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 ju...@apache.org on 2013/04/24 10:25:19 UTC

svn commit: r1471288 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/ oak-core/src/test...

Author: jukka
Date: Wed Apr 24 08:25:18 2013
New Revision: 1471288

URL: http://svn.apache.org/r1471288
Log:
OAK-325: QueryEngine can't handle node type hierarchies

Fix handling of type restrictions when updating indices

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexHookProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/CompositeIndexHookProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexHookManager.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexHookManagerDiff.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexHookProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUtils.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexHook.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexHookProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexHookUpdate.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexLookup.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexTest.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexHookProvider.java
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexHookProvider.java
    jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/TestUtils.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexHookProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexHookProvider.java?rev=1471288&r1=1471287&r2=1471288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexHookProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexHookProvider.java Wed Apr 24 08:25:18 2013
@@ -26,6 +26,7 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.index.IndexHook;
 import org.apache.jackrabbit.oak.plugins.index.IndexHookProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 /**
  * This IndexHook provider combines all index hooks of all available OSGi
@@ -40,9 +41,10 @@ public class OsgiIndexHookProvider exten
 
     @Override
     @Nonnull
-    public List<? extends IndexHook> getIndexHooks(String type, NodeBuilder builder) {
+    public List<? extends IndexHook> getIndexHooks(
+            String type, NodeBuilder builder, NodeState root) {
         IndexHookProvider composite = CompositeIndexHookProvider.compose(getServices());
-        return composite.getIndexHooks(type, builder);
+        return composite.getIndexHooks(type, builder, root);
     }
 
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/CompositeIndexHookProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/CompositeIndexHookProvider.java?rev=1471288&r1=1471287&r2=1471288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/CompositeIndexHookProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/CompositeIndexHookProvider.java Wed Apr 24 08:25:18 2013
@@ -23,6 +23,7 @@ import java.util.List;
 import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
@@ -38,8 +39,8 @@ public class CompositeIndexHookProvider 
         if (providers.isEmpty()) {
             return new IndexHookProvider() {
                 @Override
-                public List<? extends IndexHook> getIndexHooks(String type,
-                        NodeBuilder builder) {
+                public List<? extends IndexHook> getIndexHooks(
+                        String type, NodeBuilder builder, NodeState root) {
                     return ImmutableList.of();
                 }
             };
@@ -63,11 +64,11 @@ public class CompositeIndexHookProvider 
 
     @Override
     @Nonnull
-    public List<? extends IndexHook> getIndexHooks(String type,
-            NodeBuilder builder) {
+    public List<? extends IndexHook> getIndexHooks(
+            String type, NodeBuilder builder, NodeState root) {
         List<IndexHook> indexes = Lists.newArrayList();
         for (IndexHookProvider provider : providers) {
-            indexes.addAll(provider.getIndexHooks(type, builder));
+            indexes.addAll(provider.getIndexHooks(type, builder, root));
         }
         return indexes;
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexHookManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexHookManager.java?rev=1471288&r1=1471287&r2=1471288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexHookManager.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexHookManager.java Wed Apr 24 08:25:18 2013
@@ -45,6 +45,6 @@ public class IndexHookManager implements
     @Override
     public Editor getRootEditor(NodeState before, NodeState after,
             NodeBuilder builder) {
-        return VisibleEditor.wrap(new IndexHookManagerDiff(provider, builder));
+        return VisibleEditor.wrap(new IndexHookManagerDiff(provider, builder, after));
     }
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexHookManagerDiff.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexHookManagerDiff.java?rev=1471288&r1=1471287&r2=1471288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexHookManagerDiff.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexHookManagerDiff.java Wed Apr 24 08:25:18 2013
@@ -54,11 +54,15 @@ class IndexHookManagerDiff implements Ed
 
     private final NodeBuilder node;
 
+    private final NodeState root;
+
     private Editor inner = new DefaultEditor();
 
-    public IndexHookManagerDiff(IndexHookProvider provider, NodeBuilder node) {
+    public IndexHookManagerDiff(
+            IndexHookProvider provider, NodeBuilder node, NodeState root) {
         this.provider = provider;
         this.node = node;
+        this.root = root;
     }
 
     @Override
@@ -100,9 +104,9 @@ class IndexHookManagerDiff implements Ed
         List<IndexHook> reindex = Lists.newArrayList();
         for (String type : allTypes) {
             if (reindexTypes.contains(type)) {
-                reindex.addAll(provider.getIndexHooks(type, node));
+                reindex.addAll(provider.getIndexHooks(type, node, ref));
             } else {
-                hooks.addAll(provider.getIndexHooks(type, node));
+                hooks.addAll(provider.getIndexHooks(type, node, ref));
             }
         }
         reindex(reindex, ref);

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexHookProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexHookProvider.java?rev=1471288&r1=1471287&r2=1471288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexHookProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexHookProvider.java Wed Apr 24 08:25:18 2013
@@ -21,6 +21,7 @@ import java.util.List;
 import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 /**
  * Extension point for plugging in different kinds of IndexHook providers.
@@ -47,9 +48,12 @@ public interface IndexHookProvider {
      * @param builder
      *            the node state builder of the content node that will be used
      *            for updates
+     * @param root
+     *            root node state
      * @return a list of index hooks of the given type
      */
     @Nonnull
