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


Reply via email to