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

vsarathy1 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 8cddc59fb9 [ASTERIX-3376][COMP] Fix composite key joins cardinality
8cddc59fb9 is described below

commit 8cddc59fb9029b68421b6bfce15c147981f8439b
Author: murali4104 <[email protected]>
AuthorDate: Tue Apr 23 13:20:21 2024 -0700

    [ASTERIX-3376][COMP] Fix composite key joins cardinality
    
    Change-Id: If19e9fad35c783d3692a3fadb26b8aec22164768
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18250
    Integration-Tests: Jenkins <[email protected]>
    Tested-by: Jenkins <[email protected]>
    Reviewed-by: Vijay Sarathy <[email protected]>
---
 .../asterix/optimizer/rules/cbo/JoinEnum.java      |  14 +++
 .../asterix/optimizer/rules/cbo/JoinNode.java      |   4 +-
 .../optimizerts/results_cbo/ch2/ch2_q10.plan       |  44 ++++----
 .../optimizerts/results_cbo/ch2/ch2_q21.plan       | 118 ++++++++++----------
 .../optimizerts/results_cbo/ch2/ch2_q5.plan        |  60 +++++-----
 .../optimizerts/results_cbo/ch2/ch2_q7.plan        | 124 +++++++++++----------
 .../optimizerts/results_cbo/ch2/ch2_q8.plan        |  62 +++++------
 .../optimizerts/results_cbo/ch2/ch2_q9.plan        |   4 +-
 .../hash-join-with-redundant-variable.3.plan       |  44 ++++----
 .../optimizerts/results_cbo/q09_group_by.plan      |  20 ++--
 .../results_cbo/tpcds/query-ASTERIXDB-1596.plan    |   4 +-
 .../results_cbo/tpcds/query-ASTERIXDB-1596_ps.plan |   8 +-
 ...ash-join-with-redundant-variable.12.query.sqlpp |   2 +-
 .../hash-join-with-redundant-variable.06.plan      |  20 ++--
 .../hash-join-with-redundant-variable.08.plan      |  14 +--
 .../hash-join-with-redundant-variable.12.plan      |  34 +++---
 16 files changed, 296 insertions(+), 280 deletions(-)

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
index 951648aa3b..7e4997d6af 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
@@ -514,12 +514,26 @@ public class JoinEnum {
         for (int i = 0; i < joinConditions.size() - 1; i++) {
             for (int j = i + 1; j < joinConditions.size(); j++) {
                 if (joinConditions.get(i).datasetBits == 
joinConditions.get(j).datasetBits) {
+                    joinConditions.get(i).selectivity = 1.0 / 
smallerDatasetSize(joinConditions.get(i).datasetBits);
+                    // 1/P will be the selectivity of the composite clause
                     joinConditions.get(j).partOfComposite = true;
+                    joinConditions.get(j).selectivity = 1.0;
                 }
             }
         }
     }
 
