Henning Snater has uploaded a new change for review.

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


Change subject: Implemented index in ChangeOpReference
......................................................................

Implemented index in ChangeOpReference

(requires change I38031e6eae6bed107241e4a9c34a67c7c7abee13)
ChangeOpReference supports specifying the index of a Reference within the list 
of References.

Change-Id: I0941d1227c873a0d84a1d486d036644874ec1fb1
---
M repo/includes/ChangeOp/ChangeOpReference.php
M repo/tests/phpunit/includes/changeop/ChangeOpReferenceTest.php
2 files changed, 55 insertions(+), 7 deletions(-)


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

diff --git a/repo/includes/ChangeOp/ChangeOpReference.php 
b/repo/includes/ChangeOp/ChangeOpReference.php
index 05f9510..01d2fd9 100644
--- a/repo/includes/ChangeOp/ChangeOpReference.php
+++ b/repo/includes/ChangeOp/ChangeOpReference.php
@@ -51,6 +51,13 @@
        protected $idFormatter;
 
        /**
+        * @since 0.5
+        *
+        * @var int|null
+        */
+       protected $index;
+
+       /**
         * Constructs a new reference change operation
         *
         * @since 0.4
@@ -59,10 +66,17 @@
         * @param Reference|null $reference
         * @param string $referenceHash
         * @param EntityIdFormatter $idFormatter
+        * @param int|null $index
         *
         * @throws \InvalidArgumentException
         */
-       public function __construct( $claimGuid, $reference, $referenceHash, 
EntityIdFormatter $idFormatter ) {
+       public function __construct(
+               $claimGuid,
+               $reference,
+               $referenceHash,
+               EntityIdFormatter $idFormatter,
+               $index = null
+       ) {
                if ( !is_string( $claimGuid ) || $claimGuid === '' ) {
                        throw new InvalidArgumentException( '$claimGuid needs 
to be a string and must not be empty' );
                }
@@ -79,10 +93,15 @@
                        throw new InvalidArgumentException( 'Either 
$referenceHash or $reference needs to be set' );
                }
 
+               if( !is_null( $index ) && !is_integer( $index ) ) {
+                       throw new InvalidArgumentException( '$index needs to be 
null or an integer value' );
+               }
+
                $this->claimGuid = $claimGuid;
                $this->reference = $reference;
                $this->referenceHash = $referenceHash;
                $this->idFormatter = $idFormatter;
+               $this->index = $index;
        }
 
        /**
@@ -155,11 +174,16 @@
                if ( !$references->hasReferenceHash( $this->referenceHash ) ) {
                        throw new ChangeOpException( "Reference with hash 
$this->referenceHash does not exist" );
                }
-               if ( $references->hasReference( $this->reference ) ) {
-                       throw new ChangeOpException( "Claim has already a 
reference with hash {$this->reference->getHash()}" );
+
+               $currentIndex = $references->indexOf( $this->reference );
+               $indexMatch = is_null( $this->index ) || $currentIndex === 
$this->index;
+
+               if ( $references->hasReference( $this->reference ) && 
$indexMatch ) {
+                       throw new ChangeOpException( "Claim has already a 
reference with hash "
+                       . "{$this->reference->getHash()} and index 
($currentIndex) is not changed" );
                }
                $references->removeReferenceHash( $this->referenceHash );
-               $references->addReference( $this->reference );
+               $references->addReference( $this->reference, $this->index );
                $this->updateSummary( $summary, 'set' );
        }
 
diff --git a/repo/tests/phpunit/includes/changeop/ChangeOpReferenceTest.php 
b/repo/tests/phpunit/includes/changeop/ChangeOpReferenceTest.php
index f572d9a..f0ce242b 100644
--- a/repo/tests/phpunit/includes/changeop/ChangeOpReferenceTest.php
+++ b/repo/tests/phpunit/includes/changeop/ChangeOpReferenceTest.php
@@ -8,6 +8,7 @@
 use Wikibase\ItemContent;
 use Wikibase\Repo\WikibaseRepo;
 use Wikibase\Lib\ClaimGuidGenerator;
+use Wikibase\PropertyNoValueSnak;
 use Wikibase\Reference;
 use Wikibase\SnakList;
 use InvalidArgumentException;
@@ -44,6 +45,7 @@
                $args[] = array( $validClaimGuid, 'notAReference', 
$validReferenceHash, $validIdFormatter );
                $args[] = array( $validClaimGuid, 'notAReference', '', 
$validIdFormatter );
                $args[] = array( $validClaimGuid, null, '', $validIdFormatter );
+               $args[] = array( $validClaimGuid, $validReference, 
$validReferenceHash, $validIdFormatter, 'string' );
 
                return $args;
        }
@@ -53,12 +55,11 @@
         *
         * @expectedException InvalidArgumentException
         */
-       public function testInvalidConstruct( $claimGuid, $reference, 
$referenceHash, $idFormatter ) {
-               $ChangeOpQualifier = new ChangeOpReference( $claimGuid, 
$reference, $referenceHash, $idFormatter );
+       public function testInvalidConstruct( $claimGuid, $reference, 
$referenceHash, $idFormatter, $index = null ) {
+               new ChangeOpReference( $claimGuid, $reference, $referenceHash, 
$idFormatter, $index );
        }
 
        public function changeOpAddProvider() {
-               $idFormatter = 
WikibaseRepo::getDefaultInstance()->getIdFormatter();
                $snak = new \Wikibase\PropertyValueSnak( 2754236, new 
\DataValues\StringValue( 'test' ) );
                $args = array();
 
@@ -147,6 +148,29 @@
                $changeOp = new ChangeOpReference( $claimGuid, 
$changedReference, $referenceHash, $idFormatter );
                $args[] = array ( $item, $changeOp, 
$changedReference->getHash() );
 
+               // Just change a reference's index:
+               $item = $this->provideNewItemWithClaim( 'q123', $snak );
+               $claims = $item->getClaims();
+
+               $references = array(
+                       new Reference( new SnakList( array( new 
PropertyNoValueSnak( 1 ) ) ) ),
+                       new Reference( new SnakList( array( new 
PropertyNoValueSnak( 2 ) ) ) ),
+               );
+
+               $referenceList = $claims[0]->getReferences();
+               $referenceList->addReference( $references[0] );
+               $referenceList->addReference( $references[1] );
+
+               $item->setClaims( new Claims( $claims ) );
+               $changeOp = new ChangeOpReference(
+                       $claims[0]->getGuid(),
+                       $references[1],
+                       $references[1]->getHash(),
+                       $idFormatter,
+                       0
+               );
+               $args[] = array ( $item, $changeOp, $references[1]->getHash() );
+
                return $args;
        }
 

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0941d1227c873a0d84a1d486d036644874ec1fb1
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Henning Snater <[email protected]>

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

Reply via email to