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 ch...@apache.org on 2014/10/31 07:15:18 UTC

svn commit: r1635682 - in /jackrabbit/oak/branches/1.0: ./ oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/ oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/

Author: chetanm
Date: Fri Oct 31 06:15:17 2014
New Revision: 1635682

URL: http://svn.apache.org/r1635682
Log:
OAK-2211 - Use Lucene index on non root node

Merging r1632592

Added:
    jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexLookupTest.java
      - copied unchanged from r1632592, jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexLookupTest.java
Modified:
    jackrabbit/oak/branches/1.0/   (props changed)
    jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java
    jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexLookup.java
    jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
    jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java

Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk:r1632592

Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java?rev=1635682&r1=1635681&r2=1635682&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java Fri Oct 31 06:15:17 2014
@@ -24,6 +24,7 @@ import java.util.List;
 
 import javax.annotation.CheckForNull;
 
+import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.query.fulltext.FullTextExpression;
 import org.apache.jackrabbit.oak.spi.query.Filter;
 import org.apache.lucene.index.IndexReader;
@@ -107,12 +108,18 @@ public class IndexPlanner {
                 .setFulltextIndex(defn.isFullTextEnabled())
                 .setIncludesNodeData(false) // we should not include node data
                 .setFilter(filter)
+                .setPathPrefix(getPathPrefix())
                 .setSortOrder(createSortOrder())
                 .setDelayed(true) //Lucene is always async
                 .setAttribute(LuceneIndex.ATTR_INDEX_PATH, indexPath)
                 .setEstimatedEntryCount(getReader().numDocs());
     }
 
