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 2014/11/27 12:34:33 UTC

svn commit: r1642109 - in /jackrabbit/oak/branches/1.0: ./ oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/ oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/

Author: chetanm
Date: Thu Nov 27 11:34:33 2014
New Revision: 1642109

URL: http://svn.apache.org/r1642109
Log:
OAK-2283 - Fix inconsistent handling of includedPropertyTypes

Merging revisions 1640872

Modified:
    jackrabbit/oak/branches/1.0/   (props changed)
    jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java
    jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
    jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java
    jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java
    jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java

Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk:r1640872

Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java?rev=1642109&r1=1642108&r2=1642109&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java Thu Nov 27 11:34:33 2014
@@ -103,9 +103,9 @@ class IndexDefinition {
 
     private static String TYPES_ALLOW_ALL_NAME = "all";
 
-    private static final int TYPES_ALLOW_NONE = PropertyType.UNDEFINED;
+    static final int TYPES_ALLOW_NONE = PropertyType.UNDEFINED;
 
-    private static final int TYPES_ALLOW_ALL = -1;
+    static final int TYPES_ALLOW_ALL = -1;
 
     private final boolean fullTextEnabled;
 
@@ -464,7 +464,7 @@ class IndexDefinition {
             this.defaultFulltextEnabled = getOptionalValue(config, LuceneIndexConstants.FULL_TEXT_ENABLED, false);
             //TODO Provide a new proper propertyName for enabling storage
             this.defaultStorageEnabled = getOptionalValue(config, LuceneIndexConstants.EXPERIMENTAL_STORAGE, false);
-            this.propertyTypes = getSupportedTypes(config, TYPES_ALLOW_ALL);
+            this.propertyTypes = getSupportedTypes(config, INCLUDE_PROPERTY_TYPES, TYPES_ALLOW_ALL);
 
             List<NamePattern> namePatterns = newArrayList();
             Map<String,RelativeProperty> relativeProps = newHashMap();
@@ -585,17 +585,7 @@ class IndexDefinition {
         }
 
         public boolean includePropertyType(int type){
-            //TODO Rules related to type inclusion need to be synced
-            //Login IndexEditor evaluates differently compared to IndexDefinition
-            if(propertyTypes == TYPES_ALLOW_ALL){
-                return true;
-            }
-
-            if (propertyTypes == TYPES_ALLOW_NONE){
-                return false;
-            }
-
-            return (propertyTypes & (1 << type)) != 0;
+           return IndexDefinition.includePropertyType(propertyTypes, type);
         }
 
         public Collection<RelativeProperty> getRelativeProps() {
@@ -925,8 +915,8 @@ class IndexDefinition {
         return state.hasProperty(OAK_CHILD_ORDER);
     }
 
-    private static int getSupportedTypes(NodeState defn, int defaultVal) {
-        PropertyState pst = defn.getProperty(INCLUDE_PROPERTY_TYPES);
+    static int getSupportedTypes(NodeState defn, String typePropertyName, int defaultVal) {
+        PropertyState pst = defn.getProperty(typePropertyName);
         if (pst != null) {
             int types = 0;
             for (String inc : pst.getValue(Type.STRINGS)) {
@@ -945,6 +935,18 @@ class IndexDefinition {
         return defaultVal;
     }
 
+    static boolean includePropertyType(int includedPropertyTypes, int type){
+        if(includedPropertyTypes == TYPES_ALLOW_ALL){
+            return true;
+        }
+
+        if (includedPropertyTypes == TYPES_ALLOW_NONE){
+            return false;
+        }
+
+        return (includedPropertyTypes & (1 << type)) != 0;
+    }
+
     private static boolean hasFulltextEnabledIndexRule(List<IndexingRule> rules) {
         for (IndexingRule rule : rules){
             if (rule.fulltextEnabled){

Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java?rev=1642109&r1=1642108&r2=1642109&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java Thu Nov 27 11:34:33 2014
@@ -142,4 +142,11 @@ public interface LuceneIndexConstants {
     String TEST_MODE = "testMode";
 
     String EVALUATE_PATH_RESTRICTION = "oak.experimental.evaluatePathRestrictions";
+
+    /**
+     * Experimental config to restrict which property type gets indexed at
+     * property definition level. Mostly index rule level #INCLUDE_PROPERTY_TYPES
+     * should be sufficient
+     */
+    String PROP_INCLUDED_TYPE = "oak.experimental.includePropertyTypes";
 }

Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java?rev=1642109&r1=1642108&r2=1642109&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java Thu Nov 27 11:34:33 2014
@@ -324,12 +324,7 @@ public class LuceneIndexEditor implement
                                   PropertyState property,
                                   String pname,
                                   PropertyDefinition pd) throws CommitFailedException {
-        //In case of fulltext we also check if given type is enabled for indexing
-        //TODO Use context.includePropertyType however that cause issue. Need
-        //to make filtering based on type consistent both on indexing side and
-        //query side
-        //TODO Replace with indexRule.includeType
-        boolean includeTypeForFullText = (indexingRule.propertyTypes & (1 << property.getType().tag())) != 0;
+        boolean includeTypeForFullText = indexingRule.includePropertyType(property.getType().tag());
         if (Type.BINARY.tag() == property.getType().tag()
                 && includeTypeForFullText) {
             this.context.indexUpdate();
@@ -338,21 +333,16 @@ public class LuceneIndexEditor implement
         }  else {
             boolean dirty = false;
 
-            if (pd.propertyIndex){
+            if (pd.propertyIndex && pd.includePropertyType(property.getType().tag())){
                 dirty |= addTypedFields(fields, property, pname);
             }
 
             if (pd.fulltextEnabled() && includeTypeForFullText) {
                 for (String value : property.getValue(Type.STRINGS)) {
                     this.context.indexUpdate();
-                    //TODO Analyzed field should be stored against different field name
-                    //as term field use the same name. For compatibility this should be done
-                    //for newer index versions only
-                    if (pd.analyzed) {
+                    if (pd.analyzed && pd.includePropertyType(property.getType().tag())) {
                         String analyzedPropName = constructAnalyzedPropertyName(pname);
                         fields.add(newPropertyField(analyzedPropName, value, !pd.skipTokenization(pname), pd.stored));
-                        //TODO Property field uses OakType which has omitNorms set hence
-                        //cannot be boosted
                     }
 
                     if (pd.nodeScopeIndex) {

Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java?rev=1642109&r1=1642108&r2=1642109&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java Thu Nov 27 11:34:33 2014
@@ -68,6 +68,8 @@ class PropertyDefinition {
 
     final boolean ordered;
 
+    final int includedPropertyTypes;
+
     public PropertyDefinition(IndexingRule idxDefn, String name, NodeState defn) {
         this.isRegexp = getOptionalValue(defn, PROP_IS_REGEX, false);
         this.name = getName(defn, name);
@@ -82,6 +84,8 @@ class PropertyDefinition {
         //If node is not set for full text then a property definition indicates that definition is for property index
         this.propertyIndex = getOptionalValue(defn, LuceneIndexConstants.PROP_PROPERTY_INDEX, !idxDefn.defaultFulltextEnabled);
         this.ordered = getOptionalValue(defn, LuceneIndexConstants.PROP_ORDERED, false);
+        this.includedPropertyTypes = IndexDefinition.getSupportedTypes(defn, LuceneIndexConstants.PROP_INCLUDED_TYPE,
+                IndexDefinition.TYPES_ALLOW_ALL);
 
         //TODO Add test case for above cases
 
@@ -128,6 +132,10 @@ class PropertyDefinition {
         return isTypeDefined() ? propertyType : PropertyType.STRING;
     }
 
+    public boolean includePropertyType(int type){
+        return IndexDefinition.includePropertyType(includedPropertyTypes, type);
+    }
+
     @Override
     public String toString() {
         return "PropertyDefinition{" +

Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java?rev=1642109&r1=1642108&r2=1642109&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java Thu Nov 27 11:34:33 2014
@@ -22,6 +22,7 @@ import java.util.Set;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
+import javax.jcr.PropertyType;
 
 import static com.google.common.collect.ImmutableList.copyOf;
 import static com.google.common.collect.Iterators.transform;
@@ -34,6 +35,7 @@ import static org.apache.jackrabbit.JcrC
 import static org.apache.jackrabbit.JcrConstants.NT_BASE;
 import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
 import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.REINDEX_PROPERTY_NAME;
+import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.INDEX_RULES;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PERSISTENCE_FILE;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PERSISTENCE_NAME;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PERSISTENCE_PATH;
@@ -66,7 +68,6 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.apache.lucene.analysis.Analyzer;
 import org.junit.After;
-import org.junit.Ignore;
 import org.junit.Test;
 
 import com.google.common.collect.ImmutableList;
@@ -178,11 +179,15 @@ public class LuceneIndexTest {
         assertFalse(cursor.hasNext());
     }
 
-    @Ignore("OAK-2283")
+
     @Test
     public void testLucene3() throws Exception {
-        NodeBuilder index = builder.child(INDEX_DEFINITIONS_NAME);
-        newLucenePropertyIndexDefinition(index, "lucene", ImmutableSet.of("foo"), null);
+        NodeBuilder index = newLucenePropertyIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME),
+                "lucene", ImmutableSet.of("foo"), null);
+        NodeBuilder rules = index.child(INDEX_RULES);
+        NodeBuilder fooProp = rules.child("nt:base").child(LuceneIndexConstants.PROP_NODE).child("foo");
+        fooProp.setProperty(LuceneIndexConstants.PROP_PROPERTY_INDEX, true);
+        fooProp.setProperty(LuceneIndexConstants.PROP_INCLUDED_TYPE, PropertyType.TYPENAME_STRING);
 
         NodeState before = builder.getNodeState();
         builder.setProperty("foo", "bar");