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