+    private String getPathPrefix() {
+        String parentPath = PathUtils.getAncestorPath(indexPath, 2);
+        return PathUtils.denotesRoot(parentPath) ? "" : parentPath;
+    }
+
     private IndexReader getReader() {
         return indexNode.getSearcher().getIndexReader();
     }

Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexLookup.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexLookup.java?rev=1635682&r1=1635681&r2=1635682&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexLookup.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexLookup.java Fri Oct 31 06:15:17 2014
@@ -43,7 +43,7 @@ public class LuceneIndexLookup {
      * fulltext search
      */
     public String getFullTextIndexPath(Filter filter, IndexTracker tracker) {
-        Collection<String> indexPaths = collectIndexNodePaths(filter);
+        Collection<String> indexPaths = collectIndexNodePaths(filter, false);
         IndexNode indexNode = null;
         for (String path : indexPaths) {
             try {
@@ -62,23 +62,38 @@ public class LuceneIndexLookup {
     }
 
     public Collection<String> collectIndexNodePaths(Filter filter){
+        return collectIndexNodePaths(filter, true);
+    }
+
+    private Collection<String> collectIndexNodePaths(Filter filter, boolean recurse){
         Set<String> paths = Sets.newHashSet();
-        collectIndexNodePaths(filter.getPath(), paths);
+
+        collectIndexNodePaths(root, "/", paths);
+
+        if (recurse) {
+            StringBuilder sb = new StringBuilder();
+            NodeState nodeState = root;
+            for (String element : PathUtils.elements(filter.getPath())) {
+                nodeState = nodeState.getChildNode(element);
+                collectIndexNodePaths(nodeState,
+                        sb.append("/").append(element).toString(),
+                        paths);
+            }
+        }
+
         return paths;
     }
 
-    private void collectIndexNodePaths(String filterPath, Collection<String> paths) {
-        //TODO Add support for looking index nodes from non root paths
-        NodeState state = root.getChildNode(INDEX_DEFINITIONS_NAME);
+    private static void collectIndexNodePaths(NodeState nodeState, String parentPath, Collection<String> paths) {
+        NodeState state = nodeState.getChildNode(INDEX_DEFINITIONS_NAME);
         for (ChildNodeEntry entry : state.getChildNodeEntries()) {
             if (isLuceneIndexNode(entry.getNodeState())) {
-                paths.add(createIndexNodePath(entry.getName()));
+                paths.add(createIndexNodePath(parentPath, entry.getName()));
             }
         }
     }
 
-    private String createIndexNodePath(String name){
-        //TODO getPath would lead to duplicate path constru
-        return PathUtils.concat("/", INDEX_DEFINITIONS_NAME, name);
+    private static String createIndexNodePath(String parentPath, String name){
+        return PathUtils.concat(parentPath, INDEX_DEFINITIONS_NAME, name);
     }
 }

Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java?rev=1635682&r1=1635681&r2=1635682&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java Fri Oct 31 06:15:17 2014
@@ -377,7 +377,7 @@ public class LucenePropertyIndex impleme
                 return !queue.isEmpty();
             }
         };
-        return new LucenePathCursor(itr, settings);
+        return new LucenePathCursor(itr, plan, settings);
     }
 
     private IndexNode acquireIndexNode(IndexPlan plan) {
@@ -1147,9 +1147,11 @@ public class LucenePropertyIndex impleme
     static class LucenePathCursor implements Cursor {
         
         private final Cursor pathCursor;
+        private final String pathPrefix;
         LuceneResultRow currentRow;
         
-        LucenePathCursor(final Iterator<LuceneResultRow> it, QueryEngineSettings settings) {
+        LucenePathCursor(final Iterator<LuceneResultRow> it, final IndexPlan plan, QueryEngineSettings settings) {
+            pathPrefix = plan.getPathPrefix();
             Iterator<String> pathIterator = new Iterator<String>() {
 
                 @Override
@@ -1190,7 +1192,12 @@ public class LucenePropertyIndex impleme
 
                 @Override
                 public String getPath() {
-                    return pathRow.getPath();
+                    String sub = pathRow.getPath();
+                    if (PathUtils.isAbsolute(sub)) {
+                        return pathPrefix + sub;
+                    } else {
+                        return PathUtils.concat(pathPrefix, sub);
+                    }
                 }
 
                 @Override

Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java?rev=1635682&r1=1635681&r2=1635682&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java Fri Oct 31 06:15:17 2014
@@ -240,6 +240,21 @@ public class LucenePropertyIndexTest ext
     }
 
     @Test
+    public void indexDefinitionBelowRoot() throws Exception {
+        Tree parent = root.getTree("/").addChild("test");
+        Tree idx = createIndex(parent, "test1", of("propa", "propb"));
+        idx.addChild("propa");
+        root.commit();
+
+        Tree test = parent.addChild("test2");
+        test.addChild("a").setProperty("propa", "a");
+        root.commit();
+
+        assertQuery("select [jcr:path] from [nt:base] as s where ISDESCENDANTNODE(s, '/test') and propa = 'a'", asList("/test/test2/a"));
+    }
+
+
+    @Test
     public void sortQueriesWithLong() throws Exception {
         Tree idx = createIndex("test1", of("foo", "bar"));
         Tree propIdx = idx.addChild("foo");
@@ -429,6 +444,10 @@ public class LucenePropertyIndexTest ext
 
     private Tree createIndex(String name, Set<String> propNames) throws CommitFailedException {
         Tree index = root.getTree("/");
+        return createIndex(index, name, propNames);
+    }
+
+    private Tree createIndex(Tree index, String name, Set<String> propNames) throws CommitFailedException {
         Tree def = index.addChild(INDEX_DEFINITIONS_NAME).addChild(name);
         def.setProperty(JcrConstants.JCR_PRIMARYTYPE,
                 INDEX_DEFINITIONS_NODE_TYPE, Type.NAME);
@@ -437,7 +456,7 @@ public class LucenePropertyIndexTest ext
         def.setProperty(LuceneIndexConstants.FULL_TEXT_ENABLED, false);
         def.setProperty(PropertyStates.createProperty(LuceneIndexConstants.INCLUDE_PROPERTY_NAMES, propNames, Type.STRINGS));
         root.commit();
-        return root.getTree("/").getChild(INDEX_DEFINITIONS_NAME).getChild(name);
+        return index.getChild(INDEX_DEFINITIONS_NAME).getChild(name);
     }
 
     private static String dt(String date) throws ParseException {