Jeroen De Dauw has uploaded a new change for review.
https://gerrit.wikimedia.org/r/68652
Change subject: Extract from doDiff method in MapDiffer
......................................................................
Extract from doDiff method in MapDiffer
Change-Id: I586ad0c3b1aba8b639da7edbf24c5778497f7d7c
---
M includes/differ/MapDiffer.php
1 file changed, 61 insertions(+), 32 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Diff
refs/changes/52/68652/1
diff --git a/includes/differ/MapDiffer.php b/includes/differ/MapDiffer.php
index 24454ee..5f01989 100644
--- a/includes/differ/MapDiffer.php
+++ b/includes/differ/MapDiffer.php
@@ -3,6 +3,7 @@
namespace Diff;
use Exception;
+use LogicException;
/**
* Differ that does an associative diff between two arrays,
@@ -99,45 +100,73 @@
$diffSet = array();
- foreach ( array_merge( array_keys( $oldSet ), array_keys(
$newSet ) ) as $key ) {
- $hasOld = array_key_exists( $key, $oldSet );
- $hasNew = array_key_exists( $key, $newSet );
+ foreach ( $this->getAllKeys( $oldSet, $newSet ) as $key ) {
+ $diffOp = $this->getDiffOpForElement( $key, $oldSet,
$newSet );
- if ( $this->recursively ) {
- if ( ( !$hasOld || is_array( $oldSet[$key] ) )
&& ( !$hasNew || is_array( $newSet[$key] ) ) ) {
-
- $old = $hasOld ? $oldSet[$key] :
array();
- $new = $hasNew ? $newSet[$key] :
array();
-
- if ( $this->isAssociative( $old ) ||
$this->isAssociative( $new ) ) {
- $diff = new Diff(
$this->doDiff( $old, $new ), true );
- }
- else {
- $diff = new Diff(
$this->listDiffer->doDiff( $old, $new ), false );
- }
-
- if ( !$diff->isEmpty() ) {
- $diffSet[$key] = $diff;
- }
-
- continue;
- }
- }
-
- if ( $hasOld && $hasNew ) {
- $diffSet[$key] = new DiffOpChange(
$oldSet[$key], $newSet[$key] );
- }
- elseif ( $hasOld ) {
- $diffSet[$key] = new DiffOpRemove(
$oldSet[$key] );
- }
- elseif ( $hasNew ) {
- $diffSet[$key] = new DiffOpAdd( $newSet[$key] );
+ if ( $diffOp !== null ) {
+ $diffSet[$key] = $diffOp;
}
}
return $diffSet;
}
+ protected function getAllKeys( $oldSet, $newSet ) {
+ return array_unique( array_merge(
+ array_keys( $oldSet ),
+ array_keys( $newSet )
+ ) );
+ }
+
+ protected function getDiffOpForElement( $key, array $oldSet, array
$newSet ) {
+ $hasOld = array_key_exists( $key, $oldSet );
+ $hasNew = array_key_exists( $key, $newSet );
+
+ if ( $this->recursively ) {
+ $diffOp = $this->getDiffOpForElementRecursively( $key,
$oldSet, $newSet );
+
+ if ( $diffOp !== null ) {
+ return $diffOp;
+ }
+ }
+
+ if ( $hasOld && $hasNew ) {
+ return new DiffOpChange( $oldSet[$key], $newSet[$key] );
+ }
+ elseif ( $hasOld ) {
+ return new DiffOpRemove( $oldSet[$key] );
+ }
+ elseif ( $hasNew ) {
+ return new DiffOpAdd( $newSet[$key] );
+ }
+
+ throw new LogicException( 'The element needs to exist in either
the old or new list to compare' );
+ }
+
+ protected function getDiffOpForElementRecursively( $key, array $oldSet,
array $newSet ) {
+ $old = array_key_exists( $key, $oldSet ) ? $oldSet[$key] :
array();
+ $new = array_key_exists( $key, $newSet ) ? $newSet[$key] :
array();
+
+ if ( is_array( $old ) && is_array( $new ) ) {
+ $diff = $this->getDiffForArrays( $old, $new );
+
+ if ( !$diff->isEmpty() ) {
+ return $diff;
+ }
+ }
+
+ return null;
+ }
+
+ protected function getDiffForArrays( array $old, array $new ) {
+ if ( $this->isAssociative( $old ) || $this->isAssociative( $new
) ) {
+ return new Diff( $this->doDiff( $old, $new ), true );
+ }
+ else {
+ return new Diff( $this->listDiffer->doDiff( $old, $new
), false );
+ }
+ }
+
/**
* Returns if an array is associative or not.
*
--
To view, visit https://gerrit.wikimedia.org/r/68652
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I586ad0c3b1aba8b639da7edbf24c5778497f7d7c
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Diff
Gerrit-Branch: master
Gerrit-Owner: Jeroen De Dauw <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits