WMDE-leszek has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/336387 )

Change subject: Provide EntityPrefetcher in EntityDataRetrievalServiceFactory
......................................................................

Provide EntityPrefetcher in EntityDataRetrievalServiceFactory

DispatchingServiceFactory returns an instance of
DispatchingEntityPrefetcher.

Client, and optionally repo, now only use the entity prefetcher
provided by DispatchingServiceFactory.

Wiring file defining services for per-repo RepositoryServiceContainers
ensures single instance of EntityPrefetcher is instantiated by
the container. This makes Wikibase only use a single instance
of the prefetcher.

Bug: T157380
Change-Id: Ia064c2bb19ee41fb35fc19b9363c761bbb019abf
---
M client/includes/DispatchingServiceFactory.php
M client/includes/DispatchingServiceWiring.php
M client/includes/EntityDataRetrievalServiceFactory.php
M client/includes/Store/RepositoryServiceWiring.php
M client/includes/Store/Sql/DirectSqlStore.php
M client/tests/phpunit/includes/DispatchingServiceWiringTest.php
M client/tests/phpunit/includes/Store/RepositoryServiceWiringTest.php
M client/tests/phpunit/includes/Store/Sql/DirectSqlStoreTest.php
M repo/includes/Store/Sql/SqlStore.php
9 files changed, 60 insertions(+), 15 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase 
refs/changes/87/336387/1

diff --git a/client/includes/DispatchingServiceFactory.php 
b/client/includes/DispatchingServiceFactory.php
index 546b00d..cb691e7 100644
--- a/client/includes/DispatchingServiceFactory.php
+++ b/client/includes/DispatchingServiceFactory.php
@@ -5,6 +5,7 @@
 use MediaWiki\Services\ServiceContainer;
 use Wikibase\Client\Store\RepositoryServiceContainer;
 use Wikibase\Client\Store\RepositoryServiceContainerFactory;
+use Wikibase\DataModel\Services\Entity\EntityPrefetcher;
 use Wikibase\DataModel\Services\Lookup\UnknownForeignRepositoryException;
 use Wikibase\DataModel\Entity\EntityId;
 use Wikibase\DataModel\Entity\EntityRedirect;
