Author: davide Date: Thu Oct 16 09:41:18 2014 New Revision: 1632258 URL: http://svn.apache.org/r1632258 Log: OAK-2202 - OrderedIndex should not return the whole index on property=$value statement
used a single key fetch where possible and increased unit test coverage Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStoreStrategy.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/strategy/OrderedContentMirrorStoreStrategy.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStoreStrategy.java?rev=1632258&r1=1632257&r2=1632258&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStoreStrategy.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStoreStrategy.java Thu Oct 16 09:41:18 2014 @@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.plugins.index.property.strategy; import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.collect.Iterators.singletonIterator; import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.ENTRY_COUNT_PROPERTY_NAME; import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_CONTENT_NODE_NAME; @@ -40,6 +41,7 @@ import org.apache.jackrabbit.oak.plugins import org.apache.jackrabbit.oak.plugins.index.property.OrderedIndex.OrderDirection; import org.apache.jackrabbit.oak.plugins.index.property.OrderedIndex.Predicate; import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState; +import org.apache.jackrabbit.oak.plugins.memory.MemoryChildNodeEntry; import org.apache.jackrabbit.oak.spi.query.Filter; import org.apache.jackrabbit.oak.spi.query.Filter.PropertyRestriction; import org.apache.jackrabbit.oak.spi.state.AbstractChildNodeEntry; @@ -408,6 +410,25 @@ public class OrderedContentMirrorStoreSt } } return it; + } else if (firstEncoded != null && firstEncoded.equals(lastEncoded)) { + // property = $value case + LOG.debug("'property = $value' case"); + + final NodeState key = indexState.getChildNode(firstEncoded); + final String pf = pathPrefix; + if (key.exists()) { + return new Iterable<String>() { + @Override + public Iterator<String> iterator() { + PathIterator pi = new PathIterator(filter, indexName, pf); + pi.setPathContainsValue(true); + pi.enqueue(singletonIterator(new MemoryChildNodeEntry(firstEncoded, key))); + return pi; + } + }; + } else { + return Collections.emptyList(); + } } else { // property is not null. AKA "open query" LOG.debug("property is not null. AKA 'open query'. FullIterable"); @@ -1079,7 +1100,7 @@ public class OrderedContentMirrorStoreSt int len = next.length - 1; for (; len >= 0; len--) { if (next[len].length() != 0) { - break; + break; } } len++; 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=1632258&r1=1632257&r2=1632258&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 Thu Oct 16 09:41:18 2014 @@ -16,6 +16,7 @@ */ 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; @@ -24,6 +25,7 @@ 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.nodetype.NodeTypeConstants.JCR_NODE_TYPES; +import static org.apache.jackrabbit.oak.spi.query.PropertyValues.newString; import static org.junit.Assert.assertNotNull; import java.text.ParseException; @@ -36,11 +38,6 @@ import java.util.Map; import javax.jcr.RepositoryException; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; - import org.apache.jackrabbit.JcrConstants; import org.apache.jackrabbit.oak.api.CommitFailedException; import org.apache.jackrabbit.oak.api.PropertyValue; @@ -70,6 +67,11 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; + public class OrderedPropertyIndexQueryTest extends BasicOrderedPropertyIndexQueryTest { private static final Logger LOG = LoggerFactory.getLogger(OrderedPropertyIndexQueryTest.class); @@ -151,6 +153,42 @@ public class OrderedPropertyIndexQueryTe setTraversalEnabled(true); } + + /** + * checks the {@code OR} and {@code IN} conditions in queries. + * + * @throws Exception + */ + @Test + public void queryOrIn() throws Exception { + setTraversalEnabled(false); + + // index automatically created by the framework: + // {@code createTestIndexNode()} + + // generates: + // /test/n0, /test/n1, /test/n2 + Tree rTree = root.getTree("/"); + Tree test = rTree.addChild("test"); + List<ValuePathTuple> nodes = addChildNodes(generateOrderedValues(3), test, + OrderDirection.ASC, Type.STRING); + root.commit(); + + String statementOr = "SELECT * FROM [nt:unstructured] " + + "WHERE " + ORDERED_PROPERTY + " = $or1 " + + "OR " + ORDERED_PROPERTY + " = $or2"; + String statementIn = "SELECT * FROM [nt:unstructured] WHERE " + ORDERED_PROPERTY + + " IN($or1, $or2)"; + List<ValuePathTuple> expected = of(nodes.get(0), nodes.get(1)); + Map<String, PropertyValue> bindings = ImmutableMap.of( + "or1", newString(expected.get(0).getValue()), + "or2", newString(expected.get(1).getValue())); + + assertRightOrder(expected, executeQuery(statementOr, SQL2, bindings).getRows().iterator()); + assertRightOrder(expected, executeQuery(statementIn, SQL2, bindings).getRows().iterator()); + + setTraversalEnabled(true); + } /** * test the range query in case of '>' condition