Author: catholicon
Date: Thu Mar 22 01:14:51 2018
New Revision: 1827451

URL: http://svn.apache.org/viewvc?rev=1827451&view=rev
Log:
OAK-7370: order by jcr:score desc doesn't work across union query created by 
optimizing OR clauses

Add a lucene based test. Actual issue most likely exists in oak-core and hence 
would call for more tests over there.

Modified:
    
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java?rev=1827451&r1=1827450&r2=1827451&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
 Thu Mar 22 01:14:51 2018
@@ -751,6 +751,74 @@ public class LucenePropertyIndexTest ext
         assertQuery("select [jcr:path] from [nt:base] where propa is not null 
order by [jcr:score]", asList("/test/a"));
     }
 
+    // OAK-7370
+    @Ignore("OAK-7370")
+    @Test
+    public void orderByScoreAcrossUnion() throws Exception {
+        Tree idx = 
root.getTree("/").addChild(INDEX_DEFINITIONS_NAME).addChild("test-index");
+        IndexDefinitionBuilder builder = new IndexDefinitionBuilder();
+        builder.evaluatePathRestrictions();
+        builder.indexRule("nt:base")
+                .property("foo").analyzed().propertyIndex().nodeScopeIndex()
+                .property("p1").propertyIndex()
+                .property("p2").propertyIndex();
+        builder.build(idx);
+        idx.removeProperty("async");
+        root.commit();
+
+        Tree testRoot = root.getTree("/").addChild("test");
+        Tree path1 = testRoot.addChild("path1");
+        Tree path2 = testRoot.addChild("path2");
+
+        Tree c1 = path1.addChild("c1");
+        c1.setProperty("foo", "bar. some extra stuff");
+        c1.setProperty("p1", "d");
+
+        Tree c2 = path2.addChild("c2");
+        c2.setProperty("foo", "bar");
+        c2.setProperty("p2", "d");
+
+        Tree c3 = path2.addChild("c3");
+        c3.setProperty("foo", "bar. some extra stuff... and then some to make 
it worse than c1");
+        c3.setProperty("p2", "d");
+
+        // create more stuff to get num_docs in index large and hence force 
union optimization
+        for (int i = 0; i < 10; i++) {
+            testRoot.addChild("extra" + i).setProperty("foo", "stuff");
+        }
+
+        root.commit();
+
+        List<String> expected = asList(c2.getPath(), c1.getPath(), 
c3.getPath());
+
+        String query;
+
+        // manual union
+        query =
+                "select [jcr:path] from [nt:base] where contains(*, 'bar') and 
isdescendantnode('" + path1.getPath() + "')" +
+                " union " +
+                "select [jcr:path] from [nt:base] where contains(*, 'bar') and 
isdescendantnode('" + path2.getPath() + "')" +
+                " order by [jcr:score] desc";
+
+        assertEquals(expected, executeQuery(query, SQL2));
+
+        // no union (estiimated fulltext without union would be same as 
sub-queries and it won't be optimized
+        query = "select [jcr:path] from [nt:base] where contains(*, 'bar')" +
+                " and (isdescendantnode('" + path1.getPath() + "') or" +
+                " isdescendantnode('" + path2.getPath() + "'))" +
+                " order by [jcr:score] desc";
+
+        assertEquals(expected, executeQuery(query, SQL2));
+
+        // optimization UNION as we're adding constraints to sub-queries that 
would improve cost of optimized union
+        query = "select [jcr:path] from [nt:base] where contains(*, 'bar')" +
+                " and ( (p1 = 'd' and isdescendantnode('" + path1.getPath() + 
"')) or" +
+                " (p2 = 'd' and isdescendantnode('" + path2.getPath() + "')))" 
+
+                " order by [jcr:score] desc";
+
+        assertEquals(expected, executeQuery(query, SQL2));
+    }
+
     @Test
     public void rangeQueriesWithLong() throws Exception {
         Tree idx = createIndex("test1", of("propa", "propb"));


Reply via email to