+    private double smallerDatasetSize(int datasetBits) {
+        double size = Cost.MAX_CARD;
+        for (JoinNode jn : this.jnArray)
+            if ((jn.datasetBits & datasetBits) > 0) {
+                if (jn.origCardinality < size) {
+                    size = jn.origCardinality;
+                }
+            }
+        return size;
+    }
+
     private boolean verticesMatch(JoinCondition jc1, JoinCondition jc2) {
         return jc1.leftSideBits == jc2.leftSideBits || jc1.leftSideBits == 
jc2.rightSideBits
                 || jc1.rightSideBits == jc2.leftSideBits || jc1.rightSideBits 
== jc2.rightSideBits;
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
index 37212bae7e..03894f2ca4 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
@@ -413,9 +413,7 @@ public class JoinNode {
 
         double productJoinSels = 1.0;
         for (int idx : this.applicableJoinConditions) {
-            if (!joinConditions.get(idx).partOfComposite) {
-                productJoinSels *= joinConditions.get(idx).selectivity;
-            }
+            productJoinSels *= joinConditions.get(idx).selectivity;
         }
         joinCard = productJoinCardinality * productJoinSels;
 
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q10.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q10.plan
index 5e1de06d4a..30c69fb835 100644
--- 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q10.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q10.plan
@@ -22,20 +22,20 @@
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             -- STREAM_PROJECT  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                -- HYBRID_HASH_JOIN [$$166, $$171, 
$$173][$$170, $$172, $$174]  |PARTITIONED|
+                                -- HYBRID_HASH_JOIN [$$176][$$177]  
|PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- STREAM_PROJECT  |PARTITIONED|
+                                      -- ASSIGN  |PARTITIONED|
+                                        -- STREAM_PROJECT  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- DATASOURCE_SCAN (test.nation)  
|PARTITIONED|
+                                              -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                                -- EMPTY_TUPLE_SOURCE  
|PARTITIONED|
+                                  -- BROADCAST_EXCHANGE  |PARTITIONED|
                                     -- STREAM_PROJECT  |PARTITIONED|
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- HYBRID_HASH_JOIN [$$176][$$177]  
|PARTITIONED|
-                                          -- HASH_PARTITION_EXCHANGE [$$176]  
|PARTITIONED|
-                                            -- STREAM_PROJECT  |PARTITIONED|
-                                              -- ASSIGN  |PARTITIONED|
-                                                -- STREAM_PROJECT  
|PARTITIONED|
-                                                  -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
-                                                    -- DATASOURCE_SCAN 
(test.nation)  |PARTITIONED|
-                                                      -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
-                                                        -- EMPTY_TUPLE_SOURCE  
|PARTITIONED|
-                                          -- HASH_PARTITION_EXCHANGE [$$177]  
|PARTITIONED|
+                                        -- HYBRID_HASH_JOIN [$$166, $$171, 
$$173][$$170, $$172, $$174]  |PARTITIONED|
+                                          -- HASH_PARTITION_EXCHANGE [$$166, 
$$171, $$173]  |PARTITIONED|
                                             -- STREAM_PROJECT  |PARTITIONED|
                                               -- ASSIGN  |PARTITIONED|
                                                 -- STREAM_PROJECT  
|PARTITIONED|
@@ -43,17 +43,17 @@
                                                     -- DATASOURCE_SCAN 
(test.customer)  |PARTITIONED|
                                                       -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                                         -- EMPTY_TUPLE_SOURCE  
|PARTITIONED|
-                                  -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                    -- STREAM_PROJECT  |PARTITIONED|
-                                      -- ASSIGN  |PARTITIONED|
-                                        -- STREAM_PROJECT  |PARTITIONED|
-                                          -- UNNEST  |PARTITIONED|
+                                          -- HASH_PARTITION_EXCHANGE [$$170, 
$$172, $$174]  |PARTITIONED|
                                             -- STREAM_PROJECT  |PARTITIONED|
-                                              -- STREAM_SELECT  |PARTITIONED|
+                                              -- ASSIGN  |PARTITIONED|
                                                 -- STREAM_PROJECT  
|PARTITIONED|
-                                                  -- ASSIGN  |PARTITIONED|
+                                                  -- UNNEST  |PARTITIONED|
                                                     -- STREAM_PROJECT  
|PARTITIONED|
-                                                      -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
-                                                        -- DATASOURCE_SCAN 
(test.orders)  |PARTITIONED|
-                                                          -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                      -- STREAM_SELECT  
|PARTITIONED|
+                                                        -- STREAM_PROJECT  
|PARTITIONED|
+                                                          -- ASSIGN  
|PARTITIONED|
+                                                            -- STREAM_PROJECT  
|PARTITIONED|
+                                                              -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- 
DATASOURCE_SCAN (test.orders)  |PARTITIONED|
+                                                                  -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                    -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q21.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q21.plan
index 78fb5a9dc4..ea3a322fcb 100644
--- 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q21.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q21.plan
@@ -37,37 +37,33 @@
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                           -- STREAM_PROJECT  |PARTITIONED|
                                             -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
-                                              -- NESTED_LOOP  |PARTITIONED|
+                                              -- HYBRID_HASH_JOIN 
[$$354][$$365]  |PARTITIONED|
                                                 -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                                  -- STREAM_PROJECT  
|PARTITIONED|
+                                                    -- STREAM_SELECT  
|PARTITIONED|
+                                                      -- ASSIGN  |PARTITIONED|
+                                                        -- STREAM_PROJECT  
|PARTITIONED|
+                                                          -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- DATASOURCE_SCAN 
(test.nation)  |PARTITIONED|
+                                                              -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                -- BROADCAST_EXCHANGE  
|PARTITIONED|
                                                   -- STREAM_PROJECT  
|PARTITIONED|
                                                     -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
-                                                      -- HYBRID_HASH_JOIN 
[$$351, $$350][$$352, $$362]  |PARTITIONED|
+                                                      -- HYBRID_HASH_JOIN 
[$$355][$$366]  |PARTITIONED|
                                                         -- ONE_TO_ONE_EXCHANGE 
 |PARTITIONED|
                                                           -- STREAM_PROJECT  
|PARTITIONED|
-                                                            -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                              -- 
HYBRID_HASH_JOIN [$$355][$$366]  |PARTITIONED|
+                                                            -- ASSIGN  
|PARTITIONED|
+                                                              -- 
STREAM_PROJECT  |PARTITIONED|
                                                                 -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                  -- 
DATASOURCE_SCAN (test.supplier)  |PARTITIONED|
                                                                     -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- 
HYBRID_HASH_JOIN [$$354][$$365]  |PARTITIONED|
-                                                                        -- 
HASH_PARTITION_EXCHANGE [$$354]  |PARTITIONED|
-                                                                          -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                            -- 
STREAM_SELECT  |PARTITIONED|
-                                                                              
-- ASSIGN  |PARTITIONED|
-                                                                               
 -- STREAM_PROJECT  |PARTITIONED|
-                                                                               
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                               
     -- DATASOURCE_SCAN (test.nation)  |PARTITIONED|
-                                                                               
       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                               
         -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                        -- 
HASH_PARTITION_EXCHANGE [$$365]  |PARTITIONED|
-                                                                          -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                            -- 
ASSIGN  |PARTITIONED|
-                                                                              
-- STREAM_PROJECT  |PARTITIONED|
-                                                                               
 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                               
   -- DATASOURCE_SCAN (test.supplier)  |PARTITIONED|
-                                                                               
     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                               
       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                -- 
BROADCAST_EXCHANGE  |PARTITIONED|
+                                                                      -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                        -- BROADCAST_EXCHANGE  
|PARTITIONED|
+                                                          -- STREAM_PROJECT  
|PARTITIONED|
+                                                            -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                              -- 
HYBRID_HASH_JOIN [$$351, $$350][$$352, $$362]  |PARTITIONED|
+                                                                -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                   -- ASSIGN  
|PARTITIONED|
                                                                     -- 
STREAM_PROJECT  |PARTITIONED|
                                                                       -- 
ASSIGN  |PARTITIONED|
@@ -76,41 +72,45 @@
                                                                             -- 
DATASOURCE_SCAN (test.stock)  |PARTITIONED|
                                                                               
-- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                
 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                        -- BROADCAST_EXCHANGE  
|PARTITIONED|
-                                                          -- STREAM_PROJECT  
|PARTITIONED|
-                                                            -- STREAM_SELECT  
|PARTITIONED|
-                                                              -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                -- ASSIGN  
|PARTITIONED|
+                                                                -- 
BROADCAST_EXCHANGE  |PARTITIONED|
                                                                   -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                    -- UNNEST  
|PARTITIONED|
-                                                                      -- 
STREAM_SELECT  |PARTITIONED|
-                                                                        -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                          -- 
ASSIGN  |PARTITIONED|
-                                                                            -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                              
-- REPLICATE  |PARTITIONED|
-                                                                               
 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                               
   -- STREAM_PROJECT  |PARTITIONED|
-                                                                               
     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                               
       -- DATASOURCE_SCAN (test.orders)  |PARTITIONED|
-                                                                               
         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                               
           -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                -- BROADCAST_EXCHANGE  
|PARTITIONED|
-                                                  -- ASSIGN  |PARTITIONED|
-                                                    -- STREAM_PROJECT  
|PARTITIONED|
-                                                      -- ASSIGN  |PARTITIONED|
-                                                        -- STREAM_PROJECT  
|PARTITIONED|
-                                                          -- UNNEST  
|PARTITIONED|
-                                                            -- STREAM_PROJECT  
|PARTITIONED|
-                                                              -- STREAM_SELECT 
 |PARTITIONED|
-                                                                -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                  -- ASSIGN  
|PARTITIONED|
-                                                                    -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                      -- 
ASSIGN  |PARTITIONED|
+                                                                    -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                      -- 
NESTED_LOOP  |PARTITIONED|
                                                                         -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                          -- 
REPLICATE  |PARTITIONED|
-                                                                            -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                          -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                            -- 
STREAM_SELECT  |PARTITIONED|
                                                                               
-- STREAM_PROJECT  |PARTITIONED|
-                                                                               
 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                               
   -- DATASOURCE_SCAN (test.orders)  |PARTITIONED|
-                                                                               
     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                               
       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                               
 -- ASSIGN  |PARTITIONED|
+                                                                               
   -- STREAM_PROJECT  |PARTITIONED|
+                                                                               
     -- UNNEST  |PARTITIONED|
+                                                                               
       -- STREAM_SELECT  |PARTITIONED|
+                                                                               
         -- STREAM_PROJECT  |PARTITIONED|
+                                                                               
           -- ASSIGN  |PARTITIONED|
+                                                                               
             -- STREAM_PROJECT  |PARTITIONED|
+                                                                               
               -- ASSIGN  |PARTITIONED|
+                                                                               
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
                   -- REPLICATE  |PARTITIONED|
+                                                                               
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
                       -- STREAM_PROJECT  |PARTITIONED|
+                                                                               
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
                           -- DATASOURCE_SCAN (test.orders)  |PARTITIONED|
+                                                                               
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                        -- 
BROADCAST_EXCHANGE  |PARTITIONED|
+                                                                          -- 
ASSIGN  |PARTITIONED|
+                                                                            -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                              
-- ASSIGN  |PARTITIONED|
+                                                                               
 -- STREAM_PROJECT  |PARTITIONED|
+                                                                               
   -- UNNEST  |PARTITIONED|
+                                                                               
     -- STREAM_PROJECT  |PARTITIONED|
+                                                                               
       -- STREAM_SELECT  |PARTITIONED|
+                                                                               
         -- STREAM_PROJECT  |PARTITIONED|
+                                                                               
           -- ASSIGN  |PARTITIONED|
+                                                                               
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
               -- REPLICATE  |PARTITIONED|
+                                                                               
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
                   -- STREAM_PROJECT  |PARTITIONED|
+                                                                               
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
                       -- DATASOURCE_SCAN (test.orders)  |PARTITIONED|
+                                                                               
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
                           -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q5.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q5.plan
index e58b399abc..0ce1d15d5f 100644
--- 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q5.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q5.plan
@@ -29,27 +29,35 @@
                                         -- STREAM_PROJECT  |PARTITIONED|
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                             -- HYBRID_HASH_JOIN [$$256][$$257] 
 |PARTITIONED|
-                                              -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                              -- HASH_PARTITION_EXCHANGE 
[$$256]  |PARTITIONED|
                                                 -- STREAM_PROJECT  
|PARTITIONED|
                                                   -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
-                                                    -- HYBRID_HASH_JOIN 
[$$258][$$274]  |PARTITIONED|
+                                                    -- HYBRID_HASH_JOIN 
[$$274][$$258]  |PARTITIONED|
                                                       -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                                        -- STREAM_PROJECT  
|PARTITIONED|
+                                                          -- ASSIGN  
|PARTITIONED|
+                                                            -- STREAM_PROJECT  
|PARTITIONED|
+                                                              -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- 
DATASOURCE_SCAN (test.nation)  |PARTITIONED|
+                                                                  -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                    -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                      -- BROADCAST_EXCHANGE  
|PARTITIONED|
                                                         -- STREAM_PROJECT  
|PARTITIONED|
                                                           -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            -- 
HYBRID_HASH_JOIN [$$260, $$254, $$263][$$276, $$277, $$278]  |PARTITIONED|
+                                                            -- 
HYBRID_HASH_JOIN [$$245, $$246][$$254, $$281]  |PARTITIONED|
                                                               -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                  -- ASSIGN  
|PARTITIONED|
+                                                                    -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                      -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                        -- 
DATASOURCE_SCAN (test.stock)  |PARTITIONED|
+                                                                          -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                            -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                              -- 
BROADCAST_EXCHANGE  |PARTITIONED|
                                                                 -- 
STREAM_PROJECT  |PARTITIONED|
                                                                   -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                    -- 
HYBRID_HASH_JOIN [$$245, $$246][$$254, $$281]  |PARTITIONED|
-                                                                      -- 
HASH_PARTITION_EXCHANGE [$$245, $$246]  |PARTITIONED|
-                                                                        -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                          -- 
ASSIGN  |PARTITIONED|
-                                                                            -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                              
-- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                               
 -- DATASOURCE_SCAN (test.stock)  |PARTITIONED|
-                                                                               
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                               
     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                      -- 
HASH_PARTITION_EXCHANGE [$$254, $$281]  |PARTITIONED|
+                                                                    -- 
HYBRID_HASH_JOIN [$$260, $$254, $$263][$$276, $$277, $$278]  |PARTITIONED|
+                                                                      -- 
HASH_PARTITION_EXCHANGE [$$260, $$254, $$263]  |PARTITIONED|
                                                                         -- 
STREAM_PROJECT  |PARTITIONED|
                                                                           -- 
ASSIGN  |PARTITIONED|
                                                                             -- 
STREAM_PROJECT  |PARTITIONED|
@@ -63,23 +71,15 @@
                                                                                
             -- DATASOURCE_SCAN (test.orders)  |PARTITIONED|
                                                                                
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                
                 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                              -- 
BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                  -- ASSIGN  
|PARTITIONED|
-                                                                    -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                      -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- 
DATASOURCE_SCAN (test.customer)  |PARTITIONED|
-                                                                          -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                            -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                      -- BROADCAST_EXCHANGE  
|PARTITIONED|
-                                                        -- STREAM_PROJECT  
|PARTITIONED|
-                                                          -- ASSIGN  
|PARTITIONED|
-                                                            -- STREAM_PROJECT  
|PARTITIONED|
-                                                              -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                -- 
DATASOURCE_SCAN (test.nation)  |PARTITIONED|
-                                                                  -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                    -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                              -- BROADCAST_EXCHANGE  
|PARTITIONED|
+                                                                      -- 
HASH_PARTITION_EXCHANGE [$$276, $$277, $$278]  |PARTITIONED|
+                                                                        -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                          -- 
ASSIGN  |PARTITIONED|
+                                                                            -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                              
-- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
 -- DATASOURCE_SCAN (test.customer)  |PARTITIONED|
+                                                                               
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                              -- HASH_PARTITION_EXCHANGE 
[$$257]  |PARTITIONED|
                                                 -- STREAM_PROJECT  
|PARTITIONED|
                                                   -- STREAM_SELECT  
|PARTITIONED|
                                                     -- ASSIGN  |PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
index cd2769723c..a6eab49312 100644
--- 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
@@ -18,85 +18,87 @@
                   -- STREAM_PROJECT  |PARTITIONED|
                     -- ASSIGN  |PARTITIONED|
                       -- STREAM_PROJECT  |PARTITIONED|
-                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          -- HYBRID_HASH_JOIN [$$303, $$326][$$277, $$300]  
|PARTITIONED|
+                        -- STREAM_SELECT  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- STREAM_PROJECT  |PARTITIONED|
-                                -- ASSIGN  |PARTITIONED|
+                              -- HYBRID_HASH_JOIN [$$288][$$304]  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   -- STREAM_PROJECT  |PARTITIONED|
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      -- HYBRID_HASH_JOIN [$$310, 
$$311][$$275, $$276]  |PARTITIONED|
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- HYBRID_HASH_JOIN [$$277][$$303]  
|PARTITIONED|
+                                        -- HASH_PARTITION_EXCHANGE [$$277]  
|PARTITIONED|
                                           -- STREAM_PROJECT  |PARTITIONED|
                                             -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
-                                              -- HYBRID_HASH_JOIN [$$305, 
$$306, $$307][$$291, $$293, $$295]  |PARTITIONED|
+                                              -- HYBRID_HASH_JOIN 
[$$300][$$326]  |PARTITIONED|
                                                 -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                                   -- STREAM_PROJECT  
|PARTITIONED|
-                                                    -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
-                                                      -- HYBRID_HASH_JOIN 
[$$304][$$288]  |PARTITIONED|
+                                                    -- ASSIGN  |PARTITIONED|
+                                                      -- STREAM_PROJECT  
|PARTITIONED|
                                                         -- ONE_TO_ONE_EXCHANGE 
 |PARTITIONED|
-                                                          -- STREAM_PROJECT  
|PARTITIONED|
+                                                          -- DATASOURCE_SCAN 
(test.supplier)  |PARTITIONED|
                                                             -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                              -- NESTED_LOOP  
|PARTITIONED|
-                                                                -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                    -- ASSIGN  
|PARTITIONED|
-                                                                      -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- 
REPLICATE  |PARTITIONED|
-                                                                          -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                            -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                              
-- ASSIGN  |PARTITIONED|
-                                                                               
 -- STREAM_PROJECT  |PARTITIONED|
-                                                                               
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                               
     -- DATASOURCE_SCAN (test.nation)  |PARTITIONED|
-                                                                               
       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                               
         -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                -- 
BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                  -- REPLICATE 
 |PARTITIONED|
-                                                                    -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                        -- 
ASSIGN  |PARTITIONED|
-                                                                          -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                            -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                              
-- DATASOURCE_SCAN (test.nation)  |PARTITIONED|
-                                                                               
 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                               
   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                        -- BROADCAST_EXCHANGE  
|PARTITIONED|
-                                                          -- ASSIGN  
|PARTITIONED|
-                                                            -- STREAM_PROJECT  
|PARTITIONED|
-                                                              -- ASSIGN  
|PARTITIONED|
-                                                                -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                  -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                    -- 
DATASOURCE_SCAN (test.customer)  |PARTITIONED|
-                                                                      -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                              -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                 -- BROADCAST_EXCHANGE  
|PARTITIONED|
                                                   -- STREAM_PROJECT  
|PARTITIONED|
-                                                    -- STREAM_SELECT  
|PARTITIONED|
+                                                    -- ASSIGN  |PARTITIONED|
                                                       -- STREAM_PROJECT  
|PARTITIONED|
-                                                        -- ASSIGN  
|PARTITIONED|
-                                                          -- STREAM_PROJECT  
|PARTITIONED|
-                                                            -- UNNEST  
|PARTITIONED|
+                                                        -- ONE_TO_ONE_EXCHANGE 
 |PARTITIONED|
+                                                          -- HYBRID_HASH_JOIN 
[$$275, $$276][$$310, $$311]  |PARTITIONED|
+                                                            -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                               -- 
STREAM_PROJECT  |PARTITIONED|
                                                                 -- ASSIGN  
|PARTITIONED|
                                                                   -- 
STREAM_PROJECT  |PARTITIONED|
                                                                     -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- 
DATASOURCE_SCAN (test.orders)  |PARTITIONED|
+                                                                      -- 
DATASOURCE_SCAN (test.stock)  |PARTITIONED|
                                                                         -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                           -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                        -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                          -- STREAM_PROJECT  |PARTITIONED|
-                                            -- ASSIGN  |PARTITIONED|
+                                                            -- 
BROADCAST_EXCHANGE  |PARTITIONED|
+                                                              -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                  -- 
HYBRID_HASH_JOIN [$$291, $$293, $$295][$$305, $$306, $$307]  |PARTITIONED|
+                                                                    -- 
HASH_PARTITION_EXCHANGE [$$291, $$293, $$295]  |PARTITIONED|
+                                                                      -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                        -- 
STREAM_SELECT  |PARTITIONED|
+                                                                          -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                            -- 
ASSIGN  |PARTITIONED|
+                                                                              
-- STREAM_PROJECT  |PARTITIONED|
+                                                                               
 -- UNNEST  |PARTITIONED|
+                                                                               
   -- STREAM_PROJECT  |PARTITIONED|
+                                                                               
     -- ASSIGN  |PARTITIONED|
+                                                                               
       -- STREAM_PROJECT  |PARTITIONED|
+                                                                               
         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
           -- DATASOURCE_SCAN (test.orders)  |PARTITIONED|
+                                                                               
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                    -- 
HASH_PARTITION_EXCHANGE [$$305, $$306, $$307]  |PARTITIONED|
+                                                                      -- 
ASSIGN  |PARTITIONED|
+                                                                        -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                          -- 
ASSIGN  |PARTITIONED|
+                                                                            -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                              
-- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
 -- DATASOURCE_SCAN (test.customer)  |PARTITIONED|
+                                                                               
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                        -- HASH_PARTITION_EXCHANGE [$$303]  
|PARTITIONED|
+                                          -- REPLICATE  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                               -- STREAM_PROJECT  |PARTITIONED|
-                                                -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
-                                                  -- DATASOURCE_SCAN 
(test.stock)  |PARTITIONED|
+                                                -- ASSIGN  |PARTITIONED|
+                                                  -- STREAM_PROJECT  
|PARTITIONED|
                                                     -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
-                                                      -- EMPTY_TUPLE_SOURCE  
|PARTITIONED|
-                            -- BROADCAST_EXCHANGE  |PARTITIONED|
-                              -- STREAM_PROJECT  |PARTITIONED|
-                                -- ASSIGN  |PARTITIONED|
+                                                      -- DATASOURCE_SCAN 
(test.nation)  |PARTITIONED|
+                                                        -- ONE_TO_ONE_EXCHANGE 
 |PARTITIONED|
+                                                          -- 
EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                -- BROADCAST_EXCHANGE  |PARTITIONED|
                                   -- STREAM_PROJECT  |PARTITIONED|
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      -- DATASOURCE_SCAN (test.supplier)  
|PARTITIONED|
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                    -- ASSIGN  |PARTITIONED|
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        -- REPLICATE  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- STREAM_PROJECT  |PARTITIONED|
+                                              -- ASSIGN  |PARTITIONED|
+                                                -- STREAM_PROJECT  
|PARTITIONED|
+                                                  -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                                    -- DATASOURCE_SCAN 
(test.nation)  |PARTITIONED|
+                                                      -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                                        -- EMPTY_TUPLE_SOURCE  
|PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q8.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q8.plan
index e3ebbc7eba..63d7b2dfd6 100644
--- 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q8.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q8.plan
@@ -34,27 +34,36 @@
                                                   -- STREAM_PROJECT  
|PARTITIONED|
                                                     -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                                       -- HYBRID_HASH_JOIN 
[$$311][$$331]  |PARTITIONED|
-                                                        -- ONE_TO_ONE_EXCHANGE 
 |PARTITIONED|
+                                                        -- 
HASH_PARTITION_EXCHANGE [$$311]  |PARTITIONED|
                                                           -- STREAM_PROJECT  
|PARTITIONED|
                                                             -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                              -- 
HYBRID_HASH_JOIN [$$313, $$315, $$317][$$333, $$334, $$332]  |PARTITIONED|
+                                                              -- 
HYBRID_HASH_JOIN [$$324][$$306]  |PARTITIONED|
                                                                 -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                  -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                    -- 
STREAM_SELECT  |PARTITIONED|
+                                                                      -- 
ASSIGN  |PARTITIONED|
+                                                                        -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                          -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                            -- 
DATASOURCE_SCAN (test.item)  |PARTITIONED|
+                                                                              
-- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                -- 
BROADCAST_EXCHANGE  |PARTITIONED|
                                                                   -- 
STREAM_PROJECT  |PARTITIONED|
                                                                     -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- 
HYBRID_HASH_JOIN [$$306][$$324]  |PARTITIONED|
+                                                                      -- 
HYBRID_HASH_JOIN [$$296, $$295][$$306, $$336]  |PARTITIONED|
                                                                         -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                          -- 
STREAM_PROJECT  |PARTITIONED|
+                                                                            -- 
ASSIGN  |PARTITIONED|
+                                                                              
-- STREAM_PROJECT  |PARTITIONED|
+                                                                               
 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
   -- DATASOURCE_SCAN (test.stock)  |PARTITIONED|
+                                                                               
     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                        -- 
BROADCAST_EXCHANGE  |PARTITIONED|
                                                                           -- 
STREAM_PROJECT  |PARTITIONED|
                                                                             -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                              
-- HYBRID_HASH_JOIN [$$296, $$295][$$306, $$336]  |PARTITIONED|
-                                                                               
 -- HASH_PARTITION_EXCHANGE [$$296, $$295]  |PARTITIONED|
-                                                                               
   -- STREAM_PROJECT  |PARTITIONED|
-                                                                               
     -- ASSIGN  |PARTITIONED|
-                                                                               
       -- STREAM_PROJECT  |PARTITIONED|
-                                                                               
         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                               
           -- DATASOURCE_SCAN (test.stock)  |PARTITIONED|
-                                                                               
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                               
               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                               
 -- HASH_PARTITION_EXCHANGE [$$306, $$336]  |PARTITIONED|
+                                                                              
-- HYBRID_HASH_JOIN [$$313, $$315, $$317][$$333, $$334, $$332]  |PARTITIONED|
+                                                                               
 -- HASH_PARTITION_EXCHANGE [$$313, $$315, $$317]  |PARTITIONED|
                                                                                
   -- STREAM_SELECT  |PARTITIONED|
                                                                                
     -- STREAM_PROJECT  |PARTITIONED|
                                                                                
       -- ASSIGN  |PARTITIONED|
@@ -68,24 +77,15 @@
                                                                                
                       -- DATASOURCE_SCAN (test.orders)  |PARTITIONED|
                                                                                
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                
                           -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                        -- 
BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                          -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                            -- 
STREAM_SELECT  |PARTITIONED|
-                                                                              
-- ASSIGN  |PARTITIONED|
-                                                                               
 -- STREAM_PROJECT  |PARTITIONED|
-                                                                               
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                               
     -- DATASOURCE_SCAN (test.item)  |PARTITIONED|
-                                                                               
       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                               
         -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                -- 
BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                  -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                    -- ASSIGN  
|PARTITIONED|
-                                                                      -- 
STREAM_PROJECT  |PARTITIONED|
-                                                                        -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                          -- 
DATASOURCE_SCAN (test.customer)  |PARTITIONED|
-                                                                            -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                              
-- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                        -- BROADCAST_EXCHANGE  
|PARTITIONED|
+                                                                               
 -- HASH_PARTITION_EXCHANGE [$$333, $$334, $$332]  |PARTITIONED|
+                                                                               
   -- STREAM_PROJECT  |PARTITIONED|
+                                                                               
     -- ASSIGN  |PARTITIONED|
+                                                                               
       -- STREAM_PROJECT  |PARTITIONED|
+                                                                               
         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
           -- DATASOURCE_SCAN (test.customer)  |PARTITIONED|
+                                                                               
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                               
               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                        -- 
HASH_PARTITION_EXCHANGE [$$331]  |PARTITIONED|
                                                           -- STREAM_PROJECT  
|PARTITIONED|
                                                             -- ASSIGN  
|PARTITIONED|
                                                               -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q9.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q9.plan
index 78777b0a08..0fb4fffd9c 100644
--- 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q9.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q9.plan
@@ -30,7 +30,7 @@
                                           -- STREAM_PROJECT  |PARTITIONED|
                                             -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                               -- HYBRID_HASH_JOIN 
[$$206][$$207]  |PARTITIONED|
-                                                -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
+                                                -- HASH_PARTITION_EXCHANGE 
[$$206]  |PARTITIONED|
                                                   -- STREAM_PROJECT  
|PARTITIONED|
                                                     -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                                       -- HYBRID_HASH_JOIN 
[$$200, $$199][$$206, $$217]  |PARTITIONED|
@@ -54,7 +54,7 @@
                                                                           -- 
DATASOURCE_SCAN (test.orders)  |PARTITIONED|
                                                                             -- 
ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                               
-- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                -- BROADCAST_EXCHANGE  
|PARTITIONED|
+                                                -- HASH_PARTITION_EXCHANGE 
[$$207]  |PARTITIONED|
                                                   -- STREAM_PROJECT  
|PARTITIONED|
                                                     -- STREAM_SELECT  
|PARTITIONED|
                                                       -- ASSIGN  |PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/hash-join-with-redundant-variable/hash-join-with-redundant-variable.3.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/hash-join-with-redundant-variable/hash-join-with-redundant-variable.3.plan
index 686ad890f1..6a2c57932e 100644
--- 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/hash-join-with-redundant-variable/hash-join-with-redundant-variable.3.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/hash-join-with-redundant-variable/hash-join-with-redundant-variable.3.plan
@@ -4,32 +4,34 @@
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
         -- AGGREGATE  |PARTITIONED|
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- HYBRID_HASH_JOIN [$$72][$$70]  |PARTITIONED|
-              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            -- HYBRID_HASH_JOIN [$$70][$$72]  |PARTITIONED|
+              -- HASH_PARTITION_EXCHANGE [$$70]  |PARTITIONED|
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    -- HYBRID_HASH_JOIN [$$71][$$72]  |PARTITIONED|
-                      -- HASH_PARTITION_EXCHANGE [$$71]  |PARTITIONED|
-                        -- STREAM_PROJECT  |PARTITIONED|
-                          -- ASSIGN  |PARTITIONED|
-                            -- STREAM_PROJECT  |PARTITIONED|
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                -- DATASOURCE_SCAN (test.region)  |PARTITIONED|
-                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                      -- HASH_PARTITION_EXCHANGE [$$72]  |PARTITIONED|
-                        -- STREAM_PROJECT  |PARTITIONED|
-                          -- ASSIGN  |PARTITIONED|
-                            -- STREAM_PROJECT  |PARTITIONED|
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                -- DATASOURCE_SCAN (test.nation)  |PARTITIONED|
-                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-              -- BROADCAST_EXCHANGE  |PARTITIONED|
+                    -- HYBRID_HASH_JOIN [$$71, $$79][$$70, $$78]  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- ASSIGN  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- DATASOURCE_SCAN (test.region)  
|PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- ASSIGN  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- DATASOURCE_SCAN (test.orders)  
|PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+              -- HASH_PARTITION_EXCHANGE [$$72]  |PARTITIONED|
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- ASSIGN  |PARTITIONED|
                     -- STREAM_PROJECT  |PARTITIONED|
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- DATASOURCE_SCAN (test.orders)  |PARTITIONED|
+                        -- DATASOURCE_SCAN (test.nation)  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/q09_group_by.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/q09_group_by.plan
index f258777743..cc7e6cc3f2 100644
--- 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/q09_group_by.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/q09_group_by.plan
@@ -12,19 +12,19 @@
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                         -- STREAM_PROJECT  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- HYBRID_HASH_JOIN [$$169, $$154][$$148, $$149]  
|PARTITIONED|
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            -- HYBRID_HASH_JOIN [$$169][$$147]  |PARTITIONED|
+                              -- HASH_PARTITION_EXCHANGE [$$169]  |PARTITIONED|
                                 -- STREAM_PROJECT  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    -- HYBRID_HASH_JOIN [$$147][$$169]  
|PARTITIONED|
-                                      -- HASH_PARTITION_EXCHANGE [$$147]  
|PARTITIONED|
+                                    -- HYBRID_HASH_JOIN [$$148, $$149][$$169, 
$$154]  |PARTITIONED|
+                                      -- HASH_PARTITION_EXCHANGE [$$148, 
$$149]  |PARTITIONED|
                                         -- STREAM_PROJECT  |PARTITIONED|
-                                          -- STREAM_SELECT  |PARTITIONED|
+                                          -- ASSIGN  |PARTITIONED|
                                             -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
-                                              -- DATASOURCE_SCAN 
(q09_group_by.Part)  |PARTITIONED|
+                                              -- DATASOURCE_SCAN 
(q09_group_by.Partsupp)  |PARTITIONED|
                                                 -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                                   -- EMPTY_TUPLE_SOURCE  
|PARTITIONED|
-                                      -- HASH_PARTITION_EXCHANGE [$$169]  
|PARTITIONED|
+                                      -- HASH_PARTITION_EXCHANGE [$$169, 
$$154]  |PARTITIONED|
                                         -- STREAM_PROJECT  |PARTITIONED|
                                           -- ASSIGN  |PARTITIONED|
                                             -- STREAM_PROJECT  |PARTITIONED|
@@ -32,11 +32,11 @@
                                                 -- DATASOURCE_SCAN 
(q09_group_by.LineItem)  |PARTITIONED|
                                                   -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                                     -- EMPTY_TUPLE_SOURCE  
|PARTITIONED|
-                              -- BROADCAST_EXCHANGE  |PARTITIONED|
+                              -- HASH_PARTITION_EXCHANGE [$$147]  |PARTITIONED|
                                 -- STREAM_PROJECT  |PARTITIONED|
-                                  -- ASSIGN  |PARTITIONED|
+                                  -- STREAM_SELECT  |PARTITIONED|
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      -- DATASOURCE_SCAN 
(q09_group_by.Partsupp)  |PARTITIONED|
+                                      -- DATASOURCE_SCAN (q09_group_by.Part)  
|PARTITIONED|
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                           -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                       -- BROADCAST_EXCHANGE  |PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpcds/query-ASTERIXDB-1596.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpcds/query-ASTERIXDB-1596.plan
index e92bd13dac..6b5568231d 100644
--- 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpcds/query-ASTERIXDB-1596.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpcds/query-ASTERIXDB-1596.plan
@@ -9,7 +9,7 @@
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                     -- HYBRID_HASH_JOIN [$$53][$$57]  |PARTITIONED|
-                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- HASH_PARTITION_EXCHANGE [$$53]  |PARTITIONED|
                         -- STREAM_PROJECT  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             -- HYBRID_HASH_JOIN [$$54, $$53][$$56, $$55]  
|PARTITIONED|
@@ -21,7 +21,7 @@
                                 -- DATASOURCE_SCAN (tpcds.catalog_returns)  
|PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                      -- BROADCAST_EXCHANGE  |PARTITIONED|
+                      -- HASH_PARTITION_EXCHANGE [$$57]  |PARTITIONED|
                         -- DATASOURCE_SCAN (tpcds.item)  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpcds/query-ASTERIXDB-1596_ps.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpcds/query-ASTERIXDB-1596_ps.plan
index 2b3a72887d..ea90224242 100644
--- 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpcds/query-ASTERIXDB-1596_ps.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpcds/query-ASTERIXDB-1596_ps.plan
@@ -13,7 +13,7 @@
                         -- STREAM_PROJECT  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             -- HYBRID_HASH_JOIN [$$53][$$57]  |PARTITIONED|
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- HASH_PARTITION_EXCHANGE [$$53]  |PARTITIONED|
                                 -- STREAM_PROJECT  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     -- HYBRID_HASH_JOIN [$$54, $$53][$$56, 
$$55]  |PARTITIONED|
@@ -25,7 +25,7 @@
                                         -- DATASOURCE_SCAN 
(tpcds.catalog_returns)  |PARTITIONED|
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                             -- EMPTY_TUPLE_SOURCE  
|PARTITIONED|
-                              -- BROADCAST_EXCHANGE  |PARTITIONED|
+                              -- HASH_PARTITION_EXCHANGE [$$57]  |PARTITIONED|
                                 -- DATASOURCE_SCAN (tpcds.item)  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
@@ -40,7 +40,7 @@
                                   -- STREAM_PROJECT  |PARTITIONED|
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       -- HYBRID_HASH_JOIN [$$53][$$57]  
|PARTITIONED|
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        -- HASH_PARTITION_EXCHANGE [$$53]  
|PARTITIONED|
                                           -- STREAM_PROJECT  |PARTITIONED|
                                             -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                               -- HYBRID_HASH_JOIN [$$54, 
$$53][$$56, $$55]  |PARTITIONED|
@@ -52,7 +52,7 @@
                                                   -- DATASOURCE_SCAN 
(tpcds.catalog_returns)  |PARTITIONED|
                                                     -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                                       -- EMPTY_TUPLE_SOURCE  
|PARTITIONED|
-                                        -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                        -- HASH_PARTITION_EXCHANGE [$$57]  
|PARTITIONED|
                                           -- DATASOURCE_SCAN (tpcds.item)  
|PARTITIONED|
                                             -- ONE_TO_ONE_EXCHANGE  
|PARTITIONED|
                                               -- EMPTY_TUPLE_SOURCE  
|PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.12.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.12.query.sqlpp
index 85077fe0c1..b4bc8aeaf6 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.12.query.sqlpp
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.12.query.sqlpp
@@ -24,7 +24,7 @@ SET `compiler.sort.parallel` "false";
 -- To ensure that Nation's key is hash partitioned
 SET `compiler.parallelism` "-1";
 -- To disable reordering joins
-SET `compiler.cbo` "true";
+SET `compiler.forcejoinorder` "true";
 
 EXPLAIN
 SELECT n.n_nationkey, s.s_nationkey, c.c_nationkey
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.06.plan
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.06.plan
index 88f0fd3618..70813fabab 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.06.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.06.plan
@@ -1,22 +1,22 @@
-distribute result [$$36] [cardinality: 6364.57, op-cost: 0.0, total-cost: 
102950.85]
+distribute result [$$36] [cardinality: 6016.3, op-cost: 0.0, total-cost: 
98061.73]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 6364.57, op-cost: 0.0, total-cost: 102950.85]
+  exchange [cardinality: 6016.3, op-cost: 0.0, total-cost: 98061.73]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$36]) [cardinality: 6364.57, op-cost: 0.0, total-cost: 
102950.85]
+    project ([$$36]) [cardinality: 6016.3, op-cost: 0.0, total-cost: 98061.73]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$36] <- [{"o_orderkey": $$43, "l_orderkey": $$44, "l_suppkey": 
$$42}] [cardinality: 6364.57, op-cost: 0.0, total-cost: 102950.85]
+      assign [$$36] <- [{"o_orderkey": $$43, "l_orderkey": $$44, "l_suppkey": 
$$42}] [cardinality: 6016.3, op-cost: 0.0, total-cost: 98061.73]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 6364.57, op-cost: 0.0, total-cost: 102950.85]
+        exchange [cardinality: 6016.3, op-cost: 0.0, total-cost: 98061.73]
         -- SORT_MERGE_EXCHANGE [$$43(ASC), $$44(ASC), $$42(ASC) ]  
