Author: thomasm
Date: Tue Mar 27 09:42:08 2018
New Revision: 1827820
URL: http://svn.apache.org/viewvc?rev=1827820&view=rev
Log:
OAK-7379 Lucene Index: per-column selectivity, assume 5 unique entries
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/MultiplexingLucenePropertyIndexTest.java
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java?rev=1827820&r1=1827819&r2=1827820&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java
Tue Mar 27 09:42:08 2018
@@ -65,6 +65,9 @@ import static org.apache.jackrabbit.oak.
import static org.apache.jackrabbit.oak.spi.query.QueryIndex.OrderEntry;
class IndexPlanner {
+
+ public static int DEFAULT_PROPERTY_WEIGHT =
Integer.getInteger("oak.lucene.defaultPropertyWeight", 5);
+
private static final String FLAG_ENTRY_COUNT =
"oak.lucene.useActualEntryCount";
private static final Logger log =
LoggerFactory.getLogger(IndexPlanner.class);
private final IndexDefinition definition;
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java?rev=1827820&r1=1827819&r2=1827820&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java
Tue Mar 27 09:42:08 2018
@@ -111,10 +111,10 @@ public class PropertyDefinition {
* For function-based indexes: the function name, in Polish notation.
*/
final String function;
-
+
/**
* For function-based indexes: the function code, as tokens.
- */
+ */
final String[] functionCode;
public final ValuePattern valuePattern;
@@ -128,7 +128,7 @@ public class PropertyDefinition {
this.name = getName(defn, nodeName);
this.relative = isRelativeProperty(name);
this.boost = getOptionalValue(defn, FIELD_BOOST, DEFAULT_BOOST);
- this.weight = getOptionalValue(defn, PROP_WEIGHT, -1);
+ this.weight = getOptionalValue(defn, PROP_WEIGHT,
IndexPlanner.DEFAULT_PROPERTY_WEIGHT);
//By default if a property is defined it is indexed
this.index = getOptionalValue(defn, LuceneIndexConstants.PROP_INDEX,
true);
Modified:
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java?rev=1827820&r1=1827819&r2=1827820&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java
Tue Mar 27 09:42:08 2018
@@ -355,7 +355,7 @@ public class IndexPlannerTest {
IndexPlanner planner = new IndexPlanner(node, "/foo", filter,
Collections.<OrderEntry>emptyList());
QueryIndex.IndexPlan plan = planner.getPlan();
- assertEquals(numofDocs, plan.getEstimatedEntryCount());
+ assertEquals(documentsPerValue(numofDocs),
plan.getEstimatedEntryCount());
assertEquals(3.0, plan.getCostPerExecution(), 0);
assertEquals(2.0, plan.getCostPerEntry(), 0);
assertNotNull(plan);
@@ -390,7 +390,7 @@ public class IndexPlannerTest {
IndexPlanner planner = new IndexPlanner(node, "/foo", filter,
Collections.<OrderEntry>emptyList());
QueryIndex.IndexPlan plan = planner.getPlan();
- assertEquals(numofDocs, plan.getEstimatedEntryCount());
+ assertEquals(documentsPerValue(numofDocs),
plan.getEstimatedEntryCount());
}
@Test
@@ -1046,8 +1046,7 @@ public class IndexPlannerTest {
QueryIndex.IndexPlan plan = planner.getPlan();
assertNotNull(plan);
- //For non unique count is actual
- assertEquals(100, plan.getEstimatedEntryCount());
+ assertEquals(documentsPerValue(100), plan.getEstimatedEntryCount());
PropertyIndexResult hr = pr(plan).getPropertyIndexResult();
assertNotNull(hr);
@@ -1100,7 +1099,7 @@ public class IndexPlannerTest {
QueryIndex.IndexPlan plan = planner.getPlan();
assertNotNull(plan);
- assertEquals(100, plan.getEstimatedEntryCount());
+ assertEquals(documentsPerValue(100), plan.getEstimatedEntryCount());
PropertyIndexResult hr = pr(plan).getPropertyIndexResult();
assertNull(hr);
@@ -1124,7 +1123,7 @@ public class IndexPlannerTest {
QueryIndex.IndexPlan plan = planner.getPlan();
assertNotNull(plan);
- assertEquals(100, plan.getEstimatedEntryCount());
+ assertEquals(documentsPerValue(100), plan.getEstimatedEntryCount());
PropertyIndexResult hr = pr(plan).getPropertyIndexResult();
assertNull(hr);
@@ -1306,7 +1305,7 @@ public class IndexPlannerTest {
IndexPlanner planner = new IndexPlanner(node, "/test", filter,
Collections.emptyList());
QueryIndex.IndexPlan plan = planner.getPlan();
- assertEquals(numOfDocs, plan.getEstimatedEntryCount());
+ assertEquals(documentsPerValue(numOfDocs),
plan.getEstimatedEntryCount());
assertEquals(1.0, plan.getCostPerExecution(), 0);
assertEquals(1.0, plan.getCostPerEntry(), 0);
@@ -1633,7 +1632,7 @@ public class IndexPlannerTest {
IndexPlanner planner = new IndexPlanner(node, indexPath, filter,
Collections.emptyList());
QueryIndex.IndexPlan plan = planner.getPlan();
- assertEquals(numOfDocs, plan.getEstimatedEntryCount());
+ assertEquals(documentsPerValue(numOfDocs),
plan.getEstimatedEntryCount());
filter = createFilter("nt:base");
filter.restrictProperty(SYNTHETICALLY_FALLIABLE_FIELD,
Operator.EQUAL, PropertyValues.newString("bar"));
@@ -1688,7 +1687,7 @@ public class IndexPlannerTest {
IndexPlanner planner = new IndexPlanner(node, indexPath, filter,
Collections.emptyList());
QueryIndex.IndexPlan plan = planner.getPlan();
- assertEquals(numOfDocs, plan.getEstimatedEntryCount());
+ assertEquals(documentsPerValue(numOfDocs),
plan.getEstimatedEntryCount());
filter = createFilter("nt:base");
filter.restrictProperty("a/foo", Operator.EQUAL,
PropertyValues.newString("bar"));
@@ -1706,7 +1705,7 @@ public class IndexPlannerTest {
plan = planner.getPlan();
//Because path transormation comes into play only when direct prop
defs don't match
- assertEquals(numOfDocs, plan.getEstimatedEntryCount());
+ assertEquals(documentsPerValue(numOfDocs),
plan.getEstimatedEntryCount());
filter = createFilter("nt:base");
filter.restrictProperty("a/foo", Operator.EQUAL,
PropertyValues.newString("bar"));
@@ -1797,5 +1796,16 @@ public class IndexPlannerTest {
}
}
+ /**
+ * The estimated number of documents per unique value.
+ *
+ * @param numofDocs the total number of documents
+ * @return the estimated number of documents
+ */
+ public static long documentsPerValue(long numofDocs) {
+ // OAK-7379: divide the number of documents by the number of unique
entries
+ return Math.max(1, numofDocs / IndexPlanner.DEFAULT_PROPERTY_WEIGHT);
+ }
+
}
Modified:
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/MultiplexingLucenePropertyIndexTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/MultiplexingLucenePropertyIndexTest.java?rev=1827820&r1=1827819&r2=1827820&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/MultiplexingLucenePropertyIndexTest.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/MultiplexingLucenePropertyIndexTest.java
Tue Mar 27 09:42:08 2018
@@ -162,7 +162,7 @@ public class MultiplexingLucenePropertyI
QueryIndex.IndexPlan plan = planner.getPlan();
//Count should be sum of both readers
- assertEquals(2, plan.getEstimatedEntryCount());
+ assertEquals(IndexPlannerTest.documentsPerValue(2),
plan.getEstimatedEntryCount());
}
@Test