Author: davide Date: Tue Oct 21 13:01:24 2014 New Revision: 1633366 URL: http://svn.apache.org/r1633366 Log: OAK-2219 - Ordered index does not return relative properties for un-restricted indexes
Fixed depth in index plan and increased unit testing coverage. Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndex.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexDescendingQueryTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexQueryTest.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndex.java?rev=1633366&r1=1633365&r2=1633366&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndex.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndex.java Tue Oct 21 13:01:24 2014 @@ -191,7 +191,7 @@ public class OrderedPropertyIndex implem PropertyRestriction pr = plan.getPropertyRestriction(); if (pr != null) { String propertyName = PathUtils.getName(pr.propertyName); - depth = PathUtils.getDepth(propertyName); + depth = PathUtils.getDepth(pr.propertyName); paths = strategy.query(plan.getFilter(), propertyName, plan.getDefinition(), pr, pathPrefix); } Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexDescendingQueryTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexDescendingQueryTest.java?rev=1633366&r1=1633365&r2=1633366&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexDescendingQueryTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexDescendingQueryTest.java Tue Oct 21 13:01:24 2014 @@ -16,13 +16,18 @@ */ package org.apache.jackrabbit.oak.plugins.index.property; +import static com.google.common.collect.ImmutableList.of; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; +import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE; import static org.apache.jackrabbit.JcrConstants.NT_UNSTRUCTURED; +import static org.apache.jackrabbit.oak.api.Type.NAME; +import static org.apache.jackrabbit.oak.api.Type.STRING; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Iterator; @@ -36,6 +41,7 @@ import org.apache.jackrabbit.oak.api.Pro import org.apache.jackrabbit.oak.api.ResultRow; import org.apache.jackrabbit.oak.api.Tree; import org.apache.jackrabbit.oak.api.Type; +import org.apache.jackrabbit.oak.commons.PathUtils; import org.apache.jackrabbit.oak.plugins.index.IndexConstants; import org.apache.jackrabbit.oak.plugins.index.IndexUtils; import org.apache.jackrabbit.oak.plugins.index.property.OrderedIndex.OrderDirection; @@ -45,6 +51,7 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Predicate; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -555,4 +562,75 @@ public class OrderedPropertyIndexDescend setTraversalEnabled(true); } + @Test + public void oak2219() throws Exception { + setTraversalEnabled(false); + + List<String> expected = new ArrayList<String>(); + Tree content = root.getTree("/").addChild("content"); + + for (String s : of("a", "b", "c")) { + Tree node = content.addChild(s); + node.setProperty(JCR_PRIMARYTYPE, NT_UNSTRUCTURED, NAME); + node.addChild("sub").setProperty(ORDERED_PROPERTY, s + "value", STRING); + expected.add(node.getPath()); + } + + root.commit(); + + assertQuery("//element(*, nt:unstructured)[(sub/@" + ORDERED_PROPERTY + ")]", "xpath", + expected); + + assertQuery("//element(*, nt:unstructured)[(sub/@" + ORDERED_PROPERTY + " > 'avalue')]", + "xpath", Lists.newArrayList(Iterables.filter(expected, new Predicate<String>() { + @Override + public boolean apply(String path) { + return "a".compareTo(PathUtils.getName(path)) < 0; + } + }))); + + assertQuery("//element(*, nt:unstructured)[(sub/@" + ORDERED_PROPERTY + " >= 'bvalue')]", + "xpath", Lists.newArrayList(Iterables.filter(expected, new Predicate<String>() { + @Override + public boolean apply(String path) { + return "b".compareTo(PathUtils.getName(path)) <= 0; + } + }))); + + assertQuery("//element(*, nt:unstructured)[(sub/@" + ORDERED_PROPERTY + " <= 'bvalue')]", + "xpath", Lists.newArrayList(Iterables.filter(expected, new Predicate<String>() { + @Override + public boolean apply(String path) { + return "b".compareTo(PathUtils.getName(path)) >= 0; + } + }))); + + assertQuery("//element(*, nt:unstructured)[(sub/@" + ORDERED_PROPERTY + " < 'cvalue')]", + "xpath", Lists.newArrayList(Iterables.filter(expected, new Predicate<String>() { + @Override + public boolean apply(String path) { + return "c".compareTo(PathUtils.getName(path)) > 0; + } + }))); + + assertQuery("//element(*, nt:unstructured)[(sub/@" + ORDERED_PROPERTY + + " > 'avalue' and sub/@" + ORDERED_PROPERTY + " < 'cvalue')]", "xpath", + Lists.newArrayList(Iterables.filter(expected, new Predicate<String>() { + @Override + public boolean apply(String path) { + return "c".compareTo(PathUtils.getName(path)) > 0 + && "a".compareTo(PathUtils.getName(path)) < 0; + } + }))); + + assertQuery("//element(*, nt:unstructured)[(sub/@" + ORDERED_PROPERTY + " = 'bvalue')]", + "xpath", Lists.newArrayList(Iterables.filter(expected, new Predicate<String>() { + @Override + public boolean apply(String path) { + return "b".compareTo(PathUtils.getName(path)) == 0; + } + }))); + + setTraversalEnabled(true); + } } Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexQueryTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexQueryTest.java?rev=1633366&r1=1633365&r2=1633366&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexQueryTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexQueryTest.java Tue Oct 21 13:01:24 2014 @@ -23,6 +23,8 @@ import static junit.framework.Assert.ass import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE; import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM; import static org.apache.jackrabbit.JcrConstants.NT_UNSTRUCTURED; +import static org.apache.jackrabbit.oak.api.Type.NAME; +import static org.apache.jackrabbit.oak.api.Type.STRING; import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME; import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_NODE_TYPES; import static org.apache.jackrabbit.oak.spi.query.PropertyValues.newString; @@ -30,6 +32,7 @@ import static org.junit.Assert.assertNot import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Iterator; @@ -67,6 +70,7 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; @@ -962,4 +966,76 @@ public class OrderedPropertyIndexQueryTe setTraversalEnabled(true); } + + @Test + public void oak2219() throws Exception { + setTraversalEnabled(false); + + List<String> expected = new ArrayList<String>(); + Tree content = root.getTree("/").addChild("content"); + + for (String s : of("a", "b", "c")) { + Tree node = content.addChild(s); + node.setProperty(JCR_PRIMARYTYPE, NT_UNSTRUCTURED, NAME); + node.addChild("sub").setProperty(ORDERED_PROPERTY, s + "value", STRING); + expected.add(node.getPath()); + } + + root.commit(); + + assertQuery("//element(*, nt:unstructured)[(sub/@" + ORDERED_PROPERTY + ")]", "xpath", + expected); + + assertQuery("//element(*, nt:unstructured)[(sub/@" + ORDERED_PROPERTY + " > 'avalue')]", + "xpath", Lists.newArrayList(Iterables.filter(expected, new Predicate<String>() { + @Override + public boolean apply(String path) { + return "a".compareTo(PathUtils.getName(path)) < 0; + } + }))); + + assertQuery("//element(*, nt:unstructured)[(sub/@" + ORDERED_PROPERTY + " >= 'bvalue')]", + "xpath", Lists.newArrayList(Iterables.filter(expected, new Predicate<String>() { + @Override + public boolean apply(String path) { + return "b".compareTo(PathUtils.getName(path)) <= 0; + } + }))); + + assertQuery("//element(*, nt:unstructured)[(sub/@" + ORDERED_PROPERTY + " <= 'bvalue')]", + "xpath", Lists.newArrayList(Iterables.filter(expected, new Predicate<String>() { + @Override + public boolean apply(String path) { + return "b".compareTo(PathUtils.getName(path)) >= 0; + } + }))); + + assertQuery("//element(*, nt:unstructured)[(sub/@" + ORDERED_PROPERTY + " < 'cvalue')]", + "xpath", Lists.newArrayList(Iterables.filter(expected, new Predicate<String>() { + @Override + public boolean apply(String path) { + return "c".compareTo(PathUtils.getName(path)) > 0; + } + }))); + + assertQuery("//element(*, nt:unstructured)[(sub/@" + ORDERED_PROPERTY + + " > 'avalue' and sub/@" + ORDERED_PROPERTY + " < 'cvalue')]", "xpath", + Lists.newArrayList(Iterables.filter(expected, new Predicate<String>() { + @Override + public boolean apply(String path) { + return "c".compareTo(PathUtils.getName(path)) > 0 + && "a".compareTo(PathUtils.getName(path)) < 0; + } + }))); + + assertQuery("//element(*, nt:unstructured)[(sub/@" + ORDERED_PROPERTY + " = 'bvalue')]", + "xpath", Lists.newArrayList(Iterables.filter(expected, new Predicate<String>() { + @Override + public boolean apply(String path) { + return "b".compareTo(PathUtils.getName(path)) == 0; + } + }))); + + setTraversalEnabled(true); + } } \ No newline at end of file