Author: thomasm
Date: Wed Feb  5 12:55:53 2014
New Revision: 1564752

URL: http://svn.apache.org/r1564752
Log:
Query: an index is used even where traversing is faster (WIP: improved cost 
estimation)

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingIndex.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingIndex.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingIndex.java?rev=1564752&r1=1564751&r2=1564752&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingIndex.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingIndex.java
 Wed Feb  5 12:55:53 2014
@@ -22,6 +22,7 @@ import org.apache.jackrabbit.oak.commons
 import org.apache.jackrabbit.oak.spi.query.Cursor;
 import org.apache.jackrabbit.oak.spi.query.Cursors;
 import org.apache.jackrabbit.oak.spi.query.Filter;
+import org.apache.jackrabbit.oak.spi.query.Filter.PathRestriction;
 import org.apache.jackrabbit.oak.spi.query.QueryIndex;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
@@ -40,15 +41,37 @@ public class TraversingIndex implements 
         if (filter.isAlwaysFalse()) {
             return 0;
         }
-        String path = filter.getPath();
-        // TODO estimate or read the node count
         double nodeCount = 10000000;
-        if (!PathUtils.denotesRoot(path)) {
-            for (int depth = PathUtils.getDepth(path); depth > 0; depth--) {
-                // estimate 10 child nodes per node
-                nodeCount /= 10;
+        String path = filter.getPath();
+        PathRestriction restriction = filter.getPathRestriction();
+        switch (restriction) {
+        case NO_RESTRICTION:
+            break;
+        case EXACT:
+            nodeCount = 1;
+            break;
+        case ALL_CHILDREN:
+            if (!PathUtils.denotesRoot(path)) {
+                for (int depth = PathUtils.getDepth(path); depth > 0; depth--) 
{
+                    // estimate 10 child nodes per node
+                    nodeCount /= 10;
+                }
             }
-        }
+            break;
+        case PARENT:
+            if (PathUtils.denotesRoot(path)) {
+                nodeCount = 1;
+            } else {
+                nodeCount = PathUtils.getDepth(path);
+            }
+            break;
+        case DIRECT_CHILDREN:
+            // we expect 1 million child nodes in the worst case
+            nodeCount = 1000000;
+            break;
+        default:
+            throw new IllegalArgumentException("Unknown restriction: " + 
restriction);
+        }        
         return nodeCount;
     }
 


Reply via email to