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 2014/04/29 14:49:05 UTC

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

Author: thomasm
Date: Tue Apr 29 12:49:04 2014
New Revision: 1590967

URL: http://svn.apache.org/r1590967
Log:
OAK-1776 Ordered index returns the wrong nodes when ordering by relative properties

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndex.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.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/OrderedPropertyIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndex.java?rev=1590967&r1=1590966&r2=1590967&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndex.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndex.java Tue Apr 29 12:49:04 2014
@@ -101,7 +101,7 @@ public class OrderedPropertyIndex extend
                     if (lookup.isIndexed(propertyName, "/", filter)) {
                         IndexPlan.Builder b = getIndexPlanBuilder(filter);
                         b.setSortOrder(ImmutableList.of(new OrderEntry(
-                            propertyName,
+                                oe.getPropertyName(),
                                 Type.UNDEFINED,
                                 lookup.isAscending(root, propertyName, filter) ? OrderEntry.Order.ASCENDING
                                         : OrderEntry.Order.DESCENDING)));
@@ -204,6 +204,7 @@ public class OrderedPropertyIndex extend
                 // we could be here if we have a query where the ORDER BY makes us play it.
                 for (OrderEntry oe : sortOrder) {
                     String propertyName = PathUtils.getName(oe.getPropertyName());
+                    depth = PathUtils.getDepth(oe.getPropertyName());
                     if (lookup.isIndexed(propertyName, "/", null)) {
                         paths = lookup.query(filter, propertyName, new PropertyRestriction());
                     }

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java?rev=1590967&r1=1590966&r2=1590967&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java Tue Apr 29 12:49:04 2014
@@ -31,6 +31,7 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
 import org.apache.jackrabbit.oak.plugins.index.nodetype.NodeTypeIndexProvider;
 import org.apache.jackrabbit.oak.plugins.index.property.OrderedPropertyIndexEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.property.OrderedPropertyIndexProvider;
 import org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexEditorProvider;
 import org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexProvider;
 import org.apache.jackrabbit.oak.plugins.index.reference.ReferenceEditorProvider;
@@ -84,6 +85,7 @@ public class Jcr {
         with(new PropertyIndexEditorProvider());
 
         with(new PropertyIndexProvider());
+        with(new OrderedPropertyIndexProvider());
         with(new NodeTypeIndexProvider());
         
         with(new OrderedPropertyIndexEditorProvider());

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=1590967&r1=1590966&r2=1590967&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 Apr 29 12:49:04 2014
@@ -27,7 +27,9 @@ import static org.junit.Assert.fail;
 import java.io.ByteArrayInputStream;
 import java.io.InputStreamReader;
 import java.io.Reader;
+import java.sql.Timestamp;
 import java.util.Arrays;
+import java.util.Calendar;
 import java.util.HashSet;
 import java.util.NoSuchElementException;
 import java.util.Set;
@@ -63,6 +65,60 @@ public class QueryTest extends AbstractR
     }
     
     @Test
+    public void orderBy() throws Exception {
+        Session session = getAdminSession();
+        Node root = session.getRootNode();
+        
+        // add an ordered index on "lastMod"
+        Node index = root.getNode("oak:index").
+                addNode("lastMod", "oak:QueryIndexDefinition");
+        index.setProperty("reindex", true);
+        // index.setProperty("async", "async");
+        index.setProperty("type", "ordered");
+        index.setProperty("propertyNames", new String[] { "lastMod" },
+                PropertyType.NAME);
+        
+        // disable the nodetype index
+        Node nodeTypeIndex = root.getNode("oak:index").getNode("nodetype");
+        nodeTypeIndex.setProperty("declaringNodeTypes", new String[] {
+        }, PropertyType.NAME);
+
+        // add 10 nodes
+        Node test = root.addNode("test");
+        for (int i = 0; i < 10; i++) {
+            Node n = test.addNode("test" + i, "oak:Unstructured");
+            Calendar cal = Calendar.getInstance();
+            cal.setTimeInMillis(Timestamp.valueOf("2000-01-01 10:00:00")
+                    .getTime() + 1000 * i);
+            n.addNode("content").setProperty("lastMod", cal);
+        }
+        
+        session.save();
+
+        // run the query
+        String query = "/jcr:root/test//*[@jcr:primaryType='oak:Unstructured'] " + 
+                "order by content/@lastMod descending";
+        QueryResult r = session.getWorkspace().getQueryManager()
+                .createQuery(query, "xpath").execute();
+        NodeIterator it = r.getNodes();
+        StringBuilder buff = new StringBuilder();
+        while (it.hasNext()) {
+            if (buff.length() > 0) {
+                buff.append(", ");
+            }
+            buff.append(it.nextNode().getPath());
+        }
+        assertEquals("/test/test9, /test/test8, /test/test7, /test/test6, /test/test5, /test/test4, /test/test3, /test/test2, /test/test1, /test/test0", 
+                buff.toString());
+        
+        // TODO
+        // r = session.getWorkspace().getQueryManager()
+        //         .createQuery("explain " + query, "xpath").execute();
+        // RowIterator rit = r.getRows();
+        // assertEquals("", rit.nextRow().getValue("plan").getString());
+    }
+    
+    @Test
     public void date() throws Exception {
         Session session = getAdminSession();
         Node t1 = session.getRootNode().addNode("t1");