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

Reply via email to