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 2019/03/28 14:58:26 UTC

svn commit: r1856481 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/Statement.java

Author: thomasm
Date: Thu Mar 28 14:58:26 2019
New Revision: 1856481

URL: http://svn.apache.org/viewvc?rev=1856481&view=rev
Log:
OAK-7731 Order by jcr:score descending is not always ignored

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/Statement.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/Statement.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/Statement.java?rev=1856481&r1=1856480&r2=1856481&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/Statement.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/Statement.java Thu Mar 28 14:58:26 2019
@@ -33,6 +33,7 @@ public class Statement {
     private static final UnsupportedOperationException TOO_MANY_UNION = 
             new UnsupportedOperationException("Too many union queries");
     private final static int MAX_UNION = Integer.getInteger("oak.xpathMaxUnion", 1000);
+    private final static boolean KEEP_UNION_ORDER = Boolean.getBoolean("oak.xpath.keepUnionOrder");
 
     boolean explain;
     boolean measure;
@@ -59,7 +60,7 @@ public class Statement {
     QueryOptions queryOptions;
     
     public Statement optimize() {
-        ignoreOrderByScoreDesc();
+        ignoreOrderByScoreDesc(orderList);
         if (where == null) {
             return this;
         }
@@ -232,7 +233,12 @@ public class Statement {
         return buff.toString();        
     }
     
-    private void ignoreOrderByScoreDesc() {
+    /**
+     * Remove "[jcr:score] descending" from the list if this is the only element.
+     *
+     * @param orderList - the list (modified in-place)
+     */
+    private static void ignoreOrderByScoreDesc(ArrayList<Order> orderList) {
         if (orderList.size() != 1) {
             return;
         }
@@ -295,6 +301,9 @@ public class Statement {
         
         @Override
         public Statement optimize() {
+            if (!KEEP_UNION_ORDER) {
+                ignoreOrderByScoreDesc(orderList);
+            }
             Statement s1b = s1.optimize();
             Statement s2b = s2.optimize();
             if (s1 == s1b && s2 == s2b) {