Luo Chen has posted comments on this change.

Change subject: [ASTERIXDB-2119][COMP] Fix variable ordering of projects
......................................................................


Patch Set 2:

The affected test cases are mainly caused by some unnecessary projections (with 
union) are removed because of this change. Take a look at the attached query 
plan of one affected test. Before this change (line 76), the projection first 
outputs variables in a random order, while another extra projection is added 
because union requires some ordering of variables. With this change, the first 
projection preserves the order, thus the extra projection is not needed.

Before the change:
distribute result [$$13]
-- DISTRIBUTE_RESULT  |PARTITIONED|
  exchange
  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
    project ([$$13])
    -- STREAM_PROJECT  |PARTITIONED|
      assign [$$13] <- [{"arec": $$a, "brec": $$b, "ed": get-item($$32, 1)}]
      -- ASSIGN  |PARTITIONED|
        project ([$$a, $$32, $$b])
        -- STREAM_PROJECT  |PARTITIONED|
          exchange
          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
            join (eq($$26, $$14))
            -- HYBRID_HASH_JOIN [$$26][$$14]  |PARTITIONED|
              exchange
              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                data-scan []<-[$$26, $$a] <- test.Customers
                -- DATASOURCE_SCAN  |PARTITIONED|
                  exchange
                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                    empty-tuple-source
                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
              exchange
              -- HASH_PARTITION_EXCHANGE [$$14]  |PARTITIONED|
                union ($$b, $$29, $$b) ($$14, $$14, $$14) ($$35, $$36, $$32)
                -- UNION_ALL  |PARTITIONED|
                  exchange
                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                    project ([$$b, $$14, $$35])
                    -- STREAM_PROJECT  |PARTITIONED|
                      select (and(get-item($$35, 0), lt($$14, $$15)))
                      -- STREAM_SELECT  |PARTITIONED|
                        project ([$$b, $$35, $$14, $$15])
                        -- STREAM_PROJECT  |PARTITIONED|
                          assign [$$35] <- [edit-distance-check($$17, 
$$b.getField(4), 2)]
                          -- ASSIGN  |PARTITIONED|
                            project ([$$17, $$b, $$14, $$15])
                            -- STREAM_PROJECT  |PARTITIONED|
                              exchange
                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                unnest-map [$$15, $$b] <- 
index-search("Customers", 0, "test", "Customers", TRUE, FALSE, 1, $$31, 1, 
$$31, TRUE, TRUE, TRUE)
                                -- BTREE_SEARCH  |PARTITIONED|
                                  exchange
                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                    order (ASC, $$31) 
                                    -- STABLE_SORT [$$31(ASC)]  |PARTITIONED|
                                      exchange
                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                        unnest-map [$$31] <- 
index-search("interests_index", 4, "test", "Customers", TRUE, TRUE, 2, 2, 21, 
FALSE, 1, $$17)
                                        -- 
LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
                                          exchange
                                          -- BROADCAST_EXCHANGE  |PARTITIONED|
                                            select 
(edit-distance-list-is-filterable($$17, 2))
                                            -- STREAM_SELECT  |PARTITIONED|
                                              exchange
                                              -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                                replicate
                                                -- REPLICATE  |PARTITIONED|
                                                  exchange
                                                  -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                                    project ([$$17, $$14])
                                                    -- STREAM_PROJECT  
|PARTITIONED|
                                                      assign [$$17] <- 
[$$27.getField(4)]
                                                      -- ASSIGN  |PARTITIONED|
                                                        exchange
                                                        -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                                          data-scan []<-[$$14, 
$$27] <- test.Customers
                                                          -- DATASOURCE_SCAN  
|PARTITIONED|
                                                            exchange
                                                            -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                              empty-tuple-source
                                                              -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
                  exchange
                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                    project ([$$29, $$14, $$36])
                    -- STREAM_PROJECT  |PARTITIONED|
                      select (get-item($$36, 0))
                      -- STREAM_SELECT  |PARTITIONED|
                        project ([$$36, $$29, $$14])
                        -- STREAM_PROJECT  |PARTITIONED|
                          assign [$$36] <- [edit-distance-check($$17, 
$$29.getField(4), 2)]
                          -- ASSIGN  |PARTITIONED|
                            project ([$$17, $$29, $$14])
                            -- STREAM_PROJECT  |PARTITIONED|
                              exchange
                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                join (lt($$14, $$30))
                                -- NESTED_LOOP  |PARTITIONED|
                                  exchange
                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                    data-scan []<-[$$30, $$29] <- test.Customers
                                    -- DATASOURCE_SCAN  |PARTITIONED|
                                      exchange
                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                        empty-tuple-source
                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                  exchange
                                  -- BROADCAST_EXCHANGE  |PARTITIONED|
                                    select 
(not(edit-distance-list-is-filterable($$17, 2)))
                                    -- STREAM_SELECT  |PARTITIONED|
                                      exchange
                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                        replicate
                                        -- REPLICATE  |PARTITIONED|
                                          exchange
                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                            project ([$$17, $$14])
                                            -- STREAM_PROJECT  |PARTITIONED|
                                              assign [$$17] <- 
[$$27.getField(4)]
                                              -- ASSIGN  |PARTITIONED|
                                                exchange
                                                -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                                  data-scan []<-[$$14, $$27] <- 
test.Customers
                                                  -- DATASOURCE_SCAN  
