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