You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2010/10/20 18:55:11 UTC
svn commit: r1025643 - in
/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join:
JoinMerger.java QueryEngine.java
Author: jukka
Date: Wed Oct 20 16:55:11 2010
New Revision: 1025643
URL: http://svn.apache.org/viewvc?rev=1025643&view=rev
Log:
JCR-2715: Improved join query performance
Handle query offset and limit only after sorting.
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinMerger.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/QueryEngine.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinMerger.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinMerger.java?rev=1025643&r1=1025642&r2=1025643&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinMerger.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinMerger.java Wed Oct 20 16:55:11 2010
@@ -140,8 +140,7 @@ abstract class JoinMerger {
}
}
- public QueryResult merge(
- RowIterator leftRows, RowIterator rightRows, long offset, long limit)
+ public QueryResult merge(RowIterator leftRows, RowIterator rightRows)
throws RepositoryException {
RowIterator joinRows;
if (JCR_JOIN_TYPE_RIGHT_OUTER.equals(type)) {
@@ -172,16 +171,6 @@ abstract class JoinMerger {
boolean outer = JCR_JOIN_TYPE_LEFT_OUTER.equals(type);
joinRows = mergeLeft(leftRows, map, outer);
}
- while ((offset-- > 0 || limit == 0) && joinRows.hasNext()) {
- joinRows.nextRow();
- }
- if (limit > 0) {
- List<Row> rows = new ArrayList<Row>((int) limit);
- for (int i = 0; i < limit && joinRows.hasNext(); i++) {
- rows.add(joinRows.nextRow());
- }
- joinRows = new RowIteratorAdapter(rows);
- }
return new SimpleQueryResult(columnNames, selectorNames, joinRows);
}
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=1025643&r1=1025642&r2=1025643&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 20 16:55:11 2010
@@ -216,9 +216,9 @@ public class QueryEngine {
rightRows = new RowIteratorAdapter(list);
}
- QueryResult result = merger.merge(
- new RowIteratorAdapter(leftRows), rightRows, offset, limit);
- return sort(result, orderings);
+ QueryResult result =
+ merger.merge(new RowIteratorAdapter(leftRows), rightRows);
+ return sort(result, orderings, offset, limit);
}
private String toSqlConstraint(Constraint constraint)
@@ -357,19 +357,8 @@ public class QueryEngine {
columnMap.keySet().toArray(new String[columnMap.size()]);
NodeIterator nodes = query.execute().getNodes();
- while ((offset-- > 0 || limit == 0) && nodes.hasNext()) {
- nodes.next();
- }
- if (limit > 0) {
- List<Node> list = new ArrayList<Node>((int) limit);
- for (int i = 0; i < limit && nodes.hasNext(); i++) {
- list.add(nodes.nextNode());
- }
- nodes = new NodeIteratorAdapter(list);
- }
-
final String selectorName = selector.getSelectorName();
- RangeIterator rows = new RangeIteratorAdapter(nodes) {
+ RowIterator rows = new RowIteratorAdapter(nodes) {
@Override
public Object next() {
Node node = (Node) super.next();
@@ -378,9 +367,9 @@ public class QueryEngine {
}
};
- QueryResult result = new SimpleQueryResult(
- columnNames, selectorNames, new RowIteratorAdapter(rows));
- return sort(result, orderings);
+ QueryResult result =
+ new SimpleQueryResult(columnNames, selectorNames, rows);
+ return sort(result, orderings, offset, limit);
}
private Map<String, PropertyValue> getColumnMap(
@@ -451,12 +440,16 @@ public class QueryEngine {
*
* @param result original query results
* @param orderings QOM orderings
+ * @param offset result offset
+ * @param limit result limit
* @return sorted query results
* @throws RepositoryException if the results can not be sorted
*/
- public QueryResult sort(QueryResult result, final Ordering[] orderings)
- throws RepositoryException {
- if (orderings != null && orderings.length > 0) {
+ public QueryResult sort(
+ QueryResult result, final Ordering[] orderings,
+ long offset, long limit) throws RepositoryException {
+ if ((orderings != null && orderings.length > 0)
+ || offset != 0 || limit >= 0) {
List<Row> rows = new ArrayList<Row>();
RowIterator iterator = result.getRows();
@@ -464,7 +457,18 @@ public class QueryEngine {
rows.add(iterator.nextRow());
}
- Collections.sort(rows, new RowComparator(orderings));
+ if (orderings != null && orderings.length > 0) {
+ Collections.sort(rows, new RowComparator(orderings));
+ }
+
+ if (offset != 0 || limit >= 0) {
+ int from = (int) offset;
+ int to = rows.size();
+ if (limit >= 0 && offset + limit < to) {
+ to = (int) (offset + limit);
+ }
+ rows = rows.subList(from, to);
+ }
return new SimpleQueryResult(
result.getColumnNames(), result.getSelectorNames(),