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