You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by th...@apache.org on 2014/06/23 18:20:43 UTC

svn commit: r1604849 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java

Author: thomasm
Date: Mon Jun 23 16:20:43 2014
New Revision: 1604849

URL: http://svn.apache.org/r1604849
Log:
OAK-1903 PropertyIndex applies 10x penalty to is not null queries even when the node count is known

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java?rev=1604849&r1=1604848&r2=1604849&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java Mon Jun 23 16:20:43 2014
@@ -168,8 +168,10 @@ public class ContentMirrorStoreStrategy 
             CountingNodeVisitor v = new CountingNodeVisitor(max);
             v.visit(index);
             count = v.getEstimatedCount();
-            // "is not null" queries typically read more data
-            count *= 10;
+            if (count >= max) {
+                // "is not null" queries typically read more data
+                count *= 10;
+            }
         } else {
             int size = values.size();
             if (size == 0) {

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java?rev=1604849&r1=1604848&r2=1604849&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java Mon Jun 23 16:20:43 2014
@@ -44,6 +44,43 @@ public class QueryPlanTest extends Abstr
     public QueryPlanTest(NodeStoreFixture fixture) {
         super(fixture);
     }
+    
+    @Test
+    // OAK-1903
+    public void propertyEqualsVersusPropertyNotNull() throws Exception {
+        Session session = getAdminSession();
+        QueryManager qm = session.getWorkspace().getQueryManager();
+        Node testRootNode = session.getRootNode().addNode("testroot");
+        createPropertyIndex(session, "notNull");
+        createPropertyIndex(session, "equals");
+        for (int i = 0; i < 100; i++) {
+            Node n = testRootNode.addNode("n" + i, "oak:Unstructured");
+            if (i % 2 == 0) {
+                n.setProperty("notNull", i);
+            }
+            n.setProperty("equals", 1);
+        }
+        session.save();
+       
+        String xpath = "/jcr:root//*[@notNull and @equals=1]";
+        
+        Query q;
+        QueryResult result;
+        RowIterator it;
+        
+        q = qm.createQuery("explain " + xpath, "xpath");
+        result = q.execute();
+        it = result.getRows();
+        assertTrue(it.hasNext());
+        String plan = it.nextRow().getValue("plan").getString();
+        // System.out.println("plan: " + plan);
+        // should not use the index on "jcr:uuid"
+        assertEquals("[nt:base] as [a] /* property notNull " + 
+                "where (([a].[notNull] is not null) " + 
+                "and ([a].[equals] = cast('1' as long))) " + 
+                "and (isdescendantnode([a], [/])) */", 
+                plan);
+    }           
 
     @Test
     // OAK-1898