Aude has uploaded a new change for review. https://gerrit.wikimedia.org/r/247626
Change subject: Ignore site link uniqueness conflicts of from-item during merge [WIP] ...................................................................... Ignore site link uniqueness conflicts of from-item during merge [WIP] needs tests and perhaps polish the code some... Bug: T115892 Change-Id: I4cb518f54f6dd045f81e6e79390e320a0cd8895d --- M repo/includes/WikibaseRepo.php M repo/includes/api/MergeItems.php M repo/includes/specials/SpecialMergeItems.php M repo/includes/store/sql/SqlSiteLinkConflictLookup.php 4 files changed, 97 insertions(+), 21 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase refs/changes/26/247626/1 diff --git a/repo/includes/WikibaseRepo.php b/repo/includes/WikibaseRepo.php index d0bcbb4..889aab6 100644 --- a/repo/includes/WikibaseRepo.php +++ b/repo/includes/WikibaseRepo.php @@ -68,6 +68,7 @@ use Wikibase\Repo\Content\ItemHandler; use Wikibase\Repo\Content\PropertyHandler; use Wikibase\Repo\Hooks\EditFilterHookRunner; +use Wikibase\Repo\Interactors\ItemMergeInteractor; use Wikibase\Repo\Interactors\RedirectCreationInteractor; use Wikibase\Repo\LinkedData\EntityDataFormatProvider; use Wikibase\Repo\Localizer\ChangeOpValidationExceptionLocalizer; @@ -82,6 +83,7 @@ use Wikibase\Repo\Notifications\DatabaseChangeTransmitter; use Wikibase\Repo\Notifications\HookChangeTransmitter; use Wikibase\Repo\Store\EntityPermissionChecker; +use Wikibase\Repo\Store\SiteLinkConflictLookup; use Wikibase\Repo\Validators\EntityConstraintProvider; use Wikibase\Repo\Validators\SnakValidator; use Wikibase\Repo\Validators\TermValidatorFactory; @@ -199,6 +201,11 @@ private $monolingualTextLanguages = null; /** + * @var SiteLinkConflictLookup|null + */ + private $siteLinkConflictLookup = null; + + /** * @var DataTypeDefinitions */ private $dataTypeDefinitions; @@ -207,6 +214,7 @@ * @var Language */ private $defaultLanguage; + /** * Returns the default instance constructed using newInstance(). @@ -948,7 +956,7 @@ public function getEntityConstraintProvider() { return new EntityConstraintProvider( $this->getLabelDescriptionDuplicateDetector(), - $this->getStore()->getSiteLinkConflictLookup() + $this->getSiteLinkConflictLookup() ); } @@ -1387,4 +1395,30 @@ return new WikibaseHtmlSnakFormatterFactory( $this->getSnakFormatterFactory() ); } + private function getSiteLinkConflictLookup() { + if ( $this->siteLinkConflictLookup === null ) { + $this->siteLinkConflictLookup = $this->store->getSiteLinkConflictLookup(); + } + + return $this->siteLinkConflictLookup; + } + + /** + * @return ItemMergeInteractor + */ + public function newItemMergeInteractor( User $user, IContextSource $context ) { + $entityStore = $this->getEntityStore(); + $entityStore->registerWatcher( $this->getSiteLinkConflictLookup() ); + + return new ItemMergeInteractor( + $this->getChangeOpFactoryProvider()->getMergeChangeOpFactory(), + $this->getEntityRevisionLookup( 'uncached' ), + $entityStore, + $this->getEntityPermissionChecker(), + $this->getSummaryFormatter(), + $user, + $this->newRedirectCreationInteractor( $user, $context ) + ); + } + } diff --git a/repo/includes/api/MergeItems.php b/repo/includes/api/MergeItems.php index 677fd66..6ca1a22 100644 --- a/repo/includes/api/MergeItems.php +++ b/repo/includes/api/MergeItems.php @@ -65,14 +65,9 @@ $wikibaseRepo->getEntityIdParser(), $apiHelperFactory->getErrorReporter( $this ), $apiHelperFactory->getResultBuilder( $this ), - new ItemMergeInteractor( - $wikibaseRepo->getChangeOpFactoryProvider()->getMergeChangeOpFactory(), - $wikibaseRepo->getEntityRevisionLookup( 'uncached' ), - $wikibaseRepo->getEntityStore(), - $wikibaseRepo->getEntityPermissionChecker(), - $wikibaseRepo->getSummaryFormatter(), + $wikibaseRepo->newItemMergeInteractor( $this->getUser(), - $wikibaseRepo->newRedirectCreationInteractor( $this->getUser(), $this->getContext() ) + $this->getContext() ) ); } diff --git a/repo/includes/specials/SpecialMergeItems.php b/repo/includes/specials/SpecialMergeItems.php index 47ec779..5d228fd 100644 --- a/repo/includes/specials/SpecialMergeItems.php +++ b/repo/includes/specials/SpecialMergeItems.php @@ -59,14 +59,9 @@ new TokenCheckInteractor( $this->getUser() ), - new ItemMergeInteractor( - $wikibaseRepo->getChangeOpFactoryProvider()->getMergeChangeOpFactory(), - $wikibaseRepo->getEntityRevisionLookup( 'uncached' ), - $wikibaseRepo->getEntityStore(), - $wikibaseRepo->getEntityPermissionChecker(), - $wikibaseRepo->getSummaryFormatter(), + $wikibaseRepo->newItemMergeInteractor( $this->getUser(), - $wikibaseRepo->newRedirectCreationInteractor( $this->getUser(), $this->getContext() ) + $this->getContext() ) ); } diff --git a/repo/includes/store/sql/SqlSiteLinkConflictLookup.php b/repo/includes/store/sql/SqlSiteLinkConflictLookup.php index ee830cd..0c3bc94 100644 --- a/repo/includes/store/sql/SqlSiteLinkConflictLookup.php +++ b/repo/includes/store/sql/SqlSiteLinkConflictLookup.php @@ -4,8 +4,13 @@ use DatabaseBase; use DBAccessBase; +use Wikibase\DataModel\Entity\EntityId; +use Wikibase\DataModel\Entity\EntityRedirect; use Wikibase\DataModel\Entity\Item; +use Wikibase\DataModel\Entity\ItemId; use Wikibase\DataModel\SiteLink; +use Wikibase\EntityRevision; +use Wikibase\Lib\Store\EntityStoreWatcher; use Wikibase\Repo\Store\SiteLinkConflictLookup; /** @@ -19,7 +24,13 @@ * @author Daniel Kinzler * @author Katie Filbert < aude.w...@gmail.com > */ -class SqlSiteLinkConflictLookup extends DBAccessBase implements SiteLinkConflictLookup { +class SqlSiteLinkConflictLookup extends DBAccessBase implements SiteLinkConflictLookup, + EntityStoreWatcher { + + /** + * @var ItemId[] + */ + private $itemConflictsToIgnore = array(); /** * @see SiteLinkConflictLookup::getConflictsForItem @@ -75,11 +86,15 @@ $conflicts = array(); foreach ( $conflictingLinks as $link ) { - $conflicts[] = array( - 'siteId' => $link->ips_site_id, - 'itemId' => (int)$link->ips_item_id, - 'sitePage' => $link->ips_site_page, - ); + $numericId = (int)$link->ips_item_id; + + if ( !array_key_exists( $numericId, $this->itemConflictsToIgnore ) ) { + $conflicts[] = array( + 'siteId' => $link->ips_site_id, + 'itemId' => $numericId, + 'sitePage' => $link->ips_site_page, + ); + } } if ( !$db ) { @@ -89,4 +104,41 @@ return $conflicts; } + /** + * @see EntityStoreWatcher::entityDeleted + * + * @param EntityId $entityId + */ + public function entityDeleted( EntityId $entityId ) { + // no-op + } + + /** + * @see EntityStoreWatcher::entityDeleted + * + * @param EntityRevision $entityRevision + */ + public function entityUpdated( EntityRevision $entityRevision ) { + $entity = $entityRevision->getEntity(); + + if ( $entity instanceof Item ) { + $itemId = $entity->getId(); + + if ( $itemId instanceof ItemId ) { + $numericId = $itemId->getNumericId(); + $this->itemConflictsToIgnore[$numericId] = $itemId; + } + } + } + + /** + * @see EntityStoreWatcher::redirectUpdated + * + * @param EntityRedirect $entityRedirect + * @param int $revisionId + */ + public function redirectUpdated( EntityRedirect $entityRedirect, $revisionId ) { + // no-op + } + } -- To view, visit https://gerrit.wikimedia.org/r/247626 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I4cb518f54f6dd045f81e6e79390e320a0cd8895d Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: Aude <aude.w...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits