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 th...@apache.org on 2012/07/24 14:23:09 UTC

svn commit: r1365005 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/mk/index/ test/java/org/apache/jackrabbit/mk/index/

Author: thomasm
Date: Tue Jul 24 12:23:08 2012
New Revision: 1365005

URL: http://svn.apache.org/viewvc?rev=1365005&view=rev
Log:
OAK-137 Query: content index

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeLeaf.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeNode.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreePage.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Cursor.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/IndexTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PropertyIndexTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeLeaf.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeLeaf.java?rev=1365005&r1=1365004&r2=1365005&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeLeaf.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeLeaf.java Tue Jul 24 12:23:08 2012
@@ -110,7 +110,7 @@ class BTreeLeaf extends BTreePage {
 
     @Override
     public String toString() {
-    		return "leaf: " + getJsop();
+        return "leaf: " + getJsop();
     }
 
 }
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeNode.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeNode.java?rev=1365005&r1=1365004&r2=1365005&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeNode.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreeNode.java Tue Jul 24 12:23:08 2012
@@ -178,7 +178,7 @@ class BTreeNode extends BTreePage {
 
     @Override
     public String toString() {
-    		return "node: " + getJsop();
+        return "node: " + getJsop();
     }
 
 }
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreePage.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreePage.java?rev=1365005&r1=1365004&r2=1365005&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreePage.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/BTreePage.java Tue Jul 24 12:23:08 2012
@@ -52,7 +52,7 @@ abstract class BTreePage {
                 newParent.writeCreate();
             }
             tree.bufferMove(
-            			temp,
+                    temp,
                     PathUtils.concat(tree.getName(), Indexer.INDEX_CONTENT, getParentPath(), newName));
             parent = newParent;
             name = newName;

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Cursor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Cursor.java?rev=1365005&r1=1365004&r2=1365005&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Cursor.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Cursor.java Tue Jul 24 12:23:08 2012
@@ -73,15 +73,20 @@ public class Cursor implements Iterator<
         this.pos = pos;
     }
 
+    /**
+     * An iterator over a cursor.
+     */
     public static class RangeIterator implements Iterator<String> {
         private final Cursor cursor;
         private final String maxKey;
         private String value;
+
         RangeIterator(Cursor cursor, String maxKey) {
             this.cursor = cursor;
             this.maxKey = maxKey;
             step();
         }
+
         private void step() {
             value = null;
             if (cursor.hasNext()) {
@@ -91,20 +96,24 @@ public class Cursor implements Iterator<
                 }
             }
         }
+
         @Override
         public boolean hasNext() {
             return value != null;
         }
+
         @Override
         public String next() {
             String v = value;
             step();
             return v;
         }
+
         @Override
         public void remove() {
             throw new UnsupportedOperationException();
         }
+
     }
 
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java?rev=1365005&r1=1365004&r2=1365005&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java Tue Jul 24 12:23:08 2012
@@ -42,17 +42,17 @@ import java.util.Map.Entry;
  */
 public class Indexer implements QueryIndexProvider {
 
-	/**
-	 * The root node of the index definition (configuration) nodes.
-	 */
+    /**
+     * The root node of the index definition (configuration) nodes.
+     */
     // TODO OAK-178 discuss where to store index config data
-    public static final String INDEX_CONFIG_ROOT = "/jcr:system/indexes";
+    public static final String INDEX_CONFIG_PATH = "/jcr:system/indexes";
 
-	/**
-	 * For each index, the index content is stored relative to the index
-	 * definition below this node. There is also such a node just below the
-	 * index definition node, to store the last revision and for temporary data.
-	 */
+    /**
+     * For each index, the index content is stored relative to the index
+     * definition below this node. There is also such a node just below the
+     * index definition node, to store the last revision and for temporary data.
+     */
     public static final String INDEX_CONTENT = ":data";
 
     /**
@@ -63,6 +63,7 @@ public class Indexer implements QueryInd
     /**
      * The node name prefix of a property index.
      */
+    // TODO support multi-property indexes
     static final String TYPE_PROPERTY = "property@";
 
     /**
@@ -70,11 +71,16 @@ public class Indexer implements QueryInd
      */
     static final String UNIQUE = "unique";
 
+    /**
+     * The maximum length of the write buffer.
+     */
+    private static final int MAX_BUFFER_LENGTH = 100000;
+
     private static final boolean DISABLED = Boolean.getBoolean("mk.indexDisabled");
 
     private MicroKernel mk;
     private String revision;
-    private String indexRootNode = INDEX_CONFIG_ROOT;
+    private String indexRootNode = INDEX_CONFIG_PATH;
     private int indexRootNodeDepth;
     private StringBuilder buffer;
     private ArrayList<QueryIndex> queryIndexList;
@@ -135,8 +141,8 @@ public class Indexer implements QueryInd
         revision = mk.getHeadRevision();
         readRevision = revision;
         boolean exists = mk.nodeExists(indexRootNode, revision);
-		createNodes(INDEX_CONTENT);
-		if (exists) {
+        createNodes(INDEX_CONTENT);
+            if (exists) {
             String node = mk.getNodes(indexRootNode, revision, 1, 0, Integer.MAX_VALUE, null);
             JsopTokenizer t = new JsopTokenizer(node);
             NodeMap map = new NodeMap();
@@ -146,21 +152,21 @@ public class Indexer implements QueryInd
             if (rev != null) {
                 readRevision = rev;
             }
-			for (int i = 0; i < n.getChildNodeCount(); i++) {
-				String k = n.getChildNodeName(i);
-				PropertyIndex prop = PropertyIndex.fromNodeName(this, k);
-				if (prop != null) {
-					indexes.put(prop.getIndexNodeName(), prop);
-					propertyIndexes.put(prop.getPropertyName(), prop);
-					queryIndexList = null;
-				}
-				PrefixIndex pref = PrefixIndex.fromNodeName(this, k);
-				if (pref != null) {
-					indexes.put(pref.getIndexNodeName(), pref);
-					prefixIndexes.put(pref.getPrefix(), pref);
-					queryIndexList = null;
-				}
-			}
+            for (int i = 0; i < n.getChildNodeCount(); i++) {
+                String k = n.getChildNodeName(i);
+                PropertyIndex prop = PropertyIndex.fromNodeName(this, k);
+                if (prop != null) {
+                    indexes.put(prop.getIndexNodeName(), prop);
+                    propertyIndexes.put(prop.getPropertyName(), prop);
+                    queryIndexList = null;
+                }
+                PrefixIndex pref = PrefixIndex.fromNodeName(this, k);
+                if (pref != null) {
+                    indexes.put(pref.getIndexNodeName(), pref);
+                    prefixIndexes.put(pref.getPrefix(), pref);
+                    queryIndexList = null;
+                }
+            }
         }
     }
 
@@ -208,14 +214,15 @@ public class Indexer implements QueryInd
     }
 
     void createNodes(String path) {
-    		String rev = mk.getHeadRevision();
+        String rev = mk.getHeadRevision();
         JsopBuilder jsop = new JsopBuilder();
         String p = "/";
         path = PathUtils.concat(indexRootNode, path);
         for (String e : PathUtils.elements(path)) {
             p = PathUtils.concat(p, e);
             if (!mk.nodeExists(p, rev)) {
-                jsop.tag('+').key(PathUtils.relativize("/", p)).object().endObject().newline();
+                jsop.tag('+').key(PathUtils.relativize("/", p)).
+                    object().endObject().newline();
             }
         }
         revision = mk.commit("/", jsop.toString(), rev, null);
@@ -373,6 +380,9 @@ public class Indexer implements QueryInd
             }
             lastRevision = rev;
             t.read('}');
+            if (buffer != null && buffer.length() > MAX_BUFFER_LENGTH) {
+                updateEnd(rev);
+            }
         } while (t.matches(','));
         updateEnd(toRevision);
     }
@@ -388,17 +398,21 @@ public class Indexer implements QueryInd
         JsopBuilder jsop = new JsopBuilder();
         jsop.tag('^').key(PathUtils.concat(INDEX_CONTENT, "rev")).value(readRevision);
         buffer(jsop.toString());
+        flushBuffer();
+        return revision;
+    }
+
+    private void flushBuffer() {
         try {
             commitChanges();
         } catch (MicroKernelException e) {
             if (!mk.nodeExists(indexRootNode, revision)) {
                 // the index node itself was removed, which is
                 // unexpected but possible
-            		// this will cause all indexes to be removed, so
-            		// it can be ignored here
+                // this will cause all indexes to be removed, so
+                // it can be ignored here
             }
         }
-        return revision;
     }
 
     /**
@@ -493,12 +507,8 @@ public class Indexer implements QueryInd
     private void addOrRemoveRecursive(NodeImpl n, boolean remove, boolean add) {
         String path = n.getPath();
         if (isInIndex(path)) {
-            if (n.getPropertyCount() == 0) {
-                // add or remove the index itself - otherwise it's
-                // changing the root page of the index
-                addOrRemoveIndex(path, remove, add);
-            }
-            // don't index the index
+            addOrRemoveIndex(path, remove, add);
+            // don't index the index data itself
             return;
         }
         for (Index index : indexes.values()) {
@@ -561,7 +571,7 @@ public class Indexer implements QueryInd
 
     private void removeProperty(String path, String lastRevision) {
         if (isInIndex(path)) {
-            // don't index the index
+            // don't index the index data itself
             return;
         }
         String nodePath = PathUtils.getParentPath(path);
@@ -585,7 +595,7 @@ public class Indexer implements QueryInd
 
     private void addProperty(String path, String value) {
         if (isInIndex(path)) {
-            // don't index the index
+            // don't index the index data itself
             return;
         }
         String nodePath = PathUtils.getParentPath(path);
@@ -603,7 +613,7 @@ public class Indexer implements QueryInd
             if (targetPath != null) {
                 addOrRemoveIndex(targetPath, false, true);
             }
-            // don't index the index
+            // don't index the index data itself
             return;
         }
         if (!mk.nodeExists(sourcePath, lastRevision)) {
@@ -646,6 +656,13 @@ public class Indexer implements QueryInd
         for (Iterator<String> it = n.getChildNodeNames(Integer.MAX_VALUE); it.hasNext();) {
             addRecursive(index, PathUtils.concat(path, it.next()));
         }
+        if (needFlush()) {
+            flushBuffer();
+        }
+    }
+
+    private boolean needFlush() {
+        return buffer != null && buffer.length() > MAX_BUFFER_LENGTH;
     }
 
     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/IndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/IndexTest.java?rev=1365005&r1=1365004&r2=1365005&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/IndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/IndexTest.java Tue Jul 24 12:23:08 2012
@@ -240,7 +240,7 @@ public class IndexTest {
 
     static void print(MicroKernel mk, BTree tree) {
         String head = mk.getHeadRevision();
-        String t = mk.getNodes(Indexer.INDEX_CONFIG_ROOT, head, 100, 0, -1, null);
+        String t = mk.getNodes(Indexer.INDEX_CONFIG_PATH, head, 100, 0, -1, null);
         log(t);
         Cursor c = tree.findFirst("0");
         StringBuilder buff = new StringBuilder();

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java?rev=1365005&r1=1365004&r2=1365005&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java Tue Jul 24 12:23:08 2012
@@ -37,10 +37,10 @@ public class PrefixIndexTest {
         String head = mk.getHeadRevision();
 
         // meta data
-        String meta = mk.getNodes(Indexer.INDEX_CONFIG_ROOT, head, 1, 0, -1, null);
+        String meta = mk.getNodes(Indexer.INDEX_CONFIG_PATH, head, 1, 0, -1, null);
 
         Assert.assertEquals("{\":childNodeCount\":2,\"prefix@d:\":" +
-        		"{\":childNodeCount\":1,\":data\":{}},\":data\":{\":childNodeCount\":0}}", meta);
+                "{\":childNodeCount\":1,\":data\":{}},\":data\":{\":childNodeCount\":0}}", meta);
 
         Assert.assertEquals("", getPathList(index, "d:1", head));
 

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PropertyIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PropertyIndexTest.java?rev=1365005&r1=1365004&r2=1365005&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PropertyIndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PropertyIndexTest.java Tue Jul 24 12:23:08 2012
@@ -36,9 +36,9 @@ public class PropertyIndexTest {
         String head = mk.getHeadRevision();
 
         // meta data
-        String meta = mk.getNodes(Indexer.INDEX_CONFIG_ROOT, head, 1, 0, -1, null);
+        String meta = mk.getNodes(Indexer.INDEX_CONFIG_PATH, head, 1, 0, -1, null);
         Assert.assertEquals("{\":childNodeCount\":2,\":data\":{\":childNodeCount\":0}," +
-        		"\"property@id,unique\":{\":childNodeCount\":1,\":data\":{}}}", meta);
+                "\"property@id,unique\":{\":childNodeCount\":1,\":data\":{}}}", meta);
 
         String oldHead = head;