-    List<? extends IndexHook> getIndexHooks(String type, NodeBuilder builder);
+    List<? extends IndexHook> getIndexHooks(
+            String type, NodeBuilder builder, NodeState root);
 
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUtils.java?rev=1471288&r1=1471287&r2=1471288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUtils.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUtils.java Wed Apr 24 08:25:18 2013
@@ -117,7 +117,7 @@ public class IndexUtils {
             entry.setBoolean(UNIQUE_PROPERTY_NAME, true);
         }
         if (declaringNodeTypeNames != null && declaringNodeTypeNames.length > 0) {
-            entry.setStrings(DECLARING_NODE_TYPES, declaringNodeTypeNames);
+            entry.setNames(DECLARING_NODE_TYPES, declaringNodeTypeNames);
         }
         entry.setNames(PROPERTY_NAMES, propertyNames);
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexHook.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexHook.java?rev=1471288&r1=1471287&r2=1471288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexHook.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexHook.java Wed Apr 24 08:25:18 2013
@@ -16,22 +16,29 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.p2;
 
+import static com.google.common.collect.Iterables.addAll;
 import static com.google.common.collect.Lists.newArrayList;
+import static com.google.common.collect.Sets.newHashSet;
+import static org.apache.jackrabbit.JcrConstants.JCR_ISMIXIN;
 import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
+import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM;
 import static org.apache.jackrabbit.oak.commons.PathUtils.concat;
 import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
 import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NODE_TYPE;
 import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.TYPE_PROPERTY_NAME;
 import static org.apache.jackrabbit.oak.plugins.index.p2.Property2IndexHookProvider.TYPE;
 import static org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_NODE_TYPES;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_MIXIN_SUBTYPES;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_PRIMARY_SUBTYPES;
 
 import java.io.Closeable;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.PropertyState;
@@ -93,24 +100,32 @@ class Property2IndexHook implements Inde
      */
     private final Map<String, List<Property2IndexHookUpdate>> indexMap;
 