|PARTITIONED|
-          order (ASC, $$43) (ASC, $$44) (ASC, $$42) [cardinality: 6364.57, 
op-cost: 80421.73, total-cost: 102950.85]
+          order (ASC, $$43) (ASC, $$44) (ASC, $$42) [cardinality: 6016.3, 
op-cost: 75532.61, total-cost: 98061.73]
           -- STABLE_SORT [$$43(ASC), $$44(ASC), $$42(ASC)]  |PARTITIONED|
-            exchange [cardinality: 6364.57, op-cost: 0.0, total-cost: 22529.12]
+            exchange [cardinality: 6016.3, op-cost: 0.0, total-cost: 22529.12]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$43, $$44, $$42]) [cardinality: 6364.57, op-cost: 
0.0, total-cost: 22529.12]
+              project ([$$43, $$44, $$42]) [cardinality: 6016.3, op-cost: 0.0, 
total-cost: 22529.12]
               -- STREAM_PROJECT  |PARTITIONED|
-                exchange [cardinality: 6364.57, op-cost: 0.0, total-cost: 
22529.12]
+                exchange [cardinality: 6016.3, op-cost: 0.0, total-cost: 
22529.12]
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  join (and(eq($$43, $$44), eq($$49, $$42))) [cardinality: 
6364.57, op-cost: 7512.06, total-cost: 22529.12]
+                  join (and(eq($$43, $$44), eq($$49, $$42))) [cardinality: 
6016.3, op-cost: 7512.06, total-cost: 22529.12]
                   -- HYBRID_HASH_JOIN [$$44, $$42][$$43, $$49]  |PARTITIONED|
                     exchange [cardinality: 6005.0, op-cost: 6010.65, 
total-cost: 12015.65]
                     -- HASH_PARTITION_EXCHANGE [$$44, $$42]  |PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.08.plan
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.08.plan
index e322d8f854..0668ea4441 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.08.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.08.plan
@@ -1,14 +1,14 @@
-distribute result [$$38] [cardinality: 1500.0, op-cost: 0.0, total-cost: 
81921.73]
+distribute result [$$38] [cardinality: 1500.0, op-cost: 0.0, total-cost: 
77032.61]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1500.0, op-cost: 0.0, total-cost: 81921.73]
+  exchange [cardinality: 1500.0, op-cost: 0.0, total-cost: 77032.61]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$38]) [cardinality: 1500.0, op-cost: 0.0, total-cost: 81921.73]
+    project ([$$38]) [cardinality: 1500.0, op-cost: 0.0, total-cost: 77032.61]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$38] <- [{"o_orderkey": $$43, "l_orderkey": $$44, "l_suppkey": 
$$47}] [cardinality: 1500.0, op-cost: 0.0, total-cost: 81921.73]
+      assign [$$38] <- [{"o_orderkey": $$43, "l_orderkey": $$44, "l_suppkey": 
$$47}] [cardinality: 1500.0, op-cost: 0.0, total-cost: 77032.61]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 1500.0, op-cost: 0.0, total-cost: 81921.73]
+        exchange [cardinality: 1500.0, op-cost: 0.0, total-cost: 77032.61]
         -- SORT_MERGE_EXCHANGE [$$43(ASC), $$44(ASC), $$47(ASC) ]  
