Author: chetanm
Date: Tue Oct  3 05:39:40 2017
New Revision: 1810656

URL: http://svn.apache.org/viewvc?rev=1810656&view=rev
Log:
OAK-6535 - Synchronous Lucene Property Indexes

Enable non root sync (non unique index) property index in lucene

Modified:
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/HybridPropertyIndexLookup.java
    
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/HybridPropertyIndexLookupTest.java
    
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/SynchronousPropertyIndexTest.java

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java?rev=1810656&r1=1810655&r2=1810656&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
 Tue Oct  3 05:39:40 2017
@@ -1561,7 +1561,7 @@ public class LucenePropertyIndex impleme
                                                                       
Iterator<LuceneResultRow> itr) {
         PlanResult pr = getPlanResult(plan);
         HybridPropertyIndexLookup lookup = new 
HybridPropertyIndexLookup(pr.indexPath,
-                NodeStateUtils.getNode(rootState, pr.indexPath));
+                NodeStateUtils.getNode(rootState, pr.indexPath), 
plan.getPathPrefix(), false);
         PropertyIndexResult pir = pr.getPropertyIndexResult();
         Iterable<String> paths = lookup.query(plan.getFilter(), pir.pd, 
pir.propertyName, pir.pr);
 

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/HybridPropertyIndexLookup.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/HybridPropertyIndexLookup.java?rev=1810656&r1=1810655&r2=1810656&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/HybridPropertyIndexLookup.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/HybridPropertyIndexLookup.java
 Tue Oct  3 05:39:40 2017
@@ -42,10 +42,19 @@ import static org.apache.jackrabbit.oak.
 public class HybridPropertyIndexLookup {
     private final String indexPath;
     private final NodeState indexState;
+    private final String pathPrefix;
+    private final boolean prependPathPrefix;
 
     public HybridPropertyIndexLookup(String indexPath, NodeState indexState) {
+       this(indexPath, indexState, "", false);
+    }
+
+    public HybridPropertyIndexLookup(String indexPath, NodeState indexState,
+                                     String pathPrefix, boolean 
prependPathPrefix) {
         this.indexPath = indexPath;
         this.indexState = indexState;
+        this.pathPrefix = pathPrefix;
+        this.prependPathPrefix = prependPathPrefix;
     }
 
     /**
@@ -83,7 +92,6 @@ public class HybridPropertyIndexLookup {
             return Collections.emptyList();
         }
 
-        //TODO Check for non root indexes
         String indexName = indexPath + "(" + propertyName + ")";
         Iterable<String> result;
         if (pd.unique) {
@@ -101,7 +109,7 @@ public class HybridPropertyIndexLookup {
         return s.query(filter, indexName, propIndexRootNode, values);
     }
 
-    private static Iterable<String> querySimple(Filter filter, String 
indexName, NodeState propIndexNode,
+    private Iterable<String> querySimple(Filter filter, String indexName, 
NodeState propIndexNode,
                                                 Set<String> values) {
         return Iterables.concat(
                 queryBucket(filter, indexName, propIndexNode, 
PROP_HEAD_BUCKET, values),
@@ -109,13 +117,13 @@ public class HybridPropertyIndexLookup {
         );
     }
 
-    private static Iterable<String> queryBucket(Filter filter, String 
indexName, NodeState propIndexNode,
+    private Iterable<String> queryBucket(Filter filter, String indexName, 
NodeState propIndexNode,
                                          String bucketPropName, Set<String> 
values) {
         String bucketName = propIndexNode.getString(bucketPropName);
         if (bucketName == null) {
             return Collections.emptyList();
         }
-        ContentMirrorStoreStrategy s = new 
ContentMirrorStoreStrategy(bucketName);
+        ContentMirrorStoreStrategy s = new 
ContentMirrorStoreStrategy(bucketName, pathPrefix, prependPathPrefix);
         return s.query(filter, indexName, propIndexNode, bucketName, values);
     }
 }

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/HybridPropertyIndexLookupTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/HybridPropertyIndexLookupTest.java?rev=1810656&r1=1810655&r2=1810656&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/HybridPropertyIndexLookupTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/HybridPropertyIndexLookupTest.java
 Tue Oct  3 05:39:40 2017
@@ -114,6 +114,33 @@ public class HybridPropertyIndexLookupTe
         assertThat(ImmutableList.copyOf(paths), containsInAnyOrder("/a"));
     }
 
+    @Test
+    public void nonRootIndex() throws Exception{
+        defnb.indexRule("nt:base").property("foo").sync();
+        indexPath = "/content/oak:index/fooIndex";
+
+        propertyUpdated("/a", "foo", "bar");
+
+        String propertyName = "foo";
+        FilterImpl filter = createFilter();
+        filter.restrictProperty("foo", Operator.EQUAL, newString("bar"));
+        filter.restrictPath("/content", Filter.PathRestriction.ALL_CHILDREN);
+
+        HybridPropertyIndexLookup lookup = new 
HybridPropertyIndexLookup(indexPath, builder.getNodeState(),
+                "/content", false);
+        Iterable<String> paths = lookup.query(filter, pd(propertyName), 
propertyName,
+                filter.getPropertyRestriction(propertyName));
+
+        assertThat(ImmutableList.copyOf(paths), containsInAnyOrder("/a"));
+
+        lookup = new HybridPropertyIndexLookup(indexPath, 
builder.getNodeState(),
+                "/content", true);
+        paths = lookup.query(filter, pd(propertyName), propertyName,
+                filter.getPropertyRestriction(propertyName));
+
+        assertThat(ImmutableList.copyOf(paths), 
containsInAnyOrder("/content/a"));
+    }
+
     private void propertyUpdated(String nodePath, String propertyRelativeName, 
String value){
         callback.propertyUpdated(nodePath, propertyRelativeName, 
pd(propertyRelativeName),
                 null, createProperty(PathUtils.getName(propertyRelativeName), 
value));

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/SynchronousPropertyIndexTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/SynchronousPropertyIndexTest.java?rev=1810656&r1=1810655&r2=1810656&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/SynchronousPropertyIndexTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/SynchronousPropertyIndexTest.java
 Tue Oct  3 05:39:40 2017
@@ -288,6 +288,31 @@ public class SynchronousPropertyIndexTes
         assertQuery("select * from [nt:base] where [jcr:content/foo] = 'bar'", 
singletonList("/a"));
     }
 
+    @Test
+    public void nonRootIndex() throws Exception{
+        createPath("/content/oak:index");
+        root.commit();
+
+        defnb.async("async", "nrt");
+        defnb.indexRule("nt:base").property("foo").sync();
+
+        indexPath = "/content/oak:index/fooIndex";
+        addIndex(indexPath, defnb);
+        root.commit();
+
+        createPath("/a").setProperty("foo", "bar");
+        createPath("/content/a").setProperty("foo", "bar");
+        createPath("/content/a/jcr:content").setProperty("foo", "bar");
+        root.commit();
+
+        assertQuery("select * from [nt:base] where 
ISDESCENDANTNODE('/content') " +
+                "and [jcr:content/foo] = 'bar'", singletonList("/content/a"));
+
+        assertQuery("select * from [nt:base] where 
ISDESCENDANTNODE('/content') " +
+                "and [foo] = 'bar'", asList("/content/a", 
"/content/a/jcr:content"));
+
+    }
+
     private void runAsyncIndex() {
         AsyncIndexUpdate async = (AsyncIndexUpdate) 
WhiteboardUtils.getService(wb,
                 Runnable.class, input -> input instanceof AsyncIndexUpdate);


Reply via email to