Daniel Kinzler has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/172248

Change subject: Track usage via Lua
......................................................................

Track usage via Lua

Entity usages via the wikibase Lua modules need to be tracked
in the UsageTracker service.

Bug: 71288
Change-Id: Ib47e3d9348f60b50c176162ca686cb06672fdfe9
---
M client/includes/DataAccess/PropertyParserFunction/LanguageAwareRenderer.php
M client/includes/scribunto/Scribunto_LuaWikibaseEntityLibrary.php
M client/includes/scribunto/Scribunto_LuaWikibaseLibrary.php
M client/includes/scribunto/WikibaseLuaBindings.php
M client/includes/scribunto/WikibaseLuaEntityBindings.php
M client/tests/phpunit/includes/scribunto/WikibaseLuaBindingsTest.php
M client/tests/phpunit/includes/scribunto/WikibaseLuaEntityBindingsTest.php
7 files changed, 150 insertions(+), 12 deletions(-)


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

diff --git 
a/client/includes/DataAccess/PropertyParserFunction/LanguageAwareRenderer.php 
b/client/includes/DataAccess/PropertyParserFunction/LanguageAwareRenderer.php
index 84fa3c6..b72fd48 100644
--- 
a/client/includes/DataAccess/PropertyParserFunction/LanguageAwareRenderer.php
+++ 
b/client/includes/DataAccess/PropertyParserFunction/LanguageAwareRenderer.php
@@ -135,6 +135,7 @@
        }
 
        /**
+        * @todo Share code with WikibaseLuaEntityBindings::trackUsage
         * @param Snak[] $snaks
         */
        private function trackUsage( array $snaks ) {
@@ -156,12 +157,14 @@
        }
 
        /**
+        * @todo Share code with WikibaseLuaEntityBindings.
+        *
         * @param EntityId $entityId
         * @param PropertyId $propertyId
         *
         * @return Status a status object wrapping a wikitext string
         */
