Ladsgroup has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/394999 )

Change subject: All the backward compatibility needed for compact diff 
representation
......................................................................

All the backward compatibility needed for compact diff representation

Bug: T113468
Change-Id: I1bf483b42bf7c542e5f847680377ee2d65cdc4dc
---
M client/includes/Changes/AffectedPagesFinder.php
M client/tests/phpunit/includes/Changes/AffectedPagesFinderTest.php
M lib/includes/Changes/ItemChange.php
M lib/tests/phpunit/Changes/ItemChangeTest.php
4 files changed, 99 insertions(+), 25 deletions(-)


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

diff --git a/client/includes/Changes/AffectedPagesFinder.php 
b/client/includes/Changes/AffectedPagesFinder.php
index 99632b5..cec0eeb 100644
--- a/client/includes/Changes/AffectedPagesFinder.php
+++ b/client/includes/Changes/AffectedPagesFinder.php
@@ -16,7 +16,6 @@
 use Wikibase\DataModel\Entity\EntityId;
 use Wikibase\EntityChange;
 use Wikibase\ItemChange;
-use Wikibase\Lib\Changes\EntityDiffChangedAspects;
 use Wikibase\Lib\Changes\EntityDiffChangedAspectsFactory;
 use Wikibase\Lib\Store\StorageException;
 
@@ -115,21 +114,21 @@
        }
 
        /**
-        * @param EntityChange|EntityDiffChangedAspects $change
+        * @param EntityChange $change
         *
         * @return string[]
         */
