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 2012/07/09 17:25:21 UTC

svn commit: r1359216 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeState.java

Author: jukka
Date: Mon Jul  9 15:25:21 2012
New Revision: 1359216

URL: http://svn.apache.org/viewvc?rev=1359216&view=rev
Log:
OAK-172: Optimize KernelNodeState equality checks

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeState.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeState.java?rev=1359216&r1=1359215&r2=1359216&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeState.java Mon Jul  9 15:25:21 2012
@@ -43,7 +43,7 @@ import java.util.Map.Entry;
  * Basic {@link NodeState} implementation based on the {@link MicroKernel}
  * interface. This class makes an attempt to load data lazily.
  */
-class KernelNodeState extends AbstractNodeState {
+final class KernelNodeState extends AbstractNodeState {
 
     /**
      * Maximum number of child nodes kept in memory.
@@ -61,6 +61,8 @@ class KernelNodeState extends AbstractNo
 
     private long childNodeCount = -1;
 
+    private String hash = null;
+
     // TODO: WeakReference?
     private Map<String, NodeState> childNodes;
 
@@ -89,7 +91,8 @@ class KernelNodeState extends AbstractNo
     private synchronized void init() {
         if (properties == null) {
             String json = kernel.getNodes(
-                    path, revision, 0, 0, MAX_CHILD_NODE_NAMES, null);
+                    path, revision, 0, 0, MAX_CHILD_NODE_NAMES,
+                    "{properties:[\"*\",\":hash\"]}");
 
             JsopReader reader = new JsopTokenizer(json);
             reader.read('{');
@@ -101,6 +104,8 @@ class KernelNodeState extends AbstractNo
                 if (":childNodeCount".equals(name)) {
                     childNodeCount =
                             Long.valueOf(reader.read(JsopReader.NUMBER));
+                } else if (":hash".equals(name)) {
+                    hash = reader.read(JsopReader.STRING);
                 } else if (reader.matches('{')) {
                     reader.read('}');
                     String childPath = path + '/' + name;
@@ -173,6 +178,33 @@ class KernelNodeState extends AbstractNo
         };
     }
 
+    //------------------------------------------------------------< Object >--
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        } else if (object instanceof KernelNodeState) {
+            KernelNodeState that = (KernelNodeState) object;
+            // When both instances come from the same MicroKernel, we can
+            // use revision/path information or content hashes (when available)
+            // to avoid a full tree comparison in many cases.
+            if (kernel.equals(that.kernel)) {
+                if (revision.equals(that.revision) && path.equals(that.path)) {
+                    return true;
+                } else {
+                    this.init();
+                    that.init();
+                    if (hash != null && that.hash != null) {
+                        return hash.equals(that.hash);
+                    }
+                }
+            }
+        }
+        // fallback
+        return super.equals(object);
+    }
+
     //------------------------------------------------------------< internal >---
 
     @Nonnull
@@ -251,12 +283,4 @@ class KernelNodeState extends AbstractNo
         }
     }
 
-    private List<CoreValue> readArray(JsopReader reader) {
-        List<CoreValue> values = new ArrayList<CoreValue>();
-        while (!reader.matches(']')) {
-            values.add(CoreValueMapper.fromJsopReader(reader, valueFactory));
-            reader.matches(',');
-        }
-        return values;
-    }
-}
\ No newline at end of file
+}