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 2016/10/20 13:54:36 UTC
svn commit: r1765818 -
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java
Author: thomasm
Date: Thu Oct 20 13:54:36 2016
New Revision: 1765818
URL: http://svn.apache.org/viewvc?rev=1765818&view=rev
Log:
OAK-4968 Query engine: sort order is calculated multiple times unnecessarily
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java?rev=1765818&r1=1765817&r2=1765818&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java Thu Oct 20 13:54:36 2016
@@ -979,6 +979,7 @@ public class QueryImpl implements Query
// current index is below the minimum cost of the next index.
List<? extends QueryIndex> queryIndexes = MINIMAL_COST_ORDERING
.sortedCopy(indexProvider.getQueryIndexes(rootState));
+ List<OrderEntry> sortOrder = getSortOrder(filter);
for (int i = 0; i < queryIndexes.size(); i++) {
QueryIndex index = queryIndexes.get(i);
double minCost = index.getMinimumCost();
@@ -992,21 +993,6 @@ public class QueryImpl implements Query
IndexPlan indexPlan = null;
if (index instanceof AdvancedQueryIndex) {
AdvancedQueryIndex advIndex = (AdvancedQueryIndex) index;
- List<OrderEntry> sortOrder = null;
- if (orderings != null) {
- sortOrder = new ArrayList<OrderEntry>();
- for (OrderingImpl o : orderings) {
- DynamicOperandImpl op = o.getOperand();
- OrderEntry e = op.getOrderEntry(filter.getSelector(), o);
- if (e == null) {
- continue;
- }
- sortOrder.add(e);
- }
- if (sortOrder.size() == 0) {
- sortOrder = null;
- }
- }
long maxEntryCount = limit;
if (offset > 0) {
if (offset + limit < 0) {
@@ -1083,6 +1069,25 @@ public class QueryImpl implements Query
return new SelectorExecutionPlan(filter.getSelector(), bestIndex, bestPlan, bestCost);
}
+ private List<OrderEntry> getSortOrder(FilterImpl filter) {
+ if (orderings == null) {
+ return null;
+ }
+ ArrayList<OrderEntry> sortOrder = new ArrayList<OrderEntry>();
+ for (OrderingImpl o : orderings) {
+ DynamicOperandImpl op = o.getOperand();
+ OrderEntry e = op.getOrderEntry(filter.getSelector(), o);
+ if (e == null) {
+ continue;
+ }
+ sortOrder.add(e);
+ }
+ if (sortOrder.size() == 0) {
+ return null;
+ }
+ return sortOrder;
+ }
+
private void logDebug(String msg) {
if (isInternal) {
LOG.trace(msg);