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 2024/10/18 15:17:07 UTC

(jackrabbit-oak) branch OAK-11214 created (now bc52d7e836)

This is an automated email from the ASF dual-hosted git repository.

thomasm pushed a change to branch OAK-11214
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git


      at bc52d7e836 OAK-11214 Support 'IN' restrictions for functions

This branch includes the following new commits:

     new bc52d7e836 OAK-11214 Support 'IN' restrictions for functions

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(jackrabbit-oak) 01/01: OAK-11214 Support 'IN' restrictions for functions

Posted by th...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

thomasm pushed a commit to branch OAK-11214
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git

commit bc52d7e8360d1113145213ff284081bec58a2fea
Author: Thomas Mueller <th...@apache.org>
AuthorDate: Fri Oct 18 17:16:50 2024 +0200

    OAK-11214 Support 'IN' restrictions for functions
---
 .../jackrabbit/oak/query/ast/LowerCaseImpl.java    |  4 +++
 .../oak/query/ast/NodeLocalNameImpl.java           |  5 +++-
 .../jackrabbit/oak/query/ast/NodeNameImpl.java     |  5 +++-
 .../apache/jackrabbit/oak/query/ast/PathImpl.java  |  5 +++-
 .../jackrabbit/oak/query/ast/UpperCaseImpl.java    |  4 +++
 .../apache/jackrabbit/oak/query/FilterTest.java    | 33 ++++++++++++++++++++++
 6 files changed, 53 insertions(+), 3 deletions(-)

diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LowerCaseImpl.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LowerCaseImpl.java
index df46dd8273..e328f05b17 100644
--- a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LowerCaseImpl.java
+++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LowerCaseImpl.java
@@ -105,6 +105,10 @@ public class LowerCaseImpl extends DynamicOperandImpl {
     public void restrictList(FilterImpl f, List<PropertyValue> list) {
         // "LOWER(x) IN (A, B)" implies x is not null
         operand.restrict(f, Operator.NOT_EQUAL, null);
+        String fn = getFunction(f.getSelector());
+        if (fn != null) {
+            f.restrictPropertyAsList(QueryConstants.FUNCTION_RESTRICTION_PREFIX + fn, list);
+        }
     }
     
     @Override
diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeLocalNameImpl.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeLocalNameImpl.java
index 577ed96aee..d52215ca0d 100644
--- a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeLocalNameImpl.java
+++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeLocalNameImpl.java
@@ -109,7 +109,10 @@ public class NodeLocalNameImpl extends DynamicOperandImpl {
 
     @Override
     public void restrictList(FilterImpl f, List<PropertyValue> list) {
-        // optimizations of type "LOCALNAME(..) IN(A, B)" are not supported
+        String fn = getFunction(f.getSelector());
+        if (fn != null) {
+            f.restrictPropertyAsList(QueryConstants.FUNCTION_RESTRICTION_PREFIX + fn, list);
+        }
     }
 
     @Override
diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java
index 00484b254f..4a008c4bbe 100644
--- a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java
+++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java
@@ -111,7 +111,10 @@ public class NodeNameImpl extends DynamicOperandImpl {
 
     @Override
     public void restrictList(FilterImpl f, List<PropertyValue> list) {
-        // optimizations of type "NAME(..) IN(A, B)" are not supported
+        String fn = getFunction(f.getSelector());
+        if (fn != null) {
+            f.restrictPropertyAsList(QueryConstants.FUNCTION_RESTRICTION_PREFIX + fn, list);
+        }
     }
 
     @Override
diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PathImpl.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PathImpl.java
index 7f6c1cc796..bebc512fbe 100644
--- a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PathImpl.java
+++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PathImpl.java
@@ -95,7 +95,10 @@ public class PathImpl extends DynamicOperandImpl {
 
     @Override
     public void restrictList(FilterImpl f, List<PropertyValue> list) {
-        // optimizations of type "NAME(..) IN(A, B)" are not supported
+        String fn = getFunction(f.getSelector());
+        if (fn != null) {
+            f.restrictPropertyAsList(QueryConstants.FUNCTION_RESTRICTION_PREFIX + fn, list);
+        }
     }
 
     @Override
diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/UpperCaseImpl.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/UpperCaseImpl.java
index 400b7bbc23..e8588e654c 100644
--- a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/UpperCaseImpl.java
+++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/UpperCaseImpl.java
@@ -98,6 +98,10 @@ public class UpperCaseImpl extends DynamicOperandImpl {
     public void restrictList(FilterImpl f, List<PropertyValue> list) {
         // "UPPER(x) IN (A, B)" implies x is not null
         operand.restrict(f, Operator.NOT_EQUAL, null);
+        String fn = getFunction(f.getSelector());
+        if (fn != null) {
+            f.restrictPropertyAsList(QueryConstants.FUNCTION_RESTRICTION_PREFIX + fn, list);
+        }
     }
     
     @Override
diff --git a/oak-core/src/test/java/org/apache/jackrabbit/oak/query/FilterTest.java b/oak-core/src/test/java/org/apache/jackrabbit/oak/query/FilterTest.java
index e56cd34f27..7dc4d86e7c 100644
--- a/oak-core/src/test/java/org/apache/jackrabbit/oak/query/FilterTest.java
+++ b/oak-core/src/test/java/org/apache/jackrabbit/oak/query/FilterTest.java
@@ -46,6 +46,39 @@ public class FilterTest {
         return q.createFilter(true);
     }
 
+    @Test
+    public void functionBasedIndexOr() throws Exception {
+        String sql2 = "select [jcr:path] from [nt:base] where lower([test]) in('hello', 'world')";
+        assertEquals("Filter(query=select [jcr:path] from [nt:base] " +
+                "where lower([test]) in('hello', 'world'), " +
+                "path=*, property=[function*lower*@test=[in(hello, world)], " +
+                "test=[is not null]])", createFilterSQL(sql2).toString());
+
+        sql2 = "select [jcr:path] from [nt:base] where upper([test]) in('hello', 'world')";
+        assertEquals("Filter(query=select [jcr:path] from [nt:base] " +
+                "where upper([test]) in('hello', 'world'), " +
+                "path=*, property=[function*upper*@test=[in(hello, world)], " +
+                "test=[is not null]])", createFilterSQL(sql2).toString());
+
+        sql2 = "select [jcr:path] from [nt:base] where name() in('hello', 'world')";
+        assertEquals("Filter(query=select [jcr:path] from [nt:base] " +
+                "where name() in('hello', 'world'), " +
+                "path=*, property=[function*@:name=[in(hello, world)]])",
+                createFilterSQL(sql2).toString());
+
+        sql2 = "select [jcr:path] from [nt:base] where localname() in('hello', 'world')";
+        assertEquals("Filter(query=select [jcr:path] from [nt:base] " +
+                "where localname() in('hello', 'world'), " +
+                "path=*, property=[function*@:localname=[in(hello, world)]])",
+                createFilterSQL(sql2).toString());
+
+        sql2 = "select [jcr:path] from [nt:base] where path() in('/hello', '/world')";
+        assertEquals("Filter(query=select [jcr:path] from [nt:base] " +
+                "where path() in('/hello', '/world'), " +
+                "path=*, property=[function*@:path=[in(/hello, /world)]])",
+                createFilterSQL(sql2).toString());
+    }
+
     @Test
     public void functionBasedIndex() throws Exception {
         String sql2 = "select [jcr:path] from [nt:base] where lower([test]) = 'hello'";