You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by al...@apache.org on 2011/10/19 17:23:48 UTC
svn commit: r1186266 - in /jackrabbit/trunk/jackrabbit-core/src:
main/java/org/apache/jackrabbit/core/query/lucene/
main/java/org/apache/jackrabbit/core/query/lucene/join/
main/java/org/apache/jackrabbit/core/query/lucene/sort/
test/java/org/apache/jac...
Author: alexparvulescu
Date: Wed Oct 19 15:23:48 2011
New Revision: 1186266
URL: http://svn.apache.org/viewvc?rev=1186266&view=rev
Log:
JCR-2959 SQL2 QueryEngine should use Lucene for sort
- removed redundant 'reversed' info, as lucene is already reversing the comparator
- cosmetics
- added option to enable the feature from the SQL2OrderByTest test
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SharedFieldComparatorSource.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/QueryEngine.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/AbstractFieldComparator.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/DynamicOperandFieldComparator.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/DynamicOperandFieldComparatorSource.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/ValueComparableWrapper.java
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/SQL2OrderByTest.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SharedFieldComparatorSource.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SharedFieldComparatorSource.java?rev=1186266&r1=1186265&r2=1186266&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SharedFieldComparatorSource.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SharedFieldComparatorSource.java Wed Oct 19 15:23:48 2011
@@ -188,10 +188,8 @@ public class SharedFieldComparatorSource
@Override
protected Comparable sortValue(int doc) {
try {
- int idx = readerIndex(doc);
- IndexReader reader = readers.get(idx);
- Document document = reader.document(doc - starts[idx], FieldSelectors.UUID);
- String uuid = document.get(FieldNames.UUID);
+ final String uuid = getUUIDForIndex(doc);
+
Path path = hmgr.getPath(new NodeId(uuid));
PathBuilder builder = new PathBuilder(path);
builder.addAll(propertyName.getElements());
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/QueryEngine.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/QueryEngine.java?rev=1186266&r1=1186265&r2=1186266&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/QueryEngine.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/QueryEngine.java Wed Oct 19 15:23:48 2011
@@ -515,7 +515,7 @@ public class QueryEngine {
sortFields.add(new SortField(null, SortField.SCORE, !isAsc));
} else {
// TODO use native sort if available
- sortFields.add(new SortField(p, dofcs, isAsc));
+ sortFields.add(new SortField(p, dofcs, !isAsc));
}
}
return sortFields.toArray(new SortField[sortFields.size()]);
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/AbstractFieldComparator.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/AbstractFieldComparator.java?rev=1186266&r1=1186265&r2=1186266&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/AbstractFieldComparator.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/AbstractFieldComparator.java Wed Oct 19 15:23:48 2011
@@ -21,7 +21,9 @@ import java.util.ArrayList;
import java.util.List;
import org.apache.jackrabbit.core.query.lucene.FieldComparatorBase;
+import org.apache.jackrabbit.core.query.lucene.FieldNames;
import org.apache.jackrabbit.core.query.lucene.MultiIndexReader;
+import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
/**
@@ -138,4 +140,11 @@ public abstract class AbstractFieldCompa
readers.add(reader);
}
}
+
+ protected String getUUIDForIndex(int doc) throws IOException {
+ int idx = readerIndex(doc);
+ IndexReader reader = readers.get(idx);
+ Document document = reader.document(doc - starts[idx]);
+ return document.get(FieldNames.UUID);
+ }
}
\ No newline at end of file
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/DynamicOperandFieldComparator.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/DynamicOperandFieldComparator.java?rev=1186266&r1=1186265&r2=1186266&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/DynamicOperandFieldComparator.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/DynamicOperandFieldComparator.java Wed Oct 19 15:23:48 2011
@@ -22,9 +22,6 @@ import javax.jcr.Value;
import javax.jcr.query.qom.Ordering;
import org.apache.jackrabbit.commons.query.qom.OperandEvaluator;
-import org.apache.jackrabbit.core.query.lucene.FieldNames;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.index.IndexReader;
public final class DynamicOperandFieldComparator extends
AbstractFieldComparator {
@@ -32,28 +29,23 @@ public final class DynamicOperandFieldCo
private final Session session;
private final OperandEvaluator evaluator;
private final Ordering ordering;
- private final boolean reversed;
public DynamicOperandFieldComparator(final Session session,
final OperandEvaluator evaluator, final Ordering ordering,
- int numHits, final boolean reversed) {
+ int numHits) {
super(numHits);
this.session = session;
this.evaluator = evaluator;
this.ordering = ordering;
- this.reversed = reversed;
}
@Override
- protected Comparable sortValue(int doc) {
+ protected Comparable<ValueComparableWrapper> sortValue(int doc) {
try {
- int idx = readerIndex(doc);
- IndexReader reader = readers.get(idx);
- Document document = reader.document(doc - starts[idx]);
- final String uuid = document.get(FieldNames.UUID);
+ final String uuid = getUUIDForIndex(doc);
final Node n = session.getNodeByIdentifier(uuid);
- Value[] v = evaluator.getValues(ordering.getOperand(), n);
- return new ValueComparableWrapper(v, reversed);
+ final Value[] v = evaluator.getValues(ordering.getOperand(), n);
+ return new ValueComparableWrapper(v);
} catch (Exception e) {
e.printStackTrace();
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/DynamicOperandFieldComparatorSource.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/DynamicOperandFieldComparatorSource.java?rev=1186266&r1=1186265&r2=1186266&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/DynamicOperandFieldComparatorSource.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/DynamicOperandFieldComparatorSource.java Wed Oct 19 15:23:48 2011
@@ -47,7 +47,6 @@ public final class DynamicOperandFieldCo
public FieldComparator newComparator(String fieldname, int numHits,
int sortPos, boolean reversed) throws IOException {
final Ordering o = orderByProperties.get(fieldname);
- return new DynamicOperandFieldComparator(session, evaluator, o,
- numHits, reversed);
+ return new DynamicOperandFieldComparator(session, evaluator, o, numHits);
}
}
\ No newline at end of file
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/ValueComparableWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/ValueComparableWrapper.java?rev=1186266&r1=1186265&r2=1186266&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/ValueComparableWrapper.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/sort/ValueComparableWrapper.java Wed Oct 19 15:23:48 2011
@@ -21,29 +21,16 @@ import javax.jcr.Value;
import org.apache.jackrabbit.core.query.lucene.join.ValueComparator;
class ValueComparableWrapper implements Comparable<ValueComparableWrapper> {
- private final ValueComparator comparator = new ValueComparator();
+ private final static ValueComparator comparator = new ValueComparator();
private final Value[] v;
- private final boolean reversed;
- public ValueComparableWrapper(final Value[] v, final boolean reversed) {
+ public ValueComparableWrapper(final Value[] v) {
this.v = v;
- this.reversed = reversed;
- }
-
- public Value[] getValue() {
- return v;
}
public int compareTo(ValueComparableWrapper o) {
- final int d = compare(v, o.getValue());
- if (d != 0) {
- if (reversed) {
- return -d;
- }
- return d;
- }
- return 0;
+ return compare(v, o.v);
}
private int compare(Value[] a, Value[] b) {
@@ -55,4 +42,4 @@ class ValueComparableWrapper implements
}
return a.length - b.length;
}
-}
\ No newline at end of file
+}
Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/SQL2OrderByTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/SQL2OrderByTest.java?rev=1186266&r1=1186265&r2=1186266&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/SQL2OrderByTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/SQL2OrderByTest.java Wed Oct 19 15:23:48 2011
@@ -29,6 +29,12 @@ import org.apache.jackrabbit.commons.Jcr
public class SQL2OrderByTest extends AbstractQueryTest {
// TODO order by aggregate test?
+ // TODO enable the test once the native sort is properly handled.
+
+ static {
+ // To see JCR-2959 in action, enable the following
+ // System.setProperty(QueryEngine.NATIVE_SORT_SYSTEM_PROPERTY, "true");
+ }
@Override
protected void setUp() throws Exception {
@@ -73,77 +79,131 @@ public class SQL2OrderByTest extends Abs
Node n2 = testRootNode.addNode("node2");
Node n3 = testRootNode.addNode("node3");
- n1.setProperty("text", "aaa");
n1.setProperty("value", 3);
- n2.setProperty("text", "bbb");
- n2.setProperty("value", 2);
- n3.setProperty("text", "ccc");
- n3.setProperty("value", 1);
+ n2.setProperty("value", 1);
+ n3.setProperty("value", 2);
testRootNode.getSession().save();
QueryResult qr = executeSQL2Query("SELECT * FROM [nt:base] WHERE ISCHILDNODE(["
- + testRoot + "]) ORDER BY [value] desc");
- checkSeq(qr, new Node[] { n1, n2, n3 });
+ + testRoot + "]) ORDER BY [value]");
+ checkSeq(qr, new Node[] { n2, n3, n1 });
}
- public void testOrderByVal2() throws RepositoryException {
+ public void testOrderByValDesc() throws RepositoryException {
Node n1 = testRootNode.addNode("node1");
Node n2 = testRootNode.addNode("node2");
Node n3 = testRootNode.addNode("node3");
- n1.setProperty("text", "aaa");
n1.setProperty("value", 3);
- n2.setProperty("text", "bbb");
- n2.setProperty("value", 2);
- n3.setProperty("text", "ccc");
- n3.setProperty("value", 1);
+ n2.setProperty("value", 1);
+ n3.setProperty("value", 2);
testRootNode.getSession().save();
QueryResult qr = executeSQL2Query("SELECT * FROM [nt:base] WHERE ISCHILDNODE(["
- + testRoot + "]) ORDER BY [value]");
- checkSeq(qr, new Node[] { n3, n2, n1 });
+ + testRoot + "]) ORDER BY [value] desc");
+ checkSeq(qr, new Node[] { n1, n3, n2 });
+ }
+
+ public void testOrderByValMult() throws RepositoryException {
+
+ Node n1 = testRootNode.addNode("node1");
+ Node n2 = testRootNode.addNode("node2");
+ Node n3 = testRootNode.addNode("node3");
+
+ n1.setProperty("value", 2);
+ n1.setProperty("text", "b");
+
+ n2.setProperty("value", 1);
+ n2.setProperty("text", "x");
+
+ n3.setProperty("value", 2);
+ n3.setProperty("text", "a");
+
+ testRootNode.getSession().save();
+
+ QueryResult qr = executeSQL2Query("SELECT * FROM [nt:base] WHERE ISCHILDNODE(["
+ + testRoot + "]) ORDER BY [value], [text]");
+ checkSeq(qr, new Node[] { n2, n3, n1 });
+ }
+
+ public void testOrderByValMultDesc() throws RepositoryException {
+
+ Node n1 = testRootNode.addNode("node1");
+ Node n2 = testRootNode.addNode("node2");
+ Node n3 = testRootNode.addNode("node3");
+
+ n1.setProperty("value", 2);
+ n1.setProperty("text", "b");
+
+ n2.setProperty("value", 1);
+ n2.setProperty("text", "x");
+
+ n3.setProperty("value", 2);
+ n3.setProperty("text", "a");
+
+ testRootNode.getSession().save();
+
+ QueryResult qr = executeSQL2Query("SELECT * FROM [nt:base] WHERE ISCHILDNODE(["
+ + testRoot + "]) ORDER BY [value] desc, [text] desc");
+ checkSeq(qr, new Node[] { n1, n3, n2 });
+ }
+
+ public void testOrderByValMultMix() throws RepositoryException {
+
+ Node n1 = testRootNode.addNode("node1");
+ Node n2 = testRootNode.addNode("node2");
+ Node n3 = testRootNode.addNode("node3");
+
+ n1.setProperty("value", 2);
+ n1.setProperty("text", "b");
+
+ n2.setProperty("value", 1);
+ n2.setProperty("text", "x");
+
+ n3.setProperty("value", 2);
+ n3.setProperty("text", "a");
+
+ testRootNode.getSession().save();
+
+ QueryResult qr = executeSQL2Query("SELECT * FROM [nt:base] WHERE ISCHILDNODE(["
+ + testRoot + "]) ORDER BY [value], [text] desc");
+ checkSeq(qr, new Node[] { n2, n1, n3 });
}
- public void testOrderByFunction() throws RepositoryException {
+ public void testOrderByFnc() throws RepositoryException {
Node n1 = testRootNode.addNode("node1", "nt:unstructured");
Node n2 = testRootNode.addNode("node2", "nt:unstructured");
Node n3 = testRootNode.addNode("node3", "nt:unstructured");
- n1.setProperty("t", "aa");
- n1.setProperty("value", 3);
- n2.setProperty("t", "bbb");
- n2.setProperty("value", 2);
- n3.setProperty("t", "ccc");
- n3.setProperty("value", 1);
+ n1.setProperty("value", "aaa");
+ n2.setProperty("value", "a");
+ n3.setProperty("value", "aa");
testRootNode.getSession().save();
- QueryResult qr = executeSQL2Query("SELECT * FROM [nt:base] as sissy WHERE ISCHILDNODE(["
- + testRoot + "]) ORDER BY LENGTH([t]), t");
- checkSeq(qr, new Node[] { n1, n2, n3 });
+ QueryResult qr = executeSQL2Query("SELECT * FROM [nt:base] WHERE ISCHILDNODE(["
+ + testRoot + "]) ORDER BY LENGTH([value])");
+ checkSeq(qr, new Node[] { n2, n3, n1 });
}
- public void testOrderByFunction2() throws RepositoryException {
+ public void testOrderByFncDesc() throws RepositoryException {
Node n1 = testRootNode.addNode("node1", "nt:unstructured");
Node n2 = testRootNode.addNode("node2", "nt:unstructured");
Node n3 = testRootNode.addNode("node3", "nt:unstructured");
- n1.setProperty("t", "aa");
- n1.setProperty("value", 3);
- n2.setProperty("t", "bbb");
- n2.setProperty("value", 2);
- n3.setProperty("t", "ccc");
- n3.setProperty("value", 1);
+ n1.setProperty("value", "aaa");
+ n2.setProperty("value", "a");
+ n3.setProperty("value", "aa");
testRootNode.getSession().save();
- QueryResult qr = executeSQL2Query("SELECT * FROM [nt:base] as sissy WHERE ISCHILDNODE(["
- + testRoot + "]) ORDER BY LENGTH([t]), t desc");
+ QueryResult qr = executeSQL2Query("SELECT * FROM [nt:base] WHERE ISCHILDNODE(["
+ + testRoot + "]) ORDER BY LENGTH([value]) desc");
checkSeq(qr, new Node[] { n1, n3, n2 });
}