Author: chetanm Date: Tue Oct 3 05:32:03 2017 New Revision: 1810655 URL: http://svn.apache.org/viewvc?rev=1810655&view=rev Log: OAK-6714 - Support non root index in ContentMirrorStoreStrategy
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java?rev=1810655&r1=1810654&r2=1810655&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java Tue Oct 3 05:32:03 2017 @@ -82,13 +82,33 @@ public class ContentMirrorStoreStrategy public static final int TRAVERSING_WARN = Integer.getInteger("oak.traversing.warn", 10000); private final String indexName; + private final String pathPrefix; + private final boolean prependPathPrefix; public ContentMirrorStoreStrategy() { this(INDEX_CONTENT_NODE_NAME); } public ContentMirrorStoreStrategy(String indexName) { + this(indexName, "", true); + } + + /** + * Constructs a ContentMirrorStoreStrategy + * + * @param indexName name of sub node under which paths are stored + * @param pathPrefix path of the index in repository. Defaults to empty for indexes at root nodes i.e. + * those stored directly under '/oak:index'. For non root index its the path excluding + * the '/oak:index' node. For e.g. for index at '/content/oak:index/fooIndex' the + * pathPrefix would be '/content'. + * If this is appened to the paths returned by index then they would become absolute + * path in repository + * @param prependPathPrefix Should the path prefix be added to the query result + */ + public ContentMirrorStoreStrategy(String indexName, String pathPrefix, boolean prependPathPrefix) { this.indexName = indexName; + this.pathPrefix = pathPrefix; + this.prependPathPrefix = prependPathPrefix; } @Override @@ -148,7 +168,7 @@ public class ContentMirrorStoreStrategy return new Iterable<String>() { @Override public Iterator<String> iterator() { - PathIterator it = new PathIterator(filter, indexName, ""); + PathIterator it = new PathIterator(filter, indexName, pathPrefix, prependPathPrefix); if (values == null) { it.setPathContainsValue(true); it.enqueue(getChildNodeEntries(index).iterator()); @@ -330,6 +350,7 @@ public class ContentMirrorStoreStrategy private String parentPath; private String currentPath; private boolean pathContainsValue; + private final boolean prependPathPrefix; /** * Keep the returned path, to avoid returning duplicate entries. @@ -337,7 +358,7 @@ public class ContentMirrorStoreStrategy private final Set<String> knownPaths = Sets.newHashSet(); private final QueryLimits settings; - PathIterator(Filter filter, String indexName, String pathPrefix) { + PathIterator(Filter filter, String indexName, String pathPrefix, boolean prependPathPrefix) { this.filter = filter; this.pathPrefix = pathPrefix; this.indexName = indexName; @@ -353,6 +374,7 @@ public class ContentMirrorStoreStrategy parentPath = ""; currentPath = "/"; this.settings = filter.getQueryLimits(); + this.prependPathPrefix = prependPathPrefix; } void enqueue(Iterator<? extends ChildNodeEntry> it) { @@ -460,7 +482,7 @@ public class ContentMirrorStoreStrategy fetchNext(); init = true; } - String result = PathUtils.concat(pathPrefix, currentPath); + String result = prependPathPrefix ? PathUtils.concat(pathPrefix, currentPath) : currentPath; fetchNext(); return result; } Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.java?rev=1810655&r1=1810654&r2=1810655&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.java Tue Oct 3 05:32:03 2017 @@ -17,6 +17,7 @@ package org.apache.jackrabbit.oak.plugins.index.property.strategy; import static com.google.common.base.Suppliers.memoize; +import static com.google.common.collect.ImmutableList.copyOf; import static com.google.common.collect.Sets.newHashSet; import static java.util.Arrays.asList; import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.ENTRY_COUNT_PROPERTY_NAME; @@ -26,6 +27,8 @@ import static org.apache.jackrabbit.oak. import static org.apache.jackrabbit.oak.plugins.index.counter.NodeCounterEditor.DEFAULT_RESOLUTION; import static org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE; import static org.apache.jackrabbit.oak.plugins.index.counter.ApproximateCounter.COUNT_PROPERTY_PREFIX; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.junit.Assert.assertThat; import java.util.Collections; import java.util.Set; @@ -284,6 +287,42 @@ public class ContentMirrorStoreStrategyT KEY, maxTraversal)); } + @Test + public void nonRootStorage() throws Exception{ + IndexStoreStrategy store = new ContentMirrorStoreStrategy(INDEX_CONTENT_NODE_NAME, "/content", false); + + NodeState root = EMPTY_NODE; + NodeBuilder builder = root.builder(); + Supplier<NodeBuilder> index = () -> builder; + + for (String path : asList("a", "a/c", "b")) { + store.update(index, path, null, null, EMPTY, KEY); + } + + FilterImpl filter = FilterImpl.newTestInstance(); + filter.restrictPath("/content", Filter.PathRestriction.ALL_CHILDREN); + + NodeBuilder indexMeta = EMPTY_NODE.builder(); + indexMeta.setChildNode(INDEX_CONTENT_NODE_NAME, builder.getNodeState()); + + Iterable<String> paths = store.query(filter, null, indexMeta.getNodeState(), KEY); + assertThat(copyOf(paths), containsInAnyOrder("a", "a/c", "b")); + + FilterImpl filter2 = FilterImpl.newTestInstance(); + filter2.restrictPath("/content/a", Filter.PathRestriction.ALL_CHILDREN); + + paths = store.query(filter2, null, indexMeta.getNodeState(), KEY); + assertThat(copyOf(paths), containsInAnyOrder("a", "a/c")); + + store = new ContentMirrorStoreStrategy(INDEX_CONTENT_NODE_NAME, "/content", true); + + paths = store.query(filter, null, indexMeta.getNodeState(), KEY); + assertThat(copyOf(paths), containsInAnyOrder("/content/a", "/content/a/c", "/content/b")); + + paths = store.query(filter2, null, indexMeta.getNodeState(), KEY); + assertThat(copyOf(paths), containsInAnyOrder("/content/a", "/content/a/c")); + } + private static void assertInRange(String msg, double expected, double actual) { double allowedError = 0.1; double diff = Math.abs(expected - actual);