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 th...@apache.org on 2015/01/06 13:00:47 UTC

svn commit: r1649786 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/

Author: thomasm
Date: Tue Jan  6 12:00:47 2015
New Revision: 1649786

URL: http://svn.apache.org/r1649786
Log:
OAK-2368 Property index: setting declaringNodeTypes to an empty array can break queries

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexPlan.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypePredicate.java
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexPlan.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexPlan.java?rev=1649786&r1=1649785&r2=1649786&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexPlan.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexPlan.java Tue Jan  6 12:00:47 2015
@@ -106,7 +106,8 @@ public class PropertyIndexPlan {
         this.filter = filter;
 
         Iterable<String> types = definition.getNames(DECLARING_NODE_TYPES);
-        this.matchesAllTypes = isEmpty(types);
+        // if there is no such property, then all nodetypes are matched
+        this.matchesAllTypes = !definition.hasProperty(DECLARING_NODE_TYPES);
         this.matchesNodeTypes =
                 matchesAllTypes || any(types, in(filter.getSupertypes()));
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypePredicate.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypePredicate.java?rev=1649786&r1=1649785&r2=1649786&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypePredicate.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypePredicate.java Tue Jan  6 12:00:47 2015
@@ -66,11 +66,11 @@ public class TypePredicate implements Pr
 
     private final Iterable<String> names;
 
-    private boolean initialized = false;
+    private boolean initialized;
 
-    private Set<String> primaryTypes = null;
+    private Set<String> primaryTypes;
 
-    private Set<String> mixinTypes = null;
+    private Set<String> mixinTypes;
 
     /**
      * Creates a predicate for checking whether a node state is an instance of
@@ -159,11 +159,11 @@ public class TypePredicate implements Pr
         init();
         if (primaryTypes != null && primaryTypes.contains(primary)) {
             return true;
-        } else if (mixinTypes != null && any(mixins, in(mixinTypes))) {
+        }
+        if (mixinTypes != null && any(mixins, in(mixinTypes))) {
             return true;
-        } else {
-            return false;
         }
+        return false;
     }
 
     //---------------------------------------------------------< Predicate >--
@@ -174,12 +174,12 @@ public class TypePredicate implements Pr
         if (primaryTypes != null
                 && primaryTypes.contains(input.getName(JCR_PRIMARYTYPE))) {
             return true;
-        } else if (mixinTypes != null
+        }
+        if (mixinTypes != null
                 && any(input.getNames(JCR_MIXINTYPES), in(mixinTypes))) {
             return true;
-        } else {
-            return false;
         }
+        return false;
     }
 
     //------------------------------------------------------------< Object >--

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java?rev=1649786&r1=1649785&r2=1649786&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java Tue Jan  6 12:00:47 2015
@@ -223,7 +223,8 @@ public class QueryPlanTest extends Abstr
         session.save();
        
         String sql2 = "select [jcr:path] as [path] from [nt:base] " + 
-                "where [node2/node3/jcr:primaryType] is not null";
+                "where [node2/node3/jcr:primaryType] is not null " + 
+                "and isdescendantnode('/testroot')";
         
         Query q;
         QueryResult result;
@@ -235,8 +236,10 @@ public class QueryPlanTest extends Abstr
         assertTrue(it.hasNext());
         String plan = it.nextRow().getValue("plan").getString();
         // should not use the index on "jcr:primaryType"
-        assertEquals("[nt:base] as [nt:base] /* traverse \"*\" " + 
-                "where [nt:base].[node2/node3/jcr:primaryType] is not null */", 
+        assertEquals("[nt:base] as [nt:base] /* traverse \"/testroot//*\" " + 
+                "where ([nt:base].[node2/node3/jcr:primaryType] is not null) " + 
+                "and (isdescendantnode([nt:base], [/testroot])) " +
+                "*/", 
                 plan);
         
         // verify the result

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java?rev=1649786&r1=1649785&r2=1649786&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java Tue Jan  6 12:00:47 2015
@@ -66,6 +66,31 @@ public class QueryTest extends AbstractR
     }
     
     @Test
+    public void noDeclaringNodeTypesIndex() throws Exception {
+        Session session = getAdminSession();
+        Node root = session.getRootNode();
+        
+        // set declaringNodeTypes to an empty array
+        Node nodeTypeIndex = root.getNode("oak:index").getNode("nodetype");
+        nodeTypeIndex.setProperty("declaringNodeTypes", new String[] {
+            }, PropertyType.NAME);
+        session.save();
+
+        // add a node
+        Node test = root.addNode("test");
+        test.addNode("testNode", "oak:Unstructured");
+        session.save();
+
+        // run the query
+        String query = "/jcr:root/test//*[@jcr:primaryType='oak:Unstructured']";
+        QueryResult r = session.getWorkspace().getQueryManager()
+                .createQuery(query, "xpath").execute();
+        NodeIterator it = r.getNodes();
+        assertTrue(it.hasNext());
+        assertEquals("/test/testNode", it.nextNode().getPath());
+    }
+    
+    @Test
     public void orderBy() throws Exception {
         Session session = getAdminSession();
         Node root = session.getRootNode();
@@ -81,8 +106,10 @@ public class QueryTest extends AbstractR
         
         // disable the nodetype index
         Node nodeTypeIndex = root.getNode("oak:index").getNode("nodetype");
-        nodeTypeIndex.setProperty("declaringNodeTypes", new String[] { NT_FOLDER },
-            PropertyType.NAME);
+        nodeTypeIndex.setProperty("declaringNodeTypes", new String[] {
+                "nt:Folder"
+            }, PropertyType.NAME);
+        session.save();
 
         // add 10 nodes
         Node test = root.addNode("test");