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/10/02 17:27:59 UTC

svn commit: r1528519 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment: MapLeaf.java MapRecord.java

Author: jukka
Date: Wed Oct  2 15:27:58 2013
New Revision: 1528519

URL: http://svn.apache.org/r1528519
Log:
OAK-1031: SegmentMK: Fewer segment lookups

Some further MapLeaf simplifications

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

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapLeaf.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapLeaf.java?rev=1528519&r1=1528518&r2=1528519&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapLeaf.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapLeaf.java Wed Oct  2 15:27:58 2013
@@ -37,21 +37,23 @@ class MapLeaf extends MapRecord {
 
     @Override
     RecordId getEntry(String key) {
-        checkNotNull(key);
+        if (size == 0) {
+            return null;
+        }
 
-        if (size > 0) {
-            int hash = key.hashCode();
-            Segment segment = getSegment();
-
-            int index = 0;
-            while (index < size && getHash(segment, index) < hash) {
-                index++;
-            }
-            while (index < size && getHash(segment, index) == hash) {
-                if (key.equals(getKey(segment, index))) {
-                    return getValue(segment, index);
-                }
-                index++;
+        Segment segment = getSegment();
+        int hash = checkNotNull(key).hashCode();
+
+        for (int i = 0; i < size; i++) {
+            int d = Integer.compare(segment.readInt(getOffset(4 + i * 4)), hash);
+            if (d == 0) {
+                RecordId id = segment.readRecordId(getOffset(4 + size * 4, i));
+                d = segment.readString(id).compareTo(key);
+            }
+            if (d == 0) {
+                return segment.readRecordId(getOffset(4 + size * 4, size + i));
+            } else if (d > 0) {
+                return null;
             }
         }
 
@@ -156,21 +158,6 @@ class MapLeaf extends MapRecord {
         return true;
     }
 
-    @Override
-    public boolean compareAgainstEmptyMap(MapDiff diff) {
-        Segment segment = getSegment();
-
-        for (int i = 0; i < size; i++) {
-            RecordId key = segment.readRecordId(getOffset(4 + size * 4, i));
-            RecordId value = segment.readRecordId(getOffset(4 + size * 4, size + i));
-            if (!diff.entryAdded(segment.readString(key), value)) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
     //-----------------------------------------------------------< private >--
 
     private int getHash(Segment segment, int index) {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java?rev=1528519&r1=1528518&r2=1528519&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java Wed Oct  2 15:27:58 2013
@@ -84,7 +84,14 @@ abstract class MapRecord extends Record 
 
     abstract Iterable<MapEntry> getEntries();
 
-    abstract boolean compareAgainstEmptyMap(MapDiff diff);
+    boolean compareAgainstEmptyMap(MapDiff diff) {
+        for (MapEntry entry : getEntries()) {
+            if (!diff.entryAdded(entry.getName(), entry.getValue())) {
+                return false;
+            }
+        }
+        return true;
+    }
 
     interface MapDiff {
         boolean entryAdded(String key, RecordId after);