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 ca...@apache.org on 2018/03/22 01:14:51 UTC

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

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