-    public Property2IndexHook(NodeBuilder root) {
-        this(null, root, null, "/",
-                new HashMap<String, List<Property2IndexHookUpdate>>());
+    /**
+     * The {@code /jcr:system/jcr:nodeTypes} subtree.
+     */
+    private final NodeState types;
+
+    public Property2IndexHook(NodeBuilder builder, NodeState root) {
+        this(null, builder, null, "/",
+                new HashMap<String, List<Property2IndexHookUpdate>>(),
+                root.getChildNode(JCR_SYSTEM).getChildNode(JCR_NODE_TYPES));
     }
 
     private Property2IndexHook(Property2IndexHook parent, String nodeName) {
         this(parent, getChildNode(parent.node, nodeName), nodeName, null,
-                parent.indexMap);
+                parent.indexMap, parent.types);
     }
 
     private Property2IndexHook(Property2IndexHook parent, NodeBuilder node,
             String nodeName, String path,
-            Map<String, List<Property2IndexHookUpdate>> indexMap) {
+            Map<String, List<Property2IndexHookUpdate>> indexMap,
+            NodeState types) {
         this.parent = parent;
         this.node = node;
         this.nodeName = nodeName;
         this.path = path;
         this.indexMap = indexMap;
+        this.types = types;
     }
 
     private static NodeBuilder getChildNode(NodeBuilder node, String name) {
@@ -143,21 +158,8 @@ class Property2IndexHook implements Inde
         }
         List<Property2IndexHookUpdate> filtered = new ArrayList<Property2IndexHookUpdate>();
         for (Property2IndexHookUpdate pi : indexes) {
-            if (node == null || pi.getNodeTypeNames() == null
-                    || pi.getNodeTypeNames().isEmpty()) {
+            if (node == null || pi.matchesNodeType(node)) {
                 filtered.add(pi);
-                continue;
-            }
-            PropertyState ps = node.getProperty(JCR_PRIMARYTYPE);
-            String type = ps != null && !ps.isArray() ? ps
-                    .getValue(Type.STRING) : null;
-            if (type != null) {
-                for (String typeName : pi.getNodeTypeNames()) {
-                    if (typeName.equals(type)) {
-                        filtered.add(pi);
-                        break;
-                    }
-                }
             }
         }
         return filtered;
@@ -173,15 +175,21 @@ class Property2IndexHook implements Inde
      *            the name of the index
      */
     private void addIndexes(NodeState state, String indexName) {
-        List<String> typeNames = ImmutableList.of();
-        PropertyState appliesTo = state.getProperty(declaringNodeTypes);
-        if (appliesTo != null) {
-            typeNames = newArrayList(appliesTo.getValue(Type.STRINGS));
-            Collections.sort(typeNames);
+        Set<String> primaryTypes = newHashSet();
+        Set<String> mixinTypes = newHashSet();
+        for (String typeName : state.getNames(declaringNodeTypes)) {
+            NodeState type = types.getChildNode(typeName);
+            if (type.getBoolean(JCR_ISMIXIN)) {
+                mixinTypes.add(typeName);
+            } else {
+                primaryTypes.add(typeName);
+            }
+            addAll(primaryTypes, type.getNames(OAK_PRIMARY_SUBTYPES));
+            addAll(mixinTypes, type.getNames(OAK_MIXIN_SUBTYPES));
         }
-        PropertyState ps = state.getProperty(propertyNames);
 
-        Iterable<String> propertyNames = ps != null ? ps.getValue(Type.STRINGS)
+        PropertyState ps = state.getProperty(propertyNames);
+        Iterable<String> propertyNames = ps != null ? ps.getValue(Type.NAMES)
                 : ImmutableList.of(indexName);
         for (String pname : propertyNames) {
             List<Property2IndexHookUpdate> list = this.indexMap.get(pname);
@@ -192,8 +200,7 @@ class Property2IndexHook implements Inde
             boolean exists = false;
             String localPath = getPath();
             for (Property2IndexHookUpdate piu : list) {
-                if (localPath.equals(piu.getPath())
-                        && typeNames.equals(piu.getNodeTypeNames())) {
+                if (piu.matches(localPath, primaryTypes, mixinTypes)) {
                     exists = true;
                     break;
                 }
@@ -201,7 +208,7 @@ class Property2IndexHook implements Inde
             if (!exists) {
                 Property2IndexHookUpdate update = new Property2IndexHookUpdate(
                         getPath(), node.child(INDEX_DEFINITIONS_NAME).child(indexName),
-                        store, typeNames);
+                        store, primaryTypes, mixinTypes);
                 list.add(update);
                 updates.add(update);
             }
@@ -296,7 +303,7 @@ class Property2IndexHook implements Inde
             }
         }
         if (reindex) {
-            return new Property2IndexHook(node);
+            return new Property2IndexHook(node, types);
         }
         return null;
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexHookProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexHookProvider.java?rev=1471288&r1=1471287&r2=1471288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexHookProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexHookProvider.java Wed Apr 24 08:25:18 2013
@@ -23,6 +23,7 @@ import org.apache.felix.scr.annotations.
 import org.apache.jackrabbit.oak.plugins.index.IndexHook;
 import org.apache.jackrabbit.oak.plugins.index.IndexHookProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 import com.google.common.collect.ImmutableList;
 
@@ -40,10 +41,10 @@ public class Property2IndexHookProvider 
     public static final String TYPE = "p2";
 
     @Override
-    public List<? extends IndexHook> getIndexHooks(String type,
-            NodeBuilder builder) {
+    public List<? extends IndexHook> getIndexHooks(
+            String type, NodeBuilder builder, NodeState root) {
         if (TYPE.equals(type)) {
-            return ImmutableList.of(new Property2IndexHook(builder));
+            return ImmutableList.of(new Property2IndexHook(builder, root));
         }
         return ImmutableList.of();
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexHookUpdate.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexHookUpdate.java?rev=1471288&r1=1471287&r2=1471288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexHookUpdate.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexHookUpdate.java Wed Apr 24 08:25:18 2013
@@ -16,11 +16,12 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.p2;
 
+import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES;
+import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
 import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.REINDEX_PROPERTY_NAME;
 import static org.apache.jackrabbit.oak.plugins.index.p2.Property2Index.encode;
 
 import java.util.Collections;
-import java.util.List;
 import java.util.Set;
 
 import javax.jcr.PropertyType;
@@ -50,11 +51,16 @@ class Property2IndexHookUpdate {
     private final String path;
 
     /**
-     * The node types that this index applies to. If <code>null</code> or
-     * <code>empty</code> then the node type of the indexed node is ignored
-     * 
+     * Primary node types that this index applies to. If <code>null</code>
+     * then the node type of the indexed node is ignored
      */
-    private final List<String> nodeTypeNames;
+    private final Set<String> primaryTypes;
+
+    /**
+     * Mixin node types that this index applies to. If <code>null</code>
+     * then the node type of the indexed node is ignored
+     */
+    private final Set<String> mixinTypes;
 
     /**
      * The node where the index definition is stored.
@@ -70,12 +76,21 @@ class Property2IndexHookUpdate {
 
     private final Set<String> modifiedKeys = Sets.newHashSet();
 
-    public Property2IndexHookUpdate(String path, NodeBuilder node,
-            IndexStoreStrategy store, List<String> nodeTypeNames) {
+    public Property2IndexHookUpdate(
+            String path, NodeBuilder node, IndexStoreStrategy store,
+            Set<String> primaryTypes, Set<String> mixinTypes) {
         this.path = path;
         this.node = node;
         this.store = store;
-        this.nodeTypeNames = nodeTypeNames;
+
+        if (primaryTypes.isEmpty() && mixinTypes.isEmpty()) {
+            this.primaryTypes = null;
+            this.mixinTypes = null;
+        } else {
+            this.primaryTypes = primaryTypes;
+            this.mixinTypes = mixinTypes;
+        }
+
         index = this.node.child(":index");
         PropertyState uniquePS = node.getProperty("unique");
         unique = uniquePS != null && !uniquePS.isArray()
@@ -86,10 +101,6 @@ class Property2IndexHookUpdate {
         return path;
     }
 
-    List<String> getNodeTypeNames() {
-        return nodeTypeNames;
-    }
-
     /**
      * A property value was added at the given path.
      * 
@@ -158,4 +169,32 @@ class Property2IndexHookUpdate {
         return reindex;
     }
 
+    public boolean matches(
+            String path, Set<String> primaryTypes, Set<String> mixinTypes) {
+        if (this.primaryTypes == null) {
+            return this.path.equals(path)
+                    && primaryTypes.isEmpty()
+                    && mixinTypes.isEmpty();
+        } else {
+            return this.path.equals(path)
+                    && this.primaryTypes.equals(primaryTypes)
+                    && this.mixinTypes.equals(mixinTypes);
+        }
+    }
+
+    public boolean matchesNodeType(NodeBuilder node) {
+        if (primaryTypes == null
+                || primaryTypes.contains(node.getName(JCR_PRIMARYTYPE))) {
+            return true;
+        }
+        if (!mixinTypes.isEmpty()) {
+            for (String mixinName : node.getNames(JCR_MIXINTYPES)) {
+                if (mixinTypes.contains(mixinName)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexLookup.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexLookup.java?rev=1471288&r1=1471287&r2=1471288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexLookup.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexLookup.java Wed Apr 24 08:25:18 2013
@@ -151,11 +151,13 @@ public class Property2IndexLookup {
             }
             if (contains(ns.getNames(PROPERTY_NAMES), propertyName)) {
                 NodeState index = ns.getChildNode(":index");
-                if (ns.hasProperty(DECLARING_NODE_TYPES) && supertypes != null) {
-                    for (String typeName : ns.getNames(DECLARING_NODE_TYPES)) {
-                        if (supertypes.contains(typeName)) {
-                            // TODO: prefer the most specific type restriction
-                            return index;
+                if (ns.hasProperty(DECLARING_NODE_TYPES)) {
+                    if (supertypes != null) {
+                        for (String typeName : ns.getNames(DECLARING_NODE_TYPES)) {
+                            if (supertypes.contains(typeName)) {
+                                // TODO: prefer the most specific type restriction
+                                return index;
+                            }
                         }
                     }
                 } else if (supertypes == null) {

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexTest.java?rev=1471288&r1=1471287&r2=1471288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexTest.java Wed Apr 24 08:25:18 2013
@@ -75,7 +75,7 @@ public class Property2IndexTest {
         }
         NodeState after = builder.getNodeState();
 
-        EditorDiff.process(new Property2IndexHook(builder), before, after);
+        EditorDiff.process(new Property2IndexHook(builder, after), before, after);
         NodeState indexed = builder.getNodeState();
 
         FilterImpl f = createFilter(indexed, NT_BASE);
@@ -129,7 +129,7 @@ public class Property2IndexTest {
         NodeState after = builder.getNodeState();
 
         // Add an index
-        EditorDiff.process(new Property2IndexHook(builder), before, after);
+        EditorDiff.process(new Property2IndexHook(builder, after), before, after);
         NodeState indexed = builder.getNodeState();
 
         FilterImpl f = createFilter(indexed, NT_BASE);
@@ -190,7 +190,7 @@ public class Property2IndexTest {
                 .setProperty("foo", Arrays.asList("abc", "def"), Type.STRINGS);
         NodeState after = builder.getNodeState();
 
-        EditorDiff.process(new Property2IndexHook(builder), before, after);
+        EditorDiff.process(new Property2IndexHook(builder, after), before, after);
         NodeState indexed = builder.getNodeState();
 
         FilterImpl f = createFilter(indexed, "nt:unstructured");
@@ -256,7 +256,7 @@ public class Property2IndexTest {
         NodeState after = builder.getNodeState();
 
         // Add an index
-        EditorDiff.process(new Property2IndexHook(builder), before, after);
+        EditorDiff.process(new Property2IndexHook(builder, after), before, after);
         NodeState indexed = builder.getNodeState();
 
         FilterImpl f = createFilter(after, "nt:unstructured");
@@ -298,7 +298,7 @@ public class Property2IndexTest {
         NodeState after = builder.getNodeState();
 
         CommitFailedException expected =
-                EditorDiff.process(new Property2IndexHook(builder), before, after);
+                EditorDiff.process(new Property2IndexHook(builder, after), before, after);
         assertNotNull("Unique constraint should be respected", expected);
     }
 
@@ -327,7 +327,7 @@ public class Property2IndexTest {
         NodeState after = builder.getNodeState();
 
         CommitFailedException unexpected = EditorDiff.process(
-                new Property2IndexHook(builder), before, after);
+                new Property2IndexHook(builder, after), before, after);
         assertNull(unexpected);
     }
 
@@ -355,8 +355,8 @@ public class Property2IndexTest {
                 .setProperty("foo", "abc");
         NodeState after = builder.getNodeState();
 
-        CommitFailedException expected =
-                EditorDiff.process(new Property2IndexHook(builder), before, after);
+        CommitFailedException expected = EditorDiff.process(
+                new Property2IndexHook(builder, after), before, after);
         assertNotNull("Unique constraint should be respected", expected);
     }
 
@@ -386,7 +386,7 @@ public class Property2IndexTest {
         NodeState after = builder.getNodeState();
 
         CommitFailedException unexpected = EditorDiff.process(
-                new Property2IndexHook(builder), before, after);
+                new Property2IndexHook(builder, after), before, after);
         assertNull(unexpected);
     }
 

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexHookProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexHookProvider.java?rev=1471288&r1=1471287&r2=1471288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexHookProvider.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexHookProvider.java Wed Apr 24 08:25:18 2013
@@ -25,6 +25,7 @@ import org.apache.felix.scr.annotations.
 import org.apache.jackrabbit.oak.plugins.index.IndexHook;
 import org.apache.jackrabbit.oak.plugins.index.IndexHookProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 import com.google.common.collect.ImmutableList;
 
@@ -40,8 +41,8 @@ import com.google.common.collect.Immutab
 public class LuceneIndexHookProvider implements IndexHookProvider {
 
     @Override
-    public List<? extends IndexHook> getIndexHooks(String type,
-            NodeBuilder builder) {
+    public List<? extends IndexHook> getIndexHooks(
+            String type, NodeBuilder builder, NodeState root) {
         if (TYPE_LUCENE.equals(type)) {
             return ImmutableList.of(new LuceneIndexDiff(builder));
         }

Modified: jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexHookProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexHookProvider.java?rev=1471288&r1=1471287&r2=1471288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexHookProvider.java (original)
+++ jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexHookProvider.java Wed Apr 24 08:25:18 2013
@@ -30,6 +30,7 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.index.solr.SolrServerProvider;
 import org.apache.jackrabbit.oak.plugins.index.solr.query.SolrQueryIndex;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -62,8 +63,8 @@ public class SolrIndexHookProvider imple
 
     @Override
     @Nonnull
-    public List<? extends IndexHook> getIndexHooks(String type, NodeBuilder builder) {
-
+    public List<? extends IndexHook> getIndexHooks(
+            String type, NodeBuilder builder, NodeState root) {
         if (SolrQueryIndex.TYPE.equals(type) && solrServerProvider != null && oakSolrConfigurationProvider != null) {
             try {
                 if (log.isDebugEnabled()) {

Modified: jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/TestUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/TestUtils.java?rev=1471288&r1=1471287&r2=1471288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/TestUtils.java (original)
+++ jackrabbit/oak/trunk/oak-solr-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/solr/TestUtils.java Wed Apr 24 08:25:18 2013
@@ -71,7 +71,8 @@ public class TestUtils {
         return new IndexHookProvider() {
             @Nonnull
             @Override
-            public List<? extends IndexHook> getIndexHooks(String s, NodeBuilder nodeBuilder) {
+            public List<? extends IndexHook> getIndexHooks(
+                    String s, NodeBuilder nodeBuilder, NodeState root) {
                 if (SolrQueryIndex.TYPE.equals(s)) {
                     try {
                         IndexHook indexHook = new SolrIndexDiff(nodeBuilder, solrServer, configuration);