Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndex.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndex.java (revision 1590962) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/OrderedPropertyIndex.java (working copy) @@ -101,7 +101,7 @@ 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 @@ // 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()); } Index: oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java =================================================================== --- oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java (revision 1590962) +++ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java (working copy) @@ -31,6 +31,7 @@ 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 @@ with(new PropertyIndexEditorProvider()); with(new PropertyIndexProvider()); + with(new OrderedPropertyIndexProvider()); with(new NodeTypeIndexProvider()); with(new OrderedPropertyIndexEditorProvider()); Index: oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java =================================================================== --- oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java (revision 1590962) +++ oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java (working copy) @@ -27,7 +27,9 @@ 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,55 @@ } @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()); + } + + @Test public void date() throws Exception { Session session = getAdminSession(); Node t1 = session.getRootNode().addNode("t1");