Author: chetanm
Date: Wed Jul 12 03:52:54 2017
New Revision: 1801675
URL: http://svn.apache.org/viewvc?rev=1801675&view=rev
Log:
OAK-5899 - PropertyDefinitions should allow for some tweakability to declare
usefulness
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/LuceneIndexConstants.java
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilder.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.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=1801675&r1=1801674&r2=1801675&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
Wed Jul 12 03:52:54 2017
@@ -192,7 +192,12 @@ class IndexPlanner {
if (pr.isNullRestriction() && !pd.nullCheckEnabled){
continue;
}
- indexedProps.add(name);
+
+ //A property definition with weight == 0 is only meant to
be used
+ //with some other definitions
+ if (pd.weight != 0) {
+ indexedProps.add(name);
+ }
result.propDefns.put(name, pd);
}
}
@@ -216,7 +221,10 @@ class IndexPlanner {
//TODO Need a way to have better cost estimate to indicate that
//this index can evaluate more propertyRestrictions natively (if
more props are indexed)
//For now we reduce cost per entry
- int costPerEntryFactor = indexedProps.size();
+
+ //Use propDefns instead of indexedProps as it determines true
count of property restrictions
+ //which are evaluated by this index
+ int costPerEntryFactor = result.propDefns.size();
costPerEntryFactor += sortOrder.size();
//this index can evaluate more propertyRestrictions natively (if
more props are indexed)
@@ -653,6 +661,10 @@ class IndexPlanner {
return propDefns.get(pr.propertyName);
}
+ public boolean hasProperty(String propName){
+ return propDefns.containsKey(propName);
+ }
+
public PropertyDefinition getOrderedProperty(int index){
return sortedProperties.get(index);
}
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java?rev=1801675&r1=1801674&r2=1801675&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
Wed Jul 12 03:52:54 2017
@@ -148,6 +148,8 @@ public interface LuceneIndexConstants {
String PROP_SCORER_PROVIDER = "scorerProviderName";
+ String PROP_WEIGHT = "weight";
+
/**
* Integer property indicating that LuceneIndex should be
* used in compat mode to specific version
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=1801675&r1=1801674&r2=1801675&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
Wed Jul 12 03:52:54 2017
@@ -38,6 +38,7 @@ import static org.apache.jackrabbit.oak.
import static org.apache.jackrabbit.oak.commons.PathUtils.isAbsolute;
import static
org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.FIELD_BOOST;
import static
org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PROP_IS_REGEX;
+import static
org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PROP_WEIGHT;
import static
org.apache.jackrabbit.oak.plugins.index.lucene.util.ConfigUtil.getOptionalValue;
class PropertyDefinition {
@@ -93,6 +94,8 @@ class PropertyDefinition {
final boolean excludeFromAggregate;
+ final int weight;
+
/**
* Property name excluding the relativePath. For regular expression based
definition
* its set to null
@@ -115,6 +118,7 @@ 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);
//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/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilder.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilder.java?rev=1801675&r1=1801674&r2=1801675&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilder.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilder.java
Wed Jul 12 03:52:54 2017
@@ -339,6 +339,11 @@ public final class IndexDefinitionBuilde
return this;
}
+ public PropertyRule weight(int weight){
+ propTree.setProperty(LuceneIndexConstants.PROP_WEIGHT, weight);
+ return this;
+ }
+
public IndexRule enclosingRule(){
return indexRule;
}
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=1801675&r1=1801674&r2=1801675&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
Wed Jul 12 03:52:54 2017
@@ -37,10 +37,12 @@ import static org.apache.jackrabbit.oak.
import static
org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
import static
org.apache.jackrabbit.oak.plugins.memory.PropertyStates.createProperty;
import static org.apache.jackrabbit.oak.InitialContent.INITIAL_CONTENT;
+import static org.hamcrest.Matchers.lessThan;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
@@ -57,6 +59,7 @@ import org.apache.jackrabbit.oak.plugins
import
org.apache.jackrabbit.oak.plugins.index.lucene.reader.DefaultIndexReader;
import org.apache.jackrabbit.oak.plugins.index.lucene.reader.LuceneIndexReader;
import
org.apache.jackrabbit.oak.plugins.index.lucene.reader.LuceneIndexReaderFactory;
+import
org.apache.jackrabbit.oak.plugins.index.lucene.util.IndexDefinitionBuilder;
import org.apache.jackrabbit.oak.plugins.memory.PropertyValues;
import org.apache.jackrabbit.oak.query.NodeStateNodeTypeInfoProvider;
import org.apache.jackrabbit.oak.query.ast.NodeTypeInfo;
@@ -511,6 +514,43 @@ public class IndexPlannerTest {
assertNull(plan);
}
+ @Test
+ public void indexedButZeroWeightProps() throws Exception{
+ IndexDefinitionBuilder defnb = new IndexDefinitionBuilder();
+ defnb.indexRule("nt:base").property("foo").propertyIndex().weight(0);
+ defnb.indexRule("nt:base").property("bar").propertyIndex();
+
+ IndexDefinition defn = new IndexDefinition(root, defnb.build(),
"/foo");
+ IndexNode node = createIndexNode(defn);
+
+ FilterImpl filter = createFilter("nt:base");
+ filter.restrictProperty("foo", Operator.EQUAL,
PropertyValues.newString("a"));
+ IndexPlanner planner = new IndexPlanner(node, "/foo", filter,
Collections.<OrderEntry>emptyList());
+ //Even though foo is indexed it would not be considered for a query
involving just foo
+ assertNull(planner.getPlan());
+
+ filter = createFilter("nt:base");
+ filter.restrictProperty("bar", Operator.EQUAL,
PropertyValues.newString("a"));
+ planner = new IndexPlanner(node, "/foo", filter,
Collections.<OrderEntry>emptyList());
+ QueryIndex.IndexPlan plan1 = planner.getPlan();
+ assertNotNull(plan1);
+
+ filter = createFilter("nt:base");
+ filter.restrictProperty("foo", Operator.EQUAL,
PropertyValues.newString("a"));
+ filter.restrictProperty("bar", Operator.EQUAL,
PropertyValues.newString("a"));
+ planner = new IndexPlanner(node, "/foo", filter,
Collections.<OrderEntry>emptyList());
+ QueryIndex.IndexPlan plan2 = planner.getPlan();
+ assertNotNull(plan2);
+
+ //For plan2 as 2 props are indexed its costPerEntry should be less
than plan1 which
+ //indexes only one prop
+ assertThat(plan2.getCostPerEntry(), lessThan(plan1.getCostPerEntry()));
+
+ assertTrue(pr(plan2).hasProperty("foo"));
+ assertTrue(pr(plan2).hasProperty("bar"));
+ }
+
+
//------ Suggestion/spellcheck plan tests
@Test
public void nonSuggestIndex() throws Exception {