-       public function getChangedAspects( $change ) {
+       public function getChangedAspects( EntityChange $change ) {
                $aspects = [];
 
-               if ( $change instanceof EntityChange ) {
-                       $diff = $change->getDiff();
-                       $diffAspects = ( new EntityDiffChangedAspectsFactory() 
)->newFromEntityDiff( $diff );
-               } elseif ( $change instanceof EntityDiffChangedAspects ) {
-                       $diffAspects = $change;
+               $info = $change->getInfo();
+               // We might unserialize old EntityChange which doesn't have 
getAspectsDiff method
+               if ( array_key_exists( 'compactDiff', $info ) ) {
+                       $diffAspects = $info['compactDiff'];
                } else {
-                       throw  new InvalidArgumentException( 
'AffectedPagesFinder::getChangedAspects accepts ' .
-                               'EntityChange or EntityDiffChangedAspects' );
+                       $diffAspects = ( new EntityDiffChangedAspectsFactory() 
)->newFromEntityDiff(
+                               $change->getDiff()
+                       );
                }
 
                if ( $diffAspects->getSiteLinkChanges() !== [] ) {
@@ -218,9 +217,15 @@
                $usages = $this->transformAllPageEntityUsages( $usages, 
$entityId, $changedAspects );
 
                if ( $change instanceof ItemChange && in_array( 
EntityUsage::TITLE_USAGE, $changedAspects ) ) {
-                       $diffChangedAspects = ( new 
EntityDiffChangedAspectsFactory() )->newFromEntityDiff(
-                               $change->getDiff()
-                       );
+                       $info = $change->getInfo();
+                       // We might unserialize old EntityChange which doesn't 
have getAspectsDiff method
+                       if ( array_key_exists( 'compactDiff', $info ) ) {
+                               $diffChangedAspects = $info['compactDiff'];
+                       } else {
+                               $diffChangedAspects = ( new 
EntityDiffChangedAspectsFactory() )->newFromEntityDiff(
+                                       $change->getDiff()
+                               );
+                       }
                        $namesFromDiff = $this->getPagesReferencedInDiff(
                                $diffChangedAspects->getSiteLinkChanges()
                        );
diff --git a/client/tests/phpunit/includes/Changes/AffectedPagesFinderTest.php 
b/client/tests/phpunit/includes/Changes/AffectedPagesFinderTest.php
index 59c9432..f166828 100644
--- a/client/tests/phpunit/includes/Changes/AffectedPagesFinderTest.php
+++ b/client/tests/phpunit/includes/Changes/AffectedPagesFinderTest.php
@@ -232,10 +232,18 @@
                $trackUsagesInAllLanguages = false
        ) {
                $referencedPagesFinder = $this->getAffectedPagesFinder( [], [], 
$trackUsagesInAllLanguages );
+               $info = $change->getInfo();
+               if ( !array_key_exists( 'compactDiff', $info ) ) {
+                       $aspects = ( new EntityDiffChangedAspectsFactory() 
)->newFromEntityDiff(
+                               $change->getDiff()
+                       );
+                       $info = $change->getInfo();
+                       $info['compactDiff'] = $aspects;
+                       $change->setField( 'info', $info );
 
-               $aspects = ( new EntityDiffChangedAspectsFactory() 
)->newFromEntityDiff( $change->getDiff() );
-               $actual = $referencedPagesFinder->getChangedAspects( $aspects );
+               }
 
+               $actual = $referencedPagesFinder->getChangedAspects( $change );
                sort( $expected );
                sort( $actual );
                $this->assertEquals( $expected, $actual );
diff --git a/lib/includes/Changes/ItemChange.php 
b/lib/includes/Changes/ItemChange.php
index 467f6dd..706d55e 100644
--- a/lib/includes/Changes/ItemChange.php
+++ b/lib/includes/Changes/ItemChange.php
@@ -2,8 +2,12 @@
 
 namespace Wikibase;
 
+use Diff\DiffOpAdd;
+use Diff\DiffOpChange;
 use Diff\DiffOp\Diff\Diff;
+use Diff\DiffOpRemove;
 use Wikibase\DataModel\Services\Diff\ItemDiff;
+use Wikibase\Lib\Changes\EntityDiffChangedAspects;
 
 /**
  * @license GPL-2.0+
@@ -16,22 +20,60 @@
         * @return Diff
         */
        public function getSiteLinkDiff() {
+               $info = $this->getInfo();
+               if ( !array_key_exists( 'diff', $info ) ) {
+                       if ( !array_key_exists( 'compactDiff', $info ) ) {
+                               $this->logWarning( $this );
+                               return new Diff();
+                       }
+
+                       $aspects = $info['compactDiff'];
+                       if ( !( $aspects instanceof EntityDiffChangedAspects ) 
) {
+                               $this->logWarning( $aspects );
+                               return new Diff();
+                       }
+                       return $this->getDiffFromSiteLinkChanges( 
$aspects->getSiteLinkChanges() );
+
+               }
                $diff = $this->getDiff();
-
                if ( !( $diff instanceof ItemDiff ) ) {
-                       // This shouldn't happen, but we should be robust 
against corrupt, incomplete
-                       // or obsolete instances in the database, etc.
-
-                       $cls = $diff === null ? 'null' : get_class( $diff );
-
-                       wfLogWarning(
-                               'Cannot get sitelink diff from ' . $cls . '. 
Change #' . $this->getId()
-                               . ", type " . $this->getType() );
-
+                       $this->logWarning( $diff );
                        return new Diff();
                } else {
                        return $diff->getSiteLinkDiff();
                }
        }
 
+       private function getDiffFromSiteLinkChanges( array $siteLinkChanges ) {
+               $siteLinkDiff = [];
+               foreach ( $siteLinkChanges as $wiki => $change ) {
+                       if ( $change[0] === $change[1] ) {
+                               continue;
+                       }
+                       $siteLinkDiff[$wiki] = 
$this->getDiffFromSiteLinkChangesPerWiki( $change );
+               }
+
+               return new Diff( $siteLinkDiff, true );
+       }
+
+       private function getDiffFromSiteLinkChangesPerWiki( array $change ) {
+               if ( $change[0] === null && $change[1] !== null ) {
+                       return new Diff( [ 'name' => new DiffOpAdd( $change[1] 
) ], true );
+               } elseif ( $change[0] !== null && $change[1] === null ) {
+                       return new Diff( [ 'name' => new DiffOpRemove( 
$change[0] ) ], true );
+               } else {
+                       return new Diff( [ 'name' => new DiffOpChange( 
$change[0], $change[1] ) ], true );
+               }
+       }
+
+       private function logWarning( $obj ) {
+               // This shouldn't happen, but we should be robust against 
corrupt, incomplete
+               // or obsolete instances in the database, etc.
+
+               $cls = $obj === null ? 'null' : get_class( $obj );
+               wfLogWarning(
+                       'Cannot get sitelink diff from ' . $cls . '. Change #' 
. $this->getId()
+                       . ", type " . $this->getType() );
+       }
+
 }
diff --git a/lib/tests/phpunit/Changes/ItemChangeTest.php 
b/lib/tests/phpunit/Changes/ItemChangeTest.php
index 372f005..7054689 100644
--- a/lib/tests/phpunit/Changes/ItemChangeTest.php
+++ b/lib/tests/phpunit/Changes/ItemChangeTest.php
@@ -8,6 +8,7 @@
 use Wikibase\DataModel\Services\Diff\ItemDiff;
 use Wikibase\EntityChange;
 use Wikibase\ItemChange;
+use Wikibase\Lib\Changes\EntityDiffChangedAspectsFactory;
 
 /**
  * @covers Wikibase\ItemChange
@@ -55,6 +56,24 @@
                $this->assertInstanceOf( Diff::class, $siteLinkDiff, 
'getSiteLinkDiff must return a Diff' );
        }
 
+       /**
+        * @dataProvider changeProvider
+        *
+        * @param ItemChange $change
+        */
+       public function testGetSiteLinkDiffFromCompactDiff( ItemChange $change 
) {
+               $info = $change->getInfo();
+               if ( !array_key_exists( 'compactDiff', $info ) ) {
+                       $aspects = ( new EntityDiffChangedAspectsFactory() 
)->newFromEntityDiff(
+                               $change->getDiff()
+                       );
+                       $info['compactDiff'] = $aspects;
+                       $change->setField( 'info', $info );
+               }
+               $siteLinkDiff = $change->getSiteLinkDiff();
+               $this->assertInstanceOf( Diff::class, $siteLinkDiff, 
'getSiteLinkDiff must return a Diff' );
+       }
+
        public function changeBackwardsCompatProvider() {
                global $wgDevelopmentWarnings;
 

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I1bf483b42bf7c542e5f847680377ee2d65cdc4dc
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: wmf/1.31.0-wmf.10
Gerrit-Owner: Ladsgroup <[email protected]>

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

Reply via email to