>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]>