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 2016/10/05 14:11:57 UTC

svn commit: r1763455 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ test/java/org/apache/jackrabbit/oak/plugins/index/property/ test/java/org/apache/jackrabbit/oak/plugins/index/property/st...

Author: thomasm
Date: Wed Oct  5 14:11:56 2016
New Revision: 1763455

URL: http://svn.apache.org/viewvc?rev=1763455&view=rev
Log:
OAK-4816 Property index: cost estimate with path restriction is too optimistic

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.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=1763455&r1=1763454&r2=1763455&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 Wed Oct  5 14:11:56 2016
@@ -295,7 +295,16 @@ public class ContentMirrorStoreStrategy
             if (totalNodesCount != -1) {
                 long filterPathCount = NodeCounter.getEstimatedNodeCount(root, filterRootPath, true);
                 if (filterPathCount != -1) {
-                    count = (long) ((double) count / totalNodesCount * filterPathCount);
+                    // assume nodes in the index are evenly distributed in the repository (old idea)
+                    long countScaledDown = (long) ((double) count / totalNodesCount * filterPathCount);
+                    // assume 80% of the indexed nodes are in this subtree
+                    long mostNodesFromThisSubtree = (long) (filterPathCount * 0.8);
+                    // count can at most be the assumed subtree size
+                    count = Math.min(count, mostNodesFromThisSubtree);
+                    // this in theory should not have any effect, 
+                    // except if the above estimates are incorrect,
+                    // so this is just for safety feature
+                    count = Math.max(count, countScaledDown);
                 }
             }
         }

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java?rev=1763455&r1=1763454&r2=1763455&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java Wed Oct  5 14:11:56 2016
@@ -171,19 +171,19 @@ public class PropertyIndexTest {
         double cost;
 
         cost = lookup.getCost(f, "foo", PropertyValues.newString("x1"));
-        assertTrue("cost: " + cost, cost >= 7.5 && cost <= 8.5);
+        assertTrue("cost: " + cost, cost >= 10 && cost <= 14);
 
         cost = lookup.getCost(f, "foo", PropertyValues.newString(
                 Arrays.asList("x1", "x2")));
-        assertTrue("cost: " + cost, cost >= 14.5 && cost <= 15.5);
+        assertTrue("cost: " + cost, cost >= 20 && cost <= 24);
 
         cost = lookup.getCost(f, "foo", PropertyValues.newString(
                 Arrays.asList("x1", "x2", "x3", "x4", "x5")));
-        assertTrue("cost: " + cost, cost >= 34.5 && cost <= 35.5);
+        assertTrue("cost: " + cost, cost >= 50 && cost <= 54);
 
         cost = lookup.getCost(f, "foo", PropertyValues.newString(
                 Arrays.asList("x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x0")));
-        assertTrue("cost: " + cost, cost >= 81.5 && cost <= 82.5);
+        assertTrue("cost: " + cost, cost >= 120 && cost <= 124);
 
         cost = lookup.getCost(f, "foo", null);
         assertTrue("cost: " + cost, cost >= MANY);

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.java?rev=1763455&r1=1763454&r2=1763455&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.java Wed Oct  5 14:11:56 2016
@@ -244,18 +244,16 @@ public class ContentMirrorStoreStrategyT
         assertInRange(
                 "Approximate count not used for is-not-null query",
                 approxNodeCount,
-                filteredNodeFactor *
-                        store.count(filter, root, indexMeta.getNodeState(),
-                                null, maxTraversal));
+                store.count(filter, root, indexMeta.getNodeState(),
+                            null, maxTraversal));
 
         // prop=value query without entryCount
         key.setProperty(approxPropName, approxKeyCount, Type.LONG);
         assertInRange(
                 "Approximate count not used for key=value query",
                 approxKeyCount,
-                filteredNodeFactor *
-                        store.count(filter, root, indexMeta.getNodeState(),
-                                KEY, maxTraversal));
+                store.count(filter, root, indexMeta.getNodeState(),
+                            KEY, maxTraversal));
 
         // is-not-null query with entryCount
         indexMeta
@@ -284,10 +282,10 @@ public class ContentMirrorStoreStrategyT
     }
 
     private static void assertInRange(String msg, double expected, double actual) {
-        final double allowedError = 0.1;
-
+        double allowedError = 0.1;
         double diff = Math.abs(expected - actual);
-        Assert.assertTrue(msg, diff < expected * allowedError);
+        Assert.assertTrue(msg + "; expected about " + expected + ", got " + actual, 
+                diff < expected * allowedError);
     }
 
 }