Current File : /home/jvzmxxx/wiki/extensions/Wikibase/repo/includes/Validators/LabelUniquenessValidator.php
<?php

namespace Wikibase\Repo\Validators;

use ValueValidators\Result;
use Wikibase\DataModel\Entity\EntityDocument;
use Wikibase\DataModel\Entity\EntityId;
use Wikibase\DataModel\Term\Fingerprint;
use Wikibase\DataModel\Term\FingerprintProvider;
use Wikibase\LabelDescriptionDuplicateDetector;

/**
 * Validator for checking that entity labels and aliases are unique (per language).
 * This is used to make sure that Properties have unique labels and aliases.
 *
 * @since 0.5
 *
 * @license GPL-2.0+
 * @author Daniel Kinzler
 */
class LabelUniquenessValidator implements EntityValidator, FingerprintValidator {

	/**
	 * @var LabelDescriptionDuplicateDetector
	 */
	private $duplicateDetector;

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

	/**
	 * @see EntityValidator::validate()
	 *
	 * @param EntityDocument $entity
	 *
	 * @return Result
	 */
	public function validateEntity( EntityDocument $entity ) {
		if ( $entity instanceof FingerprintProvider ) {
			return $this->duplicateDetector->detectLabelConflicts(
				$entity->getType(),
				$entity->getFingerprint()->getLabels()->toTextArray(),
				// insert again when T104393 is resolved
				null, //$entity->getFingerprint()->getAliasGroups()->toTextArray(),
				$entity->getId()
			);
		}

		return Result::newSuccess();
	}

	/**
	 * @see FingerprintValidator::validateFingerprint()
	 *
	 * @param Fingerprint $fingerprint
	 * @param EntityId $entityId
	 * @param string[]|null $languageCodes
	 *
	 * @return Result
	 */
	public function validateFingerprint(
		Fingerprint $fingerprint,
		EntityId $entityId,
		array $languageCodes = null
	) {
		$labels = $fingerprint->getLabels()->toTextArray();
		$aliases = $fingerprint->getAliasGroups()->toTextArray();

		if ( $languageCodes !== null ) {
			$languageKeys = array_flip( $languageCodes );
			$labels = array_intersect_key( $labels, $languageKeys );
			$aliases = array_intersect_key( $aliases, $languageKeys );
		}

		// Nothing to do if there are no labels AND no aliases.
		if ( empty( $labels ) && empty( $aliases ) ) {
			return Result::newSuccess();
		}

		return $this->duplicateDetector->detectLabelConflicts(
			$entityId->getEntityType(),
			$labels,
			// insert again when T104393 is resolved
			null, //$aliases,
			$entityId
		);
	}

}