|PARTITIONED|
                                                    exchange
                                                    -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                                      empty-tuple-source
                                                      -- EMPTY_TUPLE_SOURCE  
|PARTITIONED|

After the change:
distribute result [$$13]
-- DISTRIBUTE_RESULT  |PARTITIONED|
  exchange
  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
    project ([$$13])
    -- STREAM_PROJECT  |PARTITIONED|
      assign [$$13] <- [{"arec": $$a, "brec": $$b, "ed": get-item($$32, 1)}]
      -- ASSIGN  |PARTITIONED|
        project ([$$a, $$b, $$32])
        -- STREAM_PROJECT  |PARTITIONED|
          exchange
          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
            join (eq($$26, $$14))
            -- HYBRID_HASH_JOIN [$$26][$$14]  |PARTITIONED|
              exchange
              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                data-scan []<-[$$26, $$a] <- test.Customers
                -- DATASOURCE_SCAN  |PARTITIONED|
                  exchange
                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                    empty-tuple-source
                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
              exchange
              -- HASH_PARTITION_EXCHANGE [$$14]  |PARTITIONED|
                union ($$b, $$29, $$b) ($$14, $$14, $$14) ($$35, $$36, $$32)
                -- UNION_ALL  |PARTITIONED|
                  exchange
                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                    project ([$$b, $$14, $$35])
                    -- STREAM_PROJECT  |PARTITIONED|
                      select (and(get-item($$35, 0), lt($$14, $$15)))
                      -- STREAM_SELECT  |PARTITIONED|
                        project ([$$14, $$15, $$b, $$35])
                        -- STREAM_PROJECT  |PARTITIONED|
                          assign [$$35] <- [edit-distance-check($$17, 
$$b.getField(4), 2)]
                          -- ASSIGN  |PARTITIONED|
                            project ([$$14, $$17, $$15, $$b])
                            -- STREAM_PROJECT  |PARTITIONED|
                              exchange
                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                unnest-map [$$15, $$b] <- 
index-search("Customers", 0, "test", "Customers", TRUE, FALSE, 1, $$31, 1, 
$$31, TRUE, TRUE, TRUE)
                                -- BTREE_SEARCH  |PARTITIONED|
                                  exchange
                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                    order (ASC, $$31) 
                                    -- STABLE_SORT [$$31(ASC)]  |PARTITIONED|
                                      exchange
                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                        unnest-map [$$31] <- 
index-search("interests_index", 4, "test", "Customers", TRUE, TRUE, 2, 2, 21, 
FALSE, 1, $$17)
                                        -- 
LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
                                          exchange
                                          -- BROADCAST_EXCHANGE  |PARTITIONED|
                                            select 
(edit-distance-list-is-filterable($$17, 2))
                                            -- STREAM_SELECT  |PARTITIONED|
                                              exchange
                                              -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                                replicate
                                                -- REPLICATE  |PARTITIONED|
                                                  exchange
                                                  -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                                    project ([$$14, $$17])
                                                    -- STREAM_PROJECT  
|PARTITIONED|
                                                      assign [$$17] <- 
[$$27.getField(4)]
                                                      -- ASSIGN  |PARTITIONED|
                                                        exchange
                                                        -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                                          data-scan []<-[$$14, 
$$27] <- test.Customers
                                                          -- DATASOURCE_SCAN  
|PARTITIONED|
                                                            exchange
                                                            -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                              empty-tuple-source
                                                              -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
                  exchange
                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                    select (get-item($$36, 0))
                    -- STREAM_SELECT  |PARTITIONED|
                      project ([$$29, $$14, $$36])
                      -- STREAM_PROJECT  |PARTITIONED|
                        assign [$$36] <- [edit-distance-check($$17, 
$$29.getField(4), 2)]
                        -- ASSIGN  |PARTITIONED|
                          project ([$$29, $$14, $$17])
                          -- STREAM_PROJECT  |PARTITIONED|
                            exchange
                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                              join (lt($$14, $$30))
                              -- NESTED_LOOP  |PARTITIONED|
                                exchange
                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                  data-scan []<-[$$30, $$29] <- test.Customers
                                  -- DATASOURCE_SCAN  |PARTITIONED|
                                    exchange
                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                      empty-tuple-source
                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                exchange
                                -- BROADCAST_EXCHANGE  |PARTITIONED|
                                  select 
(not(edit-distance-list-is-filterable($$17, 2)))
                                  -- STREAM_SELECT  |PARTITIONED|
                                    exchange
                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                      replicate
                                      -- REPLICATE  |PARTITIONED|
                                        exchange
                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                          project ([$$14, $$17])
                                          -- STREAM_PROJECT  |PARTITIONED|
                                            assign [$$17] <- [$$27.getField(4)]
                                            -- ASSIGN  |PARTITIONED|
                                              exchange
                                              -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                                data-scan []<-[$$14, $$27] <- 
test.Customers
                                                -- DATASOURCE_SCAN  
|PARTITIONED|
                                                  exchange
                                                  -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                                    empty-tuple-source
                                                    -- EMPTY_TUPLE_SOURCE  
|PARTITIONED|

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2043
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: Id96a5fe048dd11b7f2e97f4d4a802736ba5ba003
Gerrit-PatchSet: 2
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Luo Chen <[email protected]>
Gerrit-Reviewer: Jenkins <[email protected]>
Gerrit-Reviewer: Luo Chen <[email protected]>
Gerrit-Reviewer: Till Westmann <[email protected]>
Gerrit-HasComments: No

Reply via email to