You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2013/07/17 15:19:23 UTC

svn commit: r1504116 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Template.java

Author: jukka
Date: Wed Jul 17 13:19:23 2013
New Revision: 1504116

URL: http://svn.apache.org/r1504116
Log:
OAK-630: SegmentMK: Implement compareAgainstBaseState

Add special cases for many-to-none and many-to-one comparisons

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Template.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Template.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Template.java?rev=1504116&r1=1504115&r2=1504116&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Template.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Template.java Wed Jul 17 13:19:23 2013
@@ -485,6 +485,36 @@ public class Template {
                     }
                 }
             }
+        } else if (beforeTemplate.hasNoChildNodes()) {
+            for (ChildNodeEntry entry : getChildNodeEntries(store, afterId)) {
+                if (!diff.childNodeAdded(
+                        entry.getName(), entry.getNodeState())) {
+                    return false;
+                }
+            }
+        } else if (beforeTemplate.hasOneChildNode()) {
+            String name = beforeTemplate.getChildName();
+            for (ChildNodeEntry entry : getChildNodeEntries(store, afterId)) {
+                String childName = entry.getName();
+                NodeState afterChild = entry.getNodeState();
+                if (name.equals(childName)) {
+                    NodeState beforeChild =
+                            beforeTemplate.getChildNode(name, store, beforeId);
+                    if (beforeChild.exists()) {
+                        if (!afterChild.equals(beforeChild)
+                                && !diff.childNodeChanged(
+                                        childName, beforeChild, afterChild)) {
+                            return false;
+                        }
+                    } else {
+                        if (!diff.childNodeAdded(childName, afterChild)) {
+                            return false;
+                        }
+                    }
+                } else if (!diff.childNodeAdded(childName, afterChild)) {
+                    return false;
+                }
+            }
         } else {
             // TODO: Leverage the HAMT data structure for the comparison
             Set<String> baseChildNodes = new HashSet<String>();
@@ -499,7 +529,7 @@ public class Template {
                     }
                 } else {
                     baseChildNodes.add(name);
-                    if (!beforeChild.equals(afterChild)) {
+                    if (!afterChild.equals(beforeChild)) {
                         if (!diff.childNodeChanged(name, beforeChild, afterChild)) {
                             return false;
                         }