-       private function renderWithStatus( EntityId $entityId, PropertyId 
$propertyId ) {
+       public function renderWithStatus( EntityId $entityId, PropertyId 
$propertyId ) {
                wfProfileIn( __METHOD__ );
 
                $snaks = $this->snaksFinder->findSnaks(
diff --git a/client/includes/scribunto/Scribunto_LuaWikibaseEntityLibrary.php 
b/client/includes/scribunto/Scribunto_LuaWikibaseEntityLibrary.php
index 67323e7..7e60d76 100644
--- a/client/includes/scribunto/Scribunto_LuaWikibaseEntityLibrary.php
+++ b/client/includes/scribunto/Scribunto_LuaWikibaseEntityLibrary.php
@@ -2,6 +2,7 @@
 
 use ValueFormatters\FormatterOptions;
 use Wikibase\Client\Scribunto\WikibaseLuaEntityBindings;
+use Wikibase\Client\Usage\ParserOutputUsageAccumulator;
 use Wikibase\Client\WikibaseClient;
 use Wikibase\Lib\SnakFormatter;
 
@@ -43,6 +44,7 @@
                $this->wbLibrary = new WikibaseLuaEntityBindings(
                        $snakFormatter,
                        $wikibaseClient->getStore()->getEntityLookup(),
+                       new ParserOutputUsageAccumulator( 
$this->getEngine()->getParser()->getOutput() ),
                        $wikibaseClient->getSettings()->getSetting( 
'siteGlobalID' ),
                        $wgContLang
                );
diff --git a/client/includes/scribunto/Scribunto_LuaWikibaseLibrary.php 
b/client/includes/scribunto/Scribunto_LuaWikibaseLibrary.php
index a546cf3..330b022 100644
--- a/client/includes/scribunto/Scribunto_LuaWikibaseLibrary.php
+++ b/client/includes/scribunto/Scribunto_LuaWikibaseLibrary.php
@@ -1,6 +1,7 @@
 <?php
 
 use Wikibase\Client\Scribunto\WikibaseLuaBindings;
+use Wikibase\Client\Usage\ParserOutputUsageAccumulator;
 use Wikibase\Client\WikibaseClient;
 use Wikibase\DataModel\Entity\EntityIdParsingException;
 use Wikibase\Utils;
@@ -51,6 +52,7 @@
                        $wikibaseClient->getSettings(),
                        $wikibaseClient->getPropertyDataTypeLookup(),
                        $labelLookup,
+                       new ParserOutputUsageAccumulator( 
$this->getEngine()->getParser()->getOutput() ),
                        Utils::getLanguageCodes(),
                        $wikibaseClient->getSettings()->getSetting( 
'siteGlobalID' )
                );
diff --git a/client/includes/scribunto/WikibaseLuaBindings.php 
b/client/includes/scribunto/WikibaseLuaBindings.php
index f1f5568..e771911 100644
--- a/client/includes/scribunto/WikibaseLuaBindings.php
+++ b/client/includes/scribunto/WikibaseLuaBindings.php
@@ -5,6 +5,7 @@
 use Language;
 use InvalidArgumentException;
 use OutOfBoundsException;
+use Wikibase\Client\Usage\UsageAccumulator;
 use Wikibase\DataModel\Entity\Entity;
 use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\DataModel\Entity\EntityIdParser;
@@ -81,6 +82,11 @@
        private $labelLookup;
 
        /**
+        * @var UsageAccumulator
+        */
+       private $usageAccumulator;
+
+       /**
         * @param EntityIdParser $entityIdParser
         * @param EntityLookup $entityLookup
         * @param SiteLinkLookup $siteLinkTable
@@ -89,6 +95,7 @@
         * @param SettingsArray $settings
         * @param PropertyDataTypeLookup $dataTypeLookup
         * @param LabelLookup $labelLookup
+        * @param UsageAccumulator $usageAccumulator
         * @param string[] $languageCodes
         * @param string $siteId
         */
@@ -101,6 +108,7 @@
                SettingsArray $settings,
                PropertyDataTypeLookup $dataTypeLookup,
                LabelLookup $labelLookup,
+               UsageAccumulator $usageAccumulator,
                $languageCodes,
                $siteId
        ) {
@@ -114,6 +122,7 @@
                $this->siteId = $siteId;
                $this->dataTypeLookup = $dataTypeLookup;
                $this->labelLookup = $labelLookup;
+               $this->usageAccumulator = $usageAccumulator;
        }
 
        /**
@@ -170,6 +179,7 @@
                        $entityArr['schemaVersion'] = 2;
                }
 
+               $this->usageAccumulator->addAllUsage( $entityId );
                return $entityArr;
        }
 
@@ -223,6 +233,7 @@
                        return null;
                }
 
+               $this->usageAccumulator->addPageUsage( $id );
                return $id->getSerialization();
        }
 
@@ -267,6 +278,12 @@
                        return '';
                }
 
+               // NOTE: This tracks a label usage in the wiki's content 
language.
+               //       If the actual label is derived via language fallback,
+               //       updates to the source language will not be seen to 
apply
+               //       to this usage. We would need to trigger on changes to
+               //       *all* languages to fix that.
+               $this->usageAccumulator->addLabelUsage( $entityId );
                return $label;
        }
 
@@ -288,6 +305,8 @@
                        return '';
                }
 
+               $this->usageAccumulator->addPageUsage( $itemId );
                return $item->getSiteLinkList()->getBySiteId( $this->siteId 
)->getPageName();
        }
+
 }
diff --git a/client/includes/scribunto/WikibaseLuaEntityBindings.php 
b/client/includes/scribunto/WikibaseLuaEntityBindings.php
index 381afff..e6706ed 100644
--- a/client/includes/scribunto/WikibaseLuaEntityBindings.php
+++ b/client/includes/scribunto/WikibaseLuaEntityBindings.php
@@ -3,11 +3,14 @@
 namespace Wikibase\Client\Scribunto;
 
 use Language;
+use Wikibase\Client\Usage\UsageAccumulator;
 use Wikibase\DataModel\Claim\Claims;
 use Wikibase\DataModel\Entity\Entity;
 use Wikibase\DataModel\Entity\EntityId;
+use Wikibase\DataModel\Entity\EntityIdValue;
 use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\DataModel\Entity\PropertyId;
+use Wikibase\DataModel\Snak\PropertyValueSnak;
 use Wikibase\DataModel\Snak\Snak;
 use Wikibase\Lib\SnakFormatter;
 use Wikibase\Lib\Store\EntityLookup;
@@ -34,6 +37,11 @@
        private $entityLookup;
 
        /**
+        * @var UsageAccumulator
+        */
+       private $usageAccumulator;
+
+       /**
         * @var string
         */
        private $siteId;
@@ -50,18 +58,21 @@
 
        /**
         * @param SnakFormatter $snakFormatter
-        * @param EntityLookup $entityLookup,
-        * @param string $siteId,
+        * @param EntityLookup $entityLookup ,
+        * @param UsageAccumulator $usageAccumulator
+        * @param string $siteId ,
         * @param Language $language
         */
        public function __construct(
                SnakFormatter $snakFormatter,
                EntityLookup $entityLookup,
+               UsageAccumulator $usageAccumulator,
                $siteId,
                Language $language
        ) {
                $this->snakFormatter = $snakFormatter;
                $this->entityLookup = $entityLookup;
+               $this->usageAccumulator = $usageAccumulator;
                $this->siteId = $siteId;
                $this->language = $language;
        }
@@ -125,9 +136,32 @@
        }
 
        /**
+        * @todo Share code with LanguageAwareRenderner::trackUsage
+        * @param Snak[] $snaks
+        */
+       private function trackUsage( array $snaks ) {
+               // Note: we track any EntityIdValue as a label usage.
+               // This is making assumptions about what the respective 
formatter actually does.
+               // Ideally, the formatter itself would perform the tracking, 
but that seems nasty to model.
+
+               foreach ( $snaks as $snak ) {
+                       if ( !( $snak instanceof PropertyValueSnak ) ) {
+                               continue;
+                       }
+
+                       $value = $snak->getDataValue();
+
+                       if ( $value instanceof EntityIdValue ) {
+                               $this->usageAccumulator->addLabelUsage( 
$value->getEntityId() );
+                       }
+               }
+       }
+
+       /**
         * Render the main Snaks belonging to a Claim (which is identified by a 
PropertyId).
         *
         * @since 0.5
+        * @todo Share code with LanguageAwareRenderer.
         *
         * @param string $entityId
         * @param string $propertyId
@@ -161,6 +195,8 @@
                }
 
                $snakList = $claims->getMainSnaks();
+
+               $this->trackUsage( $snakList );
                return $this->formatSnakList( $snakList );
        }
 
diff --git 
a/client/tests/phpunit/includes/scribunto/WikibaseLuaBindingsTest.php 
b/client/tests/phpunit/includes/scribunto/WikibaseLuaBindingsTest.php
index 863e5c9..bec7159 100644
--- a/client/tests/phpunit/includes/scribunto/WikibaseLuaBindingsTest.php
+++ b/client/tests/phpunit/includes/scribunto/WikibaseLuaBindingsTest.php
@@ -4,7 +4,11 @@
 
 use Language;
 use Wikibase\Client\Scribunto\WikibaseLuaBindings;
+use Wikibase\Client\Usage\EntityUsage;
+use Wikibase\Client\Usage\HashUsageAccumulator;
+use Wikibase\Client\Usage\UsageAccumulator;
 use Wikibase\DataModel\Entity\BasicEntityIdParser;
+use Wikibase\DataModel\Entity\EntityId;
 use Wikibase\DataModel\Entity\Item;
 use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\DataModel\SiteLink;
@@ -35,7 +39,10 @@
                );
        }
 
-       private function getWikibaseLibraryImplementation( EntityLookup 
$entityLookup = null ) {
+       private function getWikibaseLibraryImplementation(
+               EntityLookup $entityLookup = null,
+               UsageAccumulator $usageAccumulator = null
+       ) {
                $language = new Language( "en" );
 
                $siteLinkTable = $this->getMockBuilder( 
'Wikibase\Lib\Store\SiteLinkTable' )
@@ -68,9 +75,16 @@
                        new SettingsArray(),
                        $propertyDataTypeLookup,
                        $labelLookup,
+                       $usageAccumulator ? $usageAccumulator : new 
HashUsageAccumulator(),
                        array( 'de', 'en', 'es', 'ja' ),
                        "enwiki" // siteId
                );
+       }
+
+       private function hasUsage( $actualUsages, EntityId $entityId, $aspect ) 
{
+               $usage = new EntityUsage( $entityId, $aspect );
+               $key = $usage->getIdentityString();
+               return isset( $actualUsages[$key] );
        }
 
        /**
@@ -79,9 +93,24 @@
        public function testGetEntity( array $expected, Item $item, 
EntityLookup $entityLookup ) {
                $prefixedId = $item->getId()->getSerialization();
                $wikibaseLibrary = $this->getWikibaseLibraryImplementation( 
$entityLookup );
+
                $entityArr = $wikibaseLibrary->getEntity( $prefixedId );
                $actual = is_array( $entityArr ) ? array_keys( $entityArr ) : 
array();
                $this->assertEquals( $expected, $actual );
+       }
+
+       public function testGetEntity_usage() {
+               $item = $this->getItem();
+               $itemId = $item->getId();
+
+               $entityLookup = new MockRepository();
+               $entityLookup->putEntity( $item );
+
+               $usages = new HashUsageAccumulator();
+               $wikibaseLibrary = $this->getWikibaseLibraryImplementation( 
$entityLookup, $usages );
+
+               $wikibaseLibrary->getEntity( $itemId->getSerialization() );
+               $this->assertTrue( $this->hasUsage( $usages->getUsages(), 
$item->getId(), EntityUsage::ALL_USAGE ), 'all usage' );
        }
 
        public function getEntityProvider() {
@@ -100,9 +129,14 @@
        }
 
        public function testGetEntityId() {
-               $wikibaseLibrary = $this->getWikibaseLibraryImplementation();
+               $usages = new HashUsageAccumulator();
+               $wikibaseLibrary = $this->getWikibaseLibraryImplementation( 
null, $usages );
+
                $itemId = $wikibaseLibrary->getEntityId( 'Rome' );
                $this->assertEquals( 'Q33' , $itemId );
+
+               $this->assertTrue( $this->hasUsage( $usages->getUsages(), new 
ItemId( $itemId ), EntityUsage::TITLE_USAGE ), 'title usage' );
+               $this->assertFalse( $this->hasUsage( $usages->getUsages(), new 
ItemId( $itemId ), EntityUsage::SITELINK_USAGE ), 'sitelink usage' );
 
                $itemId = $wikibaseLibrary->getEntityId( 'Barcelona' );
                $this->assertSame( null, $itemId );
@@ -131,6 +165,18 @@
                $this->assertEquals( $expected, $wikibaseLibrary->getLabel( 
$itemId ) );
        }
 
+       public function testGetLabel_usage() {
+               $usages = new HashUsageAccumulator();
+               $wikibaseLibrary = $this->getWikibaseLibraryImplementation( 
null, $usages );
+
+               $itemId = new ItemId( 'Q7' );
+               $wikibaseLibrary->getLabel( $itemId->getSerialization() );
+
+               $this->assertTrue( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::LABEL_USAGE ), 'label usage' );
+               $this->assertFalse( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::TITLE_USAGE ), 'title usage' );
+               $this->assertFalse( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::ALL_USAGE ), 'all usage' );
+       }
+
        public function getSiteLinkProvider() {
                return array(
                        array( 'Beer', 'Q666' ),
@@ -154,6 +200,23 @@
                $this->assertSame( $expected, $wikibaseLibrary->getSiteLink( 
$itemId ) );
        }
 
+       public function testGetSiteLink_usage() {
+               $item = $this->getItem();
+
+               $entityLookup = new MockRepository();
+               $entityLookup->putEntity( $item );
+
+               $usages = new HashUsageAccumulator();
+               $wikibaseLibrary = $this->getWikibaseLibraryImplementation( 
$entityLookup, $usages );
+
+               $itemId = $item->getId();
+               $wikibaseLibrary->getSiteLink( $itemId->getSerialization() );
+
+               $this->assertTrue( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::TITLE_USAGE ), 'title usage' );
+               $this->assertFalse( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::LABEL_USAGE ), 'label usage' );
+               $this->assertFalse( $this->hasUsage( $usages->getUsages(), 
$itemId, EntityUsage::ALL_USAGE ), 'all usage' );
+       }
+
        protected function getItem() {
                $itemId = new ItemId( 'Q666' );
 
diff --git 
a/client/tests/phpunit/includes/scribunto/WikibaseLuaEntityBindingsTest.php 
b/client/tests/phpunit/includes/scribunto/WikibaseLuaEntityBindingsTest.php
index 4662ee6..43c5da6 100644
--- a/client/tests/phpunit/includes/scribunto/WikibaseLuaEntityBindingsTest.php
+++ b/client/tests/phpunit/includes/scribunto/WikibaseLuaEntityBindingsTest.php
@@ -4,10 +4,16 @@
 
 use Language;
 use Wikibase\Client\Scribunto\WikibaseLuaEntityBindings;
+use Wikibase\Client\Usage\EntityUsage;
+use Wikibase\Client\Usage\HashUsageAccumulator;
+use Wikibase\Client\Usage\UsageAccumulator;
 use Wikibase\DataModel\Claim\Claim;
 use Wikibase\DataModel\Entity\Entity;
+use Wikibase\DataModel\Entity\EntityIdValue;
 use Wikibase\DataModel\Entity\Item;
+use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\DataModel\Entity\PropertyId;
+use Wikibase\DataModel\Snak\PropertyValueSnak;
 use Wikibase\DataModel\Statement\Statement;
 use Wikibase\Lib\SnakFormatter;
 use Wikibase\Lib\Store\EntityLookup;
@@ -34,12 +40,16 @@
                );
        }
 
-       private function getWikibaseLibraryImplementation( EntityLookup 
$entityLookup = null ) {
+       private function getWikibaseLibraryImplementation(
+               EntityLookup $entityLookup = null,
+               UsageAccumulator $usageAccumulator = null
+       ) {
                $language = new Language( 'en' );
 
                return new WikibaseLuaEntityBindings(
                        $this->newSnakFormatterMock(),
                        $entityLookup ? $entityLookup : new MockRepository(),
+                       $usageAccumulator ? $usageAccumulator : new 
HashUsageAccumulator(),
                        'enwiki',
                        $language // language
                );
@@ -49,11 +59,8 @@
         * @return Item
         */
        private function getItem() {
-               $snakFactory = new SnakFactory();
-               $snak = $snakFactory->newSnak(
-                       new PropertyId( 'P123456' ),
-                       'somevalue'
-               );
+               $propertyId = new PropertyId( 'P123456' );
+               $snak = new PropertyValueSnak( $propertyId, new EntityIdValue( 
new ItemId( 'Q11' ) ));
                $statement = new Statement( new Claim( $snak ) );
                $statement->setGuid( 'gsdfgsadg' );
 
@@ -94,10 +101,16 @@
                $item = $this->getItem();
 
                $entityLookup = $this->getEntityLookupMock( $item );
-               $wikibaseLibrary = $this->getWikibaseLibraryImplementation( 
$entityLookup );
+               $usageAccumulator = new HashUsageAccumulator();
+               $wikibaseLibrary = $this->getWikibaseLibraryImplementation( 
$entityLookup, $usageAccumulator );
+
                $ret = $wikibaseLibrary->formatPropertyValues( 'Q1', 'P123456' 
);
 
                $this->assertSame( 'Snak snak snak', $ret );
+
+               $expectedUsage = new EntityUsage( new ItemId( 'Q11' ), 
EntityUsage::LABEL_USAGE );
+               $usages = $usageAccumulator->getUsages();
+               $this->assertArrayHasKey( $expectedUsage->getIdentityString(), 
$usages );
        }
 
        public function testFormatPropertyValuesNoProperty() {

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib47e3d9348f60b50c176162ca686cb06672fdfe9
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Daniel Kinzler <[email protected]>

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

Reply via email to