Hoo man has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/395837 )
Change subject: Revert "Transmit compact diff instead of suppressed diff" ...................................................................... Revert "Transmit compact diff instead of suppressed diff" At least for wmf11 we need to keep transmitting the old diff, wmf10 client's can't yet read the new one. This is because https://gerrit.wikimedia.org/r/393780 and https://gerrit.wikimedia.org/r/394432 are needed on all wikis first. This reverts commit f77b47c5e30c297a43e4ce354c1dfb4a29a638fa. Bug: T182243 Change-Id: Icc06c9949aa4c708fc615feee35639786e99ddca --- M client/includes/Changes/AffectedPagesFinder.php M client/tests/phpunit/includes/Changes/ChangeRunCoalescerTest.php M lib/includes/Changes/DiffChange.php M lib/includes/Changes/EntityChange.php M lib/includes/Changes/EntityChangeFactory.php M lib/tests/phpunit/Changes/EntityChangeFactoryTest.php 6 files changed, 72 insertions(+), 57 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase refs/changes/37/395837/1 diff --git a/client/includes/Changes/AffectedPagesFinder.php b/client/includes/Changes/AffectedPagesFinder.php index a5450e2..4794df7 100644 --- a/client/includes/Changes/AffectedPagesFinder.php +++ b/client/includes/Changes/AffectedPagesFinder.php @@ -122,7 +122,7 @@ $aspects = []; $info = $change->getInfo(); - // We might unserialize old EntityChange which doesn't have getCompactDiff method + // We might unserialize old EntityChange which doesn't have getAspectsDiff method if ( array_key_exists( 'compactDiff', $info ) ) { $diffAspects = $info['compactDiff']; } else { @@ -240,7 +240,7 @@ if ( $change instanceof ItemChange && in_array( EntityUsage::TITLE_USAGE, $changedAspects ) ) { $info = $change->getInfo(); - // We might unserialize old EntityChange which doesn't have getCompactDiff method + // We might unserialize old EntityChange which doesn't have getAspectsDiff method if ( array_key_exists( 'compactDiff', $info ) ) { $diffChangedAspects = $info['compactDiff']; } else { diff --git a/client/tests/phpunit/includes/Changes/ChangeRunCoalescerTest.php b/client/tests/phpunit/includes/Changes/ChangeRunCoalescerTest.php index 8081361..4bc5c1c 100644 --- a/client/tests/phpunit/includes/Changes/ChangeRunCoalescerTest.php +++ b/client/tests/phpunit/includes/Changes/ChangeRunCoalescerTest.php @@ -2,6 +2,8 @@ namespace Wikibase\Client\Tests\Changes; +use Diff\DiffOp\AtomicDiffOp; +use Traversable; use Wikibase\Change; use Wikibase\Client\Changes\ChangeRunCoalescer; use Wikibase\DataModel\Entity\Item; @@ -10,7 +12,6 @@ use Wikibase\DataModel\SiteLink; use Wikibase\EntityChange; use Wikibase\ItemChange; -use Wikibase\Lib\Changes\EntityDiffChangedAspectsFactory; use Wikibase\Lib\Store\EntityRevisionLookup; use Wikibase\Lib\Tests\MockRepository; use Wikibase\Lib\Tests\Changes\TestChanges; @@ -132,8 +133,7 @@ } $change->setEntityId( new ItemId( $values['object_id'] ) ); - $diffAspects = ( new EntityDiffChangedAspectsFactory() )->newFromEntityDiff( $diff ); - $change->setCompactDiff( $diffAspects ); + $change->setDiff( $diff ); return $change; } @@ -192,10 +192,29 @@ $this->assertArrayEquals( $expected->getMetadata(), $actual->getMetadata(), false, true ); } - $this->assertSame( - $expected->getCompactDiff()->toArray(), - $actual->getCompactDiff()->toArray() - ); + $this->assertDiffsEqual( $expected->getDiff(), $actual->getDiff() ); + } + + private function assertDiffsEqual( $expected, $actual, $path = '' ) { + if ( $expected instanceof AtomicDiffOp ) { + //$this->assertEquals( $expected->getType(), $actual->getType(), $path . ' DiffOp.type' ); + $this->assertEquals( serialize( $expected ), serialize( $actual ), $path . ' DiffOp' ); + return; + } + + if ( $expected instanceof Traversable ) { + $expected = iterator_to_array( $expected ); + $actual = iterator_to_array( $actual ); + } + + foreach ( $expected as $key => $expectedValue ) { + $currentPath = "$path/$key"; + $this->assertArrayHasKey( $key, $actual, $currentPath . " missing key" ); + $this->assertDiffsEqual( $expectedValue, $actual[$key], $currentPath ); + } + + $extraKeys = array_diff( array_keys( $actual ), array_keys( $expected ) ); + $this->assertEquals( [], $extraKeys, $path . " extra keys" ); } public function provideCoalesceChanges() { diff --git a/lib/includes/Changes/DiffChange.php b/lib/includes/Changes/DiffChange.php index f004ca4..7c651f6 100644 --- a/lib/includes/Changes/DiffChange.php +++ b/lib/includes/Changes/DiffChange.php @@ -3,8 +3,6 @@ namespace Wikibase; use Diff\DiffOp\Diff\Diff; -use Wikibase\Lib\Changes\EntityDiffChangedAspects; -use Wikibase\Lib\Changes\EntityDiffChangedAspectsFactory; /** * Class for changes that can be represented as a Diff. @@ -36,28 +34,6 @@ public function setDiff( Diff $diff ) { $info = $this->getInfo(); $info['diff'] = $diff; - $this->setField( 'info', $info ); - } - - /** - * @return EntityDiffChangedAspects - */ - public function getCompactDiff() { - $info = $this->getInfo(); - - if ( !array_key_exists( 'compactDiff', $info ) ) { - // This shouldn't happen, but we should be robust against corrupt, incomplete - // obsolete instances in the database, etc. - wfLogWarning( 'Cannot get the diff when it has not been set yet.' ); - return ( new EntityDiffChangedAspectsFactory() )->newFromEntityDiff( new Diff() ); - } else { - return $info['compactDiff']; - } - } - - public function setCompactDiff( EntityDiffChangedAspects $diff ) { - $info = $this->getInfo(); - $info['compactDiff'] = $diff; $this->setField( 'info', $info ); } diff --git a/lib/includes/Changes/EntityChange.php b/lib/includes/Changes/EntityChange.php index 9c6755c..ca993bd 100644 --- a/lib/includes/Changes/EntityChange.php +++ b/lib/includes/Changes/EntityChange.php @@ -3,7 +3,6 @@ namespace Wikibase; use Deserializers\Deserializer; -use Diff\DiffOp\Diff\Diff; use Diff\DiffOp\DiffOp; use Diff\DiffOpFactory; use MWException; @@ -17,8 +16,6 @@ use Wikibase\DataModel\Entity\BasicEntityIdParser; use Wikibase\DataModel\Services\Diff\EntityTypeAwareDiffOpFactory; use Wikibase\DataModel\Statement\Statement; -use Wikibase\Lib\Changes\EntityDiffChangedAspects; -use Wikibase\Lib\Changes\EntityDiffChangedAspectsFactory; use Wikibase\Repo\WikibaseRepo; /** @@ -292,14 +289,6 @@ return $array; } ); - } - } - - if ( isset( $info['compactDiff'] ) ) { - $diff = $info['compactDiff']; - - if ( $diff instanceof EntityDiffChangedAspects ) { - $info['compactDiff'] = $diff->serialize(); } } diff --git a/lib/includes/Changes/EntityChangeFactory.php b/lib/includes/Changes/EntityChangeFactory.php index ba2b3cd..82c2aa9 100644 --- a/lib/includes/Changes/EntityChangeFactory.php +++ b/lib/includes/Changes/EntityChangeFactory.php @@ -8,6 +8,9 @@ use Wikibase\DataModel\Entity\EntityId; use Wikibase\DataModel\Entity\EntityIdParser; use Wikibase\DataModel\Services\Diff\EntityDiffer; +use Wikibase\DataModel\Statement\StatementListProvider; +use Wikibase\DataModel\Term\AliasGroupList; +use Wikibase\DataModel\Term\FingerprintProvider; use Wikibase\EntityChange; use Wikimedia\Assert\Assert; @@ -137,6 +140,9 @@ throw new MWException( 'Either $oldEntity or $newEntity must be given' ); } + $this->minimizeEntityForDiffing( $oldEntity ); + $this->minimizeEntityForDiffing( $newEntity ); + if ( $oldEntity === null ) { $id = $newEntity->getId(); $diff = $this->entityDiffer->getConstructionDiff( $newEntity ); @@ -151,10 +157,29 @@ } $instance = $this->newForEntity( $action, $id ); - $aspectsDiff = ( new EntityDiffChangedAspectsFactory() )->newFromEntityDiff( $diff ); - $instance->setCompactDiff( $aspectsDiff ); + $instance->setDiff( $diff ); return $instance; } + /** + * Hack: Don't include statement, description and alias diffs, since those are unused and not + * helpful performance-wise to the dispatcher and change handling. + * + * @fixme Implement T113468 and remove this. + * + * @param EntityDocument|null $entity + */ + private function minimizeEntityForDiffing( EntityDocument $entity = null ) { + if ( $entity instanceof StatementListProvider ) { + $entity->getStatements()->clear(); + } + + if ( $entity instanceof FingerprintProvider ) { + $fingerprint = $entity->getFingerprint(); + + $fingerprint->setAliasGroups( new AliasGroupList() ); + } + } + } diff --git a/lib/tests/phpunit/Changes/EntityChangeFactoryTest.php b/lib/tests/phpunit/Changes/EntityChangeFactoryTest.php index 1beec9d..0ca1f57 100644 --- a/lib/tests/phpunit/Changes/EntityChangeFactoryTest.php +++ b/lib/tests/phpunit/Changes/EntityChangeFactoryTest.php @@ -2,6 +2,9 @@ namespace Wikibase\Lib\Tests\Changes; +use Diff\DiffOp\Diff\Diff; +use Diff\DiffOp\DiffOpAdd; +use Diff\DiffOp\DiffOpRemove; use Wikibase\DataModel\Entity\BasicEntityIdParser; use Wikibase\DataModel\Entity\EntityId; use Wikibase\DataModel\Entity\Item; @@ -126,8 +129,8 @@ $this->assertEquals( 'wikibase-item~update', $change->getType(), 'type' ); $this->assertEquals( - [ 'es' ], - $change->getCompactDiff()->getLabelChanges(), + new Diff( [ 'es' => new DiffOpAdd( 'gato' ) ] ), + $change->getDiff()->getLabelsDiff(), 'diff' ); } @@ -146,8 +149,8 @@ $this->assertEquals( 'wikibase-item~add', $change->getType(), 'type' ); $this->assertEquals( - [ 'en' ], - $change->getCompactDiff()->getLabelChanges(), + new Diff( [ 'en' => new DiffOpAdd( 'kitten' ) ] ), + $change->getDiff()->getLabelsDiff(), 'diff' ); } @@ -166,8 +169,8 @@ $this->assertEquals( 'wikibase-property~remove', $change->getType(), 'type' ); $this->assertEquals( - [ 'de' ], - $change->getCompactDiff()->getLabelChanges(), + new Diff( [ 'de' => new DiffOpRemove( 'Katze' ) ] ), + $change->getDiff()->getLabelsDiff(), 'diff' ); } @@ -186,8 +189,12 @@ $this->assertEquals( 'wikibase-item~restore', $change->getType(), 'type' ); $this->assertEquals( - [ 'enwiki' => [ null, 'Kitten', false ] ], - $change->getCompactDiff()->getSiteLinkChanges(), + new Diff( [ + 'enwiki' => new Diff( [ + 'name' => new DiffOpAdd( 'Kitten' ) + ] ) + ] ), + $change->getDiff()->getSiteLinkDiff(), 'diff' ); } @@ -211,9 +218,8 @@ $change = $factory->newFromUpdate( EntityChange::UPDATE, $item, $updatedItem ); - $this->assertSame( - [ 'P10', 'P9000' ], - $change->getCompactDiff()->getStatementChanges(), + $this->assertTrue( + $change->getDiff()->isEmpty(), 'Diff excludes statement changes and is empty' ); } -- To view, visit https://gerrit.wikimedia.org/r/395837 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Icc06c9949aa4c708fc615feee35639786e99ddca Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: wmf/1.31.0-wmf.11 Gerrit-Owner: Hoo man <h...@online.de> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits