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


Reply via email to