Author: davide Date: Fri Nov 28 15:02:44 2014 New Revision: 1642309 URL: http://svn.apache.org/r1642309 Log: OAK-2305 - Merge OAK-2202 into the 1.0 branch
manually resolved conflicts and avoided the dependecy of OAK-1977 Modified: jackrabbit/oak/branches/1.0/ (props changed) jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStoreStrategy.java jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexQueryTest.java Propchange: jackrabbit/oak/branches/1.0/ ------------------------------------------------------------------------------ Merged /jackrabbit/oak/trunk:r1632258 Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStoreStrategy.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStoreStrategy.java?rev=1642309&r1=1642308&r2=1642309&view=diff ============================================================================== --- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStoreStrategy.java (original) +++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/OrderedContentMirrorStoreStrategy.java Fri Nov 28 15:02:44 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; @@ -396,6 +398,24 @@ 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); + if (key.exists()) { + return new Iterable<String>() { + @Override + public Iterator<String> iterator() { + PathIterator pi = new PathIterator(filter, indexName); + 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"); @@ -1063,7 +1083,7 @@ public class OrderedContentMirrorStoreSt int len = next.length - 1; for (; len >= 0; len--) { if (next[len].length() != 0) { - break; + break; } } len++; Modified: jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexQueryTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexQueryTest.java?rev=1642309&r1=1642308&r2=1642309&view=diff ============================================================================== --- jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexQueryTest.java (original) +++ jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndexQueryTest.java Fri Nov 28 15:02:44 2014 @@ -16,12 +16,14 @@ */ 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_SYSTEM; import static org.apache.jackrabbit.JcrConstants.NT_UNSTRUCTURED; 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; @@ -145,6 +147,42 @@ public class OrderedPropertyIndexQueryTe setTravesalEnabled(true); } + + /** + * checks the {@code OR} and {@code IN} conditions in queries. + * + * @throws Exception + */ + @Test + public void queryOrIn() throws Exception { + setTravesalEnabled(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()); + + setTravesalEnabled(true); + } /** * test the range query in case of '>' condition