Matthias Mullie has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/176000

Change subject: Move validateAnalyzers code into separate class
......................................................................

Move validateAnalyzers code into separate class

Meanwhile also duplicated checkConfig & related in Validator.php
Meanwhile also removed getSettings method, which is no longer used

Change-Id: I22e132d6698f53c47a243d05141384a675dac7ad
---
M CirrusSearch.php
A includes/Maintenance/Validators/AnalyzersValidator.php
M includes/Maintenance/Validators/Validator.php
M maintenance/updateOneSearchIndexConfig.php
4 files changed, 139 insertions(+), 15 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/CirrusSearch 
refs/changes/00/176000/1

diff --git a/CirrusSearch.php b/CirrusSearch.php
index a612290..7f1b6ff 100644
--- a/CirrusSearch.php
+++ b/CirrusSearch.php
@@ -582,6 +582,7 @@
 
$wgAutoloadClasses['CirrusSearch\Maintenance\Validators\MaxShardsPerNodeValidator']
 = $maintenanceDir . '/Validators/MaxShardsPerNodeValidator.php';
 
$wgAutoloadClasses['CirrusSearch\Maintenance\Validators\NumberOfShardsValidator']
 = $maintenanceDir . '/Validators/NumberOfShardsValidator.php';
 
$wgAutoloadClasses['CirrusSearch\Maintenance\Validators\ReplicaRangeValidator'] 
= $maintenanceDir . '/Validators/ReplicaRangeValidator.php';
+$wgAutoloadClasses['CirrusSearch\Maintenance\Validators\AnalyzersValidator'] = 
$maintenanceDir . '/Validators/AnalyzersValidator.php';
 $wgAutoloadClasses['CirrusSearch\Maintenance\UpdateVersionIndex'] = __DIR__ . 
'/maintenance/updateVersionIndex.php';
 $wgAutoloadClasses['CirrusSearch\NearMatchPicker'] = $includes . 
'NearMatchPicker.php';
 $wgAutoloadClasses['CirrusSearch\OtherIndexes'] = $includes . 
