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

Reply via email to