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);