[
https://issues.apache.org/jira/browse/ASTERIXDB-2675?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Wenhai Li updated ASTERIXDB-2675:
---------------------------------
Description:
When ftcontains is triggered on top of index-based selection results, the query
plan is wrong. It should be mentioned that the wrong plan arises from version
0.9.5.
Schema:
{code:java}
DROP dataverse test IF EXISTS;
CREATE dataverse test;
USE test;
DROP DATASET lefttable IF EXISTS;
DROP TYPE lefttype IF EXISTS;
CREATE TYPE lefttype AS OPEN {
leftid: string,
leftname: string
};
CREATE DATASET lefttable(lefttype) PRIMARY KEY leftid;
CREATE INDEX leftnameidx on lefttable(leftname) TYPE btree;
DROP DATASET righttable IF EXISTS;
DROP TYPE righttype IF EXISTS;
CREATE TYPE righttype AS OPEN {
rightid: string,
leftids: string?
};
CREATE DATASET righttable(righttype) PRIMARY KEY rightid;
CREATE INDEX rightleftidsidx on righttable(leftids) TYPE fulltext;{code}
Query:
{code:java}
USE test;
SELECT LT.leftid, RT.rightid
FROM lefttable LT, righttable RT
WHERE LT.leftname = 'aaa'
AND ftcontains(RT.leftids, `word-tokens`(LT.leftid), {"mode":"any"})
ORDER BY LT.leftid, RT.rightid;
{code}
Plan (which generated less results than what we expected):
{code:java}
distribute result [$$32]
– DISTRIBUTE_RESULT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$32])
– STREAM_PROJECT |PARTITIONED|
assign [$$32] <- [
{"leftid": $$36, "rightid": $$37}
]
– ASSIGN |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
order (ASC, $$36) (ASC, $$37)
– STABLE_SORT [$$36(ASC), $$37(ASC)] |PARTITIONED|
exchange
– RANGE_PARTITION_EXCHANGE [$$36(ASC), $$37(ASC)] |PARTITIONED|
forward: range-map = $$57
– FORWARD |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
replicate
– REPLICATE |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$36, $$37])
– STREAM_PROJECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
join (ftcontains($$39, word-tokens($$36), "mode", "any"))
– NESTED_LOOP |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
union ($$51, $$46, $$36)
– UNION_ALL |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$51])
– STREAM_PROJECT |PARTITIONED|
select (eq($$52.getField(1), "aaa"))
– STREAM_SELECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
unnest-map [$$51, $$52] <- index-search("lefttable", 0, "test", "lefttable",
FALSE, FALSE, 1, $$46, 1, $$46, TRUE, TRUE, TRUE)
– BTREE_SEARCH |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
split ($$47)
– SPLIT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$46, $$47])
– STREAM_PROJECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
unnest-map [$$45, $$46, $$47] <- index-search("leftnameidx", 0, "test",
"lefttable", FALSE, FALSE, 1, $$43, 1, $$44, TRUE, TRUE, TRUE)
– BTREE_SEARCH |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
assign [$$43, $$44] <- ["aaa", "aaa"]
– ASSIGN |PARTITIONED|
empty-tuple-source
– EMPTY_TUPLE_SOURCE |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$46])
– STREAM_PROJECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
split ($$47)
– SPLIT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$46, $$47])
– STREAM_PROJECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
unnest-map [$$45, $$46, $$47] <- index-search("leftnameidx", 0, "test",
"lefttable", FALSE, FALSE, 1, $$43, 1, $$44, TRUE, TRUE, TRUE)
– BTREE_SEARCH |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
assign [$$43, $$44] <- ["aaa", "aaa"]
– ASSIGN |PARTITIONED|
empty-tuple-source
– EMPTY_TUPLE_SOURCE |PARTITIONED|
exchange
– BROADCAST_EXCHANGE |PARTITIONED|
project ([$$37, $$39])
– STREAM_PROJECT |PARTITIONED|
assign [$$39] <- [$$RT.getField(1)]
– ASSIGN |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
data-scan []<[$$37, $$RT] < test.righttable
– DATASOURCE_SCAN |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
empty-tuple-source
– EMPTY_TUPLE_SOURCE |PARTITIONED|
exchange
– BROADCAST_EXCHANGE |PARTITIONED|
aggregate [$$57] <- [agg-range-map($$54, $$55, $$56)]
– AGGREGATE |UNPARTITIONED|
exchange
– RANDOM_MERGE_EXCHANGE |PARTITIONED|
aggregate [$$54, $$55, $$56] <- [agg-local-sampling($$36, $$37),
agg-null-writer($$36), agg-null-writer($$37)]
– AGGREGATE |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
replicate
– REPLICATE |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$36, $$37])
– STREAM_PROJECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
join (ftcontains($$39, word-tokens($$36), "mode", "any"))
– NESTED_LOOP |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
union ($$51, $$46, $$36)
– UNION_ALL |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$51])
– STREAM_PROJECT |PARTITIONED|
select (eq($$52.getField(1), "aaa"))
– STREAM_SELECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
unnest-map [$$51, $$52] <- index-search("lefttable", 0, "test", "lefttable",
FALSE, FALSE, 1, $$46, 1, $$46, TRUE, TRUE, TRUE)
– BTREE_SEARCH |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
split ($$47)
– SPLIT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$46, $$47])
– STREAM_PROJECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
unnest-map [$$45, $$46, $$47] <- index-search("leftnameidx", 0, "test",
"lefttable", FALSE, FALSE, 1, $$43, 1, $$44, TRUE, TRUE, TRUE)
– BTREE_SEARCH |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
assign [$$43, $$44] <- ["aaa", "aaa"]
– ASSIGN |PARTITIONED|
empty-tuple-source
– EMPTY_TUPLE_SOURCE |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$46])
– STREAM_PROJECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
split ($$47)
– SPLIT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$46, $$47])
– STREAM_PROJECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
unnest-map [$$45, $$46, $$47] <- index-search("leftnameidx", 0, "test",
"lefttable", FALSE, FALSE, 1, $$43, 1, $$44, TRUE, TRUE, TRUE)
– BTREE_SEARCH |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
assign [$$43, $$44] <- ["aaa", "aaa"]
– ASSIGN |PARTITIONED|
empty-tuple-source
– EMPTY_TUPLE_SOURCE |PARTITIONED|
exchange
– BROADCAST_EXCHANGE |PARTITIONED|
project ([$$37, $$39])
– STREAM_PROJECT |PARTITIONED|
assign [$$39] <- [$$RT.getField(1)]
– ASSIGN |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
data-scan []<[$$37, $$RT] < test.righttable
– DATASOURCE_SCAN |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
empty-tuple-source
– EMPTY_TUPLE_SOURCE |PARTITIONED|{code}
was:
When ftcontains is triggered on top of index-based selection results, the query
plan is wrong.
Schema:
{code:java}
DROP dataverse test IF EXISTS;
CREATE dataverse test;
USE test;
DROP DATASET lefttable IF EXISTS;
DROP TYPE lefttype IF EXISTS;
CREATE TYPE lefttype AS OPEN {
leftid: string,
leftname: string
};
CREATE DATASET lefttable(lefttype) PRIMARY KEY leftid;
CREATE INDEX leftnameidx on lefttable(leftname) TYPE btree;
DROP DATASET righttable IF EXISTS;
DROP TYPE righttype IF EXISTS;
CREATE TYPE righttype AS OPEN {
rightid: string,
leftids: string?
};
CREATE DATASET righttable(righttype) PRIMARY KEY rightid;
CREATE INDEX rightleftidsidx on righttable(leftids) TYPE fulltext;{code}
Query:
{code:java}
USE test;
SELECT LT.leftid, RT.rightid
FROM lefttable LT, righttable RT
WHERE LT.leftname = 'aaa'
AND ftcontains(RT.leftids, `word-tokens`(LT.leftid), {"mode":"any"})
ORDER BY LT.leftid, RT.rightid;
{code}
Plan (which generated less results than what we expected):
{code:java}
distribute result [$$32]
– DISTRIBUTE_RESULT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$32])
– STREAM_PROJECT |PARTITIONED|
assign [$$32] <- [
{"leftid": $$36, "rightid": $$37}
]
– ASSIGN |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
order (ASC, $$36) (ASC, $$37)
– STABLE_SORT [$$36(ASC), $$37(ASC)] |PARTITIONED|
exchange
– RANGE_PARTITION_EXCHANGE [$$36(ASC), $$37(ASC)] |PARTITIONED|
forward: range-map = $$57
– FORWARD |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
replicate
– REPLICATE |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$36, $$37])
– STREAM_PROJECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
join (ftcontains($$39, word-tokens($$36), "mode", "any"))
– NESTED_LOOP |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
union ($$51, $$46, $$36)
– UNION_ALL |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$51])
– STREAM_PROJECT |PARTITIONED|
select (eq($$52.getField(1), "aaa"))
– STREAM_SELECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
unnest-map [$$51, $$52] <- index-search("lefttable", 0, "test", "lefttable",
FALSE, FALSE, 1, $$46, 1, $$46, TRUE, TRUE, TRUE)
– BTREE_SEARCH |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
split ($$47)
– SPLIT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$46, $$47])
– STREAM_PROJECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
unnest-map [$$45, $$46, $$47] <- index-search("leftnameidx", 0, "test",
"lefttable", FALSE, FALSE, 1, $$43, 1, $$44, TRUE, TRUE, TRUE)
– BTREE_SEARCH |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
assign [$$43, $$44] <- ["aaa", "aaa"]
– ASSIGN |PARTITIONED|
empty-tuple-source
– EMPTY_TUPLE_SOURCE |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$46])
– STREAM_PROJECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
split ($$47)
– SPLIT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$46, $$47])
– STREAM_PROJECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
unnest-map [$$45, $$46, $$47] <- index-search("leftnameidx", 0, "test",
"lefttable", FALSE, FALSE, 1, $$43, 1, $$44, TRUE, TRUE, TRUE)
– BTREE_SEARCH |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
assign [$$43, $$44] <- ["aaa", "aaa"]
– ASSIGN |PARTITIONED|
empty-tuple-source
– EMPTY_TUPLE_SOURCE |PARTITIONED|
exchange
– BROADCAST_EXCHANGE |PARTITIONED|
project ([$$37, $$39])
– STREAM_PROJECT |PARTITIONED|
assign [$$39] <- [$$RT.getField(1)]
– ASSIGN |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
data-scan []<[$$37, $$RT] < test.righttable
– DATASOURCE_SCAN |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
empty-tuple-source
– EMPTY_TUPLE_SOURCE |PARTITIONED|
exchange
– BROADCAST_EXCHANGE |PARTITIONED|
aggregate [$$57] <- [agg-range-map($$54, $$55, $$56)]
– AGGREGATE |UNPARTITIONED|
exchange
– RANDOM_MERGE_EXCHANGE |PARTITIONED|
aggregate [$$54, $$55, $$56] <- [agg-local-sampling($$36, $$37),
agg-null-writer($$36), agg-null-writer($$37)]
– AGGREGATE |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
replicate
– REPLICATE |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$36, $$37])
– STREAM_PROJECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
join (ftcontains($$39, word-tokens($$36), "mode", "any"))
– NESTED_LOOP |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
union ($$51, $$46, $$36)
– UNION_ALL |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$51])
– STREAM_PROJECT |PARTITIONED|
select (eq($$52.getField(1), "aaa"))
– STREAM_SELECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
unnest-map [$$51, $$52] <- index-search("lefttable", 0, "test", "lefttable",
FALSE, FALSE, 1, $$46, 1, $$46, TRUE, TRUE, TRUE)
– BTREE_SEARCH |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
split ($$47)
– SPLIT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$46, $$47])
– STREAM_PROJECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
unnest-map [$$45, $$46, $$47] <- index-search("leftnameidx", 0, "test",
"lefttable", FALSE, FALSE, 1, $$43, 1, $$44, TRUE, TRUE, TRUE)
– BTREE_SEARCH |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
assign [$$43, $$44] <- ["aaa", "aaa"]
– ASSIGN |PARTITIONED|
empty-tuple-source
– EMPTY_TUPLE_SOURCE |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$46])
– STREAM_PROJECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
split ($$47)
– SPLIT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$46, $$47])
– STREAM_PROJECT |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
unnest-map [$$45, $$46, $$47] <- index-search("leftnameidx", 0, "test",
"lefttable", FALSE, FALSE, 1, $$43, 1, $$44, TRUE, TRUE, TRUE)
– BTREE_SEARCH |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
assign [$$43, $$44] <- ["aaa", "aaa"]
– ASSIGN |PARTITIONED|
empty-tuple-source
– EMPTY_TUPLE_SOURCE |PARTITIONED|
exchange
– BROADCAST_EXCHANGE |PARTITIONED|
project ([$$37, $$39])
– STREAM_PROJECT |PARTITIONED|
assign [$$39] <- [$$RT.getField(1)]
– ASSIGN |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
data-scan []<[$$37, $$RT] < test.righttable
– DATASOURCE_SCAN |PARTITIONED|
exchange
– ONE_TO_ONE_EXCHANGE |PARTITIONED|
empty-tuple-source
– EMPTY_TUPLE_SOURCE |PARTITIONED|{code}
> Fulltext search predicate -ftcontains- issues an wrong query plan based on
> another index-based selection.
> ----------------------------------------------------------------------------------------------------------
>
> Key: ASTERIXDB-2675
> URL: https://issues.apache.org/jira/browse/ASTERIXDB-2675
> Project: Apache AsterixDB
> Issue Type: Bug
> Components: *DB - AsterixDB
> Affects Versions: 0.9.5
> Reporter: Wenhai Li
> Priority: Major
>
> When ftcontains is triggered on top of index-based selection results, the
> query plan is wrong. It should be mentioned that the wrong plan arises from
> version 0.9.5.
>
> Schema:
> {code:java}
> DROP dataverse test IF EXISTS;
> CREATE dataverse test;
> USE test;
> DROP DATASET lefttable IF EXISTS;
> DROP TYPE lefttype IF EXISTS;
> CREATE TYPE lefttype AS OPEN {
> leftid: string,
> leftname: string
> };
> CREATE DATASET lefttable(lefttype) PRIMARY KEY leftid;
> CREATE INDEX leftnameidx on lefttable(leftname) TYPE btree;
> DROP DATASET righttable IF EXISTS;
> DROP TYPE righttype IF EXISTS;
> CREATE TYPE righttype AS OPEN {
> rightid: string,
> leftids: string?
> };
> CREATE DATASET righttable(righttype) PRIMARY KEY rightid;
> CREATE INDEX rightleftidsidx on righttable(leftids) TYPE fulltext;{code}
>
> Query:
> {code:java}
> USE test;
> SELECT LT.leftid, RT.rightid
> FROM lefttable LT, righttable RT
> WHERE LT.leftname = 'aaa'
> AND ftcontains(RT.leftids, `word-tokens`(LT.leftid), {"mode":"any"})
> ORDER BY LT.leftid, RT.rightid;
> {code}
>
> Plan (which generated less results than what we expected):
> {code:java}
> distribute result [$$32]
> – DISTRIBUTE_RESULT |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> project ([$$32])
> – STREAM_PROJECT |PARTITIONED|
> assign [$$32] <- [
> {"leftid": $$36, "rightid": $$37}
> ]
> – ASSIGN |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> order (ASC, $$36) (ASC, $$37)
> – STABLE_SORT [$$36(ASC), $$37(ASC)] |PARTITIONED|
> exchange
> – RANGE_PARTITION_EXCHANGE [$$36(ASC), $$37(ASC)] |PARTITIONED|
> forward: range-map = $$57
> – FORWARD |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> replicate
> – REPLICATE |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> project ([$$36, $$37])
> – STREAM_PROJECT |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> join (ftcontains($$39, word-tokens($$36), "mode", "any"))
> – NESTED_LOOP |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> union ($$51, $$46, $$36)
> – UNION_ALL |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> project ([$$51])
> – STREAM_PROJECT |PARTITIONED|
> select (eq($$52.getField(1), "aaa"))
> – STREAM_SELECT |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> unnest-map [$$51, $$52] <- index-search("lefttable", 0, "test", "lefttable",
> FALSE, FALSE, 1, $$46, 1, $$46, TRUE, TRUE, TRUE)
> – BTREE_SEARCH |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> split ($$47)
> – SPLIT |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> project ([$$46, $$47])
> – STREAM_PROJECT |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> unnest-map [$$45, $$46, $$47] <- index-search("leftnameidx", 0, "test",
> "lefttable", FALSE, FALSE, 1, $$43, 1, $$44, TRUE, TRUE, TRUE)
> – BTREE_SEARCH |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> assign [$$43, $$44] <- ["aaa", "aaa"]
> – ASSIGN |PARTITIONED|
> empty-tuple-source
> – EMPTY_TUPLE_SOURCE |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> project ([$$46])
> – STREAM_PROJECT |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> split ($$47)
> – SPLIT |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> project ([$$46, $$47])
> – STREAM_PROJECT |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> unnest-map [$$45, $$46, $$47] <- index-search("leftnameidx", 0, "test",
> "lefttable", FALSE, FALSE, 1, $$43, 1, $$44, TRUE, TRUE, TRUE)
> – BTREE_SEARCH |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> assign [$$43, $$44] <- ["aaa", "aaa"]
> – ASSIGN |PARTITIONED|
> empty-tuple-source
> – EMPTY_TUPLE_SOURCE |PARTITIONED|
> exchange
> – BROADCAST_EXCHANGE |PARTITIONED|
> project ([$$37, $$39])
> – STREAM_PROJECT |PARTITIONED|
> assign [$$39] <- [$$RT.getField(1)]
> – ASSIGN |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> data-scan []<[$$37, $$RT] < test.righttable
> – DATASOURCE_SCAN |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> empty-tuple-source
> – EMPTY_TUPLE_SOURCE |PARTITIONED|
> exchange
> – BROADCAST_EXCHANGE |PARTITIONED|
> aggregate [$$57] <- [agg-range-map($$54, $$55, $$56)]
> – AGGREGATE |UNPARTITIONED|
> exchange
> – RANDOM_MERGE_EXCHANGE |PARTITIONED|
> aggregate [$$54, $$55, $$56] <- [agg-local-sampling($$36, $$37),
> agg-null-writer($$36), agg-null-writer($$37)]
> – AGGREGATE |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> replicate
> – REPLICATE |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> project ([$$36, $$37])
> – STREAM_PROJECT |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> join (ftcontains($$39, word-tokens($$36), "mode", "any"))
> – NESTED_LOOP |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> union ($$51, $$46, $$36)
> – UNION_ALL |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> project ([$$51])
> – STREAM_PROJECT |PARTITIONED|
> select (eq($$52.getField(1), "aaa"))
> – STREAM_SELECT |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> unnest-map [$$51, $$52] <- index-search("lefttable", 0, "test", "lefttable",
> FALSE, FALSE, 1, $$46, 1, $$46, TRUE, TRUE, TRUE)
> – BTREE_SEARCH |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> split ($$47)
> – SPLIT |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> project ([$$46, $$47])
> – STREAM_PROJECT |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> unnest-map [$$45, $$46, $$47] <- index-search("leftnameidx", 0, "test",
> "lefttable", FALSE, FALSE, 1, $$43, 1, $$44, TRUE, TRUE, TRUE)
> – BTREE_SEARCH |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> assign [$$43, $$44] <- ["aaa", "aaa"]
> – ASSIGN |PARTITIONED|
> empty-tuple-source
> – EMPTY_TUPLE_SOURCE |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> project ([$$46])
> – STREAM_PROJECT |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> split ($$47)
> – SPLIT |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> project ([$$46, $$47])
> – STREAM_PROJECT |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> unnest-map [$$45, $$46, $$47] <- index-search("leftnameidx", 0, "test",
> "lefttable", FALSE, FALSE, 1, $$43, 1, $$44, TRUE, TRUE, TRUE)
> – BTREE_SEARCH |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> assign [$$43, $$44] <- ["aaa", "aaa"]
> – ASSIGN |PARTITIONED|
> empty-tuple-source
> – EMPTY_TUPLE_SOURCE |PARTITIONED|
> exchange
> – BROADCAST_EXCHANGE |PARTITIONED|
> project ([$$37, $$39])
> – STREAM_PROJECT |PARTITIONED|
> assign [$$39] <- [$$RT.getField(1)]
> – ASSIGN |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> data-scan []<[$$37, $$RT] < test.righttable
> – DATASOURCE_SCAN |PARTITIONED|
> exchange
> – ONE_TO_ONE_EXCHANGE |PARTITIONED|
> empty-tuple-source
> – EMPTY_TUPLE_SOURCE |PARTITIONED|{code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)