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 ch...@apache.org on 2017/07/12 04:32:19 UTC
svn commit: r1801678 - in /jackrabbit/oak/branches/1.6: ./
oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/
oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/
oak-lucene/src/test/java/org/apache/jackra...
Author: chetanm
Date: Wed Jul 12 04:32:19 2017
New Revision: 1801678
URL: http://svn.apache.org/viewvc?rev=1801678&view=rev
Log:
OAK-5899 - PropertyDefinitions should allow for some tweakability to declare usefulness
Merging 1801675
Modified:
jackrabbit/oak/branches/1.6/ (props changed)
jackrabbit/oak/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java
jackrabbit/oak/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
jackrabbit/oak/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java
jackrabbit/oak/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilder.java
jackrabbit/oak/branches/1.6/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java
Propchange: jackrabbit/oak/branches/1.6/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Jul 12 04:32:19 2017
@@ -1,3 +1,3 @@
/jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1781068,1781075,1781248,1781386,1781846,1781907,1782000,1782029,1782196,1782447,1782476,1782770,1782945,1782966,1782973,1782990,1783061,1783066,1783089,1783104-1783105,1783110,1783619,1783720,1783731,1783733,1783738,1783742,1783773,1783855,1783891,1784023,1784034,1784130,1784162,1784251,1784401,1784551,1784574,1784689,1785095,1785108,1785283,1785838,1785917,1785919,1785946,1787074,1787145,1787217,1787425,1788056,1788378,1788387-1788389,1788850,1789056,1789534,1790382,1792463,1792742,1792746,1793013,1793088,1793618,1793627,1793644,1795138,1795314,1795330,1795475,1795488,1795491,1795502,1795594,1795613,1795618,1796144,1796230,1796239,1796274,1796278,1796988,1798035,1798834,1799393,1799924,1800269,1800606,1800613,1800974,1801118-1801119
+/jackrabbit/oak/trunk:1781068,1781075,1781248,1781386,1781846,1781907,1782000,1782029,1782196,1782447,1782476,1782770,1782945,1782966,1782973,1782990,1783061,1783066,1783089,1783104-1783105,1783110,1783619,1783720,1783731,1783733,1783738,1783742,1783773,1783855,1783891,1784023,1784034,1784130,1784162,1784251,1784401,1784551,1784574,1784689,1785095,1785108,1785283,1785838,1785917,1785919,1785946,1787074,1787145,1787217,1787425,1788056,1788378,1788387-1788389,1788850,1789056,1789534,1790382,1792463,1792742,1792746,1793013,1793088,1793618,1793627,1793644,1795138,1795314,1795330,1795475,1795488,1795491,1795502,1795594,1795613,1795618,1796144,1796230,1796239,1796274,1796278,1796988,1798035,1798834,1799393,1799924,1800269,1800606,1800613,1800974,1801118-1801119,1801675
/jackrabbit/trunk:1345480
Modified: jackrabbit/oak/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java?rev=1801678&r1=1801677&r2=1801678&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java (original)
+++ jackrabbit/oak/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java Wed Jul 12 04:32:19 2017
@@ -178,7 +178,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);
}
}
@@ -202,7 +207,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)
@@ -630,6 +638,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/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java?rev=1801678&r1=1801677&r2=1801678&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java (original)
+++ jackrabbit/oak/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java Wed Jul 12 04:32:19 2017
@@ -153,6 +153,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/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java?rev=1801678&r1=1801677&r2=1801678&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java (original)
+++ jackrabbit/oak/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java Wed Jul 12 04:32:19 2017
@@ -32,12 +32,15 @@ import org.apache.jackrabbit.oak.spi.sta
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static com.google.common.collect.ImmutableList.copyOf;
+import static com.google.common.collect.ImmutableSet.copyOf;
import static com.google.common.collect.Iterables.toArray;
import static org.apache.jackrabbit.oak.commons.PathUtils.elements;
+import static org.apache.jackrabbit.oak.commons.PathUtils.getNextSlash;
+import static org.apache.jackrabbit.oak.commons.PathUtils.getParentPath;
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 +96,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 +120,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);
@@ -216,7 +222,7 @@ class PropertyDefinition {
}
static boolean isRelativeProperty(String propertyName){
- return !isAbsolute(propertyName) && PathUtils.getNextSlash(propertyName, 0) > 0;
+ return !isAbsolute(propertyName) && getNextSlash(propertyName, 0) > 0;
}
//~---------------------------------------------< internal >
@@ -250,7 +256,7 @@ class PropertyDefinition {
}
private static String[] computeAncestors(String parentPath) {
- return toArray(copyOf(elements(PathUtils.getParentPath(parentPath))), String.class);
+ return toArray(copyOf(elements(getParentPath(parentPath))), String.class);
}
Modified: jackrabbit/oak/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilder.java?rev=1801678&r1=1801677&r2=1801678&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilder.java (original)
+++ jackrabbit/oak/branches/1.6/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilder.java Wed Jul 12 04:32:19 2017
@@ -332,6 +332,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/branches/1.6/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java?rev=1801678&r1=1801677&r2=1801678&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.6/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java (original)
+++ jackrabbit/oak/branches/1.6/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java Wed Jul 12 04:32:19 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.plugins.nodetype.write.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.query.NodeStateNodeTypeInfoProvider;
import org.apache.jackrabbit.oak.query.QueryEngineSettings;
import org.apache.jackrabbit.oak.query.ast.NodeTypeInfo;
@@ -472,6 +475,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 {