You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-dev@jackrabbit.apache.org by Amit Jain <am...@ieee.org> on 2015/09/01 11:39:07 UTC
Re: svn commit: r1700425 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/plugins/index/ main/java/org/apache/jackrabbit/oak/plugins/index/property/
test/java/org/apache/jackrabbit/oak/plugins/index/ test/java/org/apache/jackrab...
Get test failures in oak-lucene after this
[INFO] [ERROR]
C:\Data\Source\oak_svn\trunk\oak-lucene\src\main\java\org\apache\jackrabbit\oak\plugins\index\lucene\LuceneIndexEditor.java:[
39,71] error: cannot find symbol
[INFO] [ERROR] symbol: method doFiler(String)
[INFO] location: class PathFilter
[INFO]
C:\Data\Source\oak_svn\trunk\oak-lucene\src\main\java\org\apache\jackrabbit\oak\plugins\index\lucene\LuceneIndexEditor.java:[837,54]
rror: cannot find symbol
[INFO] [INFO] 2 errors
On Tue, Sep 1, 2015 at 2:28 PM, <th...@apache.org> wrote:
> Author: thomasm
> Date: Tue Sep 1 08:58:03 2015
> New Revision: 1700425
>
> URL: http://svn.apache.org/r1700425
> Log:
> OAK-3263 Support including and excluding paths for PropertyIndex
>
> Modified:
>
> jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/PathFilter.java
>
> jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexEditor.java
>
> jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java
>
> jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexPlan.java
>
> jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/PathFilterTest.java
>
> jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/Oak2077QueriesTest.java
>
> jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java
>
> Modified:
> jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/PathFilter.java
> URL:
> http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/PathFilter.java?rev=1700425&r1=1700424&r2=1700425&view=diff
>
> ==============================================================================
> ---
> jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/PathFilter.java
> (original)
> +++
> jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/PathFilter.java
> Tue Sep 1 08:58:03 2015
> @@ -54,14 +54,17 @@ public class PathFilter {
> public static final String PROP_EXCLUDED_PATHS = "excludedPaths";
>
> public enum Result {
> +
> /**
> * Include the path for processing
> */
> INCLUDE,
> +
> /**
> * Exclude the path and subtree for processing
> */
> EXCLUDE,
> +
> /**
> * Do not process the path but just perform traversal to
> * child nodes. For IndexEditor it means that such nodes
> @@ -72,7 +75,7 @@ public class PathFilter {
>
> private static final PathFilter ALL = new PathFilter(INCLUDE_ROOT,
> Collections.<String>emptyList()) {
> @Override
> - public Result doFiler(@Nonnull String path) {
> + public Result filter(@Nonnull String path) {
> return Result.INCLUDE;
> }
> };
> @@ -81,21 +84,23 @@ public class PathFilter {
> private final String[] excludedPaths;
>
> /**
> - * Constructs the predicate based on given definition state. It looks
> - * for multi value property with names {@link
> PathFilter#PROP_INCLUDED_PATHS}
> - * and {@link PathFilter#PROP_EXCLUDED_PATHS}. Both the properties
> - * are optional.
> - *
> - * @param defn nodestate representing the configuration. Generally it
> would be the nodestate
> - * representing the index definition
> + * Constructs the predicate based on given definition state. It looks
> for
> + * multi value property with names {@link
> PathFilter#PROP_INCLUDED_PATHS}
> + * and {@link PathFilter#PROP_EXCLUDED_PATHS}. Both the properties are
> + * optional.
> + *
> + * @param defn nodestate representing the configuration. Generally it
> would
> + * be the nodestate representing the index definition
> * @return predicate based on the passed definition state
> */
> - public static PathFilter from(@Nonnull NodeBuilder defn){
> - if (!defn.hasProperty(PROP_EXCLUDED_PATHS) &&
> !defn.hasProperty(PROP_INCLUDED_PATHS)){
> + public static PathFilter from(@Nonnull NodeBuilder defn) {
> + if (!defn.hasProperty(PROP_EXCLUDED_PATHS) &&
> + !defn.hasProperty(PROP_INCLUDED_PATHS)) {
> return ALL;
> }
> - return new PathFilter(getStrings(defn, PROP_INCLUDED_PATHS,
> INCLUDE_ROOT),
> - getStrings(defn, PROP_EXCLUDED_PATHS,
> Collections.<String>emptyList()));
> + return new PathFilter(getStrings(defn, PROP_INCLUDED_PATHS,
> + INCLUDE_ROOT), getStrings(defn, PROP_EXCLUDED_PATHS,
> + Collections.<String> emptyList()));
> }
>
> /**
> @@ -123,21 +128,21 @@ public class PathFilter {
> * @param path path to check
> * @return result indicating if the path needs to be included,
> excluded or just traversed
> */
> - public Result doFiler(@Nonnull String path) {
> - for (String excludedPath : excludedPaths){
> - if (excludedPath.equals(path) || isAncestor(excludedPath,
> path)){
> + public Result filter(@Nonnull String path) {
> + for (String excludedPath : excludedPaths) {
> + if (excludedPath.equals(path) || isAncestor(excludedPath,
> path)) {
> return Result.EXCLUDE;
> }
> }
>
> - for (String includedPath : includedPaths){
> - if (includedPath.equals(path) || isAncestor(includedPath,
> path)){
> + for (String includedPath : includedPaths) {
> + if (includedPath.equals(path) || isAncestor(includedPath,
> path)) {
> return Result.INCLUDE;
> }
> }
>
> - for (String includedPath : includedPaths){
> - if (includedPath.startsWith(path)){
> + for (String includedPath : includedPaths) {
> + if (isAncestor(path, includedPath)) {
> return Result.TRAVERSE;
> }
> }
> @@ -153,12 +158,35 @@ public class PathFilter {
> '}';
> }
>
> - private static Iterable<String> getStrings(NodeBuilder builder,
> String name, Collection<String> defaultVal) {
> - PropertyState property = builder.getProperty(name);
> + private static Iterable<String> getStrings(NodeBuilder builder,
> String propertyName,
> + Collection<String> defaultVal) {
> + PropertyState property = builder.getProperty(propertyName);
> if (property != null && property.getType() == Type.STRINGS) {
> return property.getValue(Type.STRINGS);
> } else {
> return defaultVal;
> }
> }
> +
> + /**
> + * Check whether this node and all descendants are included in this
> filter.
> + *
> + * @param path the path
> + * @return true if this and all descendants of this path are included
> in the filter
> + */
> + public boolean areAllDescendantsIncluded(String path) {
> + for (String excludedPath : excludedPaths) {
> + if (excludedPath.equals(path) || isAncestor(excludedPath,
> path) ||
> + isAncestor(path, excludedPath)) {
> + return false;
> + }
> + }
> + for (String includedPath : includedPaths) {
> + if (includedPath.equals(path) || isAncestor(includedPath,
> path)) {
> + return true;
> + }
> + }
> + return false;
> + }
> +
> }
>
> Modified:
> jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexEditor.java
> URL:
> http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexEditor.java?rev=1700425&r1=1700424&r2=1700425&view=diff
>
> ==============================================================================
> ---
> jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexEditor.java
> (original)
> +++
> jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexEditor.java
> Tue Sep 1 08:58:03 2015
> @@ -27,6 +27,7 @@ import org.apache.jackrabbit.oak.api.Pro
> import org.apache.jackrabbit.oak.api.Type;
> import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
> import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
> +import org.apache.jackrabbit.oak.plugins.index.PathFilter;
> import
> org.apache.jackrabbit.oak.plugins.index.property.OrderedIndex.OrderDirection;
> import
> org.apache.jackrabbit.oak.plugins.index.property.strategy.IndexStoreStrategy;
> import
> org.apache.jackrabbit.oak.plugins.index.property.strategy.OrderedContentMirrorStoreStrategy;
> @@ -101,8 +102,8 @@ public class OrderedPropertyIndexEditor
> swl = new StopwatchLogger(OrderedPropertyIndexEditor.class);
> }
>
> - OrderedPropertyIndexEditor(OrderedPropertyIndexEditor parent, String
> name) {
> - super(parent, name);
> + OrderedPropertyIndexEditor(OrderedPropertyIndexEditor parent, String
> name, PathFilter.Result pathFilterResult) {
> + super(parent, name, pathFilterResult);
> this.propertyNames = parent.getPropertyNames();
> this.direction = parent.getDirection();
> this.swl = parent.swl;
> @@ -133,8 +134,8 @@ public class OrderedPropertyIndexEditor
>
> @Override
> PropertyIndexEditor getChildIndexEditor(@Nonnull PropertyIndexEditor
> parent,
> - @Nonnull String name) {
> - return new OrderedPropertyIndexEditor(this, name);
> + @Nonnull String name,
> PathFilter.Result pathFilterResult) {
> + return new OrderedPropertyIndexEditor(this, name,
> pathFilterResult);
> }
>
> /**
>
> Modified:
> jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java
> URL:
> http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java?rev=1700425&r1=1700424&r2=1700425&view=diff
>
> ==============================================================================
> ---
> jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java
> (original)
> +++
> jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java
> Tue Sep 1 08:58:03 2015
> @@ -40,6 +40,7 @@ import org.apache.jackrabbit.oak.api.Pro
> import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
> import org.apache.jackrabbit.oak.plugins.index.IndexEditor;
> import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
> +import org.apache.jackrabbit.oak.plugins.index.PathFilter;
> import
> org.apache.jackrabbit.oak.plugins.index.property.strategy.ContentMirrorStoreStrategy;
> import
> org.apache.jackrabbit.oak.plugins.index.property.strategy.IndexStoreStrategy;
> import
> org.apache.jackrabbit.oak.plugins.index.property.strategy.UniqueEntryStoreStrategy;
> @@ -110,6 +111,10 @@ class PropertyIndexEditor implements Ind
>
> private final IndexUpdateCallback updateCallback;
>
> + private final PathFilter pathFilter;
> +
> + private final PathFilter.Result pathFilterResult;
> +
> public PropertyIndexEditor(NodeBuilder definition, NodeState root,
> IndexUpdateCallback updateCallback) {
> this.parent = null;
> @@ -117,6 +122,8 @@ class PropertyIndexEditor implements Ind
> this.path = "/";
> this.definition = definition;
> this.root = root;
> + pathFilter = PathFilter.from(definition);
> + pathFilterResult = getPathFilterResult();
>
> //initPropertyNames(definition);
>
> @@ -147,7 +154,7 @@ class PropertyIndexEditor implements Ind
> this.updateCallback = updateCallback;
> }
>
> - PropertyIndexEditor(PropertyIndexEditor parent, String name) {
> + PropertyIndexEditor(PropertyIndexEditor parent, String name,
> PathFilter.Result pathFilterResult) {
> this.parent = parent;
> this.name = name;
> this.path = null;
> @@ -157,6 +164,8 @@ class PropertyIndexEditor implements Ind
> this.typePredicate = parent.typePredicate;
> this.keysToCheckForUniqueness = parent.keysToCheckForUniqueness;
> this.updateCallback = parent.updateCallback;
> + this.pathFilter = parent.pathFilter;
> + this.pathFilterResult = pathFilterResult;
> }
>
> /**
> @@ -228,6 +237,16 @@ class PropertyIndexEditor implements Ind
> @Override
> public void leave(NodeState before, NodeState after)
> throws CommitFailedException {
> +
> + if (pathFilterResult == PathFilter.Result.INCLUDE) {
> + applyTypeRestrictions(before, after);
> + updateIndex(before, after);
> + }
> + checkUniquenessConstraints();
> +
> + }
> +
> + private void applyTypeRestrictions(NodeState before, NodeState after)
> {
> // apply the type restrictions
> if (typePredicate != null) {
> if (typeChanged) {
> @@ -245,7 +264,9 @@ class PropertyIndexEditor implements Ind
> afterKeys = null;
> }
> }
> -
> + }
> +
> + private void updateIndex(NodeState before, NodeState after) throws
> CommitFailedException {
> // if any changes were detected, update the index accordingly
> if (beforeKeys != null || afterKeys != null) {
> // first make sure that both the before and after sets are
> non-null
> @@ -276,13 +297,17 @@ class PropertyIndexEditor implements Ind
> }
> }
>
> + checkUniquenessConstraints();
> + }
> +
> + private void checkUniquenessConstraints() throws
> CommitFailedException {
> if (parent == null) {
> // make sure that the index node exist, even with no content
> definition.child(INDEX_CONTENT_NODE_NAME);
>
> boolean uniqueIndex = keysToCheckForUniqueness != null;
> // check uniqueness constraints when leaving the root
> - if (uniqueIndex &&
> + if (uniqueIndex &&
> !keysToCheckForUniqueness.isEmpty()) {
> NodeState indexMeta = definition.getNodeState();
> String failed = getFirstDuplicate(
> @@ -292,12 +317,12 @@ class PropertyIndexEditor implements Ind
> "Uniqueness constraint violated at path [%s]
> for one of the "
> + "property in %s having value %s",
> getPath(), propertyNames, failed);
> - throw new CommitFailedException(CONSTRAINT, 30, msg);
> + throw new CommitFailedException(CONSTRAINT, 30, msg);
> }
> }
> }
> }
> -
> +
> /**
> * From a set of keys, get those that already exist in the index.
> *
> @@ -378,24 +403,43 @@ class PropertyIndexEditor implements Ind
> * @param name the name of the child node
> * @return an instance of the PropertyIndexEditor
> */
> - PropertyIndexEditor getChildIndexEditor(@Nonnull PropertyIndexEditor
> parent, @Nonnull String name) {
> - return new PropertyIndexEditor(parent, name);
> + PropertyIndexEditor getChildIndexEditor(@Nonnull PropertyIndexEditor
> parent, @Nonnull String name, PathFilter.Result filterResult) {
> + return new PropertyIndexEditor(parent, name, filterResult);
> }
>
> @Override
> public Editor childNodeAdded(String name, NodeState after) {
> - return getChildIndexEditor(this, name);
> + PathFilter.Result filterResult = getPathFilterResult(name);
> + if (filterResult == PathFilter.Result.EXCLUDE) {
> + return null;
> + }
> + return getChildIndexEditor(this, name, filterResult);
> }
>
> @Override
> public Editor childNodeChanged(
> String name, NodeState before, NodeState after) {
> - return getChildIndexEditor(this, name);
> + PathFilter.Result filterResult = getPathFilterResult(name);
> + if (filterResult == PathFilter.Result.EXCLUDE) {
> + return null;
> + }
> + return getChildIndexEditor(this, name, filterResult);
> }
>
> @Override
> public Editor childNodeDeleted(String name, NodeState before) {
> - return getChildIndexEditor(this, name);
> + PathFilter.Result filterResult = getPathFilterResult(name);
> + if (filterResult == PathFilter.Result.EXCLUDE) {
> + return null;
> + }
> + return getChildIndexEditor(this, name, filterResult);
> }
>
> + private PathFilter.Result getPathFilterResult() {
> + return pathFilter.filter(getPath());
> + }
> +
> + private PathFilter.Result getPathFilterResult(String childNodeName) {
> + return pathFilter.filter(concat(getPath(), childNodeName));
> + }
> }
> \ No newline at end of file
>
> Modified:
> jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexPlan.java
> URL:
> http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexPlan.java?rev=1700425&r1=1700424&r2=1700425&view=diff
>
> ==============================================================================
> ---
> jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexPlan.java
> (original)
> +++
> jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexPlan.java
> Tue Sep 1 08:58:03 2015
> @@ -18,7 +18,6 @@ package org.apache.jackrabbit.oak.plugin
>
> import static com.google.common.base.Predicates.in;
> import static com.google.common.collect.Iterables.any;
> -import static com.google.common.collect.Iterables.isEmpty;
> import static com.google.common.collect.Sets.newHashSet;
> import static com.google.common.collect.Sets.newLinkedHashSet;
> import static java.util.Collections.emptySet;
> @@ -31,6 +30,8 @@ import java.util.Set;
>
> import org.apache.jackrabbit.oak.api.PropertyValue;
> import org.apache.jackrabbit.oak.commons.PathUtils;
> +import org.apache.jackrabbit.oak.plugins.index.PathFilter;
> +import org.apache.jackrabbit.oak.plugins.index.PathFilter.Result;
> import
> org.apache.jackrabbit.oak.plugins.index.property.strategy.ContentMirrorStoreStrategy;
> import
> org.apache.jackrabbit.oak.plugins.index.property.strategy.IndexStoreStrategy;
> import
> org.apache.jackrabbit.oak.plugins.index.property.strategy.UniqueEntryStoreStrategy;
> @@ -94,11 +95,14 @@ public class PropertyIndexPlan {
>
> private final int depth;
>
> + private final PathFilter pathFilter;
> +
> PropertyIndexPlan(String name, NodeState root, NodeState definition,
> Filter filter) {
> this.name = name;
> this.root = root;
> this.definition = definition;
> this.properties = newHashSet(definition.getNames(PROPERTY_NAMES));
> + pathFilter = PathFilter.from(definition.builder());
>
> if (definition.getBoolean(UNIQUE_PROPERTY_NAME)) {
> this.strategy = UNIQUE;
> @@ -118,7 +122,8 @@ public class PropertyIndexPlan {
> Set<String> bestValues = emptySet();
> int bestDepth = 1;
>
> - if (matchesNodeTypes) {
> + if (matchesNodeTypes &&
> + pathFilter.areAllDescendantsIncluded(filter.getPath())) {
> for (String property : properties) {
> PropertyRestriction restriction =
> filter.getPropertyRestriction(property);
>
> Modified:
> jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/PathFilterTest.java
> URL:
> http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/PathFilterTest.java?rev=1700425&r1=1700424&r2=1700425&view=diff
>
> ==============================================================================
> ---
> jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/PathFilterTest.java
> (original)
> +++
> jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/PathFilterTest.java
> Tue Sep 1 08:58:03 2015
> @@ -36,81 +36,84 @@ import static org.junit.Assert.fail;
> public class PathFilterTest {
>
> @Test
> - public void exclude() throws Exception{
> + public void exclude() throws Exception {
> PathFilter p = new PathFilter(of("/"), of("/etc"));
> - assertEquals(PathFilter.Result.INCLUDE, p.doFiler("/"));
> - assertEquals(PathFilter.Result.INCLUDE, p.doFiler("/a"));
> - assertEquals(PathFilter.Result.EXCLUDE, p.doFiler("/etc"));
> - assertEquals(PathFilter.Result.EXCLUDE,
> p.doFiler("/etc/workflow"));
> + assertEquals(PathFilter.Result.INCLUDE, p.filter("/"));
> + assertEquals(PathFilter.Result.INCLUDE, p.filter("/a"));
> + assertEquals(PathFilter.Result.EXCLUDE, p.filter("/etc"));
> + assertEquals(PathFilter.Result.EXCLUDE,
> p.filter("/etc/workflow"));
> }
>
> @Test
> - public void include() throws Exception{
> + public void include() throws Exception {
> PathFilter p = new PathFilter(of("/content", "/etc"),
> of("/etc/workflow/instance"));
> - assertEquals(PathFilter.Result.TRAVERSE, p.doFiler("/"));
> - assertEquals(PathFilter.Result.EXCLUDE, p.doFiler("/var"));
> - assertEquals(PathFilter.Result.INCLUDE, p.doFiler("/content"));
> - assertEquals(PathFilter.Result.INCLUDE,
> p.doFiler("/content/example"));
> - assertEquals(PathFilter.Result.INCLUDE, p.doFiler("/etc"));
> - assertEquals(PathFilter.Result.INCLUDE,
> p.doFiler("/etc/workflow"));
> - assertEquals(PathFilter.Result.EXCLUDE,
> p.doFiler("/etc/workflow/instance"));
> - assertEquals(PathFilter.Result.EXCLUDE,
> p.doFiler("/etc/workflow/instance/1"));
> + assertEquals(PathFilter.Result.TRAVERSE, p.filter("/"));
> + assertEquals(PathFilter.Result.EXCLUDE, p.filter("/var"));
> + assertEquals(PathFilter.Result.INCLUDE, p.filter("/content"));
> + assertEquals(PathFilter.Result.INCLUDE,
> p.filter("/content/example"));
> + assertEquals(PathFilter.Result.INCLUDE, p.filter("/etc"));
> + assertEquals(PathFilter.Result.INCLUDE,
> p.filter("/etc/workflow"));
> + assertEquals(PathFilter.Result.EXCLUDE,
> p.filter("/etc/workflow/instance"));
> + assertEquals(PathFilter.Result.EXCLUDE,
> p.filter("/etc/workflow/instance/1"));
> + assertEquals(PathFilter.Result.EXCLUDE, p.filter("/x"));
> + assertEquals(PathFilter.Result.EXCLUDE, p.filter("/e"));
> + assertEquals(PathFilter.Result.EXCLUDE, p.filter("/etcx"));
> }
>
> @Test
> - public void emptyConfig() throws Exception{
> + public void emptyConfig() throws Exception {
> NodeBuilder root = EMPTY_NODE.builder();
> PathFilter p = PathFilter.from(root);
> - assertEquals(PathFilter.Result.INCLUDE, p.doFiler("/"));
> - assertEquals(PathFilter.Result.INCLUDE, p.doFiler("/a"));
> + assertEquals(PathFilter.Result.INCLUDE, p.filter("/"));
> + assertEquals(PathFilter.Result.INCLUDE, p.filter("/a"));
> }
>
> @Test
> - public void config() throws Exception{
> + public void config() throws Exception {
> NodeBuilder root = EMPTY_NODE.builder();
> root.setProperty(createProperty(PROP_INCLUDED_PATHS, of("/etc"),
> Type.STRINGS));
> root.setProperty(createProperty(PROP_EXCLUDED_PATHS,
> of("/etc/workflow"), Type.STRINGS));
> PathFilter p = PathFilter.from(root);
> - assertEquals(PathFilter.Result.TRAVERSE, p.doFiler("/"));
> - assertEquals(PathFilter.Result.INCLUDE, p.doFiler("/etc"));
> - assertEquals(PathFilter.Result.INCLUDE, p.doFiler("/etc/a"));
> - assertEquals(PathFilter.Result.EXCLUDE,
> p.doFiler("/etc/workflow"));
> - assertEquals(PathFilter.Result.EXCLUDE,
> p.doFiler("/etc/workflow/1"));
> + assertEquals(PathFilter.Result.TRAVERSE, p.filter("/"));
> + assertEquals(PathFilter.Result.INCLUDE, p.filter("/etc"));
> + assertEquals(PathFilter.Result.INCLUDE, p.filter("/etc/a"));
> + assertEquals(PathFilter.Result.EXCLUDE,
> p.filter("/etc/workflow"));
> + assertEquals(PathFilter.Result.EXCLUDE,
> p.filter("/etc/workflow/1"));
> }
>
> @Test
> - public void configOnlyExclude() throws Exception{
> + public void configOnlyExclude() throws Exception {
> NodeBuilder root = EMPTY_NODE.builder();
> root.setProperty(createProperty(PROP_EXCLUDED_PATHS,
> of("/etc/workflow"), Type.STRINGS));
> PathFilter p = PathFilter.from(root);
> - assertEquals(PathFilter.Result.INCLUDE, p.doFiler("/"));
> - assertEquals(PathFilter.Result.INCLUDE, p.doFiler("/etc"));
> - assertEquals(PathFilter.Result.INCLUDE, p.doFiler("/etc/a"));
> - assertEquals(PathFilter.Result.EXCLUDE,
> p.doFiler("/etc/workflow"));
> - assertEquals(PathFilter.Result.EXCLUDE,
> p.doFiler("/etc/workflow/1"));
> + assertEquals(PathFilter.Result.INCLUDE, p.filter("/"));
> + assertEquals(PathFilter.Result.INCLUDE, p.filter("/etc"));
> + assertEquals(PathFilter.Result.INCLUDE, p.filter("/etc/a"));
> + assertEquals(PathFilter.Result.EXCLUDE,
> p.filter("/etc/workflow"));
> + assertEquals(PathFilter.Result.EXCLUDE,
> p.filter("/etc/workflow/1"));
> }
>
> @Test
> - public void invalid() throws Exception{
> + public void invalid() throws Exception {
> try {
> new PathFilter(Collections.<String>emptyList(), of("/etc"));
> fail();
> - } catch (IllegalStateException ignore){
> -
> + } catch (IllegalStateException ignore) {
> + // expected
> }
>
> try {
> new PathFilter(of("/etc/workflow"), of("/etc"));
> fail();
> - } catch (IllegalStateException ignore){
> -
> + } catch (IllegalStateException ignore) {
> + // expected
> }
>
> try {
> new PathFilter(Collections.<String>emptyList(),
> Collections.<String>emptyList());
> fail();
> - } catch (IllegalStateException ignore){
> -
> + } catch (IllegalStateException ignore) {
> + // expected
> }
> }
> }
>
> Modified:
> jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/Oak2077QueriesTest.java
> URL:
> http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/Oak2077QueriesTest.java?rev=1700425&r1=1700424&r2=1700425&view=diff
>
> ==============================================================================
> ---
> jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/Oak2077QueriesTest.java
> (original)
> +++
> jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/Oak2077QueriesTest.java
> Tue Sep 1 08:58:03 2015
> @@ -49,6 +49,7 @@ import org.apache.jackrabbit.oak.api.Res
> import org.apache.jackrabbit.oak.api.Tree;
> import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
> import org.apache.jackrabbit.oak.plugins.index.IndexUtils;
> +import org.apache.jackrabbit.oak.plugins.index.PathFilter;
> import
> org.apache.jackrabbit.oak.plugins.index.property.OrderedIndex.OrderDirection;
> import
> org.apache.jackrabbit.oak.plugins.index.property.strategy.IndexStoreStrategy;
> import
> org.apache.jackrabbit.oak.plugins.index.property.strategy.OrderedContentMirrorStoreStrategy;
> @@ -169,8 +170,8 @@ public class Oak2077QueriesTest extends
> this.rnd = rnd;
> }
>
> - public SeededPropertyIndexEditor(SeededPropertyIndexEditor
> parent, String name) {
> - super(parent, name);
> + public SeededPropertyIndexEditor(SeededPropertyIndexEditor
> parent, String name, PathFilter.Result pathFilterResult) {
> + super(parent, name, pathFilterResult);
> this.rnd = parent.rnd;
> }
>
> @@ -185,8 +186,8 @@ public class Oak2077QueriesTest extends
> }
>
> @Override
> - PropertyIndexEditor getChildIndexEditor(PropertyIndexEditor
> parent, String name) {
> - return new SeededPropertyIndexEditor(this, name);
> + PropertyIndexEditor getChildIndexEditor(PropertyIndexEditor
> parent, String name, PathFilter.Result pathFilterResult) {
> + return new SeededPropertyIndexEditor(this, name,
> pathFilterResult);
> }
> }
>
> @@ -314,7 +315,7 @@ public class Oak2077QueriesTest extends
> /**
> * truncate the {@link AbstractQueryTest#TEST_INDEX_NAME} index at
> the 4th element of the
> * provided lane returning the previous value
> - *
> + *
> * @param lane the desired lane. Must be 0 <= {@code lane} < {@link
> OrderedIndex#LANES}
> * @param inexistent the derired value to be injected
> * @return the value before the change
>
> Modified:
> jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java
> URL:
> http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java?rev=1700425&r1=1700424&r2=1700425&view=diff
>
> ==============================================================================
> ---
> jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java
> (original)
> +++
> jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java
> Tue Sep 1 08:58:03 2015
> @@ -16,6 +16,8 @@
> */
> package org.apache.jackrabbit.oak.plugins.index.property;
>
> +import static com.google.common.collect.ImmutableSet.of;
> +import static java.util.Arrays.asList;
> import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
> import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM;
> import static org.apache.jackrabbit.JcrConstants.NT_BASE;
> @@ -23,14 +25,19 @@ import static org.apache.jackrabbit.JcrC
> import static org.apache.jackrabbit.JcrConstants.NT_UNSTRUCTURED;
> import static
> org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
> import static
> org.apache.jackrabbit.oak.plugins.index.IndexUtils.createIndexDefinition;
> +import static
> org.apache.jackrabbit.oak.plugins.index.PathFilter.PROP_EXCLUDED_PATHS;
> +import static
> org.apache.jackrabbit.oak.plugins.index.PathFilter.PROP_INCLUDED_PATHS;
> import static
> org.apache.jackrabbit.oak.plugins.index.counter.NodeCounterEditor.COUNT_PROPERTY_NAME;
> import static
> org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
> +import static
> org.apache.jackrabbit.oak.plugins.memory.PropertyStates.createProperty;
> import static
> org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_NODE_TYPES;
> import static
> org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent.INITIAL_CONTENT;
> import static org.junit.Assert.assertEquals;
> import static org.junit.Assert.assertFalse;
> +import static org.junit.Assert.assertThat;
> import static org.junit.Assert.assertTrue;
> import static org.junit.Assert.fail;
> +import static org.junit.matchers.JUnitMatchers.containsString;
>
> import java.util.Arrays;
> import java.util.Set;
> @@ -43,11 +50,13 @@ import ch.qos.logback.core.read.ListAppe
> import ch.qos.logback.core.spi.FilterReply;
> import com.google.common.collect.Iterables;
> import org.apache.jackrabbit.oak.api.CommitFailedException;
> +import org.apache.jackrabbit.oak.api.Tree;
> import org.apache.jackrabbit.oak.api.Type;
> import org.apache.jackrabbit.oak.plugins.index.IndexUpdateProvider;
> import
> org.apache.jackrabbit.oak.plugins.index.property.strategy.ContentMirrorStoreStrategy;
> import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState;
> import org.apache.jackrabbit.oak.query.QueryEngineSettings;
> +import org.apache.jackrabbit.oak.query.ast.Operator;
> import org.apache.jackrabbit.oak.query.ast.SelectorImpl;
> import org.apache.jackrabbit.oak.query.index.FilterImpl;
> import org.apache.jackrabbit.oak.query.index.TraversingIndex;
> @@ -565,6 +574,165 @@ public class PropertyIndexTest {
> deregisterAppender(appender);
> }
>
> + @Test
> + public void testPathInclude() throws Exception {
> + NodeState root = INITIAL_CONTENT;
> +
> + // Add index definition
> + NodeBuilder builder = root.builder();
> + NodeBuilder index =
> createIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "foo",
> + true, false, ImmutableSet.of("foo"), null);
> + index.setProperty(createProperty(PROP_INCLUDED_PATHS,
> of("/test/a"), Type.STRINGS));
> + NodeState before = builder.getNodeState();
> +
> + // Add some content and process it through the property index hook
> + builder.child("test").child("a").setProperty("foo", "abc");
> + builder.child("test").child("b").setProperty("foo", "abc");
> + NodeState after = builder.getNodeState();
> +
> + NodeState indexed = HOOK.processCommit(before, after,
> CommitInfo.EMPTY);
> +
> + FilterImpl f = createFilter(indexed, NT_BASE);
> +
> + // Query the index
> + PropertyIndexLookup lookup = new PropertyIndexLookup(indexed);
> + assertEquals(ImmutableSet.of("test/a"), find(lookup, "foo",
> "abc", f));
> + }
> +
> + @Test
> + public void testPathExclude() throws Exception {
> + NodeState root = INITIAL_CONTENT;
> +
> + // Add index definition
> + NodeBuilder builder = root.builder();
> + NodeBuilder index =
> createIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "foo",
> + true, false, ImmutableSet.of("foo"), null);
> + index.setProperty(createProperty(PROP_EXCLUDED_PATHS,
> of("/test/a"), Type.STRINGS));
> + NodeState before = builder.getNodeState();
> +
> + // Add some content and process it through the property index hook
> + builder.child("test").child("a").setProperty("foo", "abc");
> + builder.child("test").child("b").setProperty("foo", "abc");
> + NodeState after = builder.getNodeState();
> +
> + NodeState indexed = HOOK.processCommit(before, after,
> CommitInfo.EMPTY);
> +
> + FilterImpl f = createFilter(indexed, NT_BASE);
> + f.restrictProperty("foo", Operator.EQUAL,
> PropertyValues.newString("abc"));
> +
> + // Query the index
> + PropertyIndexLookup lookup = new PropertyIndexLookup(indexed);
> + assertEquals(ImmutableSet.of("test/b"), find(lookup, "foo",
> "abc", f));
> +
> + //no path restriction, opt out
> + PropertyIndexPlan plan = new PropertyIndexPlan("plan", root,
> index.getNodeState(), f);
> + assertTrue(Double.POSITIVE_INFINITY == plan.getCost());
> +
> + //path restriction is not an ancestor of excluded path, index may
> be used
> + f.setPath("/test2");
> + plan = new PropertyIndexPlan("plan", root, index.getNodeState(),
> f);
> + assertTrue(Double.POSITIVE_INFINITY != plan.getCost());
> +
> + //path restriction is an ancestor of excluded path, opt out
> + f.setPath("/test");
> + plan = new PropertyIndexPlan("plan", root, index.getNodeState(),
> f);
> + assertTrue(Double.POSITIVE_INFINITY == plan.getCost());
> + }
> +
> + @Test
> + public void testPathIncludeExclude() throws Exception {
> + NodeState root = INITIAL_CONTENT;
> +
> + // Add index definition
> + NodeBuilder builder = root.builder();
> + NodeBuilder index =
> createIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "foo",
> + true, false, ImmutableSet.of("foo"), null);
> + index.setProperty(createProperty(PROP_INCLUDED_PATHS,
> of("/test/a"), Type.STRINGS));
> + index.setProperty(createProperty(PROP_EXCLUDED_PATHS,
> of("/test/a/b"), Type.STRINGS));
> + NodeState before = builder.getNodeState();
> +
> + // Add some content and process it through the property index hook
> + builder.child("test").child("a").setProperty("foo", "abc");
> + builder.child("test").child("a").child("b").setProperty("foo",
> "abc");
> + NodeState after = builder.getNodeState();
> +
> + NodeState indexed = HOOK.processCommit(before, after,
> CommitInfo.EMPTY);
> +
> + FilterImpl f = createFilter(indexed, NT_BASE);
> + f.restrictProperty("foo", Operator.EQUAL,
> PropertyValues.newString("abc"));
> +
> + // Query the index
> + PropertyIndexLookup lookup = new PropertyIndexLookup(indexed);
> + assertEquals(ImmutableSet.of("test/a"), find(lookup, "foo",
> "abc", f));
> +
> + //no path restriction, opt out
> + PropertyIndexPlan plan = new PropertyIndexPlan("plan", root,
> index.getNodeState(), f);
> + assertTrue(Double.POSITIVE_INFINITY == plan.getCost());
> +
> + //path restriction is not an ancestor of excluded path, index may
> be used
> + f.setPath("/test/a/x");
> + plan = new PropertyIndexPlan("plan", root, index.getNodeState(),
> f);
> + assertTrue(Double.POSITIVE_INFINITY != plan.getCost());
> +
> + //path restriction is an ancestor of excluded path but no
> included path, opt out
> + f.setPath("/test/a/b");
> + plan = new PropertyIndexPlan("plan", root, index.getNodeState(),
> f);
> + assertTrue(Double.POSITIVE_INFINITY == plan.getCost());
> +
> + //path restriction is an ancestor of excluded path, opt out
> + f.setPath("/test/a");
> + plan = new PropertyIndexPlan("plan", root, index.getNodeState(),
> f);
> + assertTrue(Double.POSITIVE_INFINITY == plan.getCost());
> +}
> +
> + @Test
> + public void testPathExcludeInclude() throws Exception{
> + NodeState root = INITIAL_CONTENT;
> +
> + // Add index definition
> + NodeBuilder builder = root.builder();
> + NodeBuilder index =
> createIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "foo",
> + true, false, ImmutableSet.of("foo"), null);
> + index.setProperty(createProperty(PROP_INCLUDED_PATHS,
> of("/test/a/b"), Type.STRINGS));
> + index.setProperty(createProperty(PROP_EXCLUDED_PATHS,
> of("/test/a"), Type.STRINGS));
> + NodeState before = builder.getNodeState();
> +
> + // Add some content and process it through the property index hook
> + builder.child("test").child("a").setProperty("foo", "abc");
> + builder.child("test").child("a").child("b").setProperty("foo",
> "abc");
> + NodeState after = builder.getNodeState();
> +
> + try {
> + HOOK.processCommit(before, after, CommitInfo.EMPTY);
> + assertTrue(false);
> + } catch (IllegalStateException expected) {}
> + }
> +
> + @Test
> + public void testPathMismatch() throws Exception {
> + NodeState root = INITIAL_CONTENT;
> +
> + // Add index definition
> + NodeBuilder builder = root.builder();
> + NodeBuilder index =
> createIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "foo",
> + true, false, ImmutableSet.of("foo"), null);
> + index.setProperty(createProperty(PROP_INCLUDED_PATHS,
> of("/test/a"), Type.STRINGS));
> + index.setProperty(createProperty(PROP_EXCLUDED_PATHS,
> of("/test/a/b"), Type.STRINGS));
> + NodeState before = builder.getNodeState();
> +
> + // Add some content and process it through the property index hook
> + builder.child("test").child("a").setProperty("foo", "abc");
> + builder.child("test").child("a").child("b").setProperty("foo",
> "abc");
> + NodeState after = builder.getNodeState();
> +
> + NodeState indexed = HOOK.processCommit(before, after,
> CommitInfo.EMPTY);
> +
> + FilterImpl f = createFilter(indexed, NT_BASE);
> + f.restrictPath("/test2", Filter.PathRestriction.ALL_CHILDREN);
> + PropertyIndexPlan plan = new PropertyIndexPlan("plan", root,
> index.getNodeState(), f);
> + assertTrue(Double.POSITIVE_INFINITY == plan.getCost());
> + }
> +
> private int getResultSize(NodeState indexed, String name, String
> value){
> FilterImpl f = createFilter(indexed, NT_BASE);
>
>
>
>