'OtherIndexes.php';
diff --git a/includes/Maintenance/Validators/AnalyzersValidator.php 
b/includes/Maintenance/Validators/AnalyzersValidator.php
new file mode 100644
index 0000000..85cb59f
--- /dev/null
+++ b/includes/Maintenance/Validators/AnalyzersValidator.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace CirrusSearch\Maintenance\Validators;
+
+use CirrusSearch\Maintenance\AnalysisConfigBuilder;
+use CirrusSearch\Maintenance\Maintenance;
+use Elastica\Index;
+
+class AnalyzersValidator extends Validator {
+       /**
+        * @var Index
+        */
+       private $index;
+
+       /**
+        * @var AnalysisConfigBuilder
+        */
+       private $analysisConfigBuilder;
+
+       /**
+        * @param Index $index
+        * @param AnalysisConfigBuilder $analysisConfigBuilder
+        * @param Maintenance $out
+        */
+       public function __construct( Index $index, AnalysisConfigBuilder 
$analysisConfigBuilder, Maintenance $out = null ) {
+               parent::__construct( $out );
+
+               $this->index = $index;
+               $this->analysisConfigBuilder = $analysisConfigBuilder;
+       }
+
+       public function validate() {
+               $this->outputIndented( "Validating analyzers..." );
+               $settings = $this->index->getSettings()->get();
+               $requiredAnalyzers = 
$this->analysisConfigBuilder->buildConfig();
+               if ( $this->checkConfig( $settings[ 'analysis' ], 
$requiredAnalyzers ) ) {
+                       $this->output( "ok\n" );
+               } else {
+                       $this->output( "cannot correct\n" );
+                       return false;
+               }
+
+               return true;
+       }
+}
diff --git a/includes/Maintenance/Validators/Validator.php 
b/includes/Maintenance/Validators/Validator.php
index d209e76..1665863 100644
--- a/includes/Maintenance/Validators/Validator.php
+++ b/includes/Maintenance/Validators/Validator.php
@@ -11,6 +11,11 @@
        protected $out;
 
        /**
+        * @var bool
+        */
+       protected $printDebugCheckConfig = false;
+
+       /**
         * @param Maintenance $out Maintenance object, to relay output to.
         */
        public function __construct( Maintenance $out = null ) {
@@ -23,6 +28,83 @@
        abstract public function validate();
 
        /**
+        * @param bool $print
+        */
+       public function printDebugCheckConfig( $print = true ) {
+               $this->printDebugCheckConfig = (bool) $print;
+       }
+
+       /**
+        * @param $actual
+        * @param $required array
+        * @param string|null $indent
+        * @return bool
+        */
+       protected function checkConfig( $actual, $required, $indent = null ) {
+               foreach( $required as $key => $value ) {
+                       $this->debugCheckConfig( "\n$indent$key: " );
+                       if ( !array_key_exists( $key, $actual ) ) {
+                               $this->debugCheckConfig( "not found..." );
+                               if ( $key === '_all' ) {
+                                       // The _all field never comes back so 
we just have to assume it
+                                       // is set correctly.
+                                       $this->debugCheckConfig( "was the all 
field so skipping..." );
+                                       continue;
+                               }
+                               return false;
+                       }
+                       if ( is_array( $value ) ) {
+                               $this->debugCheckConfig( "descend..." );
+                               if ( !is_array( $actual[ $key ] ) ) {
+                                       $this->debugCheckConfig( "other not 
array..." );
+                                       return false;
+                               }
+                               if ( !$this->checkConfig( $actual[ $key ], 
$value, $indent . "\t" ) ) {
+                                       return false;
+                               }
+                               continue;
+                       }
+
+                       $actual[ $key ] = $this->normalizeConfigValue( $actual[ 
$key ] );
+                       $value = $this->normalizeConfigValue( $value );
+                       $this->debugCheckConfig( $actual[ $key ] . " ?? 
$value..." );
+                       // Note that I really mean !=, not !==.  Coercion is 
cool here.
+                       // print $actual[ $key ] . "  $value\n";
+                       if ( $actual[ $key ] != $value ) {
+                               $this->debugCheckConfig( 'different...' );
+                               return false;
+                       }
+               }
+               return true;
+       }
+
+       /**
+        * Normalize a config value for comparison.  Elasticsearch will accept 
all kinds
+        * of config values but it tends to through back 'true' for true and 
'false' for
+        * false so we normalize everything.  Sometimes, oddly, it'll through 
back false
+        * for false....
+        * @param mixed $value config value
+        * @return mixed value normalized
+        */
+       private function normalizeConfigValue( $value ) {
+               if ( $value === true ) {
+                       return 'true';
+               } else if ( $value === false ) {
+                       return 'false';
+               }
+               return $value;
+       }
+
+       /**
+        * @param string $string
+        */
+       private function debugCheckConfig( $string ) {
+               if ( $this->printDebugCheckConfig ) {
+                       $this->output( $string );
+               }
+       }
+
+       /**
         * @param string $message
         * @param mixed $channel
         */
diff --git a/maintenance/updateOneSearchIndexConfig.php 
b/maintenance/updateOneSearchIndexConfig.php
index 89739e1..ed7fad4 100644
--- a/maintenance/updateOneSearchIndexConfig.php
+++ b/maintenance/updateOneSearchIndexConfig.php
@@ -355,25 +355,14 @@
        }
 
        private function validateAnalyzers() {
-               $this->outputIndented( "Validating analyzers..." );
-               $settings = $this->getSettings();
-               $requiredAnalyzers = 
$this->analysisConfigBuilder->buildConfig();
-               if ( $this->checkConfig( $settings[ 'analysis' ], 
$requiredAnalyzers ) ) {
-                       $this->output( "ok\n" );
-               } else {
-                       $this->output( "cannot correct\n" );
+               $validator = new 
\CirrusSearch\Maintenance\Validators\AnalyzersValidator( $this->getIndex(), 
$this->indexType, $this->maxShardsPerNode, $this );
+               $validator->printDebugCheckConfig( $this->printDebugCheckConfig 
);
+               $valid = $validator->validate();
+               if ( !$valid ) {
                        $this->error( "This script encountered an index 
difference that requires that the index be\n" .
                                "copied, indexed to, and then the old index 
removed. Re-run this script with the\n" .
                                "--reindexAndRemoveOk --indexIdentifier=now 
parameters to do this.", 1 );
                }
-       }
-
-       /**
-        * Load the settings array.  You can't use this to set the settings, 
use $this->getIndex()->getSettings() for that.
-        * @return array of settings
-        */
-       private function getSettings() {
-               return $this->getIndex()->getSettings()->get();
        }
 
        private function validateMapping() {
@@ -430,6 +419,8 @@
         * @param $actual
         * @param $required array
         * @return bool
+        *
+        * @deprecated Duplicate of 
CirrusSearch\Maintenance\Validators\Validator - once all callers here have been 
moved, this'll be removed
         */
        private function checkConfig( $actual, $required, $indent = null ) {
                foreach( $required as $key => $value ) {
@@ -476,6 +467,8 @@
         * for false....
         * @param mixed $value config value
         * @return mixes value normalized
+        *
+        * @deprecated Duplicate of 
CirrusSearch\Maintenance\Validators\Validator - once all callers here have been 
moved, this'll be removed
         */
        private function normalizeConfigValue( $value ) {
                if ( $value === true ) {
@@ -486,6 +479,9 @@
                return $value;
        }
 
+       /**
+        * @deprecated Duplicate of 
CirrusSearch\Maintenance\Validators\Validator - once all callers here have been 
moved, this'll be removed
+        */
        private function debugCheckConfig( $string ) {
                if ( $this->printDebugCheckConfig ) {
                        $this->output( $string );

-- 
To view, visit https://gerrit.wikimedia.org/r/176000
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I22e132d6698f53c47a243d05141384a675dac7ad
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/CirrusSearch
Gerrit-Branch: master
Gerrit-Owner: Matthias Mullie <mmul...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to