Daniel Kinzler has uploaded a new change for review.
https://gerrit.wikimedia.org/r/204501
Change subject: Introduce MentionedEntityTracker for tracking mentioned
interfaces.
......................................................................
Introduce MentionedEntityTracker for tracking mentioned interfaces.
Previously, we were using callbacks, which was somewhat confusing.
Change-Id: I303c97a79c272635e5aa7c61ea20790dccdfb4ed
---
M repo/includes/rdf/FullStatementRdfBuilder.php
A repo/includes/rdf/MentionedEntityTracker.php
A repo/includes/rdf/NullMentionedEntityTracker.php
M repo/includes/rdf/RdfBuilder.php
M repo/includes/rdf/SimpleValueRdfBuilder.php
M repo/tests/phpunit/includes/rdf/ComplexValueRdfBuilderTest.php
M repo/tests/phpunit/includes/rdf/FullStatementsRdfBuilderTest.php
M repo/tests/phpunit/includes/rdf/SimpleValueRdfBuilderTest.php
8 files changed, 138 insertions(+), 61 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase
refs/changes/01/204501/1
diff --git a/repo/includes/rdf/FullStatementRdfBuilder.php
b/repo/includes/rdf/FullStatementRdfBuilder.php
index 9e91760..8db28d1 100644
--- a/repo/includes/rdf/FullStatementRdfBuilder.php
+++ b/repo/includes/rdf/FullStatementRdfBuilder.php
@@ -25,9 +25,9 @@
class FullStatementRdfBuilder implements EntityRdfBuilder {
/**
- * @var callable
+ * @var MentionedEntityTracker
*/
- private $propertyMentionCallback = null;
+ private $mentionedEntityTracker;
/**
* @var callable
@@ -78,20 +78,22 @@
$this->referenceWriter = $writer;
$this->valueBuilder = $valueBuilder;
+
+ $this->mentionedEntityTracker = new
NullMentionedEntityTracker();
}
/**
- * @return callable
+ * @return MentionedEntityTracker
*/
- public function getPropertyMentionCallback() {
- return $this->propertyMentionCallback;
+ public function getMentionedEntityTracker() {
+ return $this->mentionedEntityTracker;
}
/**
- * @param callable $propertyMentionCallback
+ * @param MentionedEntityTracker $mentionedEntityTracker
*/
- public function setPropertyMentionCallback( $propertyMentionCallback ) {
- $this->propertyMentionCallback = $propertyMentionCallback;
+ public function setMentionedEntityTracker( $mentionedEntityTracker ) {
+ $this->mentionedEntityTracker = $mentionedEntityTracker;
}
/**
@@ -230,7 +232,7 @@
$this->statementWriter->about( RdfVocabulary::NS_STATEMENT,
$statementLName );
$this->addSnak( $this->statementWriter, $snak,
RdfVocabulary::NS_VALUE );
- $this->propertyMentioned( $snak->getPropertyId() );
+ $this->mentionedEntityTracker->propertyUsed(
$snak->getPropertyId() );
$rank = $statement->getRank();
if ( isset( RdfVocabulary::$rankMap[$rank] ) ) {
@@ -274,15 +276,6 @@
break;
default:
throw new \InvalidArgumentException( 'Unknown
snak type: ' . $snak->getType() );
- }
- }
-
- /**
- * @param EntityId $propertyId
- */
- private function propertyMentioned( EntityId $propertyId ) {
- if ( $this->propertyMentionCallback ) {
- call_user_func( $this->propertyMentionCallback,
$propertyId );
}
}
diff --git a/repo/includes/rdf/MentionedEntityTracker.php
b/repo/includes/rdf/MentionedEntityTracker.php
new file mode 100644
index 0000000..9f42cba
--- /dev/null
+++ b/repo/includes/rdf/MentionedEntityTracker.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Wikibase;
+
+use Wikibase\DataModel\Entity\EntityId;
+use Wikibase\DataModel\Entity\PropertyId;
+
+/**
+ * Interface for tracking entities mentioned while generating RDF.
+ * This information can be used to generate "stub" entries for entities that
+ * are were referenced in the RDF output. Such stubs would typically give at
+ * least a type and a label for the entity.
+ *
+ * @since 0.5
+ *
+ * @licence GNU GPL v2+
+ * @author Daniel Kinzler
+ */
+interface MentionedEntityTracker {
+
+ /**
+ * Should be called when an entity reference (an EntityIdValue object)
is encountered.
+ *
+ * @param EntityId $id
+ */
+ public function entityReferenceMentioned( EntityId $id );
+
+ /**
+ * Should be called when a property is used in a PropertySnak.
+ *
+ * @param PropertyId $id
+ */
+ public function propertyUsed( PropertyId $id );
+
+}
diff --git a/repo/includes/rdf/NullMentionedEntityTracker.php
b/repo/includes/rdf/NullMentionedEntityTracker.php
new file mode 100644
index 0000000..2889e96
--- /dev/null
+++ b/repo/includes/rdf/NullMentionedEntityTracker.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Wikibase;
+
+use Wikibase\DataModel\Entity\EntityId;
+use Wikibase\DataModel\Entity\PropertyId;
+
+/**
+ * Null implementation of MentionedEntityTracker
+ *
+ * @since 0.5
+ *
+ * @licence GNU GPL v2+
+ * @author Daniel Kinzler
+ */
+class NullMentionedEntityTracker implements MentionedEntityTracker {
+
+ /**
+ * Should be called when an entity reference (an EntityIdValue object)
is encountered.
+ *
+ * @param EntityId $id
+ */
+ public function entityReferenceMentioned( EntityId $id ) {}
+
+ /**
+ * Should be called when a property is used in a PropertySnak.
+ *
+ * @param PropertyId $id
+ */
+ public function propertyUsed( PropertyId $id ) {}
+
+}
diff --git a/repo/includes/rdf/RdfBuilder.php b/repo/includes/rdf/RdfBuilder.php
index a453578..d2b31f0 100644
--- a/repo/includes/rdf/RdfBuilder.php
+++ b/repo/includes/rdf/RdfBuilder.php
@@ -8,9 +8,8 @@
use Wikibase\DataModel\Entity\Entity;
use Wikibase\DataModel\Entity\EntityId;
use Wikibase\DataModel\Entity\Property;
-use Wikibase\DataModel\SiteLink;
-use Wikibase\DataModel\Snak\PropertyValueSnak;
use Wikibase\DataModel\Entity\PropertyDataTypeLookup;
+use Wikibase\DataModel\Entity\PropertyId;
use Wikibase\Lib\Store\EntityLookup;
use Wikimedia\Purtle\RdfWriter;
@@ -25,7 +24,7 @@
* @author Daniel Kinzler
* @author Stas Malyshev
*/
-class RdfBuilder {
+class RdfBuilder implements MentionedEntityTracker {
/**
* A list of entities mentioned/touched to or by this builder.
@@ -110,10 +109,7 @@
*/
private function newSimpleValueRdfBuilder( RdfVocabulary $vocabulary,
PropertyDataTypeLookup $propertyLookup ) {
$simpleValueBuilder = new SimpleValueRdfBuilder( $vocabulary,
$propertyLookup );
-
- if ( $this->shouldProduce(
RdfProducer::PRODUCE_RESOLVED_ENTITIES ) ) {
- $simpleValueBuilder->setEntityMentionCallback( array(
$this, 'entityMentioned' ) );
- }
+ $simpleValueBuilder->setMentionedEntityTracker( $this );
return $simpleValueBuilder;
}
@@ -139,10 +135,7 @@
$statementValueBuilder = new ComplexValueRdfBuilder(
$vocabulary, $valueWriter, $propertyLookup );
$statementValueBuilder->setValueSeenCallback(
$valueSeen );
-
- if ( $this->shouldProduce(
RdfProducer::PRODUCE_RESOLVED_ENTITIES ) ) {
-
$statementValueBuilder->setEntityMentionCallback( array( $this,
'entityMentioned' ) );
- }
+ $statementValueBuilder->setMentionedEntityTracker(
$this );
} else {
$statementValueBuilder = $simpleValueBuilder;
}
@@ -183,11 +176,7 @@
$statementBuilder = new FullStatementRdfBuilder( $vocabulary,
$writer, $statementValueBuilder );
$statementBuilder->setReferenceSeenCallback( $referenceSeen );
-
- if ( $this->shouldProduce( RdfProducer::PRODUCE_PROPERTIES ) ) {
- $statementBuilder->setPropertyMentionCallback( array(
$this, 'entityMentioned' ) );
- }
-
+ $statementBuilder->setMentionedEntityTracker( $this );
$statementBuilder->setProduceQualifiers( $this->shouldProduce(
RdfProducer::PRODUCE_QUALIFIERS ) );
$statementBuilder->setProduceReferences( $this->shouldProduce(
RdfProducer::PRODUCE_REFERENCES ) );
@@ -244,15 +233,35 @@
}
/**
+ * @see MentionedEntityTracker::entityReferenceMentioned
+ *
+ * @param EntityId $id
+ */
+ public function entityReferenceMentioned( EntityId $id ) {
+ if ( $this->shouldProduce(
RdfProducer::PRODUCE_RESOLVED_ENTITIES ) ) {
+ $this->entityToResolve( $id );
+ }
+ }
+
+ /**
+ * @see MentionedEntityTracker::propertyUsed
+ *
+ * @param PropertyId $id
+ */
+ public function propertyUsed( PropertyId $id ) {
+ if ( $this->shouldProduce( RdfProducer::PRODUCE_PROPERTIES ) ) {
+ $this->entityToResolve( $id );
+ }
+ }
+
+ /**
* Registers an entity as mentioned.
* Will be recorded as unresolved
* if it wasn't already marked as resolved.
*
- * @todo Make callback private once we drop PHP 5.3 compat.
- *
* @param EntityId $entityId
*/
- public function entityMentioned( EntityId $entityId ) {
+ private function entityToResolve( EntityId $entityId ) {
$prefixedId = $entityId->getSerialization();
if ( !isset( $this->entitiesResolved[$prefixedId] ) ) {
diff --git a/repo/includes/rdf/SimpleValueRdfBuilder.php
b/repo/includes/rdf/SimpleValueRdfBuilder.php
index e628a8e..a3cef9b 100644
--- a/repo/includes/rdf/SimpleValueRdfBuilder.php
+++ b/repo/includes/rdf/SimpleValueRdfBuilder.php
@@ -27,9 +27,9 @@
class SimpleValueRdfBuilder implements SnakValueRdfBuilder {
/**
- * @var callable
+ * @var MentionedEntityTracker
*/
- private $entityMentionCallback = null;
+ private $mentionedEntityTracker;
/**
* @var RdfVocabulary
@@ -52,20 +52,21 @@
// TODO: if data is fixed to be always Gregorian, replace with
// DateTimeValueCleaner
$this->dateCleaner = new JulianDateTimeValueCleaner();
+ $this->mentionedEntityTracker = new
NullMentionedEntityTracker();
}
/**
- * @return callable
+ * @return MentionedEntityTracker
*/
- public function getEntityMentionCallback() {
- return $this->entityMentionCallback;
+ public function getMentionedEntityTracker() {
+ return $this->mentionedEntityTracker;
}
/**
- * @param callable $entityMentionCallback
+ * @param MentionedEntityTracker $mentionedEntityTracker
*/
- public function setEntityMentionCallback( $entityMentionCallback ) {
- $this->entityMentionCallback = $entityMentionCallback;
+ public function setMentionedEntityTracker( $mentionedEntityTracker ) {
+ $this->mentionedEntityTracker = $mentionedEntityTracker;
}
/**
@@ -139,9 +140,7 @@
$entityLName = $this->vocabulary->getEntityLName( $entityId );
$writer->say( $propertyValueNamespace, $propertyValueLName
)->is( RdfVocabulary::NS_ENTITY, $entityLName );
- if ( $this->entityMentionCallback ) {
- call_user_func( $this->entityMentionCallback, $entityId
);
- }
+ $this->mentionedEntityTracker->entityReferenceMentioned(
$entityId );
}
/**
diff --git a/repo/tests/phpunit/includes/rdf/ComplexValueRdfBuilderTest.php
b/repo/tests/phpunit/includes/rdf/ComplexValueRdfBuilderTest.php
index 0b5f26b..123cd67 100644
--- a/repo/tests/phpunit/includes/rdf/ComplexValueRdfBuilderTest.php
+++ b/repo/tests/phpunit/includes/rdf/ComplexValueRdfBuilderTest.php
@@ -57,10 +57,13 @@
* @return ComplexValueRdfBuilder
*/
private function newBuilder( array &$mentioned = array(), array
$valuesSeen = array() ) {
- $entityMentioned = function( EntityId $id ) use ( &$mentioned )
{
- $key = $id->getSerialization();
- $mentioned[$key] = $id;
- };
+ $mentionTracker = $this->getMock(
'Wikibase\MentionedEntityTracker' );
+ $mentionTracker->expects( $this->any() )
+ ->method( 'entityReferenceMentioned' )
+ ->willReturnCallback( function( EntityId $id ) use (
&$mentioned ) {
+ $key = $id->getSerialization();
+ $mentioned[$key] = $id;
+ } );
$vocabulary = $this->getTestData()->getVocabulary();
$valueWriter = $this->getTestData()->getNTriplesWriter();
@@ -70,7 +73,7 @@
};
$builder = new ComplexValueRdfBuilder( $vocabulary,
$valueWriter, $this->getTestData()->getMockRepository() );
- $builder->setEntityMentionCallback( $entityMentioned );
+ $builder->setMentionedEntityTracker( $mentionTracker );
$builder->setValueSeenCallback( $valueSeenCallback );
// HACK: glue on the value writer as a public field, so we can
evaluate it later.
diff --git a/repo/tests/phpunit/includes/rdf/FullStatementsRdfBuilderTest.php
b/repo/tests/phpunit/includes/rdf/FullStatementsRdfBuilderTest.php
index ce5f0b3..777d782 100644
--- a/repo/tests/phpunit/includes/rdf/FullStatementsRdfBuilderTest.php
+++ b/repo/tests/phpunit/includes/rdf/FullStatementsRdfBuilderTest.php
@@ -53,10 +53,13 @@
$writer = $this->getTestData()->getNTriplesWriter();
- $entityMentioned = function( EntityId $id ) use ( &$mentioned )
{
- $key = $id->getSerialization();
- $mentioned[$key] = $id;
- };
+ $mentionTracker = $this->getMock(
'Wikibase\MentionedEntityTracker' );
+ $mentionTracker->expects( $this->any() )
+ ->method( 'propertyUsed' )
+ ->willReturnCallback( function( EntityId $id ) use (
&$mentioned ) {
+ $key = $id->getSerialization();
+ $mentioned[$key] = $id;
+ } );
if ( $flavor & RdfProducer::PRODUCE_FULL_VALUES ) {
$valueWriter = $writer->sub();
@@ -74,7 +77,7 @@
$statementBuilder->setReferenceSeenCallback(
$referenceSeenCallback );
if ( $flavor & RdfProducer::PRODUCE_PROPERTIES ) {
- $statementBuilder->setPropertyMentionCallback(
$entityMentioned );
+ $statementBuilder->setMentionedEntityTracker(
$mentionTracker );
}
$statementBuilder->setProduceQualifiers( $flavor &
RdfProducer::PRODUCE_QUALIFIERS );
diff --git a/repo/tests/phpunit/includes/rdf/SimpleValueRdfBuilderTest.php
b/repo/tests/phpunit/includes/rdf/SimpleValueRdfBuilderTest.php
index c41a7c4..bd4919c 100644
--- a/repo/tests/phpunit/includes/rdf/SimpleValueRdfBuilderTest.php
+++ b/repo/tests/phpunit/includes/rdf/SimpleValueRdfBuilderTest.php
@@ -57,15 +57,18 @@
* @return SimpleValueRdfBuilder
*/
private function newBuilder( array &$mentioned = array() ) {
- $entityMentioned = function( EntityId $id ) use ( &$mentioned )
{
+ $mentionTracker = $this->getMock(
'Wikibase\MentionedEntityTracker' );
+ $mentionTracker->expects( $this->any() )
+ ->method( 'entityReferenceMentioned' )
+ ->willReturnCallback( function( EntityId $id ) use (
&$mentioned ) {
$key = $id->getSerialization();
$mentioned[$key] = $id;
- };
+ } );
$vocabulary = $this->getTestData()->getVocabulary();
$builder = new SimpleValueRdfBuilder( $vocabulary,
$this->getTestData()->getMockRepository() );
- $builder->setEntityMentionCallback( $entityMentioned );
+ $builder->setMentionedEntityTracker( $mentionTracker );
return $builder;
}
--
To view, visit https://gerrit.wikimedia.org/r/204501
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I303c97a79c272635e5aa7c61ea20790dccdfb4ed
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