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