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