Current File : /home/jvzmxxx/wiki1/extensions/Wikibase/repo/includes/Hooks/CirrusSearchHookHandlers.php
<?php

namespace Wikibase\Repo\Hooks;

use CirrusSearch\Connection;
use CirrusSearch\Maintenance\MappingConfigBuilder;
use Content;
use Elastica\Document;
use ParserOutput;
use Title;
use UnexpectedValueException;
use Wikibase\EntityContent;
use Wikibase\Repo\Search\Elastic\Fields\WikibaseFieldDefinitions;

/**
 * @since 0.5
 *
 * @license GPL-2.0+
 * @author Katie Filbert < aude.wiki@gmail.com >
 */
class CirrusSearchHookHandlers {

	/**
	 * @var WikibaseFieldDefinitions
	 */
	private $fieldDefinitions;

	/**
	 * @param Document $document
	 * @param Title $title
	 * @param Content $content
	 * @param ParserOutput $parserOutput
	 * @param Connection $connection
	 *
	 * @return bool
	 */
	public static function onCirrusSearchBuildDocumentParse(
		Document $document,
		Title $title,
		Content $content,
		ParserOutput $parserOutput,
		Connection $connection
	) {
		$hookHandler = self::newFromGlobalState();
		$hookHandler->indexExtraFields( $document, $content );

		return true;
	}

	/**
	 * @param array &$config
	 * @param MappingConfigBuilder $mappingConfigBuilder
	 *
	 * @return bool
	 */
	public static function onCirrusSearchMappingConfig(
		array &$config,
		MappingConfigBuilder $mappingConfigBuilder
	) {
		$handler = self::newFromGlobalState();
		$handler->addExtraFieldsToMappingConfig( $config );

		return true;
	}

	/**
	 * @return self
	 */
	public static function newFromGlobalState() {
		return new self( new WikibaseFieldDefinitions() );
	}

	/**
	 * @param WikibaseFieldDefinitions $fieldDefinitions
	 */
	public function __construct( WikibaseFieldDefinitions $fieldDefinitions ) {
		$this->fieldDefinitions = $fieldDefinitions;
	}

	/**
	 * @param Document $document
	 * @param Content $content
	 */
	public function indexExtraFields( Document $document, Content $content ) {
		if ( !$content instanceof EntityContent || $content->isRedirect() === true ) {
			return;
		}

		$fields = $this->fieldDefinitions->getFields();
		$entity = $content->getEntity();

		foreach ( $fields as $fieldName => $field ) {
			$data = $field->getFieldData( $entity );
			$document->set( $fieldName, $data );
		}
	}

	/**
	 * @param array &$config
	 *
	 * @throws UnexpectedValueException
	 */
	public function addExtraFieldsToMappingConfig( array &$config ) {
		$fields = $this->fieldDefinitions->getFields();

		foreach ( $fields as $fieldName => $field ) {
			if ( array_key_exists( $fieldName, $config['page']['properties'] ) ) {
				throw new UnexpectedValueException( "$fieldName is already set in the mapping." );
			}

			$config['page']['properties'][$fieldName] = $field->getMapping();
		}
	}

}