From a0d97f88f2c67bb5d428d28e925c1a0886a1d41b Mon Sep 17 00:00:00 2001
From: Mohit Kataria <tihom88@gmail.com>
Date: Wed, 27 Mar 2019 17:37:16 +0530
Subject: [PATCH] OAK-7731: Order by jcr:score descending is not always ignored

---
 .../jackrabbit/oak/query/xpath/Statement.java    | 13 +++++++------
 .../apache/jackrabbit/oak/query/XPathTest.java   | 16 +++++++++++++++-
 2 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/Statement.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/Statement.java
index 37c88b1bbf..f721c67a73 100644
--- a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/Statement.java
+++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/Statement.java
@@ -59,7 +59,7 @@ public class Statement {
     QueryOptions queryOptions;
     
     public Statement optimize() {
-        ignoreOrderByScoreDesc();
+        ignoreOrderByScoreDesc(orderList);
         if (where == null) {
             return this;
         }
@@ -97,7 +97,7 @@ public class Statement {
 
         return union;
     }
-    
+
     private ArrayList<Selector> cloneSelectors() {
         ArrayList<Selector> list = new ArrayList<Selector>();
         for (Selector s : selectors) {
@@ -231,8 +231,8 @@ public class Statement {
         appendXPathAsComment(buff, xpathQuery);
         return buff.toString();        
     }
-    
-    private void ignoreOrderByScoreDesc() {
+
+    private static void ignoreOrderByScoreDesc(ArrayList<Order> orderList) {
         if (orderList.size() != 1) {
             return;
         }
@@ -243,7 +243,7 @@ public class Statement {
         if (!order.expr.toString().equals("[jcr:score]")) {
             return;
         }
-        // so we have just one expression, 
+        // so we have just one expression,
         // and it is "order by @jcr:score desc"
         // this we can remove
         orderList.remove(0);
@@ -295,6 +295,7 @@ public class Statement {
         
         @Override
         public Statement optimize() {
+            ignoreOrderByScoreDesc(orderList);
             Statement s1b = s1.optimize();
             Statement s2b = s2.optimize();
             if (s1 == s1b && s2 == s2b) {
@@ -309,7 +310,7 @@ public class Statement {
             union.xpathQuery = xpathQuery;
             return union;
         }
-        
+
         @Override
         public String toString() {
             StringBuilder buff = new StringBuilder();
diff --git a/oak-core/src/test/java/org/apache/jackrabbit/oak/query/XPathTest.java b/oak-core/src/test/java/org/apache/jackrabbit/oak/query/XPathTest.java
index 6578db9aab..47482c0275 100644
--- a/oak-core/src/test/java/org/apache/jackrabbit/oak/query/XPathTest.java
+++ b/oak-core/src/test/java/org/apache/jackrabbit/oak/query/XPathTest.java
@@ -308,7 +308,21 @@ public class XPathTest {
                 "from [nt:base] as a " +
                 "where [a] is not null " +
                 "and isdescendantnode(a, '/lib') " +
-                "/* xpath: /jcr:root/lib//*[@a] */");        
+                "/* xpath: /jcr:root/lib//*[@a] */");
+        verify("/jcr:root/content//(element(*, nt:base) | element(*, nt:folder)) order by @jcr:score",
+                "select [jcr:path], [jcr:score], * from [nt:base] as a where isdescendantnode(a, '/content') " +
+                "/* xpath: /jcr:root/content//element(*, nt:base)  order by @jcr:score */ " +
+                "union select [jcr:path], [jcr:score], * from [nt:folder] as a where isdescendantnode(a, '/content') " +
+                "/* xpath: /jcr:root/content// element(*, nt:folder) order by @jcr:score */ " +
+                "order by [jcr:score]");
+         /*
+            order by @jcr:score descending is ignored on xpath to sql2 conversion
+          */
+        verify("/jcr:root/content//(element(*, nt:base) | element(*, nt:folder)) order by @jcr:score descending",
+                "select [jcr:path], [jcr:score], * from [nt:base] as a where isdescendantnode(a, '/content') " +
+                "/* xpath: /jcr:root/content//element(*, nt:base)  order by @jcr:score descending */ " +
+                "union select [jcr:path], [jcr:score], * from [nt:folder] as a where isdescendantnode(a, '/content') " +
+                "/* xpath: /jcr:root/content// element(*, nt:folder) order by @jcr:score descending */");
     }
 
     private void verify(String xpath, String expectedSql2) throws ParseException {
-- 
2.17.1

