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);
}