Jeroen De Dauw has submitted this change and it was merged. Change subject: Use DispatchingEntityIdParser instead of BasicEntityIdParser in repo ......................................................................
Use DispatchingEntityIdParser instead of BasicEntityIdParser in repo Constructing a new instance of BasicEntityIdParser, then calling BasicEntityIdParser::getBuilders each time BasicEntityIdParser::parse() is called (total of 3314 when purging a medium-size item page) is costly, in terms of time and memory consumption. Instead, we should be using DispatchingEntityIdParser and can use a single instance of it via the WikibaseRepo factory. Change-Id: I3529daefdec950a4377f503f50f07d53a29ae3b1 --- M repo/includes/SummaryFormatter.php M repo/includes/WikibaseRepo.php M repo/includes/content/EntityContent.php M repo/includes/content/EntityHandler.php M repo/includes/content/ItemHandler.php M repo/includes/content/PropertyHandler.php M repo/includes/rdf/RdfBuilder.php M repo/includes/store/sql/EntityPerPageTable.php M repo/includes/store/sql/SqlStore.php M repo/maintenance/rebuildItemsPerSite.php M repo/tests/phpunit/includes/UpdateRepoOnMoveJobTest.php M repo/tests/phpunit/includes/store/StoreTest.php M repo/tests/phpunit/includes/store/sql/EntityPerPageTableTest.php M repo/tests/phpunit/includes/store/sql/WikiPageEntityStoreTest.php 14 files changed, 60 insertions(+), 32 deletions(-) Approvals: Jeroen De Dauw: Looks good to me, approved diff --git a/repo/includes/SummaryFormatter.php b/repo/includes/SummaryFormatter.php index 59dab3e..519dfcd 100644 --- a/repo/includes/SummaryFormatter.php +++ b/repo/includes/SummaryFormatter.php @@ -8,7 +8,6 @@ use Language; use MWException; use ValueFormatters\ValueFormatter; -use Wikibase\DataModel\Entity\BasicEntityIdParser; use Wikibase\DataModel\Entity\EntityId; use Wikibase\DataModel\Entity\EntityIdParser; use Wikibase\DataModel\Entity\EntityIdParsingException; diff --git a/repo/includes/WikibaseRepo.php b/repo/includes/WikibaseRepo.php index f3b6149..a6667bf 100644 --- a/repo/includes/WikibaseRepo.php +++ b/repo/includes/WikibaseRepo.php @@ -450,7 +450,8 @@ public function getStore() { if ( !$this->store ) { $this->store = new SqlStore( - $this->getEntityContentDataCodec() + $this->getEntityContentDataCodec(), + $this->getEntityIdParser() ); } @@ -861,6 +862,7 @@ $codec, array( $validator ), $errorLocalizer, + $this->getEntityIdParser(), $siteLinkStore, $this->getLegacyFormatDetectorCallback() ); @@ -885,6 +887,7 @@ $codec, array( $validator ), $errorLocalizer, + $this->getEntityIdParser(), $propertyInfoStore, $this->getLegacyFormatDetectorCallback() ); @@ -925,4 +928,4 @@ ); } -} \ No newline at end of file +} diff --git a/repo/includes/content/EntityContent.php b/repo/includes/content/EntityContent.php index bccbc52..bdbb543 100644 --- a/repo/includes/content/EntityContent.php +++ b/repo/includes/content/EntityContent.php @@ -23,7 +23,6 @@ use User; use ValueFormatters\FormatterOptions; use ValueFormatters\ValueFormatter; -use Wikibase\DataModel\Entity\BasicEntityIdParser; use Wikibase\DataModel\Entity\Entity; use Wikibase\DataModel\Entity\EntityId; use Wikibase\Lib\Serializers\SerializationOptions; @@ -312,19 +311,21 @@ $context->setLanguage( $languageCode ); } + $wikibaseRepo = WikibaseRepo::getDefaultInstance(); + if ( !$uiLanguageFallbackChain ) { - $factory = WikibaseRepo::getDefaultInstance()->getLanguageFallbackChainFactory(); + $factory = $wikibaseRepo->getLanguageFallbackChainFactory(); $uiLanguageFallbackChain = $factory->newFromContextForPageView( $context ); } $formatterOptions->setOption( 'languages', $uiLanguageFallbackChain ); // get all the necessary services ---- - $snakFormatter = WikibaseRepo::getDefaultInstance()->getSnakFormatterFactory() + $snakFormatter = $wikibaseRepo->getSnakFormatterFactory() ->getSnakFormatter( SnakFormatter::FORMAT_HTML_WIDGET, $formatterOptions ); - $entityInfoBuilderFactory = WikibaseRepo::getDefaultInstance()->getStore()->getEntityInfoBuilderFactory(); - $entityContentFactory = WikibaseRepo::getDefaultInstance()->getEntityContentFactory(); + $entityInfoBuilderFactory = $wikibaseRepo->getStore()->getEntityInfoBuilderFactory(); + $entityContentFactory = $wikibaseRepo->getEntityContentFactory(); $serializationOptions = $this->makeSerializationOptions( $languageCode, $uiLanguageFallbackChain ); @@ -337,17 +338,15 @@ // --------------------------------------------------------------------- - $idParser = new BasicEntityIdParser(); - $configBuilder = new ParserOutputJsConfigBuilder( $entityInfoBuilderFactory, - $idParser, + $wikibaseRepo->getEntityIdParser(), $entityContentFactory, new ReferencedEntitiesFinder(), $context->getLanguage()->getCode() ); - $dataTypeLookup = WikibaseRepo::getDefaultInstance()->getPropertyDataTypeLookup(); + $dataTypeLookup = $wikibaseRepo->getPropertyDataTypeLookup(); return new EntityParserOutputGenerator( $entityView, diff --git a/repo/includes/content/EntityHandler.php b/repo/includes/content/EntityHandler.php index 9b3d7f2..65459c6 100644 --- a/repo/includes/content/EntityHandler.php +++ b/repo/includes/content/EntityHandler.php @@ -18,9 +18,9 @@ use Title; use User; use ValueValidators\Result; -use Wikibase\DataModel\Entity\BasicEntityIdParser; use Wikibase\DataModel\Entity\Entity; use Wikibase\DataModel\Entity\EntityId; +use Wikibase\DataModel\Entity\EntityIdParser; use Wikibase\EntityContent; use Wikibase\Lib\Store\EntityContentDataCodec; use Wikibase\Lib\Store\EntityRedirect; @@ -79,6 +79,7 @@ * @param EntityContentDataCodec $contentCodec * @param EntityValidator[] $preSaveValidators * @param ValidatorErrorLocalizer $errorLocalizer + * @param EntityIdParser $entityIdParser * @param callable|null $legacyExportFormatDetector Callback to determine whether a serialized * blob needs to be re-serialized on export. The callback must take two parameters, * the blob an the serialization format. It must return true if re-serialization is needed. @@ -93,6 +94,7 @@ EntityContentDataCodec $contentCodec, array $preSaveValidators, ValidatorErrorLocalizer $errorLocalizer, + EntityIdParser $entityIdParser, $legacyExportFormatDetector = null ) { $formats = $contentCodec->getSupportedFormats(); @@ -108,6 +110,7 @@ $this->contentCodec = $contentCodec; $this->preSaveValidators = $preSaveValidators; $this->errorLocalizer = $errorLocalizer; + $this->entityIdParser = $entityIdParser; $this->legacyExportFormatDetector = $legacyExportFormatDetector; } @@ -399,9 +402,7 @@ * @return EntityId */ public function getIdForTitle( Title $target ) { - $parser = new BasicEntityIdParser(); - $id = $parser->parse( $target->getText() ); - return $id; + return $this->entityIdParser->parse( $target->getText() ); } /** diff --git a/repo/includes/content/ItemHandler.php b/repo/includes/content/ItemHandler.php index acdef3a..25dbf6e 100644 --- a/repo/includes/content/ItemHandler.php +++ b/repo/includes/content/ItemHandler.php @@ -5,6 +5,7 @@ use DataUpdate; use Title; use Wikibase\DataModel\Entity\EntityId; +use Wikibase\DataModel\Entity\EntityIdParser; use Wikibase\DataModel\Entity\Item; use Wikibase\DataModel\Entity\ItemId; use Wikibase\EntityContent; @@ -46,6 +47,7 @@ EntityContentDataCodec $contentCodec, array $preSaveValidators, ValidatorErrorLocalizer $errorLocalizer, + EntityIdParser $entityIdParser, SiteLinkCache $siteLinkStore, $legacyExportFormatDetector = null ) { @@ -56,6 +58,7 @@ $contentCodec, $preSaveValidators, $errorLocalizer, + $entityIdParser, $legacyExportFormatDetector ); diff --git a/repo/includes/content/PropertyHandler.php b/repo/includes/content/PropertyHandler.php index e70a7c5..c4a64f0 100644 --- a/repo/includes/content/PropertyHandler.php +++ b/repo/includes/content/PropertyHandler.php @@ -7,6 +7,7 @@ use Title; use Wikibase\DataModel\Entity\Entity; use Wikibase\DataModel\Entity\EntityId; +use Wikibase\DataModel\Entity\EntityIdParser; use Wikibase\DataModel\Entity\Property; use Wikibase\DataModel\Entity\PropertyId; use Wikibase\EntityContent; @@ -52,6 +53,7 @@ * @param EntityContentDataCodec $contentCodec * @param EntityValidator[] $preSaveValidators * @param ValidatorErrorLocalizer $errorLocalizer + * @param EntityIdParser $entityIdParser * @param PropertyInfoStore $infoStore * @param callable|null $legacyExportFormatDetector */ @@ -61,6 +63,7 @@ EntityContentDataCodec $contentCodec, $preSaveValidators, ValidatorErrorLocalizer $errorLocalizer, + EntityIdParser $entityIdParser, PropertyInfoStore $infoStore, $legacyExportFormatDetector = null ) { @@ -71,6 +74,7 @@ $contentCodec, $preSaveValidators, $errorLocalizer, + $entityIdParser, $legacyExportFormatDetector ); diff --git a/repo/includes/rdf/RdfBuilder.php b/repo/includes/rdf/RdfBuilder.php index fddb209..e966f62 100644 --- a/repo/includes/rdf/RdfBuilder.php +++ b/repo/includes/rdf/RdfBuilder.php @@ -471,6 +471,7 @@ * @param EntityLookup $entityLookup */ public function resolvedMentionedEntities( EntityLookup $entityLookup ) { + // @todo inject a DispatchingEntityIdParser $idParser = new BasicEntityIdParser(); foreach ( $this->entitiesResolved as $id => $resolved ) { diff --git a/repo/includes/store/sql/EntityPerPageTable.php b/repo/includes/store/sql/EntityPerPageTable.php index ae86eab..5e39f01 100644 --- a/repo/includes/store/sql/EntityPerPageTable.php +++ b/repo/includes/store/sql/EntityPerPageTable.php @@ -5,8 +5,8 @@ use DatabaseBase; use DBError; use InvalidArgumentException; -use Wikibase\DataModel\Entity\BasicEntityIdParser; use Wikibase\DataModel\Entity\EntityId; +use Wikibase\DataModel\Entity\EntityIdParser; use Wikibase\DataModel\Entity\Item; use Wikibase\DataModel\Entity\ItemId; use Wikibase\DataModel\LegacyIdInterpreter; @@ -26,9 +26,9 @@ class EntityPerPageTable implements EntityPerPage { /** - * @var BasicEntityIdParser + * @var EntityIdParser */ - private $idParser; + private $entityIdParser; /** * @var bool @@ -40,14 +40,12 @@ * * @throws InvalidArgumentException */ - public function __construct( $useRedirectTargetColumn = true ) { + public function __construct( EntityIdParser $entityIdParser, $useRedirectTargetColumn = true ) { if ( !is_bool( $useRedirectTargetColumn ) ) { throw new InvalidArgumentException( '$useRedirectTargetColumn must be true or false' ); } - // FIXME: this needs to be injected if the table is to work with entities other than items and properties - $this->idParser = new BasicEntityIdParser(); - + $this->entityIdParser = $entityIdParser; $this->useRedirectTargetColumn = $useRedirectTargetColumn; } @@ -464,7 +462,7 @@ return null; } - return $this->idParser->parse( $row->epp_redirect_target ); + return $this->entityIdParser->parse( $row->epp_redirect_target ); } } diff --git a/repo/includes/store/sql/SqlStore.php b/repo/includes/store/sql/SqlStore.php index 20d0863..2ac2391 100644 --- a/repo/includes/store/sql/SqlStore.php +++ b/repo/includes/store/sql/SqlStore.php @@ -9,6 +9,7 @@ use MWException; use ObjectCache; use Revision; +use Wikibase\DataModel\Entity\EntityIdParser; use Wikibase\Lib\Reporting\ObservableMessageReporter; use Wikibase\Lib\Store\CachingEntityRevisionLookup; use Wikibase\Lib\Store\EntityContentDataCodec; @@ -106,6 +107,11 @@ private $contentCodec; /** + * @var EntityIdParser + */ + private $entityIdParser; + + /** * @var bool */ private $useRedirectTargetColumn; @@ -114,7 +120,8 @@ * @param EntityContentDataCodec $contentCodec */ public function __construct( - EntityContentDataCodec $contentCodec + EntityContentDataCodec $contentCodec, + EntityIdParser $entityIdParser ) { $this->contentCodec = $contentCodec; @@ -124,6 +131,7 @@ $cacheDuration = $settings->getSetting( 'sharedCacheDuration' ); $cacheType = $settings->getSetting( 'sharedCacheType' ); + $this->entityIdParser = $entityIdParser; $this->useRedirectTargetColumn = $settings->getSetting( 'useRedirectTargetColumn' ); $this->cachePrefix = $cachePrefix; @@ -461,7 +469,10 @@ * @return EntityPerPage */ public function newEntityPerPage() { - return new EntityPerPageTable( $this->useRedirectTargetColumn ); + return new EntityPerPageTable( + $this->entityIdParser, + $this->useRedirectTargetColumn + ); } /** diff --git a/repo/maintenance/rebuildItemsPerSite.php b/repo/maintenance/rebuildItemsPerSite.php index 9f25119..a4078aa 100644 --- a/repo/maintenance/rebuildItemsPerSite.php +++ b/repo/maintenance/rebuildItemsPerSite.php @@ -63,7 +63,7 @@ $useRedirectTargetColumn = WikibaseRepo::getDefaultInstance()->getSettings()->getSetting( 'useRedirectTargetColumn' ); - $entityPerPage = new EntityPerPageTable( $useRedirectTargetColumn ); + $entityPerPage = WikibaseRepo::getDefaultInstance()->getStore()->newEntityPerPage(); $stream = new EntityPerPageIdPager( $entityPerPage, 'item' ); // Now <s>kill</s> fix the table diff --git a/repo/tests/phpunit/includes/UpdateRepoOnMoveJobTest.php b/repo/tests/phpunit/includes/UpdateRepoOnMoveJobTest.php index a80c69a..f1b7303 100644 --- a/repo/tests/phpunit/includes/UpdateRepoOnMoveJobTest.php +++ b/repo/tests/phpunit/includes/UpdateRepoOnMoveJobTest.php @@ -5,6 +5,7 @@ use TestSites; use Title; use User; +use Wikibase\DataModel\Entity\BasicEntityIdParser; use Wikibase\DataModel\Entity\Item; use Wikibase\DataModel\Entity\ItemId; use Wikibase\Repo\Store\SQL\EntityPerPageTable; @@ -56,7 +57,7 @@ $store = new WikiPageEntityStore( $wikibaseRepo->getEntityContentFactory(), $wikibaseRepo->getStore()->newIdGenerator(), - new EntityPerPageTable() + new EntityPerPageTable( new BasicEntityIdParser() ) ); $store->saveEntity( $item, 'UpdateRepoOnMoveJobTest', $user, EDIT_NEW ); diff --git a/repo/tests/phpunit/includes/store/StoreTest.php b/repo/tests/phpunit/includes/store/StoreTest.php index a1d0460..148f2df 100644 --- a/repo/tests/phpunit/includes/store/StoreTest.php +++ b/repo/tests/phpunit/includes/store/StoreTest.php @@ -22,10 +22,13 @@ class StoreTest extends \MediaWikiTestCase { public function instanceProvider() { - $contentCodec = WikibaseRepo::getDefaultInstance()->getEntityContentDataCodec(); + $wikibaseRepo = WikibaseRepo::getDefaultInstance(); $instances = array( - new SqlStore( $contentCodec ) + new SqlStore( + $wikibaseRepo->getEntityContentDataCodec(), + $wikibaseRepo->getEntityIdParser() + ) ); return array( $instances ); diff --git a/repo/tests/phpunit/includes/store/sql/EntityPerPageTableTest.php b/repo/tests/phpunit/includes/store/sql/EntityPerPageTableTest.php index 44ea1c5..bbacf16 100644 --- a/repo/tests/phpunit/includes/store/sql/EntityPerPageTableTest.php +++ b/repo/tests/phpunit/includes/store/sql/EntityPerPageTableTest.php @@ -2,6 +2,7 @@ namespace Wikibase\Test; +use Wikibase\DataModel\Entity\BasicEntityIdParser; use Wikibase\DataModel\Entity\Entity; use Wikibase\DataModel\Entity\Item; use Wikibase\DataModel\Entity\ItemId; @@ -72,7 +73,9 @@ */ protected function newEntityPerPageTable( array $entities = array() ) { $useRedirectTargetColumn = $this->isRedirectTargetColumnSupported(); - $table = new EntityPerPageTable( $useRedirectTargetColumn ); + $idParser = new BasicEntityIdParser(); + + $table = new EntityPerPageTable( $idParser, $useRedirectTargetColumn ); $table->clear(); $store = WikibaseRepo::getDefaultInstance()->getEntityStore(); diff --git a/repo/tests/phpunit/includes/store/sql/WikiPageEntityStoreTest.php b/repo/tests/phpunit/includes/store/sql/WikiPageEntityStoreTest.php index cfa9fa0..19cf6ec 100644 --- a/repo/tests/phpunit/includes/store/sql/WikiPageEntityStoreTest.php +++ b/repo/tests/phpunit/includes/store/sql/WikiPageEntityStoreTest.php @@ -6,6 +6,7 @@ use Revision; use Status; use User; +use Wikibase\DataModel\Entity\BasicEntityIdParser; use Wikibase\DataModel\Entity\Entity; use Wikibase\DataModel\Entity\EntityId; use Wikibase\DataModel\Entity\Item; @@ -37,8 +38,9 @@ class WikiPageEntityStoreTest extends \PHPUnit_Framework_TestCase { private function newEntityPerPageTable() { + $idParser = new BasicEntityIdParser(); $useRedirectTargetColumn = WikibaseRepo::getDefaultInstance()->getSettings()->getSetting( 'useRedirectTargetColumn' ); - return new EntityPerPageTable( $useRedirectTargetColumn ); + return new EntityPerPageTable( $idParser, $useRedirectTargetColumn ); } /** -- To view, visit https://gerrit.wikimedia.org/r/167136 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I3529daefdec950a4377f503f50f07d53a29ae3b1 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: Aude <aude.w...@gmail.com> Gerrit-Reviewer: Jeroen De Dauw <jeroended...@gmail.com> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits