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 2015/09/22 08:54:21 UTC

svn commit: r1704457 - in /jackrabbit/oak/trunk/oak-lucene/src: main/java/org/apache/jackrabbit/oak/plugins/index/lucene/ test/java/org/apache/jackrabbit/oak/plugins/index/lucene/

Author: chetanm
Date: Tue Sep 22 06:54:17 2015
New Revision: 1704457

URL: http://svn.apache.org/viewvc?rev=1704457&view=rev
Log:
OAK-3318 - IndexRule not respecting inheritence based on mixins

Modified:
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java
    jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinitionTest.java
    jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java?rev=1704457&r1=1704456&r2=1704457&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java Tue Sep 22 06:54:17 2015
@@ -748,6 +748,12 @@ class IndexDefinition implements Aggrega
          *         <code>false</code> otherwise.
          */
         public boolean appliesTo(Tree state) {
+            for (String mixinName : getMixinTypeNames(state)){
+                if (nodeTypeName.equals(mixinName)){
+                    return true;
+                }
+            }
+
             if (!nodeTypeName.equals(getPrimaryTypeName(state))) {
                 return false;
             }
@@ -1242,7 +1248,7 @@ class IndexDefinition implements Aggrega
     }
 
     private static Iterable<String> getMixinTypeNames(Tree tree) {
-        PropertyState property = tree.getProperty(JcrConstants.JCR_MIMETYPE);
+        PropertyState property = tree.getProperty(JcrConstants.JCR_MIXINTYPES);
         return property != null ? property.getValue(Type.NAMES) : Collections.<String>emptyList();
     }
 

Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinitionTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinitionTest.java?rev=1704457&r1=1704456&r2=1704457&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinitionTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinitionTest.java Tue Sep 22 06:54:17 2015
@@ -19,11 +19,14 @@
 
 package org.apache.jackrabbit.oak.plugins.index.lucene;
 
+import java.util.Collections;
+
 import javax.jcr.PropertyType;
 
 import com.google.common.collect.ImmutableList;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
 import org.apache.jackrabbit.oak.plugins.index.lucene.IndexDefinition.IndexingRule;
 import org.apache.jackrabbit.oak.plugins.index.lucene.util.TokenizerChain;
@@ -199,8 +202,35 @@ public class IndexDefinitionTest {
         assertNull(defn.getApplicableIndexingRule(newTree(newNode("nt:base"))));
         assertNotNull(defn.getApplicableIndexingRule(newTree(newNode("nt:hierarchyNode"))));
         assertNotNull(defn.getApplicableIndexingRule(newTree(newNode("nt:folder"))));
+    }
+
+    @Test
+    public void indexRuleMixin() throws Exception{
+        NodeBuilder rules = builder.child(INDEX_RULES);
+        rules.child("mix:title");
+        TestUtil.child(rules, "mix:title/properties/jcr:title")
+                .setProperty(LuceneIndexConstants.FIELD_BOOST, 3.0);
+
+        IndexDefinition defn = new IndexDefinition(root, builder.getNodeState());
+
+        assertNotNull(defn.getApplicableIndexingRule(newTree(newNode("nt:folder", "mix:title"))));
+        assertNull(defn.getApplicableIndexingRule(newTree(newNode("nt:folder"))));
+    }
+
+    @Test
+    public void indexRuleMixinInheritance() throws Exception{
+        NodeBuilder rules = builder.child(INDEX_RULES);
+        rules.child("mix:mimeType");
+        TestUtil.child(rules, "mix:mimeType/properties/jcr:mimeType")
+                .setProperty(LuceneIndexConstants.FIELD_BOOST, 3.0);
+
+        IndexDefinition defn = new IndexDefinition(root, builder.getNodeState());
+
+        assertNotNull(defn.getApplicableIndexingRule(newTree(newNode("nt:folder", "mix:mimeType"))));
+        assertNull(defn.getApplicableIndexingRule(newTree(newNode("nt:folder"))));
 
-        //TODO Inheritance and mixin
+        //nt:resource > mix:mimeType
+        assertNotNull(defn.getApplicableIndexingRule(newTree(newNode("nt:resource"))));
     }
 
     @Test
@@ -668,4 +698,11 @@ public class IndexDefinitionTest {
         return builder;
     }
 
+    private static NodeBuilder newNode(String typeName, String mixins){
+        NodeBuilder builder = EMPTY_NODE.builder();
+        builder.setProperty(JcrConstants.JCR_PRIMARYTYPE, typeName);
+        builder.setProperty(JcrConstants.JCR_MIXINTYPES, Collections.singleton(mixins), Type.NAMES);
+        return builder;
+    }
+
 }

Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java?rev=1704457&r1=1704456&r2=1704457&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java Tue Sep 22 06:54:17 2015
@@ -1625,6 +1625,52 @@ public class LucenePropertyIndexTest ext
             asList("/test/b0", "/test/c2", "/test/a3"));
     }
 
+    @Test
+    public void indexingBasedOnMixin() throws Exception {
+        Tree idx = createIndex("test1", of("propa", "propb"));
+        Tree props = TestUtil.newRulePropTree(idx, "mix:title");
+        Tree prop = props.addChild(TestUtil.unique("prop"));
+        prop.setProperty(LuceneIndexConstants.PROP_NAME, "jcr:title");
+        prop.setProperty(LuceneIndexConstants.PROP_PROPERTY_INDEX, true);
+        root.commit();
+
+        Tree test = root.getTree("/").addChild("test");
+        createNodeWithMixinType(test, "a", "mix:title").setProperty("jcr:title", "a");
+        createNodeWithMixinType(test, "b", "mix:title").setProperty("jcr:title", "c");
+        test.addChild("c").setProperty("jcr:title", "a");
+        root.commit();
+
+        String propabQuery = "select [jcr:path] from [mix:title] where [jcr:title] = 'a'";
+        assertThat(explain(propabQuery), containsString("lucene:test1(/oak:index/test1)"));
+        assertQuery(propabQuery, asList("/test/a"));
+    }
+
+    @Test
+    public void indexingBasedOnMixinWithInheritence() throws Exception {
+        Tree idx = createIndex("test1", of("propa", "propb"));
+        Tree props = TestUtil.newRulePropTree(idx, "mix:mimeType");
+        Tree prop = props.addChild(TestUtil.unique("prop"));
+        prop.setProperty(LuceneIndexConstants.PROP_NAME, "jcr:mimeType");
+        prop.setProperty(LuceneIndexConstants.PROP_PROPERTY_INDEX, true);
+        root.commit();
+
+        Tree test = root.getTree("/").addChild("test");
+        createNodeWithType(test, "a", "nt:resource").setProperty("jcr:mimeType", "a");
+        createNodeWithType(test, "b", "nt:resource").setProperty("jcr:mimeType", "c");
+        test.addChild("c").setProperty("jcr:mimeType", "a");
+        root.commit();
+
+        String propabQuery = "select [jcr:path] from [mix:mimeType] where [jcr:mimeType] = 'a'";
+        assertThat(explain(propabQuery), containsString("lucene:test1(/oak:index/test1)"));
+        assertQuery(propabQuery, asList("/test/a"));
+    }
+
+    private static Tree createNodeWithMixinType(Tree t, String nodeName, String typeName){
+        t = t.addChild(nodeName);
+        t.setProperty(JcrConstants.JCR_MIXINTYPES, Collections.singleton(typeName), Type.NAMES);
+        return t;
+    }
+
     private Tree createFileNode(Tree tree, String name, String content, String mimeType){
         return createFileNode(tree, name, new ArrayBasedBlob(content.getBytes()), mimeType);
     }