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