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);
}
}