|PARTITIONED|
-          order (ASC, $$43) (ASC, $$44) (ASC, $$47) [cardinality: 1500.0, 
op-cost: 80421.73, total-cost: 81921.73]
+          order (ASC, $$43) (ASC, $$44) (ASC, $$47) [cardinality: 1500.0, 
op-cost: 75532.61, total-cost: 77032.61]
           -- STABLE_SORT [$$43(ASC), $$44(ASC), $$47(ASC)]  |PARTITIONED|
             exchange [cardinality: 1500.0, op-cost: 0.0, total-cost: 1500.0]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -16,7 +16,7 @@ distribute result [$$38] [cardinality: 1500.0, op-cost: 0.0, 
total-cost: 81921.7
               -- STREAM_PROJECT  |PARTITIONED|
                 exchange [cardinality: 1500.0, op-cost: 0.0, total-cost: 
1500.0]
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  left outer join (and(eq($$43, $$44), eq($$56, $$47))) 
[cardinality: 6364.57, op-cost: 7512.06, total-cost: 22529.12]
+                  left outer join (and(eq($$43, $$44), eq($$56, $$47))) 
[cardinality: 6016.3, op-cost: 7512.06, total-cost: 22529.12]
                   -- HYBRID_HASH_JOIN [$$43, $$56][$$44, $$47]  |PARTITIONED|
                     exchange [cardinality: 1500.0, op-cost: 0.0, total-cost: 
1500.0]
                     -- HASH_PARTITION_EXCHANGE [$$43, $$56]  |PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.12.plan
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.12.plan
index 09279a957c..55c421421e 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.12.plan
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.12.plan
@@ -13,23 +13,7 @@ distribute result [$$51] [cardinality: 62.1, op-cost: 0.0, 
total-cost: 945.41]
             exchange [cardinality: 62.1, op-cost: 0.0, total-cost: 575.51]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               join (eq($$55, $$58)) [cardinality: 62.1, op-cost: 160.26, 
total-cost: 575.51]
-              -- HYBRID_HASH_JOIN [$$55][$$58]  |PARTITIONED|
-                exchange [cardinality: 150.0, op-cost: 150.0, total-cost: 
300.0]
-                -- HASH_PARTITION_EXCHANGE [$$55]  |PARTITIONED|
-                  project ([$$55]) [cardinality: 150.0, op-cost: 0.0, 
total-cost: 150.0]
-                  -- STREAM_PROJECT  |PARTITIONED|
-                    assign [$$55] <- [$$c.getField(3)] [cardinality: 150.0, 
op-cost: 0.0, total-cost: 150.0]
-                    -- ASSIGN  |PARTITIONED|
-                      project ([$$c]) [cardinality: 150.0, op-cost: 0.0, 
total-cost: 150.0]
-                      -- STREAM_PROJECT  |PARTITIONED|
-                        exchange [cardinality: 150.0, op-cost: 150.0, 
total-cost: 300.0]
-                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          data-scan []<-[$$60, $$c] <- tpch.Customer 
[cardinality: 150.0, op-cost: 150.0, total-cost: 150.0]
-                          -- DATASOURCE_SCAN  |PARTITIONED|
-                            exchange [cardinality: 0.0, op-cost: 0.0, 
total-cost: 0.0]
-                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              empty-tuple-source [cardinality: 0.0, op-cost: 
0.0, total-cost: 0.0]
-                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+              -- HYBRID_HASH_JOIN [$$58][$$55]  |PARTITIONED|
                 exchange [cardinality: 10.26, op-cost: 10.26, total-cost: 
115.26]
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                   join (eq($$56, $$58)) [cardinality: 10.26, op-cost: 35.0, 
total-cost: 105.0]
@@ -62,3 +46,19 @@ distribute result [$$51] [cardinality: 62.1, op-cost: 0.0, 
total-cost: 945.41]
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   empty-tuple-source [cardinality: 0.0, 
op-cost: 0.0, total-cost: 0.0]
                                   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                exchange [cardinality: 150.0, op-cost: 150.0, total-cost: 
300.0]
+                -- HASH_PARTITION_EXCHANGE [$$55]  |PARTITIONED|
+                  project ([$$55]) [cardinality: 150.0, op-cost: 0.0, 
total-cost: 150.0]
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    assign [$$55] <- [$$c.getField(3)] [cardinality: 150.0, 
op-cost: 0.0, total-cost: 150.0]
+                    -- ASSIGN  |PARTITIONED|
+                      project ([$$c]) [cardinality: 150.0, op-cost: 0.0, 
total-cost: 150.0]
+                      -- STREAM_PROJECT  |PARTITIONED|
+                        exchange [cardinality: 150.0, op-cost: 150.0, 
total-cost: 300.0]
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          data-scan []<-[$$60, $$c] <- tpch.Customer 
[cardinality: 150.0, op-cost: 150.0, total-cost: 150.0]
+                          -- DATASOURCE_SCAN  |PARTITIONED|
+                            exchange [cardinality: 0.0, op-cost: 0.0, 
total-cost: 0.0]
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              empty-tuple-source [cardinality: 0.0, op-cost: 
0.0, total-cost: 0.0]
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|

Reply via email to