>From Shahrzad Shirazi <[email protected]>:

Shahrzad Shirazi has uploaded this change for review. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20847?usp=email )


Change subject: WIP: Issue with "not IN" Expression
......................................................................

WIP: Issue with "not IN" Expression

Change-Id: I46cb64f4f998b9d2608612e1ad7f55f3ab5f0a2a
---
M 
asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/ASTERIXDB-3582/ASTERIXDB-3582.002.plan
M 
asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.101.plan
M 
asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.201.plan
M 
asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/ASTERIXDB-3584_in_expr/ASTERIXDB-3584_in_expr.01.adm
M 
asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/OperatorExpressionVisitor.java
5 files changed, 75 insertions(+), 142 deletions(-)



  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/47/20847/1

diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/ASTERIXDB-3582/ASTERIXDB-3582.002.plan
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/ASTERIXDB-3582/ASTERIXDB-3582.002.plan
index a384fc3..3a38cd0 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/ASTERIXDB-3582/ASTERIXDB-3582.002.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/ASTERIXDB-3582/ASTERIXDB-3582.002.plan
@@ -1,31 +1,31 @@
-distribute result [$$163] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
+distribute result [$$166] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$163] <- [{"$1": $$162}] project: [$$163] [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+    assign [$$166] <- [{"$1": $$165}] project: [$$166] [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
     -- ASSIGN  |PARTITIONED|
-      project ([$$162]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
+      project ([$$165]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
       -- STREAM_PROJECT  |PARTITIONED|
         subplan {
-                  aggregate [$$162] <- [listify($$161)] [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                  aggregate [$$165] <- [listify($$164)] [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                   -- AGGREGATE  |LOCAL|
-                    assign [$$161] <- [{"$2": switch-case(true, and($$140, 
$$146), "positive", and($$153, $$159), "negative", "neutral")}] [cardinality: 
0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                    assign [$$164] <- [{"$2": switch-case(true, and($$141, 
$$148), "positive", and($$155, $$162), "negative", "neutral")}] [cardinality: 
0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                     -- ASSIGN  |LOCAL|
-                      project ([$$140, $$146, $$153, $$159]) [cardinality: 
0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                      project ([$$141, $$148, $$155, $$162]) [cardinality: 
0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- STREAM_PROJECT  |LOCAL|
                         subplan {
-                                  aggregate [$$159] <- [empty-stream()] 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  aggregate [$$162] <- [empty-stream()] 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- AGGREGATE  |LOCAL|
-                                    select (not(if-missing-or-null($$158, 
false))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    select (not(if-missing-or-null(not($$161), 
false))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- STREAM_SELECT  |LOCAL|
-                                      project ([$$158]) [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      project ([$$161]) [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                       -- STREAM_PROJECT  |LOCAL|
                                         subplan {
-                                                  aggregate [$$158] <- 
[empty-stream()] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 
0.0]
+                                                  aggregate [$$161] <- 
[non-empty-stream()] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
                                                   -- AGGREGATE  |LOCAL|
-                                                    select 
(not(if-missing-or-null(neq($$w, $#6), false))) [cardinality: 0.0, doc-size: 
0.0, op-cost: 0.0, total-cost: 0.0]
+                                                    select (eq($$w, $#6)) 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                     -- STREAM_SELECT  |LOCAL|
-                                                      unnest $#6 <- 
scan-collection(split($$166, " ")) project: [$$w, $#6] [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                                      unnest $#6 <- 
scan-collection(split($$169, " ")) project: [$$w, $#6] [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                       -- UNNEST  |LOCAL|
                                                         nested tuple source 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                         -- NESTED_TUPLE_SOURCE 
 |LOCAL|
@@ -33,25 +33,25 @@
                                         -- SUBPLAN  |LOCAL|
                                           unnest $$w <- scan-collection(array: 
[ "bomb", "needs" ]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
                                           -- UNNEST  |LOCAL|
-                                            project ([$$166]) [cardinality: 
0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                            project ([$$169]) [cardinality: 
0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                             -- STREAM_PROJECT  |LOCAL|
                                               nested tuple source 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                               -- NESTED_TUPLE_SOURCE  |LOCAL|
                                } [cardinality: 0.0, doc-size: 0.0, op-cost: 
0.0, total-cost: 0.0]
                         -- SUBPLAN  |LOCAL|
                           subplan {
-                                    aggregate [$$153] <- [non-empty-stream()] 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    aggregate [$$155] <- [non-empty-stream()] 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- AGGREGATE  |LOCAL|
-                                      select ($$152) [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      select ($$154) [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                       -- STREAM_SELECT  |LOCAL|
-                                        project ([$$152]) [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        project ([$$154]) [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                         -- STREAM_PROJECT  |LOCAL|
                                           subplan {
-                                                    aggregate [$$152] <- 
[non-empty-stream()] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
+                                                    aggregate [$$154] <- 
[non-empty-stream()] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
                                                     -- AGGREGATE  |LOCAL|
                                                       select (eq($$w, $#5)) 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                       -- STREAM_SELECT  |LOCAL|
-                                                        unnest $#5 <- 
scan-collection(split($$166, " ")) project: [$$w, $#5] [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                                        unnest $#5 <- 
scan-collection(split($$169, " ")) project: [$$w, $#5] [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                         -- UNNEST  |LOCAL|
                                                           nested tuple source 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                           -- 
NESTED_TUPLE_SOURCE  |LOCAL|
@@ -59,25 +59,25 @@
                                           -- SUBPLAN  |LOCAL|
                                             unnest $$w <- 
scan-collection(array: [ "shrinks", "shrunk", "smaller" ]) [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                             -- UNNEST  |LOCAL|
-                                              project ([$$166]) [cardinality: 
0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                              project ([$$169]) [cardinality: 
0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                               -- STREAM_PROJECT  |LOCAL|
                                                 nested tuple source 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                 -- NESTED_TUPLE_SOURCE  |LOCAL|
                                  } [cardinality: 0.0, doc-size: 0.0, op-cost: 
0.0, total-cost: 0.0]
                           -- SUBPLAN  |LOCAL|
                             subplan {
-                                      aggregate [$$146] <- [empty-stream()] 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      aggregate [$$148] <- [empty-stream()] 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                       -- AGGREGATE  |LOCAL|
-                                        select (not(if-missing-or-null($$145, 
false))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        select 
(not(if-missing-or-null(not($$147), false))) [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
                                         -- STREAM_SELECT  |LOCAL|
-                                          project ([$$145]) [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                          project ([$$147]) [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                           -- STREAM_PROJECT  |LOCAL|
                                             subplan {
-                                                      aggregate [$$145] <- 
[empty-stream()] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 
0.0]
+                                                      aggregate [$$147] <- 
[non-empty-stream()] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
                                                       -- AGGREGATE  |LOCAL|
-                                                        select 
(not(if-missing-or-null(neq($$w, $#4), false))) [cardinality: 0.0, doc-size: 
0.0, op-cost: 0.0, total-cost: 0.0]
+                                                        select (eq($$w, $#4)) 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                         -- STREAM_SELECT  
|LOCAL|
-                                                          unnest $#4 <- 
scan-collection(split($$166, " ")) project: [$$w, $#4] [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                                          unnest $#4 <- 
scan-collection(split($$169, " ")) project: [$$w, $#4] [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                           -- UNNEST  |LOCAL|
                                                             nested tuple 
source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                             -- 
NESTED_TUPLE_SOURCE  |LOCAL|
@@ -85,25 +85,25 @@
                                             -- SUBPLAN  |LOCAL|
                                               unnest $$w <- 
scan-collection(array: [ "shrinks", "shrunk", "smaller" ]) [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                               -- UNNEST  |LOCAL|
-                                                project ([$$166]) 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                                project ([$$169]) 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                 -- STREAM_PROJECT  |LOCAL|
                                                   nested tuple source 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                   -- NESTED_TUPLE_SOURCE  
|LOCAL|
                                    } [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
                             -- SUBPLAN  |LOCAL|
                               subplan {
-                                        aggregate [$$140] <- 
[non-empty-stream()] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
+                                        aggregate [$$141] <- 
[non-empty-stream()] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
                                         -- AGGREGATE  |LOCAL|
-                                          select ($$139) [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                          select ($$140) [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                           -- STREAM_SELECT  |LOCAL|
-                                            project ([$$139]) [cardinality: 
0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                            project ([$$140]) [cardinality: 
0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                             -- STREAM_PROJECT  |LOCAL|
                                               subplan {
-                                                        aggregate [$$139] <- 
[non-empty-stream()] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
+                                                        aggregate [$$140] <- 
[non-empty-stream()] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
                                                         -- AGGREGATE  |LOCAL|
                                                           select (eq($$w, 
$#3)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                           -- STREAM_SELECT  
|LOCAL|
-                                                            unnest $#3 <- 
scan-collection(split($$166, " ")) project: [$$w, $#3] [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                                            unnest $#3 <- 
scan-collection(split($$169, " ")) project: [$$w, $#3] [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                             -- UNNEST  |LOCAL|
                                                               nested tuple 
source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                               -- 
NESTED_TUPLE_SOURCE  |LOCAL|
@@ -119,13 +119,13 @@
                                 -- NESTED_TUPLE_SOURCE  |LOCAL|
                } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 
0.0]
         -- SUBPLAN  |PARTITIONED|
-          assign [$$166] <- [$$r.getField("text")] project: [$$166] 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+          assign [$$169] <- [$$r.getField("text")] project: [$$169] 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
           -- ASSIGN  |PARTITIONED|
             project ([$$r]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
             -- STREAM_PROJECT  |PARTITIONED|
               exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                data-scan []<-[$$164, $$165, $$r] <- test.reviews project 
({text:any}) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                data-scan []<-[$$167, $$168, $$r] <- test.reviews project 
({text:any}) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- DATASOURCE_SCAN  |PARTITIONED|
                   exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.101.plan
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.101.plan
index 90fee83..757dcbf 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.101.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.101.plan
@@ -5,33 +5,18 @@
     project ([$$d]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
     -- STREAM_PROJECT  |PARTITIONED|
       exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-      -- SORT_MERGE_EXCHANGE [$$20(ASC) ]  |PARTITIONED|
-        order (ASC, $$20) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
-        -- STABLE_SORT [$$20(ASC)]  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$21(ASC) ]  |PARTITIONED|
+        order (ASC, $$21) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
+        -- STABLE_SORT [$$21(ASC)]  |PARTITIONED|
           exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 
0.0]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            select ($$18) project: [$$d, $$20] [cardinality: 0.0, doc-size: 
0.0, op-cost: 0.0, total-cost: 0.0]
+            select (not(eq($$d.getField("a"), "1"))) [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
             -- STREAM_SELECT  |PARTITIONED|
-              project ([$$20, $$d, $$18]) [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
-              -- STREAM_PROJECT  |PARTITIONED|
-                subplan {
-                          aggregate [$$18] <- [empty-stream()] [cardinality: 
0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                          -- AGGREGATE  |LOCAL|
-                            select (not(if-missing-or-null(neq($$21, "1"), 
false))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                            -- STREAM_SELECT  |LOCAL|
-                              project ([$$21]) [cardinality: 0.0, doc-size: 
0.0, op-cost: 0.0, total-cost: 0.0]
-                              -- STREAM_PROJECT  |LOCAL|
-                                nested tuple source [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                       } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
-                -- SUBPLAN  |PARTITIONED|
-                  assign [$$21] <- [$$d.getField("a")] [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                  -- ASSIGN  |PARTITIONED|
-                    exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      data-scan []<-[$$20, $$d] <- test.ColumnDataset 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                      -- DATASOURCE_SCAN  |PARTITIONED|
-                        exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 
0.0, total-cost: 0.0]
-                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          empty-tuple-source [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
-                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+              exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                data-scan []<-[$$21, $$d] <- test.ColumnDataset filter on: 
not(eq($$d.getField("a"), "1")) range-filter on: not(eq($$d.getField("a"), 
"1")) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                -- DATASOURCE_SCAN  |PARTITIONED|
+                  exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    empty-tuple-source [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
+                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.201.plan
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.201.plan
index 8ffcf0e..f3bfd03 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.201.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.201.plan
@@ -5,51 +5,20 @@
     project ([$$d]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
     -- STREAM_PROJECT  |PARTITIONED|
       exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-      -- SORT_MERGE_EXCHANGE [$$24(ASC) ]  |PARTITIONED|
-        select ($$18) project: [$$d, $$24] [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
-        -- STREAM_SELECT  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$21(ASC) ]  |PARTITIONED|
+        order (ASC, $$21) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
+        -- STABLE_SORT [$$21(ASC)]  |PARTITIONED|
           exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 
0.0]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            group by ([$$24 := $$20]) decor ([$$d]) {
-                      aggregate [$$18] <- [empty-stream()] [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                      -- AGGREGATE  |LOCAL|
-                        select (not(is-missing($$23))) [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                        -- STREAM_SELECT  |LOCAL|
-                          project ([$$23]) [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
-                          -- STREAM_PROJECT  |LOCAL|
-                            nested tuple source [cardinality: 0.0, doc-size: 
0.0, op-cost: 0.0, total-cost: 0.0]
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
-            -- PRE_CLUSTERED_GROUP_BY[$$20]  |PARTITIONED|
-              exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
-              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                order (ASC, $$20) [cardinality: 0.0, doc-size: 0.0, op-cost: 
0.0, total-cost: 0.0]
-                -- STABLE_SORT [$$20(ASC)]  |PARTITIONED|
-                  exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
-                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    project ([$$d, $$23, $$20]) [cardinality: 0.0, doc-size: 
0.0, op-cost: 0.0, total-cost: 0.0]
-                    -- STREAM_PROJECT  |PARTITIONED|
-                      exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
-                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        left outer join (not(if-missing-or-null(neq($$21, 
$#1), false))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                        -- NESTED_LOOP  |PARTITIONED|
-                          exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 
0.0, total-cost: 0.0]
-                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            assign [$$21] <- [$$d.getField("a")] [cardinality: 
0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                            -- ASSIGN  |PARTITIONED|
-                              exchange [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                data-scan []<-[$$20, $$d] <- 
test.ColumnDataset [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 
0.0]
-                                -- DATASOURCE_SCAN  |PARTITIONED|
-                                  exchange [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
-                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    empty-tuple-source [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                          exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 
0.0, total-cost: 0.0]
-                          -- BROADCAST_EXCHANGE  |PARTITIONED|
-                            assign [$$23] <- [true] [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                            -- ASSIGN  |UNPARTITIONED|
-                              unnest $#1 <- scan-collection(array: [ "1", "2", 
"3" ]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                              -- UNNEST  |UNPARTITIONED|
-                                empty-tuple-source [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+            select (not(or(eq($$18, "1"), eq($$18, "2"), eq($$18, "3")))) 
project: [$$d, $$21] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
+            -- STREAM_SELECT  |PARTITIONED|
+              assign [$$18] <- [$$d.getField("a")] [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+              -- ASSIGN  |PARTITIONED|
+                exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  data-scan []<-[$$21, $$d] <- test.ColumnDataset filter on: 
not(or(eq($$d.getField("a"), "1"), eq($$d.getField("a"), "2"), 
eq($$d.getField("a"), "3"))) range-filter on: not(or(eq($$d.getField("a"), 
"1"), eq($$d.getField("a"), "2"), eq($$d.getField("a"), "3"))) [cardinality: 
0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                  -- DATASOURCE_SCAN  |PARTITIONED|
+                    exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      empty-tuple-source [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
+                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/ASTERIXDB-3584_in_expr/ASTERIXDB-3584_in_expr.01.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/ASTERIXDB-3584_in_expr/ASTERIXDB-3584_in_expr.01.adm
index 09d5d7b..8dc279a 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/ASTERIXDB-3584_in_expr/ASTERIXDB-3584_in_expr.01.adm
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/ASTERIXDB-3584_in_expr/ASTERIXDB-3584_in_expr.01.adm
@@ -1,5 +1,5 @@
 [ { "$1": null } ]
-[ { "$2": false } ]
+[ { "$2": null } ]
 [ { "$3": false } ]
 [ { "$4": true } ]
 [ { "t": 2 } ]
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/OperatorExpressionVisitor.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/OperatorExpressionVisitor.java
index e28fdd5..e18cf1f 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/OperatorExpressionVisitor.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/OperatorExpressionVisitor.java
@@ -40,7 +40,6 @@
 import 
org.apache.asterix.lang.common.expression.QuantifiedExpression.Quantifier;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.literal.FalseLiteral;
-import org.apache.asterix.lang.common.literal.NullLiteral;
 import org.apache.asterix.lang.common.literal.StringLiteral;
 import org.apache.asterix.lang.common.literal.TrueLiteral;
 import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
@@ -107,28 +106,11 @@
                         return createOperatorExpression(OperatorType.EQ, 
target, processedExpr, operatorExpr.getHints(),
                                 operatorExpr.getSourceLocation());
                     }
-                    return createLikeExpression(operatorExpr);
                 }
-                if (patternExpr.getKind() == Expression.Kind.LITERAL_EXPRESSION
-                        && ((LiteralExpr) patternExpr).getValue().getValue() 
== NullLiteral.INSTANCE.getValue()) {
-                    return createLikeExpression(operatorExpr);
-                }
-                return operatorExpr;
+                return createLikeExpression(operatorExpr);
             case NOT_LIKE:
-                // Convert NOT_LIKE to NOT(LIKE operator) by first processing 
as LIKE, then wrapping with NOT
-                // Create a LIKE operator with the same operands
-                OperatorExpr likeOperatorExpr = new OperatorExpr();
-                likeOperatorExpr.setExprList(new 
ArrayList<>(operatorExpr.getExprList()));
-                likeOperatorExpr.addOperator(OperatorType.LIKE);
-                if (operatorExpr.hasHints()) {
-                    likeOperatorExpr.addHints(operatorExpr.getHints());
-                }
-                
likeOperatorExpr.setSourceLocation(operatorExpr.getSourceLocation());
-                // Process the LIKE operator through the LIKE case logic 
(handles prefix patterns, etc.)
-                Expression processedLikeExpr = 
processLikeOperator(likeOperatorExpr, OperatorType.LIKE);
-                // Wrap the processed result with NOT function call
                 CallExpr notLikeExpr = new CallExpr(new 
FunctionSignature(BuiltinFunctions.NOT),
-                        new 
ArrayList<>(Collections.singletonList(processedLikeExpr)));
+                        new 
ArrayList<>(Collections.singletonList(createLikeExpression(operatorExpr))));
                 
notLikeExpr.setSourceLocation(operatorExpr.getSourceLocation());
                 return notLikeExpr;
             default:
@@ -147,20 +129,17 @@
         comparison.setCurrentop(true);
         comparison.addHints(operatorExpr.getHints());
         comparison.setSourceLocation(operatorExpr.getSourceLocation());
+        comparison.addOperator(OperatorType.EQ);
+        QuantifiedExpression quantExpr = new 
QuantifiedExpression(Quantifier.SOME,
+                new ArrayList<>(Collections.singletonList(new 
QuantifiedPair(bindingVar, collectionExpr))), comparison);
+        quantExpr.setSourceLocation(operatorExpr.getSourceLocation());
         if (opType == OperatorType.IN) {
-            comparison.addOperator(OperatorType.EQ);
-            QuantifiedExpression quantExpr = new 
QuantifiedExpression(Quantifier.SOME,
-                    new ArrayList<>(Collections.singletonList(new 
QuantifiedPair(bindingVar, collectionExpr))),
-                    comparison);
-            quantExpr.setSourceLocation(operatorExpr.getSourceLocation());
             return quantExpr;
         } else {
-            comparison.addOperator(OperatorType.NEQ);
-            QuantifiedExpression quantExpr = new 
QuantifiedExpression(Quantifier.EVERY,
-                    new ArrayList<>(Collections.singletonList(new 
QuantifiedPair(bindingVar, collectionExpr))),
-                    comparison);
-            quantExpr.setSourceLocation(operatorExpr.getSourceLocation());
-            return quantExpr;
+            CallExpr notInExpr = new CallExpr(new 
FunctionSignature(BuiltinFunctions.NOT),
+                    new ArrayList<>(Collections.singletonList(quantExpr)));
+            notInExpr.setSourceLocation(operatorExpr.getSourceLocation());
+            return notInExpr;
         }
     }

@@ -272,7 +251,7 @@
         }
     }

-    protected Expression createOperatorExpression(OperatorType opType, 
Expression lhs, Expression rhs,
+    private Expression createOperatorExpression(OperatorType opType, 
Expression lhs, Expression rhs,
             List<IExpressionAnnotation> hints, SourceLocation sourceLoc) {
         OperatorExpr comparison = new OperatorExpr();
         comparison.addOperand(lhs);
@@ -302,7 +281,7 @@
         return andExpr;
     }

-    protected Expression convertLikeToRange(OperatorExpr operatorExpr, 
Expression target, String prefix)
+    private Expression convertLikeToRange(OperatorExpr operatorExpr, 
Expression target, String prefix)
             throws CompilationException {
         int lastCodePoint = prefix.codePointAt(prefix.length() - 1);
         String incrementedLastChar = new 
String(Character.toChars(lastCodePoint + 1));
@@ -312,7 +291,7 @@
         return createRangeExpression(target, OperatorType.GE, left, right, 
OperatorType.LT, operatorExpr);
     }

-    protected static CallExpr createLikeExpression(OperatorExpr operatorExpr) {
+    private static CallExpr createLikeExpression(OperatorExpr operatorExpr) {
         CallExpr likeExpr =
                 new CallExpr(new 
FunctionSignature(BuiltinFunctions.STRING_LIKE), operatorExpr.getExprList());
         likeExpr.addHints(operatorExpr.getHints());
@@ -320,7 +299,7 @@
         return likeExpr;
     }

-    protected static LikePattern processPattern(String pattern, StringBuilder 
likePatternStr) {
+    private static LikePattern processPattern(String pattern, StringBuilder 
likePatternStr) {
         // note: similar logic is applied in StringLikeDescriptor
         if (pattern.equals(String.valueOf(PERCENT))) {
             return null;

--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20847?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://asterix-gerrit.ics.uci.edu/settings?usp=email

Gerrit-MessageType: newchange
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Change-Id: I46cb64f4f998b9d2608612e1ad7f55f3ab5f0a2a
Gerrit-Change-Number: 20847
Gerrit-PatchSet: 1
Gerrit-Owner: Shahrzad Shirazi <[email protected]>

Reply via email to