@@ -132,6 +133,13 @@
        }
 
        /**
+        * @return EntityPrefetcher
+        */
+       public function getEntityPrefetcher() {
+               return $this->getService( 'EntityPrefetcher' );
+       }
+
+       /**
         * @return EntityRevisionLookup
         */
        public function getEntityRevisionLookup() {
diff --git a/client/includes/DispatchingServiceWiring.php 
b/client/includes/DispatchingServiceWiring.php
index 70aaf93..a5e1a6b 100644
--- a/client/includes/DispatchingServiceWiring.php
+++ b/client/includes/DispatchingServiceWiring.php
@@ -1,6 +1,7 @@
 <?php
 
 use Wikibase\Client\DispatchingServiceFactory;
+use Wikibase\Lib\Store\DispatchingEntityPrefetcher;
 use Wikibase\Lib\Store\DispatchingEntityRevisionLookup;
 use Wikibase\Lib\Store\DispatchingPropertyInfoLookup;
 use Wikibase\Lib\Store\DispatchingTermBuffer;
@@ -13,6 +14,12 @@
 
 return [
 
+       'EntityPrefetcher' => function( DispatchingServiceFactory 
$dispatchingServiceFactory ) {
+               return new DispatchingEntityPrefetcher(
+                       $dispatchingServiceFactory->getServiceMap( 
'EntityPrefetcher' )
+               );
+       },
+
        'EntityRevisionLookup' => function( DispatchingServiceFactory 
$dispatchingServiceFactory ) {
                return new DispatchingEntityRevisionLookup(
                        $dispatchingServiceFactory->getServiceMap( 
'EntityRevisionLookup' )
diff --git a/client/includes/EntityDataRetrievalServiceFactory.php 
b/client/includes/EntityDataRetrievalServiceFactory.php
index d78efd1..9f45cc0 100644
--- a/client/includes/EntityDataRetrievalServiceFactory.php
+++ b/client/includes/EntityDataRetrievalServiceFactory.php
@@ -2,6 +2,7 @@
 
 namespace Wikibase\Client;
 
+use Wikibase\DataModel\Services\Entity\EntityPrefetcher;
 use Wikibase\DataModel\Services\Term\TermBuffer;
 use Wikibase\Lib\Store\EntityRevisionLookup;
 use Wikibase\Lib\Store\PropertyInfoLookup;
@@ -14,6 +15,11 @@
 interface EntityDataRetrievalServiceFactory {
 
        /**
+        * @return EntityPrefetcher
+        */
+       public function getEntityPrefetcher();
+
+       /**
         * Note: Instance returned is not guaranteed to be a caching decorator.
         * Callers should take care of caching themselves.
         *
diff --git a/client/includes/Store/RepositoryServiceWiring.php 
b/client/includes/Store/RepositoryServiceWiring.php
index 9fa25b1..8d6c41c 100644
--- a/client/includes/Store/RepositoryServiceWiring.php
+++ b/client/includes/Store/RepositoryServiceWiring.php
@@ -17,6 +17,13 @@
 
 return [
 
+       'EntityPrefetcher' => function(
+               RepositoryServiceContainer $services,
+               WikibaseClient $client
+       ) {
+               return $services->getService( 'WikiPageEntityMetaDataAccessor' 
);
+       },
+
        'EntityRevisionLookup' => function(
                RepositoryServiceContainer $services,
                WikibaseClient $client
diff --git a/client/includes/Store/Sql/DirectSqlStore.php 
b/client/includes/Store/Sql/DirectSqlStore.php
index c5e8124..db00813 100644
--- a/client/includes/Store/Sql/DirectSqlStore.php
+++ b/client/includes/Store/Sql/DirectSqlStore.php
@@ -454,16 +454,7 @@
         * @return PrefetchingWikiPageEntityMetaDataAccessor
         */
        public function getEntityPrefetcher() {
-               if ( $this->entityPrefetcher === null ) {
-                       $this->entityPrefetcher = new 
PrefetchingWikiPageEntityMetaDataAccessor(
-                               new WikiPageEntityMetaDataLookup(
-                                       $this->entityNamespaceLookup,
-                                       $this->repoWiki
-                               )
-                       );
-               }
-
-               return $this->entityPrefetcher;
+               return 
$this->entityDataRetrievalServices->getEntityPrefetcher();
        }
 
        /**
diff --git a/client/tests/phpunit/includes/DispatchingServiceWiringTest.php 
b/client/tests/phpunit/includes/DispatchingServiceWiringTest.php
index 8433c4e..7748878 100644
--- a/client/tests/phpunit/includes/DispatchingServiceWiringTest.php
+++ b/client/tests/phpunit/includes/DispatchingServiceWiringTest.php
@@ -6,6 +6,7 @@
 use Wikibase\Client\Store\RepositoryServiceContainerFactory;
 use Wikibase\Client\WikibaseClient;
 use Wikibase\DataModel\Entity\BasicEntityIdParser;
+use Wikibase\DataModel\Services\Entity\EntityPrefetcher;
 use Wikibase\DataModel\Services\EntityId\PrefixMappingEntityIdParserFactory;
 use Wikibase\DataModel\Services\Term\TermBuffer;
 use Wikibase\Lib\Serialization\RepositorySpecificDataValueDeserializerFactory;
@@ -48,6 +49,7 @@
 
        public function provideServices() {
                return [
+                       [ 'EntityPrefetcher', EntityPrefetcher::class ],
                        [ 'EntityRevisionLookup', EntityRevisionLookup::class ],
                        [ 'PropertyInfoLookup', PropertyInfoLookup::class ],
                        [ 'TermBuffer', TermBuffer::class ],
@@ -69,7 +71,7 @@
                $factory = $this->getDispatchingServiceFactory();
 
                $this->assertEquals(
-                       [ 'EntityRevisionLookup', 'PropertyInfoLookup', 
'TermBuffer' ],
+                       [ 'EntityPrefetcher', 'EntityRevisionLookup', 
'PropertyInfoLookup', 'TermBuffer' ],
                        $factory->getServiceNames()
                );
        }
diff --git 
a/client/tests/phpunit/includes/Store/RepositoryServiceWiringTest.php 
b/client/tests/phpunit/includes/Store/RepositoryServiceWiringTest.php
index 3ba38db..f67321c 100644
--- a/client/tests/phpunit/includes/Store/RepositoryServiceWiringTest.php
+++ b/client/tests/phpunit/includes/Store/RepositoryServiceWiringTest.php
@@ -6,6 +6,7 @@
 use Wikibase\Client\Store\RepositoryServiceContainer;
 use Wikibase\Client\WikibaseClient;
 use Wikibase\DataModel\Entity\EntityIdParser;
+use Wikibase\DataModel\Services\Entity\EntityPrefetcher;
 use Wikibase\DataModel\Services\EntityId\PrefixMappingEntityIdParser;
 use Wikibase\Lib\Store\EntityRevisionLookup;
 use Wikibase\Lib\Store\PropertyInfoLookup;
@@ -39,6 +40,7 @@
 
        public function provideServices() {
                return [
+                       [ 'EntityPrefetcher', EntityPrefetcher::class ],
                        [ 'EntityRevisionLookup', EntityRevisionLookup::class ],
                        [ 'PropertyInfoLookup', PropertyInfoLookup::class ],
                        [ 'TermIndex', TermIndex::class ],
@@ -61,7 +63,13 @@
                $container = $this->getRepositoryServiceContainer();
 
                $this->assertEquals(
-                       [ 'EntityRevisionLookup', 'PropertyInfoLookup', 
'TermIndex', 'WikiPageEntityMetaDataAccessor' ],
+                       [
+                               'EntityPrefetcher',
+                               'EntityRevisionLookup',
+                               'PropertyInfoLookup',
+                               'TermIndex',
+                               'WikiPageEntityMetaDataAccessor'
+                       ],
                        $container->getServiceNames()
                );
        }
diff --git a/client/tests/phpunit/includes/Store/Sql/DirectSqlStoreTest.php 
b/client/tests/phpunit/includes/Store/Sql/DirectSqlStoreTest.php
index ec0b5a5..ce7c599 100644
--- a/client/tests/phpunit/includes/Store/Sql/DirectSqlStoreTest.php
+++ b/client/tests/phpunit/includes/Store/Sql/DirectSqlStoreTest.php
@@ -11,6 +11,7 @@
 use Wikibase\Client\WikibaseClient;
 use Wikibase\DataModel\Entity\ItemIdParser;
 use Wikibase\DataModel\Services\Entity\EntityPrefetcher;
+use Wikibase\DataModel\Services\Entity\NullEntityPrefetcher;
 use Wikibase\DataModel\Services\Lookup\EntityLookup;
 use Wikibase\DataModel\Services\Term\PropertyLabelResolver;
 use Wikibase\DirectSqlStore;
@@ -51,6 +52,9 @@
 
                $dispatchingServiceFactory = new DispatchingServiceFactory( 
$containerFactory, [] );
 
+               $dispatchingServiceFactory->defineService( 'EntityPrefetcher', 
function() {
+                       return new NullEntityPrefetcher();
+               } );
                $dispatchingServiceFactory->defineService( 
'EntityRevisionLookup', function() {
                        return $this->getMock( EntityRevisionLookup::class );
                } );
diff --git a/repo/includes/Store/Sql/SqlStore.php 
b/repo/includes/Store/Sql/SqlStore.php
index 17857b4..0bbca64 100644
--- a/repo/includes/Store/Sql/SqlStore.php
+++ b/repo/includes/Store/Sql/SqlStore.php
@@ -10,6 +10,7 @@
 use Wikibase\DataModel\Entity\EntityIdParser;
 use Wikibase\DataModel\Entity\Item;
 use Wikibase\DataModel\Entity\Property;
+use Wikibase\DataModel\Services\Entity\EntityPrefetcher;
 use Wikibase\DataModel\Services\Lookup\EntityLookup;
 use Wikibase\DataModel\Services\Lookup\EntityRedirectLookup;
 use Wikibase\DataModel\Services\Lookup\RedirectResolvingEntityLookup;
@@ -608,15 +609,26 @@
         */
        public function getEntityPrefetcher() {
                if ( $this->entityPrefetcher === null ) {
-                       $this->entityPrefetcher = new 
PrefetchingWikiPageEntityMetaDataAccessor(
-                               new WikiPageEntityMetaDataLookup( 
$this->entityNamespaceLookup )
-                       );
+                       $this->entityPrefetcher = $this->newEntityPrefetcher();
                }
 
                return $this->entityPrefetcher;
        }
 
        /**
+        * @return EntityPrefetcher
+        */
+       private function newEntityPrefetcher() {
+               if ( $this->entityDataRetrievalServices !== null ) {
+                       return 
$this->entityDataRetrievalServices->getEntityPrefetcher();
+               } else {
+                       return new PrefetchingWikiPageEntityMetaDataAccessor(
+                               new WikiPageEntityMetaDataLookup( 
$this->entityNamespaceLookup )
+                       );
+               }
+       }
+
+       /**
         * @return EntityChangeLookup
         */
        public function getEntityChangeLookup() {

-- 
To view, visit https://gerrit.wikimedia.org/r/336387
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia064c2bb19ee41fb35fc19b9363c761bbb019abf
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: WMDE-leszek <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to