[ASTERIXDB-3209][COMP] CBO Not Picking Up Index (for Equality Pred)

Change-Id: I818171a2f381c941fb336f5c5c9cb2a03d2af70c
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17800
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Vijay Sarathy <vijay.sarathy@couchbase.com>
Reviewed-by: Ian Maxon <imaxon@uci.edu>
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/cost/Cost.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/cost/Cost.java
index 45e6691..145bec8 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/cost/Cost.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/cost/Cost.java
@@ -22,6 +22,9 @@
 public class Cost implements ICost {
 
     public static final double MAX_CARD = 1.0e200;
+
+    // Minimum cardinality for operators is 2.1 to prevent bad plans due to cardinality under estimation errors.
+    public static final double MIN_CARD = 2.1;
     private static final int COST_EQ = 0;
 
     private final double cost;
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/cost/CostMethods.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/cost/CostMethods.java
index 887cc94..c6f8d0a 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/cost/CostMethods.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/cost/CostMethods.java
@@ -31,6 +31,7 @@
     protected long blockSize;
     protected long DOP;
     protected double maxMemorySize;
+    protected static double selectivityForSecondaryIndexSelection = 0.1;
 
     public CostMethods(IOptimizationContext context) {
         optCtx = context;
@@ -58,65 +59,75 @@
         return physOptConfig.getMaxFramesForJoin() * physOptConfig.getFrameSize();
     }
 
-    // These cost methods are very simple and rudimentary for now. These can be improved by asterixdb developers as needed.
+    // These cost methods are very simple and rudimentary for now.
+    // They can be improved by asterixdb developers as needed.
     public Cost costFullScan(JoinNode jn) {
-        return new Cost(jn.computeJoinCardinality());
+        return new Cost(jn.getOrigCardinality());
     }
 
     public Cost costIndexScan(JoinNode jn, double indexSel) {
-        return new Cost(jn.computeJoinCardinality());
+        return new Cost(indexSel * jn.getOrigCardinality());
     }
 
     public Cost costIndexDataScan(JoinNode jn, double indexSel) {
-        return new Cost(jn.computeJoinCardinality());
+        if (indexSel < selectivityForSecondaryIndexSelection) {
+            return new Cost(indexSel * jn.getOrigCardinality());
+        }
+
+        // If index selectivity is not very selective, make index scan more expensive than full scan.
+        return new Cost(jn.getOrigCardinality());
     }
 
     public Cost costHashJoin(JoinNode jn) {
         JoinNode leftJn = jn.getLeftJn();
         JoinNode rightJn = jn.getRightJn();
-        return new Cost(leftJn.computeJoinCardinality() + rightJn.computeJoinCardinality());
+        return new Cost(leftJn.getCardinality() + rightJn.getCardinality());
     }
 
     public Cost computeHJProbeExchangeCost(JoinNode jn) {
         JoinNode leftJn = jn.getLeftJn();
-        return new Cost(leftJn.computeJoinCardinality());
+        return new Cost(leftJn.getCardinality());
     }
 
     public Cost computeHJBuildExchangeCost(JoinNode jn) {
         JoinNode rightJn = jn.getRightJn();
-        return new Cost(rightJn.computeJoinCardinality());
+        return new Cost(rightJn.getCardinality());
     }
 
     public Cost costBroadcastHashJoin(JoinNode jn) {
         JoinNode leftJn = jn.getLeftJn();
         JoinNode rightJn = jn.getRightJn();
-        return new Cost(leftJn.computeJoinCardinality() + DOP * rightJn.computeJoinCardinality());
+        return new Cost(leftJn.getCardinality() + DOP * rightJn.getCardinality());
     }
 
     public Cost computeBHJBuildExchangeCost(JoinNode jn) {
         JoinNode rightJn = jn.getRightJn();
-        return new Cost(DOP * rightJn.computeJoinCardinality());
+        return new Cost(DOP * rightJn.getCardinality());
     }
 
     public Cost costIndexNLJoin(JoinNode jn) {
         JoinNode leftJn = jn.getLeftJn();
         JoinNode rightJn = jn.getRightJn();
-        return new Cost(leftJn.computeJoinCardinality());
+        double origRightCard = rightJn.getOrigCardinality();
+        double innerCard = rightJn.getCardinality();
+        double joinCard = jn.getCardinality();
+
+        return new Cost(4 * leftJn.getCardinality() + joinCard * origRightCard / innerCard);
     }
 
     public Cost computeNLJOuterExchangeCost(JoinNode jn) {
         JoinNode leftJn = jn.getLeftJn();
-        return new Cost(DOP * leftJn.computeJoinCardinality());
+        return new Cost(DOP * leftJn.getCardinality());
     }
 
     public Cost costCartesianProductJoin(JoinNode jn) {
         JoinNode leftJn = jn.getLeftJn();
         JoinNode rightJn = jn.getRightJn();
-        return new Cost(leftJn.computeJoinCardinality() * rightJn.computeJoinCardinality());
+        return new Cost(leftJn.getCardinality() * rightJn.getCardinality());
     }
 
     public Cost computeCPRightExchangeCost(JoinNode jn) {
         JoinNode rightJn = jn.getRightJn();
-        return new Cost(DOP * rightJn.computeJoinCardinality());
+        return new Cost(DOP * rightJn.getCardinality());
     }
 }
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 ee9ec4f..752064a 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
@@ -680,10 +680,7 @@
                     jn.aliases.addAll(jnJ.aliases);
                     Collections.sort(jn.aliases);
                     jn.size = jnI.size + jnJ.size;
-                    jn.cardinality = jn.computeJoinCardinality();
-                    if (jn.cardinality < 2.1) {
-                        jn.cardinality = 2.1; // for keeping CP and HJ cost formulas happy.
-                    }
+                    jn.setCardinality(jn.computeJoinCardinality());
                 } else {
                     addPlansToThisJn = jnNewBits.jnIndex;
                 }
@@ -769,15 +766,14 @@
                     jn.setAvgDocSize(idxDetails.getSourceAvgItemSize());
                 }
                 // multiply by the respective predicate selectivities
-                jn.cardinality = jn.origCardinality * stats.getSelectivity(leafInput, false);
-                if (jn.cardinality < 2.1) {
-                    jn.cardinality = 2.1; // for keeping CP and HJ cost formulas happy.
-                }
+                jn.setCardinality(jn.origCardinality * stats.getSelectivity(leafInput, false));
             } else {
                 // could be unnest or assign
                 jn.datasetNames = new ArrayList<>(Collections.singleton("unnestOrAssign"));
                 jn.aliases = new ArrayList<>(Collections.singleton("unnestOrAssign"));
-                jn.origCardinality = jn.cardinality = findInListCard(leafInput);
+                double card = findInListCard(leafInput);
+                jn.setOrigCardinality(card);
+                jn.setCardinality(card);
                 // just a guess
                 jn.size = 10;
             }
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 8afc26b..89791ef 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
@@ -123,7 +123,8 @@
     }
 
     protected void setCardinality(double card) {
-        cardinality = card;
+        // Minimum cardinality for operators is MIN_CARD to prevent bad plans due to cardinality under estimation errors.
+        cardinality = Math.max(card, Cost.MIN_CARD);
     }
 
     public double getOrigCardinality() {
@@ -131,7 +132,8 @@
     }
 
     protected void setOrigCardinality(double card) {
-        origCardinality = card;
+        // Minimum cardinality for operators is MIN_CARD to prevent bad plans due to cardinality under estimation errors.
+        origCardinality = Math.max(card, Cost.MIN_CARD);
     }
 
     protected void setAvgDocSize(double avgDocSize) {
@@ -302,6 +304,7 @@
         if (this.applicableJoinConditions.size() >= 3) {
             redundantSel = removeRedundantPred(this.applicableJoinConditions);
         }
+
         // By dividing by redundantSel, we are undoing the earlier multiplication of all the selectivities.
         return joinCard / redundantSel;
     }
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/hash-join-with-redundant-variable/hash-join-with-redundant-variable.1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/hash-join-with-redundant-variable/hash-join-with-redundant-variable.1.plan
index d44143c..3a7bf12 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/hash-join-with-redundant-variable/hash-join-with-redundant-variable.1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/hash-join-with-redundant-variable/hash-join-with-redundant-variable.1.plan
@@ -5,7 +5,7 @@
         -- AGGREGATE  |PARTITIONED|
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
             -- HYBRID_HASH_JOIN [$$137][$$136]  |PARTITIONED|
-              -- HASH_PARTITION_EXCHANGE [$$137]  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- STREAM_SELECT  |PARTITIONED|
                     -- ASSIGN  |PARTITIONED|
@@ -14,11 +14,11 @@
                           -- DATASOURCE_SCAN (test.region)  |PARTITIONED|
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-              -- HASH_PARTITION_EXCHANGE [$$136]  |PARTITIONED|
+              -- BROADCAST_EXCHANGE  |PARTITIONED|
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                     -- HYBRID_HASH_JOIN [$$124][$$123]  |PARTITIONED|
-                      -- HASH_PARTITION_EXCHANGE [$$124]  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                         -- STREAM_PROJECT  |PARTITIONED|
                           -- ASSIGN  |PARTITIONED|
                             -- STREAM_PROJECT  |PARTITIONED|
@@ -26,7 +26,7 @@
                                 -- DATASOURCE_SCAN (test.nation)  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                      -- HASH_PARTITION_EXCHANGE [$$123]  |PARTITIONED|
+                      -- BROADCAST_EXCHANGE  |PARTITIONED|
                         -- STREAM_PROJECT  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             -- HYBRID_HASH_JOIN [$$134, $$122][$$135, $$123]  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/query_issue849-2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/query_issue849-2.plan
new file mode 100644
index 0000000..21bb457
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/query_issue849-2.plan
@@ -0,0 +1,32 @@
+-- COMMIT  |PARTITIONED|
+  -- STREAM_PROJECT  |PARTITIONED|
+    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+      -- INSERT_DELETE  |PARTITIONED|
+        -- HASH_PARTITION_EXCHANGE [$$3]  |PARTITIONED|
+          -- ASSIGN  |UNPARTITIONED|
+            -- ASSIGN  |UNPARTITIONED|
+              -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+-- COMMIT  |PARTITIONED|
+  -- STREAM_PROJECT  |PARTITIONED|
+    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+      -- INSERT_DELETE  |PARTITIONED|
+        -- HASH_PARTITION_EXCHANGE [$$3]  |PARTITIONED|
+          -- ASSIGN  |UNPARTITIONED|
+            -- ASSIGN  |UNPARTITIONED|
+              -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+-- DISTRIBUTE_RESULT  |PARTITIONED|
+  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            -- HYBRID_HASH_JOIN [$$47][$$49]  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- DATASOURCE_SCAN (test.s)  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+              -- BROADCAST_EXCHANGE  |PARTITIONED|
+                -- STREAM_PROJECT  |UNPARTITIONED|
+                  -- ASSIGN  |UNPARTITIONED|
+                    -- UNNEST  |UNPARTITIONED|
+                      -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/subquery/in_as_or_2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/subquery/in_as_or_2.plan
new file mode 100644
index 0000000..d6e9fa9
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/subquery/in_as_or_2.plan
@@ -0,0 +1,28 @@
+-- DISTRIBUTE_RESULT  |PARTITIONED|
+  -- SORT_MERGE_EXCHANGE [$$26(ASC) ]  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- STREAM_SELECT  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
+                  {
+                    -- AGGREGATE  |LOCAL|
+                      -- STREAM_SELECT  |LOCAL|
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                  }
+            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+              -- STABLE_SORT [$$22(ASC)]  |PARTITIONED|
+                -- HASH_PARTITION_EXCHANGE [$$22]  |PARTITIONED|
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$23][$#1]  |PARTITIONED|
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- DATASOURCE_SCAN (tpch.Customer)  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        -- BROADCAST_EXCHANGE  |PARTITIONED|
+                          -- ASSIGN  |UNPARTITIONED|
+                            -- UNNEST  |UNPARTITIONED|
+                              -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/subquery/in_as_or_2_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/subquery/in_as_or_2_ps.plan
new file mode 100644
index 0000000..de7e790
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/subquery/in_as_or_2_ps.plan
@@ -0,0 +1,67 @@
+-- DISTRIBUTE_RESULT  |PARTITIONED|
+  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+    -- STABLE_SORT [$$26(ASC)]  |PARTITIONED|
+      -- RANGE_PARTITION_EXCHANGE [$$26(ASC)]  |PARTITIONED|
+        -- FORWARD  |PARTITIONED|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            -- REPLICATE  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- STREAM_PROJECT  |PARTITIONED|
+                  -- STREAM_SELECT  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
+                              {
+                                -- AGGREGATE  |LOCAL|
+                                  -- STREAM_SELECT  |LOCAL|
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              }
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- STABLE_SORT [$$22(ASC)]  |PARTITIONED|
+                            -- HASH_PARTITION_EXCHANGE [$$22]  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- HYBRID_HASH_JOIN [$$23][$#1]  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- STREAM_PROJECT  |PARTITIONED|
+                                        -- ASSIGN  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- DATASOURCE_SCAN (tpch.Customer)  |PARTITIONED|
+                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                    -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                      -- ASSIGN  |UNPARTITIONED|
+                                        -- UNNEST  |UNPARTITIONED|
+                                          -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+          -- BROADCAST_EXCHANGE  |PARTITIONED|
+            -- AGGREGATE  |UNPARTITIONED|
+              -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+                -- AGGREGATE  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- REPLICATE  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- STREAM_PROJECT  |PARTITIONED|
+                          -- STREAM_SELECT  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
+                                      {
+                                        -- AGGREGATE  |LOCAL|
+                                          -- STREAM_SELECT  |LOCAL|
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      }
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- STABLE_SORT [$$22(ASC)]  |PARTITIONED|
+                                    -- HASH_PARTITION_EXCHANGE [$$22]  |PARTITIONED|
+                                      -- STREAM_PROJECT  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- HYBRID_HASH_JOIN [$$23][$#1]  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                -- ASSIGN  |PARTITIONED|
+                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                    -- DATASOURCE_SCAN (tpch.Customer)  |PARTITIONED|
+                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                            -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                              -- ASSIGN  |UNPARTITIONED|
+                                                -- UNNEST  |UNPARTITIONED|
+                                                  -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/subquery/in_as_or_4.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/subquery/in_as_or_4.plan
new file mode 100644
index 0000000..9ba625b
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/subquery/in_as_or_4.plan
@@ -0,0 +1,28 @@
+-- DISTRIBUTE_RESULT  |PARTITIONED|
+  -- SORT_MERGE_EXCHANGE [$$25(ASC) ]  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- STREAM_SELECT  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$21]  |PARTITIONED|
+                  {
+                    -- AGGREGATE  |LOCAL|
+                      -- STREAM_SELECT  |LOCAL|
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                  }
+            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+              -- STABLE_SORT [$$21(ASC)]  |PARTITIONED|
+                -- HASH_PARTITION_EXCHANGE [$$21]  |PARTITIONED|
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$22][$#1]  |PARTITIONED|
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- DATASOURCE_SCAN (tpch.Customer)  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        -- BROADCAST_EXCHANGE  |PARTITIONED|
+                          -- ASSIGN  |UNPARTITIONED|
+                            -- UNNEST  |UNPARTITIONED|
+                              -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/subquery/in_as_or_4_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/subquery/in_as_or_4_ps.plan
new file mode 100644
index 0000000..148d1b0
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/subquery/in_as_or_4_ps.plan
@@ -0,0 +1,67 @@
+-- DISTRIBUTE_RESULT  |PARTITIONED|
+  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+    -- STABLE_SORT [$$25(ASC)]  |PARTITIONED|
+      -- RANGE_PARTITION_EXCHANGE [$$25(ASC)]  |PARTITIONED|
+        -- FORWARD  |PARTITIONED|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            -- REPLICATE  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- STREAM_PROJECT  |PARTITIONED|
+                  -- STREAM_SELECT  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- PRE_CLUSTERED_GROUP_BY[$$21]  |PARTITIONED|
+                              {
+                                -- AGGREGATE  |LOCAL|
+                                  -- STREAM_SELECT  |LOCAL|
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              }
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- STABLE_SORT [$$21(ASC)]  |PARTITIONED|
+                            -- HASH_PARTITION_EXCHANGE [$$21]  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- HYBRID_HASH_JOIN [$$22][$#1]  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- STREAM_PROJECT  |PARTITIONED|
+                                        -- ASSIGN  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- DATASOURCE_SCAN (tpch.Customer)  |PARTITIONED|
+                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                    -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                      -- ASSIGN  |UNPARTITIONED|
+                                        -- UNNEST  |UNPARTITIONED|
+                                          -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+          -- BROADCAST_EXCHANGE  |PARTITIONED|
+            -- AGGREGATE  |UNPARTITIONED|
+              -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+                -- AGGREGATE  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- REPLICATE  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- STREAM_PROJECT  |PARTITIONED|
+                          -- STREAM_SELECT  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- PRE_CLUSTERED_GROUP_BY[$$21]  |PARTITIONED|
+                                      {
+                                        -- AGGREGATE  |LOCAL|
+                                          -- STREAM_SELECT  |LOCAL|
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      }
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- STABLE_SORT [$$21(ASC)]  |PARTITIONED|
+                                    -- HASH_PARTITION_EXCHANGE [$$21]  |PARTITIONED|
+                                      -- STREAM_PROJECT  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- HYBRID_HASH_JOIN [$$22][$#1]  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                -- ASSIGN  |PARTITIONED|
+                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                    -- DATASOURCE_SCAN (tpch.Customer)  |PARTITIONED|
+                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                            -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                              -- ASSIGN  |UNPARTITIONED|
+                                                -- UNNEST  |UNPARTITIONED|
+                                                  -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/subquery/in_as_or_6.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/subquery/in_as_or_6.plan
new file mode 100644
index 0000000..d6e9fa9
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/subquery/in_as_or_6.plan
@@ -0,0 +1,28 @@
+-- DISTRIBUTE_RESULT  |PARTITIONED|
+  -- SORT_MERGE_EXCHANGE [$$26(ASC) ]  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- STREAM_SELECT  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
+                  {
+                    -- AGGREGATE  |LOCAL|
+                      -- STREAM_SELECT  |LOCAL|
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                  }
+            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+              -- STABLE_SORT [$$22(ASC)]  |PARTITIONED|
+                -- HASH_PARTITION_EXCHANGE [$$22]  |PARTITIONED|
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$23][$#1]  |PARTITIONED|
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- DATASOURCE_SCAN (tpch.Customer)  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        -- BROADCAST_EXCHANGE  |PARTITIONED|
+                          -- ASSIGN  |UNPARTITIONED|
+                            -- UNNEST  |UNPARTITIONED|
+                              -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/subquery/in_as_or_6_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/subquery/in_as_or_6_ps.plan
new file mode 100644
index 0000000..de7e790
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/subquery/in_as_or_6_ps.plan
@@ -0,0 +1,67 @@
+-- DISTRIBUTE_RESULT  |PARTITIONED|
+  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+    -- STABLE_SORT [$$26(ASC)]  |PARTITIONED|
+      -- RANGE_PARTITION_EXCHANGE [$$26(ASC)]  |PARTITIONED|
+        -- FORWARD  |PARTITIONED|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            -- REPLICATE  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- STREAM_PROJECT  |PARTITIONED|
+                  -- STREAM_SELECT  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
+                              {
+                                -- AGGREGATE  |LOCAL|
+                                  -- STREAM_SELECT  |LOCAL|
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              }
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- STABLE_SORT [$$22(ASC)]  |PARTITIONED|
+                            -- HASH_PARTITION_EXCHANGE [$$22]  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- HYBRID_HASH_JOIN [$$23][$#1]  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- STREAM_PROJECT  |PARTITIONED|
+                                        -- ASSIGN  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- DATASOURCE_SCAN (tpch.Customer)  |PARTITIONED|
+                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                    -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                      -- ASSIGN  |UNPARTITIONED|
+                                        -- UNNEST  |UNPARTITIONED|
+                                          -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+          -- BROADCAST_EXCHANGE  |PARTITIONED|
+            -- AGGREGATE  |UNPARTITIONED|
+              -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+                -- AGGREGATE  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- REPLICATE  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- STREAM_PROJECT  |PARTITIONED|
+                          -- STREAM_SELECT  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
+                                      {
+                                        -- AGGREGATE  |LOCAL|
+                                          -- STREAM_SELECT  |LOCAL|
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      }
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- STABLE_SORT [$$22(ASC)]  |PARTITIONED|
+                                    -- HASH_PARTITION_EXCHANGE [$$22]  |PARTITIONED|
+                                      -- STREAM_PROJECT  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- HYBRID_HASH_JOIN [$$23][$#1]  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                -- ASSIGN  |PARTITIONED|
+                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                    -- DATASOURCE_SCAN (tpch.Customer)  |PARTITIONED|
+                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                            -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                              -- ASSIGN  |UNPARTITIONED|
+                                                -- UNNEST  |UNPARTITIONED|
+                                                  -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpch/q12_shipping_broadcast.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpch/q12_shipping_broadcast.plan
index 4ad65b5..c970de6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpch/q12_shipping_broadcast.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpch/q12_shipping_broadcast.plan
@@ -3,13 +3,13 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- SORT_MERGE_EXCHANGE [$$l_shipmode(ASC) ]  |PARTITIONED|
-          -- SORT_GROUP_BY[$$131]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$135]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
-            -- HASH_PARTITION_EXCHANGE [$$131]  |PARTITIONED|
-              -- SORT_GROUP_BY[$$114]  |PARTITIONED|
+            -- HASH_PARTITION_EXCHANGE [$$135]  |PARTITIONED|
+              -- SORT_GROUP_BY[$$118]  |PARTITIONED|
                       {
                         -- AGGREGATE  |LOCAL|
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
@@ -17,7 +17,7 @@
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                   -- STREAM_PROJECT  |PARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- HYBRID_HASH_JOIN [$$118][$$121]  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$122][$$125]  |PARTITIONED|
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           -- STREAM_PROJECT  |PARTITIONED|
                             -- ASSIGN  |PARTITIONED|
@@ -28,8 +28,11 @@
                         -- BROADCAST_EXCHANGE  |PARTITIONED|
                           -- STREAM_PROJECT  |PARTITIONED|
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- HYBRID_HASH_JOIN [$$114][$$120]  |PARTITIONED|
-                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- HYBRID_HASH_JOIN [$$124][$$118]  |PARTITIONED|
+                                -- RANDOM_PARTITION_EXCHANGE  |PARTITIONED|
+                                  -- UNNEST  |UNPARTITIONED|
+                                    -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                                -- BROADCAST_EXCHANGE  |PARTITIONED|
                                   -- STREAM_PROJECT  |PARTITIONED|
                                     -- STREAM_SELECT  |PARTITIONED|
                                       -- ASSIGN  |PARTITIONED|
@@ -38,6 +41,3 @@
                                             -- DATASOURCE_SCAN (tpch.LineItem)  |PARTITIONED|
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                  -- UNNEST  |UNPARTITIONED|
-                                    -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpch/q12_shipping_broadcast_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpch/q12_shipping_broadcast_ps.plan
index 7bf4afa..d037732 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpch/q12_shipping_broadcast_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpch/q12_shipping_broadcast_ps.plan
@@ -9,13 +9,13 @@
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                   -- REPLICATE  |PARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- SORT_GROUP_BY[$$131]  |PARTITIONED|
+                      -- SORT_GROUP_BY[$$135]  |PARTITIONED|
                               {
                                 -- AGGREGATE  |LOCAL|
                                   -- NESTED_TUPLE_SOURCE  |LOCAL|
                               }
-                        -- HASH_PARTITION_EXCHANGE [$$131]  |PARTITIONED|
-                          -- SORT_GROUP_BY[$$114]  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$135]  |PARTITIONED|
+                          -- SORT_GROUP_BY[$$118]  |PARTITIONED|
                                   {
                                     -- AGGREGATE  |LOCAL|
                                       -- NESTED_TUPLE_SOURCE  |LOCAL|
@@ -23,7 +23,7 @@
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                               -- STREAM_PROJECT  |PARTITIONED|
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  -- HYBRID_HASH_JOIN [$$118][$$121]  |PARTITIONED|
+                                  -- HYBRID_HASH_JOIN [$$122][$$125]  |PARTITIONED|
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         -- ASSIGN  |PARTITIONED|
@@ -34,8 +34,11 @@
                                     -- BROADCAST_EXCHANGE  |PARTITIONED|
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- HYBRID_HASH_JOIN [$$114][$$120]  |PARTITIONED|
-                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- HYBRID_HASH_JOIN [$$124][$$118]  |PARTITIONED|
+                                            -- RANDOM_PARTITION_EXCHANGE  |PARTITIONED|
+                                              -- UNNEST  |UNPARTITIONED|
+                                                -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                                            -- BROADCAST_EXCHANGE  |PARTITIONED|
                                               -- STREAM_PROJECT  |PARTITIONED|
                                                 -- STREAM_SELECT  |PARTITIONED|
                                                   -- ASSIGN  |PARTITIONED|
@@ -44,9 +47,6 @@
                                                         -- DATASOURCE_SCAN (tpch.LineItem)  |PARTITIONED|
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                             -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                            -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                              -- UNNEST  |UNPARTITIONED|
-                                                -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
                 -- BROADCAST_EXCHANGE  |PARTITIONED|
                   -- AGGREGATE  |UNPARTITIONED|
                     -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
@@ -55,13 +55,13 @@
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             -- REPLICATE  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                -- SORT_GROUP_BY[$$131]  |PARTITIONED|
+                                -- SORT_GROUP_BY[$$135]  |PARTITIONED|
                                         {
                                           -- AGGREGATE  |LOCAL|
                                             -- NESTED_TUPLE_SOURCE  |LOCAL|
                                         }
-                                  -- HASH_PARTITION_EXCHANGE [$$131]  |PARTITIONED|
-                                    -- SORT_GROUP_BY[$$114]  |PARTITIONED|
+                                  -- HASH_PARTITION_EXCHANGE [$$135]  |PARTITIONED|
+                                    -- SORT_GROUP_BY[$$118]  |PARTITIONED|
                                             {
                                               -- AGGREGATE  |LOCAL|
                                                 -- NESTED_TUPLE_SOURCE  |LOCAL|
@@ -69,7 +69,7 @@
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                         -- STREAM_PROJECT  |PARTITIONED|
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            -- HYBRID_HASH_JOIN [$$118][$$121]  |PARTITIONED|
+                                            -- HYBRID_HASH_JOIN [$$122][$$125]  |PARTITIONED|
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                   -- ASSIGN  |PARTITIONED|
@@ -80,8 +80,11 @@
                                               -- BROADCAST_EXCHANGE  |PARTITIONED|
                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- HYBRID_HASH_JOIN [$$114][$$120]  |PARTITIONED|
-                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                    -- HYBRID_HASH_JOIN [$$124][$$118]  |PARTITIONED|
+                                                      -- RANDOM_PARTITION_EXCHANGE  |PARTITIONED|
+                                                        -- UNNEST  |UNPARTITIONED|
+                                                          -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
                                                         -- STREAM_PROJECT  |PARTITIONED|
                                                           -- STREAM_SELECT  |PARTITIONED|
                                                             -- ASSIGN  |PARTITIONED|
@@ -90,6 +93,3 @@
                                                                   -- DATASOURCE_SCAN (tpch.LineItem)  |PARTITIONED|
                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                        -- UNNEST  |UNPARTITIONED|
-                                                          -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.007.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.007.plan
index 8550e65..00578bd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.007.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.007.plan
@@ -1,24 +1,24 @@
-distribute result [$$d] [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+distribute result [$$d] [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$d]) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+    project ([$$d]) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
       -- SORT_MERGE_EXCHANGE [$$20(ASC) ]  |PARTITIONED|
-        order (ASC, $$20) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+        order (ASC, $$20) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
         -- STABLE_SORT [$$20(ASC)]  |PARTITIONED|
-          exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            project ([$$d, $$20]) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+            project ([$$d, $$20]) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_PROJECT  |PARTITIONED|
-              select (and(gt($$19, "1"), lt($$19, "3"))) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+              select (and(gt($$19, "1"), lt($$19, "3"))) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
               -- STREAM_SELECT  |PARTITIONED|
-                assign [$$19] <- [$$d.getField("a")] [cardinality: 6.0, op-cost: 0.0, total-cost: 1.0]
+                assign [$$19] <- [$$d.getField("a")] [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                 -- ASSIGN  |PARTITIONED|
-                  exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 1.0]
+                  exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    data-scan []<-[$$20, $$d] <- test.ColumnDataset filter on: and(gt($$d.getField("a"), "1"), lt($$d.getField("a"), "3")) range-filter on: and(gt($$d.getField("a"), "1"), lt($$d.getField("a"), "3")) [cardinality: 6.0, op-cost: 1.0, total-cost: 1.0]
+                    data-scan []<-[$$20, $$d] <- test.ColumnDataset filter on: and(gt($$d.getField("a"), "1"), lt($$d.getField("a"), "3")) range-filter on: and(gt($$d.getField("a"), "1"), lt($$d.getField("a"), "3")) [cardinality: 6.0, op-cost: 6.0, total-cost: 6.0]
                     -- DATASOURCE_SCAN  |PARTITIONED|
                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.009.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.009.plan
index 26029f0..c5bad9f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.009.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.009.plan
@@ -1,24 +1,24 @@
-distribute result [$$d] [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+distribute result [$$d] [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$d]) [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+    project ([$$d]) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
       -- SORT_MERGE_EXCHANGE [$$20(ASC) ]  |PARTITIONED|
-        order (ASC, $$20) [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+        order (ASC, $$20) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
         -- STABLE_SORT [$$20(ASC)]  |PARTITIONED|
-          exchange [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            project ([$$d, $$20]) [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+            project ([$$d, $$20]) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_PROJECT  |PARTITIONED|
-              select (and(gt($$19, 1), lt($$19, 3))) [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+              select (and(gt($$19, 1), lt($$19, 3))) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
               -- STREAM_SELECT  |PARTITIONED|
-                assign [$$19] <- [$$d.getField("a")] [cardinality: 6.0, op-cost: 0.0, total-cost: 0.11]
+                assign [$$19] <- [$$d.getField("a")] [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                 -- ASSIGN  |PARTITIONED|
-                  exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 0.11]
+                  exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    data-scan []<-[$$20, $$d] <- test.ColumnDataset filter on: and(gt($$d.getField("a"), 1), lt($$d.getField("a"), 3)) range-filter on: and(gt($$d.getField("a"), 1), lt($$d.getField("a"), 3)) [cardinality: 6.0, op-cost: 0.11, total-cost: 0.11]
+                    data-scan []<-[$$20, $$d] <- test.ColumnDataset filter on: and(gt($$d.getField("a"), 1), lt($$d.getField("a"), 3)) range-filter on: and(gt($$d.getField("a"), 1), lt($$d.getField("a"), 3)) [cardinality: 6.0, op-cost: 6.0, total-cost: 6.0]
                     -- DATASOURCE_SCAN  |PARTITIONED|
                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.011.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.011.plan
index 6b57afe..88018de 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.011.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.011.plan
@@ -1,20 +1,20 @@
-distribute result [$$d] [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+distribute result [$$d] [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$d]) [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+    project ([$$d]) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
       -- SORT_MERGE_EXCHANGE [$$28(ASC) ]  |PARTITIONED|
-        order (ASC, $$28) [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+        order (ASC, $$28) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
         -- STABLE_SORT [$$28(ASC)]  |PARTITIONED|
-          exchange [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            project ([$$d, $$28]) [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+            project ([$$d, $$28]) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_PROJECT  |PARTITIONED|
-              select ($$26) [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+              select ($$26) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
               -- STREAM_SELECT  |PARTITIONED|
-                project ([$$28, $$d, $$26]) [cardinality: 6.0, op-cost: 0.0, total-cost: 0.11]
+                project ([$$28, $$d, $$26]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                 -- STREAM_PROJECT  |PARTITIONED|
                   subplan {
                             aggregate [$$26] <- [non-empty-stream()] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
@@ -25,13 +25,13 @@
                                 -- UNNEST  |LOCAL|
                                   nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- NESTED_TUPLE_SOURCE  |LOCAL|
-                         } [cardinality: 6.0, op-cost: 0.0, total-cost: 0.11]
+                         } [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                   -- SUBPLAN  |PARTITIONED|
-                    assign [$$29] <- [$$d.getField("array")] [cardinality: 6.0, op-cost: 0.0, total-cost: 0.11]
+                    assign [$$29] <- [$$d.getField("array")] [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                     -- ASSIGN  |PARTITIONED|
-                      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 0.11]
+                      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on: lt(scan-collection($$d.getField("array")), "100") range-filter on: lt(scan-collection($$d.getField("array")), "100") [cardinality: 6.0, op-cost: 0.11, total-cost: 0.11]
+                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on: lt(scan-collection($$d.getField("array")), "100") range-filter on: lt(scan-collection($$d.getField("array")), "100") [cardinality: 6.0, op-cost: 6.0, total-cost: 6.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.013.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.013.plan
index 821f0bb..2ed863a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.013.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.013.plan
@@ -1,20 +1,20 @@
-distribute result [$$d] [cardinality: 3.0, op-cost: 0.0, total-cost: 3.0]
+distribute result [$$d] [cardinality: 3.0, op-cost: 0.0, total-cost: 6.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 3.0]
+  exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 6.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$d]) [cardinality: 3.0, op-cost: 0.0, total-cost: 3.0]
+    project ([$$d]) [cardinality: 3.0, op-cost: 0.0, total-cost: 6.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 3.0]
+      exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 6.0]
       -- SORT_MERGE_EXCHANGE [$$28(ASC) ]  |PARTITIONED|
-        order (ASC, $$28) [cardinality: 3.0, op-cost: 0.0, total-cost: 3.0]
+        order (ASC, $$28) [cardinality: 3.0, op-cost: 0.0, total-cost: 6.0]
         -- STABLE_SORT [$$28(ASC)]  |PARTITIONED|
-          exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 3.0]
+          exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 6.0]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            project ([$$d, $$28]) [cardinality: 3.0, op-cost: 0.0, total-cost: 3.0]
+            project ([$$d, $$28]) [cardinality: 3.0, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_PROJECT  |PARTITIONED|
-              select ($$26) [cardinality: 3.0, op-cost: 0.0, total-cost: 3.0]
+              select ($$26) [cardinality: 3.0, op-cost: 0.0, total-cost: 6.0]
               -- STREAM_SELECT  |PARTITIONED|
-                project ([$$28, $$d, $$26]) [cardinality: 6.0, op-cost: 0.0, total-cost: 3.0]
+                project ([$$28, $$d, $$26]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                 -- STREAM_PROJECT  |PARTITIONED|
                   subplan {
                             aggregate [$$26] <- [non-empty-stream()] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
@@ -25,13 +25,13 @@
                                 -- UNNEST  |LOCAL|
                                   nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- NESTED_TUPLE_SOURCE  |LOCAL|
-                         } [cardinality: 6.0, op-cost: 0.0, total-cost: 3.0]
+                         } [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                   -- SUBPLAN  |PARTITIONED|
-                    assign [$$29] <- [$$d.getField("array")] [cardinality: 6.0, op-cost: 0.0, total-cost: 3.0]
+                    assign [$$29] <- [$$d.getField("array")] [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                     -- ASSIGN  |PARTITIONED|
-                      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 3.0]
+                      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on: lt(scan-collection($$d.getField("array")), 100) range-filter on: lt(scan-collection($$d.getField("array")), 100) [cardinality: 6.0, op-cost: 3.0, total-cost: 3.0]
+                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on: lt(scan-collection($$d.getField("array")), 100) range-filter on: lt(scan-collection($$d.getField("array")), 100) [cardinality: 6.0, op-cost: 6.0, total-cost: 6.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.015.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.015.plan
index c97dc2a..3d4ceef 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.015.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.015.plan
@@ -1,20 +1,20 @@
-distribute result [$$d] [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+distribute result [$$d] [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$d]) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+    project ([$$d]) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
       -- SORT_MERGE_EXCHANGE [$$28(ASC) ]  |PARTITIONED|
-        order (ASC, $$28) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+        order (ASC, $$28) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
         -- STABLE_SORT [$$28(ASC)]  |PARTITIONED|
-          exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            project ([$$d, $$28]) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+            project ([$$d, $$28]) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_PROJECT  |PARTITIONED|
-              select ($$26) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+              select ($$26) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
               -- STREAM_SELECT  |PARTITIONED|
-                project ([$$28, $$d, $$26]) [cardinality: 6.0, op-cost: 0.0, total-cost: 1.0]
+                project ([$$28, $$d, $$26]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                 -- STREAM_PROJECT  |PARTITIONED|
                   subplan {
                             aggregate [$$26] <- [non-empty-stream()] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
@@ -25,13 +25,13 @@
                                 -- UNNEST  |LOCAL|
                                   nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- NESTED_TUPLE_SOURCE  |LOCAL|
-                         } [cardinality: 6.0, op-cost: 0.0, total-cost: 1.0]
+                         } [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                   -- SUBPLAN  |PARTITIONED|
-                    assign [$$29] <- [$$d.getField("array")] [cardinality: 6.0, op-cost: 0.0, total-cost: 1.0]
+                    assign [$$29] <- [$$d.getField("array")] [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                     -- ASSIGN  |PARTITIONED|
-                      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 1.0]
+                      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on: eq(scan-collection($$d.getField("array")), 100) range-filter on: eq(scan-collection($$d.getField("array")), 100) [cardinality: 6.0, op-cost: 1.0, total-cost: 1.0]
+                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on: eq(scan-collection($$d.getField("array")), 100) range-filter on: eq(scan-collection($$d.getField("array")), 100) [cardinality: 6.0, op-cost: 6.0, total-cost: 6.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.017.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.017.plan
index 8e80f4c..c721841 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.017.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.017.plan
@@ -1,20 +1,20 @@
-distribute result [$$d] [cardinality: 4.0, op-cost: 0.0, total-cost: 4.0]
+distribute result [$$d] [cardinality: 4.0, op-cost: 0.0, total-cost: 6.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 4.0, op-cost: 0.0, total-cost: 4.0]
+  exchange [cardinality: 4.0, op-cost: 0.0, total-cost: 6.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$d]) [cardinality: 4.0, op-cost: 0.0, total-cost: 4.0]
+    project ([$$d]) [cardinality: 4.0, op-cost: 0.0, total-cost: 6.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 4.0, op-cost: 0.0, total-cost: 4.0]
+      exchange [cardinality: 4.0, op-cost: 0.0, total-cost: 6.0]
       -- SORT_MERGE_EXCHANGE [$$28(ASC) ]  |PARTITIONED|
-        order (ASC, $$28) [cardinality: 4.0, op-cost: 0.0, total-cost: 4.0]
+        order (ASC, $$28) [cardinality: 4.0, op-cost: 0.0, total-cost: 6.0]
         -- STABLE_SORT [$$28(ASC)]  |PARTITIONED|
-          exchange [cardinality: 4.0, op-cost: 0.0, total-cost: 4.0]
+          exchange [cardinality: 4.0, op-cost: 0.0, total-cost: 6.0]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            project ([$$d, $$28]) [cardinality: 4.0, op-cost: 0.0, total-cost: 4.0]
+            project ([$$d, $$28]) [cardinality: 4.0, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_PROJECT  |PARTITIONED|
-              select ($$26) [cardinality: 4.0, op-cost: 0.0, total-cost: 4.0]
+              select ($$26) [cardinality: 4.0, op-cost: 0.0, total-cost: 6.0]
               -- STREAM_SELECT  |PARTITIONED|
-                project ([$$28, $$d, $$26]) [cardinality: 6.0, op-cost: 0.0, total-cost: 4.0]
+                project ([$$28, $$d, $$26]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                 -- STREAM_PROJECT  |PARTITIONED|
                   subplan {
                             aggregate [$$26] <- [non-empty-stream()] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
@@ -25,13 +25,13 @@
                                 -- UNNEST  |LOCAL|
                                   nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- NESTED_TUPLE_SOURCE  |LOCAL|
-                         } [cardinality: 6.0, op-cost: 0.0, total-cost: 4.0]
+                         } [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                   -- SUBPLAN  |PARTITIONED|
-                    assign [$$29] <- [$$d.getField("array")] [cardinality: 6.0, op-cost: 0.0, total-cost: 4.0]
+                    assign [$$29] <- [$$d.getField("array")] [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                     -- ASSIGN  |PARTITIONED|
-                      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 4.0]
+                      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on: lt(scan-collection($$d.getField("array")), 100.1) range-filter on: lt(scan-collection($$d.getField("array")), 100.1) [cardinality: 6.0, op-cost: 4.0, total-cost: 4.0]
+                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on: lt(scan-collection($$d.getField("array")), 100.1) range-filter on: lt(scan-collection($$d.getField("array")), 100.1) [cardinality: 6.0, op-cost: 6.0, total-cost: 6.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.019.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.019.plan
index 484d76f..5f136ea 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.019.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.019.plan
@@ -1,28 +1,28 @@
-distribute result [$$item] [cardinality: 3.0, op-cost: 0.0, total-cost: 3.0]
+distribute result [$$item] [cardinality: 3.0, op-cost: 0.0, total-cost: 6.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 3.0]
+  exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 6.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$item]) [cardinality: 3.0, op-cost: 0.0, total-cost: 3.0]
+    project ([$$item]) [cardinality: 3.0, op-cost: 0.0, total-cost: 6.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 3.0]
+      exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 6.0]
       -- SORT_MERGE_EXCHANGE [$$29(ASC), $$item(ASC) ]  |PARTITIONED|
-        order (ASC, $$29) (ASC, $$item) [cardinality: 3.0, op-cost: 0.0, total-cost: 3.0]
+        order (ASC, $$29) (ASC, $$item) [cardinality: 3.0, op-cost: 0.0, total-cost: 6.0]
         -- STABLE_SORT [$$29(ASC), $$item(ASC)]  |PARTITIONED|
-          exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 3.0]
+          exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 6.0]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            select (and(gt($$item, 60), lt($$item, 100))) [cardinality: 3.0, op-cost: 0.0, total-cost: 3.0]
+            select (and(gt($$item, 60), lt($$item, 100))) [cardinality: 3.0, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_SELECT  |PARTITIONED|
-              project ([$$29, $$item]) [cardinality: 6.0, op-cost: 0.0, total-cost: 3.0]
+              project ([$$29, $$item]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
               -- STREAM_PROJECT  |PARTITIONED|
-                unnest $$item <- scan-collection($$30) [cardinality: 6.0, op-cost: 0.0, total-cost: 3.0]
+                unnest $$item <- scan-collection($$30) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                 -- UNNEST  |PARTITIONED|
-                  project ([$$29, $$30]) [cardinality: 6.0, op-cost: 0.0, total-cost: 3.0]
+                  project ([$$29, $$30]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                   -- STREAM_PROJECT  |PARTITIONED|
-                    assign [$$30] <- [$$d.getField("array")] [cardinality: 6.0, op-cost: 0.0, total-cost: 3.0]
+                    assign [$$30] <- [$$d.getField("array")] [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                     -- ASSIGN  |PARTITIONED|
-                      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 3.0]
+                      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$29, $$d] <- test.ColumnDataset project ({array:[any]}) filter on: and(gt(scan-collection($$d.getField("array")), 60), lt(scan-collection($$d.getField("array")), 100)) range-filter on: and(gt(scan-collection($$d.getField("array")), 60), lt(scan-collection($$d.getField("array")), 100)) [cardinality: 6.0, op-cost: 3.0, total-cost: 3.0]
+                        data-scan []<-[$$29, $$d] <- test.ColumnDataset project ({array:[any]}) filter on: and(gt(scan-collection($$d.getField("array")), 60), lt(scan-collection($$d.getField("array")), 100)) range-filter on: and(gt(scan-collection($$d.getField("array")), 60), lt(scan-collection($$d.getField("array")), 100)) [cardinality: 6.0, op-cost: 6.0, total-cost: 6.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.021.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.021.plan
index 8b3eb88..d6621a3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.021.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.021.plan
@@ -1,28 +1,28 @@
-distribute result [$$item] [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+distribute result [$$item] [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$item]) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+    project ([$$item]) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
       -- SORT_MERGE_EXCHANGE [$$27(ASC), $$item(ASC) ]  |PARTITIONED|
-        order (ASC, $$27) (ASC, $$item) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+        order (ASC, $$27) (ASC, $$item) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
         -- STABLE_SORT [$$27(ASC), $$item(ASC)]  |PARTITIONED|
-          exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            select (eq($$item, 100)) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+            select (eq($$item, 100)) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_SELECT  |PARTITIONED|
-              project ([$$27, $$item]) [cardinality: 6.0, op-cost: 0.0, total-cost: 1.0]
+              project ([$$27, $$item]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
               -- STREAM_PROJECT  |PARTITIONED|
-                unnest $$item <- scan-collection($$28) [cardinality: 6.0, op-cost: 0.0, total-cost: 1.0]
+                unnest $$item <- scan-collection($$28) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                 -- UNNEST  |PARTITIONED|
-                  project ([$$27, $$28]) [cardinality: 6.0, op-cost: 0.0, total-cost: 1.0]
+                  project ([$$27, $$28]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                   -- STREAM_PROJECT  |PARTITIONED|
-                    assign [$$28] <- [$$d.getField("array")] [cardinality: 6.0, op-cost: 0.0, total-cost: 1.0]
+                    assign [$$28] <- [$$d.getField("array")] [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                     -- ASSIGN  |PARTITIONED|
-                      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 1.0]
+                      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$27, $$d] <- test.ColumnDataset project ({array:[any]}) filter on: eq(scan-collection($$d.getField("array")), 100) range-filter on: eq(scan-collection($$d.getField("array")), 100) [cardinality: 6.0, op-cost: 1.0, total-cost: 1.0]
+                        data-scan []<-[$$27, $$d] <- test.ColumnDataset project ({array:[any]}) filter on: eq(scan-collection($$d.getField("array")), 100) range-filter on: eq(scan-collection($$d.getField("array")), 100) [cardinality: 6.0, op-cost: 6.0, total-cost: 6.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.023.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.023.plan
index 7bda2a5..b89d0a9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.023.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.023.plan
@@ -1,28 +1,28 @@
-distribute result [$$item] [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+distribute result [$$item] [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$item]) [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+    project ([$$item]) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
       -- SORT_MERGE_EXCHANGE [$$27(ASC), $$item(ASC) ]  |PARTITIONED|
-        order (ASC, $$27) (ASC, $$item) [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+        order (ASC, $$27) (ASC, $$item) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
         -- STABLE_SORT [$$27(ASC), $$item(ASC)]  |PARTITIONED|
-          exchange [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            select (gt($$item, 10000)) [cardinality: 0.11, op-cost: 0.0, total-cost: 0.11]
+            select (gt($$item, 10000)) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_SELECT  |PARTITIONED|
-              project ([$$27, $$item]) [cardinality: 6.0, op-cost: 0.0, total-cost: 0.11]
+              project ([$$27, $$item]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
               -- STREAM_PROJECT  |PARTITIONED|
-                unnest $$item <- scan-collection($$28) [cardinality: 6.0, op-cost: 0.0, total-cost: 0.11]
+                unnest $$item <- scan-collection($$28) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                 -- UNNEST  |PARTITIONED|
-                  project ([$$27, $$28]) [cardinality: 6.0, op-cost: 0.0, total-cost: 0.11]
+                  project ([$$27, $$28]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                   -- STREAM_PROJECT  |PARTITIONED|
-                    assign [$$28] <- [$$d.getField("array")] [cardinality: 6.0, op-cost: 0.0, total-cost: 0.11]
+                    assign [$$28] <- [$$d.getField("array")] [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                     -- ASSIGN  |PARTITIONED|
-                      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 0.11]
+                      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$27, $$d] <- test.ColumnDataset project ({array:[any]}) filter on: gt(scan-collection($$d.getField("array")), 10000) range-filter on: gt(scan-collection($$d.getField("array")), 10000) [cardinality: 6.0, op-cost: 0.11, total-cost: 0.11]
+                        data-scan []<-[$$27, $$d] <- test.ColumnDataset project ({array:[any]}) filter on: gt(scan-collection($$d.getField("array")), 10000) range-filter on: gt(scan-collection($$d.getField("array")), 10000) [cardinality: 6.0, op-cost: 6.0, total-cost: 6.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.025.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.025.plan
index 0731954..baf747f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.025.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.025.plan
@@ -1,34 +1,34 @@
-distribute result [$$31] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+distribute result [$$31] [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$31]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+    project ([$$31]) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$31] <- [{"a": $$34, "item": $$item}] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+      assign [$$31] <- [{"a": $$34, "item": $$item}] [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
       -- ASSIGN  |PARTITIONED|
-        project ([$$34, $$item]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+        project ([$$34, $$item]) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
         -- STREAM_PROJECT  |PARTITIONED|
-          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
           -- SORT_MERGE_EXCHANGE [$$35(ASC), $$34(ASC), $$item(ASC) ]  |PARTITIONED|
-            order (ASC, $$35) (ASC, $$34) (ASC, $$item) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+            order (ASC, $$35) (ASC, $$34) (ASC, $$item) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
             -- STABLE_SORT [$$35(ASC), $$34(ASC), $$item(ASC)]  |PARTITIONED|
-              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                select (gt($$item, 10)) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+                select (gt($$item, 10)) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
                 -- STREAM_SELECT  |PARTITIONED|
-                  project ([$$35, $$34, $$item]) [cardinality: 6.0, op-cost: 0.0, total-cost: 2.0]
+                  project ([$$35, $$34, $$item]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                   -- STREAM_PROJECT  |PARTITIONED|
-                    unnest $$item <- scan-collection($$36) [cardinality: 6.0, op-cost: 0.0, total-cost: 2.0]
+                    unnest $$item <- scan-collection($$36) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                     -- UNNEST  |PARTITIONED|
                       select (eq($$34, "1")) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- STREAM_SELECT  |PARTITIONED|
-                        project ([$$35, $$34, $$36]) [cardinality: 6.0, op-cost: 0.0, total-cost: 2.0]
+                        project ([$$35, $$34, $$36]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                         -- STREAM_PROJECT  |PARTITIONED|
-                          assign [$$34, $$36] <- [$$d.getField("a"), $$d.getField("array")] [cardinality: 6.0, op-cost: 0.0, total-cost: 2.0]
+                          assign [$$34, $$36] <- [$$d.getField("a"), $$d.getField("array")] [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                           -- ASSIGN  |PARTITIONED|
-                            exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 2.0]
+                            exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              data-scan []<-[$$35, $$d] <- test.ColumnDataset project ({a:any,array:[any]}) filter on: and(eq($$d.getField("a"), "1"), gt(scan-collection($$d.getField("array")), 10)) range-filter on: and(eq($$d.getField("a"), "1"), gt(scan-collection($$d.getField("array")), 10)) [cardinality: 6.0, op-cost: 2.0, total-cost: 2.0]
+                              data-scan []<-[$$35, $$d] <- test.ColumnDataset project ({a:any,array:[any]}) filter on: and(eq($$d.getField("a"), "1"), gt(scan-collection($$d.getField("array")), 10)) range-filter on: and(eq($$d.getField("a"), "1"), gt(scan-collection($$d.getField("array")), 10)) [cardinality: 6.0, op-cost: 6.0, total-cost: 6.0]
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.006.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.006.plan
index d2c4559..8071306 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.006.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.006.plan
@@ -1,32 +1,32 @@
-distribute result [$$47] [cardinality: 99.0, op-cost: 0.0, total-cost: 99.0]
+distribute result [$$47] [cardinality: 99.0, op-cost: 0.0, total-cost: 30.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 99.0, op-cost: 0.0, total-cost: 99.0]
+  exchange [cardinality: 99.0, op-cost: 0.0, total-cost: 30.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$47]) [cardinality: 99.0, op-cost: 0.0, total-cost: 99.0]
+    project ([$$47]) [cardinality: 99.0, op-cost: 0.0, total-cost: 30.0]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$47] <- [{"$1": $$49}] [cardinality: 99.0, op-cost: 0.0, total-cost: 99.0]
+      assign [$$47] <- [{"$1": $$49}] [cardinality: 99.0, op-cost: 0.0, total-cost: 30.0]
       -- ASSIGN  |UNPARTITIONED|
-        aggregate [$$49] <- [agg-sql-sum($$51)] [cardinality: 99.0, op-cost: 0.0, total-cost: 99.0]
+        aggregate [$$49] <- [agg-sql-sum($$51)] [cardinality: 99.0, op-cost: 0.0, total-cost: 30.0]
         -- AGGREGATE  |UNPARTITIONED|
-          exchange [cardinality: 99.0, op-cost: 0.0, total-cost: 99.0]
+          exchange [cardinality: 99.0, op-cost: 0.0, total-cost: 30.0]
           -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-            aggregate [$$51] <- [agg-sql-count(1)] [cardinality: 99.0, op-cost: 0.0, total-cost: 99.0]
+            aggregate [$$51] <- [agg-sql-count(1)] [cardinality: 99.0, op-cost: 0.0, total-cost: 30.0]
             -- AGGREGATE  |PARTITIONED|
-              select (gt($$D, " ")) [cardinality: 99.0, op-cost: 0.0, total-cost: 99.0]
+              select (gt($$D, " ")) [cardinality: 99.0, op-cost: 0.0, total-cost: 30.0]
               -- STREAM_SELECT  |PARTITIONED|
-                project ([$$D]) [cardinality: 30.0, op-cost: 0.0, total-cost: 99.0]
+                project ([$$D]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  unnest $$D <- scan-collection($$50) [cardinality: 30.0, op-cost: 0.0, total-cost: 99.0]
+                  unnest $$D <- scan-collection($$50) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                   -- UNNEST  |PARTITIONED|
-                    project ([$$50]) [cardinality: 30.0, op-cost: 0.0, total-cost: 99.0]
+                    project ([$$50]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      assign [$$50] <- [$$C.getField("dates")] [cardinality: 30.0, op-cost: 0.0, total-cost: 99.0]
+                      assign [$$50] <- [$$C.getField("dates")] [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                       -- ASSIGN  |PARTITIONED|
-                        project ([$$C]) [cardinality: 30.0, op-cost: 0.0, total-cost: 99.0]
+                        project ([$$C]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                         -- STREAM_PROJECT  |PARTITIONED|
-                          exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 99.0]
+                          exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$48, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: gt(scan-collection($$C.getField("dates")), " ") range-filter on: gt(scan-collection($$C.getField("dates")), " ") [cardinality: 30.0, op-cost: 99.0, total-cost: 99.0]
+                            data-scan []<-[$$48, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: gt(scan-collection($$C.getField("dates")), " ") range-filter on: gt(scan-collection($$C.getField("dates")), " ") [cardinality: 30.0, op-cost: 30.0, total-cost: 30.0]
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.102.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.102.plan
index fb64b66..ffd904f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.102.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.102.plan
@@ -1,32 +1,32 @@
-distribute result [$$48] [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
+distribute result [$$48] [cardinality: 6.0, op-cost: 0.0, total-cost: 30.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
+  exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 30.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$48]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
+    project ([$$48]) [cardinality: 6.0, op-cost: 0.0, total-cost: 30.0]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$48] <- [{"$1": $$50}] [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
+      assign [$$48] <- [{"$1": $$50}] [cardinality: 6.0, op-cost: 0.0, total-cost: 30.0]
       -- ASSIGN  |UNPARTITIONED|
-        aggregate [$$50] <- [agg-sql-sum($$52)] [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
+        aggregate [$$50] <- [agg-sql-sum($$52)] [cardinality: 6.0, op-cost: 0.0, total-cost: 30.0]
         -- AGGREGATE  |UNPARTITIONED|
-          exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
+          exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 30.0]
           -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-            aggregate [$$52] <- [agg-sql-count(1)] [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
+            aggregate [$$52] <- [agg-sql-count(1)] [cardinality: 6.0, op-cost: 0.0, total-cost: 30.0]
             -- AGGREGATE  |PARTITIONED|
-              select (eq(substring($$D, 0, 4), "2011")) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
+              select (eq(substring($$D, 0, 4), "2011")) [cardinality: 6.0, op-cost: 0.0, total-cost: 30.0]
               -- STREAM_SELECT  |PARTITIONED|
-                project ([$$D]) [cardinality: 30.0, op-cost: 0.0, total-cost: 6.0]
+                project ([$$D]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  unnest $$D <- scan-collection($$51) [cardinality: 30.0, op-cost: 0.0, total-cost: 6.0]
+                  unnest $$D <- scan-collection($$51) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                   -- UNNEST  |PARTITIONED|
-                    project ([$$51]) [cardinality: 30.0, op-cost: 0.0, total-cost: 6.0]
+                    project ([$$51]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      assign [$$51] <- [$$C.getField("dates")] [cardinality: 30.0, op-cost: 0.0, total-cost: 6.0]
+                      assign [$$51] <- [$$C.getField("dates")] [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                       -- ASSIGN  |PARTITIONED|
-                        project ([$$C]) [cardinality: 30.0, op-cost: 0.0, total-cost: 6.0]
+                        project ([$$C]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                         -- STREAM_PROJECT  |PARTITIONED|
-                          exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 6.0]
+                          exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$49, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011") [cardinality: 30.0, op-cost: 6.0, total-cost: 6.0]
+                            data-scan []<-[$$49, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011") [cardinality: 30.0, op-cost: 30.0, total-cost: 30.0]
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.105.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.105.plan
index 317dccc..b59f329 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.105.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.105.plan
@@ -1,36 +1,36 @@
-distribute result [$$51] [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
+distribute result [$$51] [cardinality: 20.0, op-cost: 0.0, total-cost: 30.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
+  exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 30.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$51]) [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
+    project ([$$51]) [cardinality: 20.0, op-cost: 0.0, total-cost: 30.0]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$51] <- [{"$1": $$54}] [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
+      assign [$$51] <- [{"$1": $$54}] [cardinality: 20.0, op-cost: 0.0, total-cost: 30.0]
       -- ASSIGN  |UNPARTITIONED|
-        aggregate [$$54] <- [agg-sql-sum($$57)] [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
+        aggregate [$$54] <- [agg-sql-sum($$57)] [cardinality: 20.0, op-cost: 0.0, total-cost: 30.0]
         -- AGGREGATE  |UNPARTITIONED|
-          exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
+          exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 30.0]
           -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-            aggregate [$$57] <- [agg-sql-count(1)] [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
+            aggregate [$$57] <- [agg-sql-count(1)] [cardinality: 20.0, op-cost: 0.0, total-cost: 30.0]
             -- AGGREGATE  |PARTITIONED|
-              select (or(eq($$58, "2011"), eq($$58, "2016"))) [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
+              select (or(eq($$58, "2011"), eq($$58, "2016"))) [cardinality: 20.0, op-cost: 0.0, total-cost: 30.0]
               -- STREAM_SELECT  |PARTITIONED|
-                project ([$$58]) [cardinality: 30.0, op-cost: 0.0, total-cost: 20.0]
+                project ([$$58]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  assign [$$58] <- [substring($$D, 0, 4)] [cardinality: 30.0, op-cost: 0.0, total-cost: 20.0]
+                  assign [$$58] <- [substring($$D, 0, 4)] [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                   -- ASSIGN  |PARTITIONED|
-                    project ([$$D]) [cardinality: 30.0, op-cost: 0.0, total-cost: 20.0]
+                    project ([$$D]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      unnest $$D <- scan-collection($$55) [cardinality: 30.0, op-cost: 0.0, total-cost: 20.0]
+                      unnest $$D <- scan-collection($$55) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                       -- UNNEST  |PARTITIONED|
-                        project ([$$55]) [cardinality: 30.0, op-cost: 0.0, total-cost: 20.0]
+                        project ([$$55]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                         -- STREAM_PROJECT  |PARTITIONED|
-                          assign [$$55] <- [$$C.getField("dates")] [cardinality: 30.0, op-cost: 0.0, total-cost: 20.0]
+                          assign [$$55] <- [$$C.getField("dates")] [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                           -- ASSIGN  |PARTITIONED|
-                            project ([$$C]) [cardinality: 30.0, op-cost: 0.0, total-cost: 20.0]
+                            project ([$$C]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                             -- STREAM_PROJECT  |PARTITIONED|
-                              exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 20.0]
+                              exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                data-scan []<-[$$53, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: or(eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011"), eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2016")) [cardinality: 30.0, op-cost: 20.0, total-cost: 20.0]
+                                data-scan []<-[$$53, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: or(eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011"), eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2016")) [cardinality: 30.0, op-cost: 30.0, total-cost: 30.0]
                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                   exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.108.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.108.plan
index f541fed..d117252 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.108.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.108.plan
@@ -1,20 +1,20 @@
-distribute result [$$52] [cardinality: 11.0, op-cost: 0.0, total-cost: 11.0]
+distribute result [$$52] [cardinality: 11.0, op-cost: 0.0, total-cost: 30.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 11.0, op-cost: 0.0, total-cost: 11.0]
+  exchange [cardinality: 11.0, op-cost: 0.0, total-cost: 30.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$52]) [cardinality: 11.0, op-cost: 0.0, total-cost: 11.0]
+    project ([$$52]) [cardinality: 11.0, op-cost: 0.0, total-cost: 30.0]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$52] <- [{"$1": $$55}] [cardinality: 11.0, op-cost: 0.0, total-cost: 11.0]
+      assign [$$52] <- [{"$1": $$55}] [cardinality: 11.0, op-cost: 0.0, total-cost: 30.0]
       -- ASSIGN  |UNPARTITIONED|
-        aggregate [$$55] <- [agg-sql-sum($$58)] [cardinality: 11.0, op-cost: 0.0, total-cost: 11.0]
+        aggregate [$$55] <- [agg-sql-sum($$58)] [cardinality: 11.0, op-cost: 0.0, total-cost: 30.0]
         -- AGGREGATE  |UNPARTITIONED|
-          exchange [cardinality: 11.0, op-cost: 0.0, total-cost: 11.0]
+          exchange [cardinality: 11.0, op-cost: 0.0, total-cost: 30.0]
           -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-            aggregate [$$58] <- [agg-sql-count(1)] [cardinality: 11.0, op-cost: 0.0, total-cost: 11.0]
+            aggregate [$$58] <- [agg-sql-count(1)] [cardinality: 11.0, op-cost: 0.0, total-cost: 30.0]
             -- AGGREGATE  |PARTITIONED|
-              select ($$45) [cardinality: 11.0, op-cost: 0.0, total-cost: 11.0]
+              select ($$45) [cardinality: 11.0, op-cost: 0.0, total-cost: 30.0]
               -- STREAM_SELECT  |PARTITIONED|
-                project ([$$45]) [cardinality: 30.0, op-cost: 0.0, total-cost: 11.0]
+                project ([$$45]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                 -- STREAM_PROJECT  |PARTITIONED|
                   subplan {
                             aggregate [$$45] <- [non-empty-stream()] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
@@ -27,17 +27,17 @@
                                   -- UNNEST  |LOCAL|
                                     nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- NESTED_TUPLE_SOURCE  |LOCAL|
-                         } [cardinality: 30.0, op-cost: 0.0, total-cost: 11.0]
+                         } [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                   -- SUBPLAN  |PARTITIONED|
-                    project ([$$56]) [cardinality: 30.0, op-cost: 0.0, total-cost: 11.0]
+                    project ([$$56]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      assign [$$56] <- [$$C.getField("dates")] [cardinality: 30.0, op-cost: 0.0, total-cost: 11.0]
+                      assign [$$56] <- [$$C.getField("dates")] [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                       -- ASSIGN  |PARTITIONED|
-                        project ([$$C]) [cardinality: 30.0, op-cost: 0.0, total-cost: 11.0]
+                        project ([$$C]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                         -- STREAM_PROJECT  |PARTITIONED|
-                          exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 11.0]
+                          exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$54, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: or(eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011"), eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2016")) [cardinality: 30.0, op-cost: 11.0, total-cost: 11.0]
+                            data-scan []<-[$$54, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: or(eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011"), eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2016")) [cardinality: 30.0, op-cost: 30.0, total-cost: 30.0]
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.113.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.113.plan
index 552f478..11fa99a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.113.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.113.plan
@@ -1,38 +1,38 @@
-distribute result [$$54] [cardinality: 7.0, op-cost: 0.0, total-cost: 7.0]
+distribute result [$$54] [cardinality: 7.0, op-cost: 0.0, total-cost: 30.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 7.0, op-cost: 0.0, total-cost: 7.0]
+  exchange [cardinality: 7.0, op-cost: 0.0, total-cost: 30.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$54]) [cardinality: 7.0, op-cost: 0.0, total-cost: 7.0]
+    project ([$$54]) [cardinality: 7.0, op-cost: 0.0, total-cost: 30.0]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$54] <- [{"$1": $$57}] [cardinality: 7.0, op-cost: 0.0, total-cost: 7.0]
+      assign [$$54] <- [{"$1": $$57}] [cardinality: 7.0, op-cost: 0.0, total-cost: 30.0]
       -- ASSIGN  |UNPARTITIONED|
-        aggregate [$$57] <- [agg-sql-sum($$61)] [cardinality: 7.0, op-cost: 0.0, total-cost: 7.0]
+        aggregate [$$57] <- [agg-sql-sum($$61)] [cardinality: 7.0, op-cost: 0.0, total-cost: 30.0]
         -- AGGREGATE  |UNPARTITIONED|
-          exchange [cardinality: 7.0, op-cost: 0.0, total-cost: 7.0]
+          exchange [cardinality: 7.0, op-cost: 0.0, total-cost: 30.0]
           -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-            aggregate [$$61] <- [agg-sql-count(1)] [cardinality: 7.0, op-cost: 0.0, total-cost: 7.0]
+            aggregate [$$61] <- [agg-sql-count(1)] [cardinality: 7.0, op-cost: 0.0, total-cost: 30.0]
             -- AGGREGATE  |PARTITIONED|
-              select (or(eq($$62, "2011"), eq($$62, "2016"))) [cardinality: 7.0, op-cost: 0.0, total-cost: 7.0]
+              select (or(eq($$62, "2011"), eq($$62, "2016"))) [cardinality: 7.0, op-cost: 0.0, total-cost: 30.0]
               -- STREAM_SELECT  |PARTITIONED|
-                project ([$$62]) [cardinality: 30.0, op-cost: 0.0, total-cost: 7.0]
+                project ([$$62]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  assign [$$62] <- [substring($$D, 0, 4)] [cardinality: 30.0, op-cost: 0.0, total-cost: 7.0]
+                  assign [$$62] <- [substring($$D, 0, 4)] [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                   -- ASSIGN  |PARTITIONED|
-                    project ([$$D]) [cardinality: 30.0, op-cost: 0.0, total-cost: 7.0]
+                    project ([$$D]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      unnest $$D <- scan-collection($$59) [cardinality: 30.0, op-cost: 0.0, total-cost: 7.0]
+                      unnest $$D <- scan-collection($$59) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                       -- UNNEST  |PARTITIONED|
-                        project ([$$59]) [cardinality: 30.0, op-cost: 0.0, total-cost: 7.0]
+                        project ([$$59]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                         -- STREAM_PROJECT  |PARTITIONED|
                           select (starts-with($$C.getField("business_id"), "-0")) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- STREAM_SELECT  |PARTITIONED|
-                            assign [$$59] <- [$$C.getField("dates")] [cardinality: 30.0, op-cost: 0.0, total-cost: 7.0]
+                            assign [$$59] <- [$$C.getField("dates")] [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                             -- ASSIGN  |PARTITIONED|
-                              project ([$$C]) [cardinality: 30.0, op-cost: 0.0, total-cost: 7.0]
+                              project ([$$C]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                               -- STREAM_PROJECT  |PARTITIONED|
-                                exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 7.0]
+                                exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan []<-[$$56, $$C] <- TestYelp.YelpCheckin project ({dates:[any],business_id:any}) filter on: and(starts-with($$C.getField("business_id"), "-0"), or(eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011"), eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2016"))) [cardinality: 30.0, op-cost: 7.0, total-cost: 7.0]
+                                  data-scan []<-[$$56, $$C] <- TestYelp.YelpCheckin project ({dates:[any],business_id:any}) filter on: and(starts-with($$C.getField("business_id"), "-0"), or(eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011"), eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2016"))) [cardinality: 30.0, op-cost: 30.0, total-cost: 30.0]
                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                     exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/005/005.008.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/005/005.008.plan
index 1e221be..9936002 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/005/005.008.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/005/005.008.plan
@@ -1,32 +1,32 @@
-distribute result [$$48] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+distribute result [$$48] [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$48]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+    project ([$$48]) [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$48] <- [{"$1": $$50}] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+      assign [$$48] <- [{"$1": $$50}] [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
       -- ASSIGN  |UNPARTITIONED|
-        aggregate [$$50] <- [agg-sql-sum($$52)] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+        aggregate [$$50] <- [agg-sql-sum($$52)] [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
         -- AGGREGATE  |UNPARTITIONED|
-          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
           -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-            aggregate [$$52] <- [agg-sql-count(1)] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+            aggregate [$$52] <- [agg-sql-count(1)] [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
             -- AGGREGATE  |PARTITIONED|
-              select (gt(numeric-add($$D, 1), 2018)) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+              select (gt(numeric-add($$D, 1), 2018)) [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
               -- STREAM_SELECT  |PARTITIONED|
-                project ([$$D]) [cardinality: 30.0, op-cost: 0.0, total-cost: 2.0]
+                project ([$$D]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  unnest $$D <- scan-collection($$51) [cardinality: 30.0, op-cost: 0.0, total-cost: 2.0]
+                  unnest $$D <- scan-collection($$51) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                   -- UNNEST  |PARTITIONED|
-                    project ([$$51]) [cardinality: 30.0, op-cost: 0.0, total-cost: 2.0]
+                    project ([$$51]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      assign [$$51] <- [$$C.getField("dates")] [cardinality: 30.0, op-cost: 0.0, total-cost: 2.0]
+                      assign [$$51] <- [$$C.getField("dates")] [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                       -- ASSIGN  |PARTITIONED|
-                        project ([$$C]) [cardinality: 30.0, op-cost: 0.0, total-cost: 2.0]
+                        project ([$$C]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                         -- STREAM_PROJECT  |PARTITIONED|
-                          exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 2.0]
+                          exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$49, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: gt(numeric-add(scan-collection($$C.getField("dates")), 1), 2018) [cardinality: 30.0, op-cost: 2.0, total-cost: 2.0]
+                            data-scan []<-[$$49, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: gt(numeric-add(scan-collection($$C.getField("dates")), 1), 2018) [cardinality: 30.0, op-cost: 30.0, total-cost: 30.0]
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/005/005.011.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/005/005.011.plan
index 346e3d3..1930f1c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/005/005.011.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/005/005.011.plan
@@ -1,32 +1,32 @@
-distribute result [$$51] [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+distribute result [$$51] [cardinality: 8.0, op-cost: 0.0, total-cost: 30.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+  exchange [cardinality: 8.0, op-cost: 0.0, total-cost: 30.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$51]) [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+    project ([$$51]) [cardinality: 8.0, op-cost: 0.0, total-cost: 30.0]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$51] <- [{"$1": $$53}] [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+      assign [$$51] <- [{"$1": $$53}] [cardinality: 8.0, op-cost: 0.0, total-cost: 30.0]
       -- ASSIGN  |UNPARTITIONED|
-        aggregate [$$53] <- [agg-sql-sum($$55)] [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+        aggregate [$$53] <- [agg-sql-sum($$55)] [cardinality: 8.0, op-cost: 0.0, total-cost: 30.0]
         -- AGGREGATE  |UNPARTITIONED|
-          exchange [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+          exchange [cardinality: 8.0, op-cost: 0.0, total-cost: 30.0]
           -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-            aggregate [$$55] <- [agg-sql-count(1)] [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+            aggregate [$$55] <- [agg-sql-count(1)] [cardinality: 8.0, op-cost: 0.0, total-cost: 30.0]
             -- AGGREGATE  |PARTITIONED|
-              select (or(gt(numeric-add($$D, 1), 2018), eq(substring($$D, 0, 4), "2011"))) [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+              select (or(gt(numeric-add($$D, 1), 2018), eq(substring($$D, 0, 4), "2011"))) [cardinality: 8.0, op-cost: 0.0, total-cost: 30.0]
               -- STREAM_SELECT  |PARTITIONED|
-                project ([$$D]) [cardinality: 30.0, op-cost: 0.0, total-cost: 8.0]
+                project ([$$D]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  unnest $$D <- scan-collection($$54) [cardinality: 30.0, op-cost: 0.0, total-cost: 8.0]
+                  unnest $$D <- scan-collection($$54) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                   -- UNNEST  |PARTITIONED|
-                    project ([$$54]) [cardinality: 30.0, op-cost: 0.0, total-cost: 8.0]
+                    project ([$$54]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      assign [$$54] <- [$$C.getField("dates")] [cardinality: 30.0, op-cost: 0.0, total-cost: 8.0]
+                      assign [$$54] <- [$$C.getField("dates")] [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                       -- ASSIGN  |PARTITIONED|
-                        project ([$$C]) [cardinality: 30.0, op-cost: 0.0, total-cost: 8.0]
+                        project ([$$C]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                         -- STREAM_PROJECT  |PARTITIONED|
-                          exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 8.0]
+                          exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$52, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: or(gt(numeric-add(scan-collection($$C.getField("dates")), 1), 2018), eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011")) [cardinality: 30.0, op-cost: 8.0, total-cost: 8.0]
+                            data-scan []<-[$$52, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: or(gt(numeric-add(scan-collection($$C.getField("dates")), 1), 2018), eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011")) [cardinality: 30.0, op-cost: 30.0, total-cost: 30.0]
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/006/006.010.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/006/006.010.plan
index b217e0e..a66d6a8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/006/006.010.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/006/006.010.plan
@@ -1,20 +1,20 @@
-distribute result [$$51] [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+distribute result [$$51] [cardinality: 2.1, op-cost: 0.0, total-cost: 8.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$51]) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+    project ([$$51]) [cardinality: 2.1, op-cost: 0.0, total-cost: 8.0]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$51] <- [{"$1": $$53}] [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+      assign [$$51] <- [{"$1": $$53}] [cardinality: 2.1, op-cost: 0.0, total-cost: 8.0]
       -- ASSIGN  |UNPARTITIONED|
-        aggregate [$$53] <- [agg-sql-sum($$57)] [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+        aggregate [$$53] <- [agg-sql-sum($$57)] [cardinality: 2.1, op-cost: 0.0, total-cost: 8.0]
         -- AGGREGATE  |UNPARTITIONED|
-          exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.0]
           -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-            aggregate [$$57] <- [agg-sql-count(1)] [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+            aggregate [$$57] <- [agg-sql-count(1)] [cardinality: 2.1, op-cost: 0.0, total-cost: 8.0]
             -- AGGREGATE  |PARTITIONED|
-              select ($$44) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+              select ($$44) [cardinality: 2.1, op-cost: 0.0, total-cost: 8.0]
               -- STREAM_SELECT  |PARTITIONED|
-                project ([$$44]) [cardinality: 8.0, op-cost: 0.0, total-cost: 1.0]
+                project ([$$44]) [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
                 -- STREAM_PROJECT  |PARTITIONED|
                   subplan {
                             aggregate [$$44] <- [non-empty-stream()] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
@@ -27,17 +27,17 @@
                                   -- UNNEST  |LOCAL|
                                     nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- NESTED_TUPLE_SOURCE  |LOCAL|
-                         } [cardinality: 8.0, op-cost: 0.0, total-cost: 1.0]
+                         } [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
                   -- SUBPLAN  |PARTITIONED|
-                    project ([$$54]) [cardinality: 8.0, op-cost: 0.0, total-cost: 1.0]
+                    project ([$$54]) [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      assign [$$54] <- [$$c.getField("geo").getField("coordinates")] [cardinality: 8.0, op-cost: 0.0, total-cost: 1.0]
+                      assign [$$54] <- [$$c.getField("geo").getField("coordinates")] [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
                       -- ASSIGN  |PARTITIONED|
-                        project ([$$c]) [cardinality: 8.0, op-cost: 0.0, total-cost: 1.0]
+                        project ([$$c]) [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
                         -- STREAM_PROJECT  |PARTITIONED|
-                          exchange [cardinality: 8.0, op-cost: 0.0, total-cost: 1.0]
+                          exchange [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$52, $$c] <- test.ColumnDataset project ({geo:{coordinates:[{lon:any}]}}) [cardinality: 8.0, op-cost: 1.0, total-cost: 1.0]
+                            data-scan []<-[$$52, $$c] <- test.ColumnDataset project ({geo:{coordinates:[{lon:any}]}}) [cardinality: 8.0, op-cost: 8.0, total-cost: 8.0]
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/007/007.010.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/007/007.010.plan
index a5f30b3..307a75a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/007/007.010.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/007/007.010.plan
@@ -1,24 +1,24 @@
-distribute result [$$37] [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+distribute result [$$37] [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$37]) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+    project ([$$37]) [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$37] <- [{"$1": $$39}] [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+      assign [$$37] <- [{"$1": $$39}] [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
       -- ASSIGN  |UNPARTITIONED|
-        aggregate [$$39] <- [agg-sql-sum($$42)] [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+        aggregate [$$39] <- [agg-sql-sum($$42)] [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
         -- AGGREGATE  |UNPARTITIONED|
-          exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
           -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-            aggregate [$$42] <- [agg-sql-count(1)] [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+            aggregate [$$42] <- [agg-sql-count(1)] [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
             -- AGGREGATE  |PARTITIONED|
-              select (array-contains($$C.getField("checkin_times").getField("dates"), "2018-05-25")) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
+              select (array-contains($$C.getField("checkin_times").getField("dates"), "2018-05-25")) [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
               -- STREAM_SELECT  |PARTITIONED|
-                project ([$$C]) [cardinality: 30.0, op-cost: 0.0, total-cost: 1.0]
+                project ([$$C]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 1.0]
+                  exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    data-scan []<-[$$38, $$C] <- TestYelp.YelpCheckin project ({checkin_times:{dates:any}}) [cardinality: 30.0, op-cost: 1.0, total-cost: 1.0]
+                    data-scan []<-[$$38, $$C] <- TestYelp.YelpCheckin project ({checkin_times:{dates:any}}) [cardinality: 30.0, op-cost: 30.0, total-cost: 30.0]
                     -- DATASOURCE_SCAN  |PARTITIONED|
                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/not-in_every/not-in_every.101.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/not-in_every/not-in_every.101.plan
index f4aae0b..8a40740 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/not-in_every/not-in_every.101.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/not-in_every/not-in_every.101.plan
@@ -1,20 +1,20 @@
-distribute result [$$d] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+distribute result [$$d] [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$d]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+    project ([$$d]) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
       -- SORT_MERGE_EXCHANGE [$$20(ASC) ]  |PARTITIONED|
-        order (ASC, $$20) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+        order (ASC, $$20) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
         -- STABLE_SORT [$$20(ASC)]  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            project ([$$d, $$20]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+            project ([$$d, $$20]) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_PROJECT  |PARTITIONED|
-              select ($$18) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+              select ($$18) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
               -- STREAM_SELECT  |PARTITIONED|
-                project ([$$20, $$d, $$18]) [cardinality: 6.0, op-cost: 0.0, total-cost: 2.1]
+                project ([$$20, $$d, $$18]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                 -- STREAM_PROJECT  |PARTITIONED|
                   subplan {
                             aggregate [$$18] <- [empty-stream()] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
@@ -23,13 +23,13 @@
                               -- STREAM_SELECT  |LOCAL|
                                 nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- NESTED_TUPLE_SOURCE  |LOCAL|
-                         } [cardinality: 6.0, op-cost: 0.0, total-cost: 2.1]
+                         } [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                   -- SUBPLAN  |PARTITIONED|
-                    assign [$$21] <- [$$d.getField("a")] [cardinality: 6.0, op-cost: 0.0, total-cost: 2.1]
+                    assign [$$21] <- [$$d.getField("a")] [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                     -- ASSIGN  |PARTITIONED|
-                      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 2.1]
+                      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$20, $$d] <- test.ColumnDataset [cardinality: 6.0, op-cost: 2.1, total-cost: 2.1]
+                        data-scan []<-[$$20, $$d] <- test.ColumnDataset [cardinality: 6.0, op-cost: 6.0, total-cost: 6.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/not-in_every/not-in_every.201.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/not-in_every/not-in_every.201.plan
index a768c38..26874d9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/not-in_every/not-in_every.201.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/not-in_every/not-in_every.201.plan
@@ -31,7 +31,7 @@
                       -- STREAM_PROJECT  |PARTITIONED|
                         exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          left outer join (not(if-missing-or-null(neq($$21, $#1), false))) [cardinality: 2.1, op-cost: 6.0, total-cost: 17.0]
+                          left outer join (not(if-missing-or-null(neq($$21, $#1), false))) [cardinality: 6.6, op-cost: 12.6, total-cost: 29.1]
                           -- NESTED_LOOP  |PARTITIONED|
                             exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/not-in_every/not-in_every.301.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/not-in_every/not-in_every.301.plan
index 9ed9fc9..e115d34 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/not-in_every/not-in_every.301.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/not-in_every/not-in_every.301.plan
@@ -1,20 +1,20 @@
-distribute result [$$d] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+distribute result [$$d] [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$d]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+    project ([$$d]) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
       -- SORT_MERGE_EXCHANGE [$$28(ASC) ]  |PARTITIONED|
-        order (ASC, $$28) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+        order (ASC, $$28) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
         -- STABLE_SORT [$$28(ASC)]  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            project ([$$d, $$28]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+            project ([$$d, $$28]) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_PROJECT  |PARTITIONED|
-              select ($$26) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+              select ($$26) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
               -- STREAM_SELECT  |PARTITIONED|
-                project ([$$28, $$d, $$26]) [cardinality: 6.0, op-cost: 0.0, total-cost: 2.1]
+                project ([$$28, $$d, $$26]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                 -- STREAM_PROJECT  |PARTITIONED|
                   subplan {
                             aggregate [$$26] <- [empty-stream()] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
@@ -25,13 +25,13 @@
                                 -- UNNEST  |LOCAL|
                                   nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- NESTED_TUPLE_SOURCE  |LOCAL|
-                         } [cardinality: 6.0, op-cost: 0.0, total-cost: 2.1]
+                         } [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                   -- SUBPLAN  |PARTITIONED|
-                    assign [$$29] <- [$$d.getField("array")] [cardinality: 6.0, op-cost: 0.0, total-cost: 2.1]
+                    assign [$$29] <- [$$d.getField("array")] [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                     -- ASSIGN  |PARTITIONED|
-                      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 2.1]
+                      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$28, $$d] <- test.ColumnDataset [cardinality: 6.0, op-cost: 2.1, total-cost: 2.1]
+                        data-scan []<-[$$28, $$d] <- test.ColumnDataset [cardinality: 6.0, op-cost: 6.0, total-cost: 6.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.004.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.004.plan
index afa9eea..8bb276d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.004.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.004.plan
@@ -1,26 +1,26 @@
-distribute result [$$18] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+distribute result [$$18] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$18]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+    project ([$$18]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$18] <- [{"display_url": $$22}] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+      assign [$$18] <- [{"display_url": $$22}] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
       -- ASSIGN  |PARTITIONED|
-        project ([$$22]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+        project ([$$22]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
         -- STREAM_PROJECT  |PARTITIONED|
-          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
           -- SORT_MERGE_EXCHANGE [$$20(ASC) ]  |PARTITIONED|
-            order (ASC, $$20) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+            order (ASC, $$20) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
             -- STABLE_SORT [$$20(ASC)]  |PARTITIONED|
-              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                project ([$$22, $$20]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                project ([$$22, $$20]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  assign [$$22] <- [get-item($$p.getField("entities").getField("urls"), 0).getField("display_url")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                  assign [$$22] <- [get-item($$p.getField("entities").getField("urls"), 0).getField("display_url")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                   -- ASSIGN  |PARTITIONED|
-                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      data-scan []<-[$$20, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                      data-scan []<-[$$20, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                       -- DATASOURCE_SCAN  |PARTITIONED|
                         exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.006.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.006.plan
index 342dfc1..954ac47 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.006.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.006.plan
@@ -20,13 +20,13 @@
                   -- ASSIGN  |PARTITIONED|
                     select (not(is-missing($$24))) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                     -- STREAM_SELECT  |PARTITIONED|
-                      project ([$$25, $$24]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                      project ([$$25, $$24]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                       -- STREAM_PROJECT  |PARTITIONED|
-                        assign [$$24] <- [$$p.getField("entities").getField("urls")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                        assign [$$24] <- [$$p.getField("entities").getField("urls")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                         -- ASSIGN  |PARTITIONED|
-                          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$25, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                            data-scan []<-[$$25, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.008.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.008.plan
index 40c755a..4ae4d46 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.008.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.008.plan
@@ -1,30 +1,30 @@
-distribute result [$$28] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+distribute result [$$28] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$28]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+    project ([$$28]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$28] <- [{"display_url": $$urls.getField("display_url")}] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+      assign [$$28] <- [{"display_url": $$urls.getField("display_url")}] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
       -- ASSIGN  |PARTITIONED|
-        project ([$$urls]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+        project ([$$urls]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
         -- STREAM_PROJECT  |PARTITIONED|
-          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
           -- SORT_MERGE_EXCHANGE [$$30(ASC) ]  |PARTITIONED|
-            order (ASC, $$30) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+            order (ASC, $$30) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
             -- STABLE_SORT [$$30(ASC)]  |PARTITIONED|
-              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                project ([$$urls, $$30]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                project ([$$urls, $$30]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  unnest $$urls <- scan-collection($$31) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                  unnest $$urls <- scan-collection($$31) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                   -- UNNEST  |PARTITIONED|
-                    project ([$$30, $$31]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                    project ([$$30, $$31]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      assign [$$31] <- [$$p.getField("entities").getField("urls")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                      assign [$$31] <- [$$p.getField("entities").getField("urls")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                       -- ASSIGN  |PARTITIONED|
-                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          data-scan []<-[$$30, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                          data-scan []<-[$$30, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                           -- DATASOURCE_SCAN  |PARTITIONED|
                             exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.010.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.010.plan
index d0bf0f0..e50e0db 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.010.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.010.plan
@@ -10,7 +10,7 @@
         -- AGGREGATE  |PARTITIONED|
           select ($$42) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
           -- STREAM_SELECT  |PARTITIONED|
-            project ([$$42]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+            project ([$$42]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
             -- STREAM_PROJECT  |PARTITIONED|
               subplan {
                         aggregate [$$42] <- [empty-stream()] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
@@ -23,17 +23,17 @@
                               -- UNNEST  |LOCAL|
                                 nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- NESTED_TUPLE_SOURCE  |LOCAL|
-                     } [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                     } [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
               -- SUBPLAN  |PARTITIONED|
-                project ([$$51]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                project ([$$51]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  assign [$$51] <- [$$p.getField("entities").getField("urls")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                  assign [$$51] <- [$$p.getField("entities").getField("urls")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                   -- ASSIGN  |PARTITIONED|
-                    project ([$$p]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                    project ([$$p]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$49, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                        data-scan []<-[$$49, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.012.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.012.plan
index 3157c17..4832473 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.012.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.012.plan
@@ -1,26 +1,26 @@
-distribute result [$$19] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+distribute result [$$19] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$19]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+    project ([$$19]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$19] <- [get-item(get-item(get-item($$25.getField("coordinates"), 0), 0), 0)] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+      assign [$$19] <- [get-item(get-item(get-item($$25.getField("coordinates"), 0), 0), 0)] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
       -- ASSIGN  |PARTITIONED|
-        project ([$$25]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+        project ([$$25]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
         -- STREAM_PROJECT  |PARTITIONED|
-          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
           -- SORT_MERGE_EXCHANGE [$$21(ASC) ]  |PARTITIONED|
-            order (ASC, $$21) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+            order (ASC, $$21) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
             -- STABLE_SORT [$$21(ASC)]  |PARTITIONED|
-              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                project ([$$25, $$21]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                project ([$$25, $$21]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  assign [$$25] <- [$$p.getField("place").getField("bounding_box")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                  assign [$$25] <- [$$p.getField("place").getField("bounding_box")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                   -- ASSIGN  |PARTITIONED|
-                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      data-scan []<-[$$21, $$p] <- test.ColumnDataset project ({place:{bounding_box:{coordinates:[[[any]]]}}}) [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                      data-scan []<-[$$21, $$p] <- test.ColumnDataset project ({place:{bounding_box:{coordinates:[[[any]]]}}}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                       -- DATASOURCE_SCAN  |PARTITIONED|
                         exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/field-access-pushdown/field-access-pushdown.008.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/field-access-pushdown/field-access-pushdown.008.plan
index acf9d3b..653d2bb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/field-access-pushdown/field-access-pushdown.008.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/field-access-pushdown/field-access-pushdown.008.plan
@@ -1,44 +1,50 @@
-distribute result [$$31] [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+distribute result [$$31] [cardinality: 8.0, op-cost: 0.0, total-cost: 45.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+  exchange [cardinality: 8.0, op-cost: 0.0, total-cost: 45.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$31]) [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+    project ([$$31]) [cardinality: 8.0, op-cost: 0.0, total-cost: 45.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$31] <- [{"age": $$38, "name": $$39}] [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+      assign [$$31] <- [{"age": $$38, "name": $$39}] [cardinality: 8.0, op-cost: 0.0, total-cost: 45.0]
       -- ASSIGN  |PARTITIONED|
-        project ([$$38, $$39]) [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+        project ([$$38, $$39]) [cardinality: 8.0, op-cost: 0.0, total-cost: 45.0]
         -- STREAM_PROJECT  |PARTITIONED|
-          exchange [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+          exchange [cardinality: 8.0, op-cost: 0.0, total-cost: 45.0]
           -- SORT_MERGE_EXCHANGE [$$34(ASC) ]  |PARTITIONED|
-            order (ASC, $$34) [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+            order (ASC, $$34) [cardinality: 8.0, op-cost: 0.0, total-cost: 45.0]
             -- STABLE_SORT [$$34(ASC)]  |PARTITIONED|
-              exchange [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+              exchange [cardinality: 8.0, op-cost: 0.0, total-cost: 45.0]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                project ([$$38, $$39, $$34]) [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+                project ([$$38, $$39, $$34]) [cardinality: 8.0, op-cost: 0.0, total-cost: 45.0]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  assign [$$39] <- [$$p2.getField("name")] [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
-                  -- ASSIGN  |PARTITIONED|
-                    project ([$$38, $$34, $$p2]) [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
-                    -- STREAM_PROJECT  |PARTITIONED|
-                      exchange [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
-                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        unnest-map [$$34, $$p2] <- index-search("ColumnDataset3", 0, "test", "ColumnDataset3", true, true, 1, $$33, 1, $$33, true, true, true) project ({name:any}) [cardinality: 8.0, op-cost: 8.0, total-cost: 8.0]
-                        -- BTREE_SEARCH  |PARTITIONED|
-                          exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            order (ASC, $$33) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                            -- STABLE_SORT [$$33(ASC)]  |PARTITIONED|
-                              exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                              -- HASH_PARTITION_EXCHANGE [$$33]  |PARTITIONED|
-                                project ([$$33, $$38]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- STREAM_PROJECT  |PARTITIONED|
-                                  assign [$$38] <- [$$p1.getField("age")] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- ASSIGN  |PARTITIONED|
-                                    exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      data-scan []<-[$$33, $$p1] <- test.ColumnDataset1 project ({age:any}) [cardinality: 7.0, op-cost: 7.0, total-cost: 7.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|
+                  exchange [cardinality: 8.0, op-cost: 0.0, total-cost: 45.0]
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    join (eq($$33, $$34)) [cardinality: 8.0, op-cost: 15.0, total-cost: 45.0]
+                    -- HYBRID_HASH_JOIN [$$34][$$33]  |PARTITIONED|
+                      exchange [cardinality: 8.0, op-cost: 8.0, total-cost: 16.0]
+                      -- HASH_PARTITION_EXCHANGE [$$34]  |PARTITIONED|
+                        project ([$$39, $$34]) [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+                        -- STREAM_PROJECT  |PARTITIONED|
+                          assign [$$39] <- [$$p2.getField("name")] [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
+                          -- ASSIGN  |PARTITIONED|
+                            exchange [cardinality: 8.0, op-cost: 8.0, total-cost: 16.0]
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              data-scan []<-[$$34, $$p2] <- test.ColumnDataset3 project ({name:any}) [cardinality: 8.0, op-cost: 8.0, total-cost: 8.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|
+                      exchange [cardinality: 7.0, op-cost: 7.0, total-cost: 14.0]
+                      -- HASH_PARTITION_EXCHANGE [$$33]  |PARTITIONED|
+                        project ([$$38, $$33]) [cardinality: 7.0, op-cost: 0.0, total-cost: 7.0]
+                        -- STREAM_PROJECT  |PARTITIONED|
+                          assign [$$38] <- [$$p1.getField("age")] [cardinality: 7.0, op-cost: 0.0, total-cost: 7.0]
+                          -- ASSIGN  |PARTITIONED|
+                            exchange [cardinality: 7.0, op-cost: 7.0, total-cost: 14.0]
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              data-scan []<-[$$33, $$p1] <- test.ColumnDataset1 project ({age:any}) [cardinality: 7.0, op-cost: 7.0, total-cost: 7.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|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/field-access-pushdown/field-access-pushdown.010.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/field-access-pushdown/field-access-pushdown.010.plan
index 6b9b1d8..c89f877 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/field-access-pushdown/field-access-pushdown.010.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/field-access-pushdown/field-access-pushdown.010.plan
@@ -1,24 +1,24 @@
-distribute result [$$18] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+distribute result [$$18] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$18]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+    project ([$$18]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$18] <- [{"id": $$20.getField("id"), "name": $$20.getField("name")}] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+      assign [$$18] <- [{"id": $$20.getField("id"), "name": $$20.getField("name")}] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
       -- ASSIGN  |PARTITIONED|
-        project ([$$20]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+        project ([$$20]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
         -- STREAM_PROJECT  |PARTITIONED|
-          assign [$$20] <- [$$p.getField("user")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+          assign [$$20] <- [$$p.getField("user")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
           -- ASSIGN  |PARTITIONED|
-            project ([$$p]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+            project ([$$p]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
             -- STREAM_PROJECT  |PARTITIONED|
-              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
               -- SORT_MERGE_EXCHANGE [$$21(ASC) ]  |PARTITIONED|
-                order (ASC, $$21) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                order (ASC, $$21) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                 -- STABLE_SORT [$$21(ASC)]  |PARTITIONED|
-                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    data-scan []<-[$$21, $$p] <- test.ColumnDataset4 project ({user:{name:any,id:any}}) [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                    data-scan []<-[$$21, $$p] <- test.ColumnDataset4 project ({user:{name:any,id:any}}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                     -- DATASOURCE_SCAN  |PARTITIONED|
                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/field-access-pushdown/field-access-pushdown.012.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/field-access-pushdown/field-access-pushdown.012.plan
index 92b7106..c4b9b3b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/field-access-pushdown/field-access-pushdown.012.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/field-access-pushdown/field-access-pushdown.012.plan
@@ -1,16 +1,16 @@
-distribute result [$$34] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+distribute result [$$34] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    aggregate [$$34] <- [agg-sql-sum($$35)] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+    aggregate [$$34] <- [agg-sql-sum($$35)] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
     -- AGGREGATE  |UNPARTITIONED|
-      exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        aggregate [$$35] <- [agg-sql-count(1)] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+        aggregate [$$35] <- [agg-sql-count(1)] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
         -- AGGREGATE  |PARTITIONED|
-          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            data-scan []<-[$$33, $$p] <- test.ColumnDataset4 project ({}) [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+            data-scan []<-[$$33, $$p] <- test.ColumnDataset4 project ({}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
             -- DATASOURCE_SCAN  |PARTITIONED|
               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.004.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.004.plan
index e957155..6168bb4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.004.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.004.plan
@@ -1,36 +1,40 @@
-distribute result [$$61] [cardinality: 2.21, op-cost: 0.0, total-cost: 12.6]
+distribute result [$$61] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 2.21, op-cost: 0.0, total-cost: 12.6]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$61]) [cardinality: 2.21, op-cost: 0.0, total-cost: 12.6]
+    project ([$$61]) [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$61] <- [{"$1": $$66, "$2": $$67}] [cardinality: 2.21, op-cost: 0.0, total-cost: 12.6]
+      assign [$$61] <- [{"$1": $$66, "$2": $$67}] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
       -- ASSIGN  |UNPARTITIONED|
-        aggregate [$$66, $$67] <- [agg-global-sql-sum($$70), agg-global-sql-sum($$71)] [cardinality: 2.21, op-cost: 0.0, total-cost: 12.6]
+        aggregate [$$66, $$67] <- [agg-global-sql-sum($$70), agg-global-sql-sum($$71)] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
         -- AGGREGATE  |UNPARTITIONED|
-          exchange [cardinality: 2.21, op-cost: 0.0, total-cost: 12.6]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
           -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-            aggregate [$$70, $$71] <- [agg-local-sql-sum($$54), agg-local-sql-sum($$59)] [cardinality: 2.21, op-cost: 0.0, total-cost: 12.6]
+            aggregate [$$70, $$71] <- [agg-local-sql-sum($$54), agg-local-sql-sum($$59)] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
             -- AGGREGATE  |PARTITIONED|
-              project ([$$54, $$59]) [cardinality: 2.21, op-cost: 0.0, total-cost: 12.6]
+              project ([$$54, $$59]) [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
               -- STREAM_PROJECT  |PARTITIONED|
-                assign [$$59, $$54] <- [object-length($$p2), object-length($$p1)] [cardinality: 2.21, op-cost: 0.0, total-cost: 12.6]
+                assign [$$59, $$54] <- [object-length($$p2), object-length($$p1)] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
                 -- ASSIGN  |PARTITIONED|
-                  project ([$$p1, $$p2]) [cardinality: 2.21, op-cost: 0.0, total-cost: 12.6]
+                  project ([$$p1, $$p2]) [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
                   -- STREAM_PROJECT  |PARTITIONED|
-                    exchange [cardinality: 2.21, op-cost: 0.0, total-cost: 12.6]
+                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      unnest-map [$$63, $$p2] <- index-search("RowDataset", 0, "test", "RowDataset", true, true, 1, $$62, 1, $$62, true, true, true) [cardinality: 2.21, op-cost: 2.1, total-cost: 12.6]
-                      -- BTREE_SEARCH  |PARTITIONED|
-                        exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          order (ASC, $$62) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                          -- STABLE_SORT [$$62(ASC)]  |PARTITIONED|
+                      join (eq($$63, $$62)) [cardinality: 2.1, op-cost: 4.2, total-cost: 12.6]
+                      -- HYBRID_HASH_JOIN [$$62][$$63]  |PARTITIONED|
+                        exchange [cardinality: 2.1, op-cost: 2.1, total-cost: 4.2]
+                        -- HASH_PARTITION_EXCHANGE [$$62]  |PARTITIONED|
+                          data-scan []<-[$$62, $$p1] <- test.ColumnDataset [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                          -- DATASOURCE_SCAN  |PARTITIONED|
                             exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                            -- HASH_PARTITION_EXCHANGE [$$62]  |PARTITIONED|
-                              data-scan []<-[$$62, $$p1] <- test.ColumnDataset [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
-                              -- 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|
+                            -- 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: 2.1, op-cost: 2.1, total-cost: 4.2]
+                        -- HASH_PARTITION_EXCHANGE [$$63]  |PARTITIONED|
+                          data-scan []<-[$$63, $$p2] <- test.RowDataset [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                          -- 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|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.006.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.006.plan
index ab6b6cb..4cb5569 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.006.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.006.plan
@@ -20,9 +20,9 @@
                   -- HASH_PARTITION_EXCHANGE [$$p1]  |PARTITIONED|
                     select (neq($$16, "0")) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                     -- STREAM_SELECT  |PARTITIONED|
-                      exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$16, $$p1] <- test.ColumnDataset [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                        data-scan []<-[$$16, $$p1] <- test.ColumnDataset [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.008.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.008.plan
index 6ededae..a450f96 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.008.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.008.plan
@@ -28,23 +28,23 @@
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                   select (eq(lowercase($$71), "string")) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                   -- STREAM_SELECT  |PARTITIONED|
-                    project ([$$75, $$71]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                    project ([$$75, $$71]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      assign [$$71] <- [$$ht.getField("display_url")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                      assign [$$71] <- [$$ht.getField("display_url")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                       -- ASSIGN  |PARTITIONED|
-                        unnest $$ht <- scan-collection($$75) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                        unnest $$ht <- scan-collection($$75) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                         -- UNNEST  |PARTITIONED|
-                          project ([$$75]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                          project ([$$75]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                           -- STREAM_PROJECT  |PARTITIONED|
-                            assign [$$75] <- [$$p1.getField("entities").getField("urls")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                            assign [$$75] <- [$$p1.getField("entities").getField("urls")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                             -- ASSIGN  |PARTITIONED|
-                              project ([$$p1]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                              project ([$$p1]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                               -- STREAM_PROJECT  |PARTITIONED|
                                 select (neq($$72, "0")) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- STREAM_SELECT  |PARTITIONED|
-                                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    data-scan []<-[$$72, $$p1] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) filter on: eq(lowercase(scan-collection($$p1.getField("entities").getField("urls")).getField("display_url")), "string") [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                                    data-scan []<-[$$72, $$p1] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) filter on: eq(lowercase(scan-collection($$p1.getField("entities").getField("urls")).getField("display_url")), "string") [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                                     -- DATASOURCE_SCAN  |PARTITIONED|
                                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.010.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.010.plan
index 402e741..e57d660 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.010.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.010.plan
@@ -28,25 +28,25 @@
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                   select (eq(lowercase($$70), "string")) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                   -- STREAM_SELECT  |PARTITIONED|
-                    project ([$$75, $$70]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                    project ([$$75, $$70]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      assign [$$75, $$70] <- [$$ht.getField("indices"), $$ht.getField("display_url")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                      assign [$$75, $$70] <- [$$ht.getField("indices"), $$ht.getField("display_url")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                       -- ASSIGN  |PARTITIONED|
-                        project ([$$ht]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                        project ([$$ht]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                         -- STREAM_PROJECT  |PARTITIONED|
-                          unnest $$ht <- scan-collection($$74) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                          unnest $$ht <- scan-collection($$74) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                           -- UNNEST  |PARTITIONED|
-                            project ([$$74]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                            project ([$$74]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                             -- STREAM_PROJECT  |PARTITIONED|
-                              assign [$$74] <- [$$p1.getField("entities").getField("urls")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                              assign [$$74] <- [$$p1.getField("entities").getField("urls")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                               -- ASSIGN  |PARTITIONED|
-                                project ([$$p1]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                project ([$$p1]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                 -- STREAM_PROJECT  |PARTITIONED|
                                   select (neq($$71, "0")) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- STREAM_SELECT  |PARTITIONED|
-                                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      data-scan []<-[$$71, $$p1] <- test.ColumnDataset project ({entities:{urls:[{display_url:any,indices:any}]}}) filter on: eq(lowercase(scan-collection($$p1.getField("entities").getField("urls")).getField("display_url")), "string") [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                                      data-scan []<-[$$71, $$p1] <- test.ColumnDataset project ({entities:{urls:[{display_url:any,indices:any}]}}) filter on: eq(lowercase(scan-collection($$p1.getField("entities").getField("urls")).getField("display_url")), "string") [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                                       -- DATASOURCE_SCAN  |PARTITIONED|
                                         exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.012.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.012.plan
index 16f1d72..4d0c38a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.012.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.012.plan
@@ -20,13 +20,13 @@
                   -- ASSIGN  |PARTITIONED|
                     select (eq(sql-count($$24), 1)) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                     -- STREAM_SELECT  |PARTITIONED|
-                      project ([$$25, $$24]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                      project ([$$25, $$24]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                       -- STREAM_PROJECT  |PARTITIONED|
-                        assign [$$24] <- [$$p.getField("entities").getField("urls")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                        assign [$$24] <- [$$p.getField("entities").getField("urls")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                         -- ASSIGN  |PARTITIONED|
-                          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$25, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                            data-scan []<-[$$25, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.014.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.014.plan
index 6db5e85..a207f43 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.014.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.014.plan
@@ -1,42 +1,42 @@
-distribute result [$$101] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+distribute result [$$101] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$101]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+    project ([$$101]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$101] <- [{"uname": $$uname, "cnt": $$105}] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+      assign [$$101] <- [{"uname": $$uname, "cnt": $$105}] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
         -- SORT_MERGE_EXCHANGE [$$105(DESC), $$uname(ASC) ]  |PARTITIONED|
-          order (DESC, $$105) (ASC, $$uname) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+          order (DESC, $$105) (ASC, $$uname) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
           -- STABLE_SORT [$$105(DESC), $$uname(ASC)]  |PARTITIONED|
-            exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               group by ([$$uname := $$116]) decor ([]) {
                         aggregate [$$105] <- [agg-sql-sum($$115)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- AGGREGATE  |LOCAL|
                           nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
-                     } [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                     } [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
               -- SORT_GROUP_BY[$$116]  |PARTITIONED|
-                exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                 -- HASH_PARTITION_EXCHANGE [$$116]  |PARTITIONED|
                   group by ([$$116 := $$102]) decor ([]) {
                             aggregate [$$115] <- [agg-sql-count(1)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- AGGREGATE  |LOCAL|
                               nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- NESTED_TUPLE_SOURCE  |LOCAL|
-                         } [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                         } [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                   -- SORT_GROUP_BY[$$102]  |PARTITIONED|
-                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      project ([$$102]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                      project ([$$102]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                       -- STREAM_PROJECT  |PARTITIONED|
                         select ($$92) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- STREAM_SELECT  |PARTITIONED|
-                          project ([$$92, $$102]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                          project ([$$92, $$102]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                           -- STREAM_PROJECT  |PARTITIONED|
-                            exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                               group by ([$$114 := $$112]) decor ([$$102]) {
                                         aggregate [$$92] <- [non-empty-stream()] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
@@ -45,41 +45,41 @@
                                           -- STREAM_SELECT  |LOCAL|
                                             nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                             -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                     } [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                     } [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                               -- PRE_CLUSTERED_GROUP_BY[$$112]  |PARTITIONED|
-                                exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  order (ASC, $$112) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                  order (ASC, $$112) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                   -- STABLE_SORT [$$112(ASC)]  |PARTITIONED|
-                                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                     -- HASH_PARTITION_EXCHANGE [$$112]  |PARTITIONED|
-                                      project ([$$102, $$113, $$112]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                      project ([$$102, $$113, $$112]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                       -- STREAM_PROJECT  |PARTITIONED|
-                                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          left outer join (eq($$106, $$88)) [cardinality: 2.21, op-cost: 4.2, total-cost: 12.6]
+                                          left outer join (eq($$106, $$88)) [cardinality: 2.1, op-cost: 4.2, total-cost: 12.6]
                                           -- HYBRID_HASH_JOIN [$$106][$$88]  |PARTITIONED|
-                                            exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                             -- HASH_PARTITION_EXCHANGE [$$106]  |PARTITIONED|
-                                              running-aggregate [$$112] <- [create-query-uid()] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                              running-aggregate [$$112] <- [create-query-uid()] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                               -- RUNNING_AGGREGATE  |PARTITIONED|
-                                                project ([$$102, $$106]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                project ([$$102, $$106]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                 -- STREAM_PROJECT  |PARTITIONED|
-                                                  assign [$$106] <- [$$ht1.getField("display_url")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                  assign [$$106] <- [$$ht1.getField("display_url")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                   -- ASSIGN  |PARTITIONED|
-                                                    project ([$$102, $$ht1]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                    project ([$$102, $$ht1]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                     -- STREAM_PROJECT  |PARTITIONED|
-                                                      unnest $$ht1 <- scan-collection($$107) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                      unnest $$ht1 <- scan-collection($$107) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                       -- UNNEST  |PARTITIONED|
-                                                        project ([$$107, $$102]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                        project ([$$107, $$102]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                         -- STREAM_PROJECT  |PARTITIONED|
-                                                          assign [$$107, $$102] <- [$$p1.getField("entities").getField("urls"), $$p1.getField("user").getField("name")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                          assign [$$107, $$102] <- [$$p1.getField("entities").getField("urls"), $$p1.getField("user").getField("name")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                           -- ASSIGN  |PARTITIONED|
-                                                            project ([$$p1]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                            project ([$$p1]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                             -- STREAM_PROJECT  |PARTITIONED|
-                                                              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                data-scan []<-[$$103, $$p1] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]},user:{name:any}}) [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                                                                data-scan []<-[$$103, $$p1] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]},user:{name:any}}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                                                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                                                   exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -103,7 +103,7 @@
                                                           -- STREAM_PROJECT  |PARTITIONED|
                                                             exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                              data-scan []<-[$$104, $$p2] <- test.RowDataset [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                                                              data-scan []<-[$$104, $$p2] <- test.RowDataset [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                                                               -- DATASOURCE_SCAN  |PARTITIONED|
                                                                 exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.04.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.04.plan
index 0e78a96..5bf8d6d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.04.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.04.plan
@@ -1,66 +1,64 @@
-distribute result [$$51] [cardinality: 150.0, op-cost: 0.0, total-cost: 560.0]
+distribute result [$$51] [cardinality: 150.0, op-cost: 0.0, total-cost: 605.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 560.0]
+  exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 605.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$51]) [cardinality: 150.0, op-cost: 0.0, total-cost: 560.0]
+    project ([$$51]) [cardinality: 150.0, op-cost: 0.0, total-cost: 605.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$51] <- [{"n_nationkey": $$58, "s_nationkey": $$56, "c_nationkey": $$55}] [cardinality: 150.0, op-cost: 0.0, total-cost: 560.0]
+      assign [$$51] <- [{"n_nationkey": $$58, "s_nationkey": $$56, "c_nationkey": $$55}] [cardinality: 150.0, op-cost: 0.0, total-cost: 605.0]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 560.0]
+        exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 605.0]
         -- SORT_MERGE_EXCHANGE [$$58(ASC), $$56(ASC), $$55(ASC) ]  |PARTITIONED|
-          order (ASC, $$58) (ASC, $$56) (ASC, $$55) [cardinality: 150.0, op-cost: 0.0, total-cost: 560.0]
+          order (ASC, $$58) (ASC, $$56) (ASC, $$55) [cardinality: 150.0, op-cost: 0.0, total-cost: 605.0]
           -- STABLE_SORT [$$58(ASC), $$56(ASC), $$55(ASC)]  |PARTITIONED|
-            exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 560.0]
+            exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 605.0]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$58, $$56, $$55]) [cardinality: 150.0, op-cost: 0.0, total-cost: 560.0]
-              -- STREAM_PROJECT  |PARTITIONED|
-                exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 560.0]
-                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  join (and(eq($$55, $$58), eq($$56, $$66))) [cardinality: 150.0, op-cost: 175.0, total-cost: 560.0]
-                  -- HYBRID_HASH_JOIN [$$55, $$66][$$58, $$56]  |PARTITIONED|
-                    exchange [cardinality: 150.0, op-cost: 150.0, total-cost: 300.0]
-                    -- HASH_PARTITION_EXCHANGE [$$55, $$66]  |PARTITIONED|
-                      assign [$$66] <- [$$55] [cardinality: 150.0, op-cost: 0.0, total-cost: 150.0]
-                      -- ASSIGN  |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|
-                    exchange [cardinality: 25.0, op-cost: 25.0, total-cost: 85.0]
-                    -- HASH_PARTITION_EXCHANGE [$$58, $$56]  |PARTITIONED|
-                      project ([$$56, $$58]) [cardinality: 25.0, op-cost: 0.0, total-cost: 60.0]
+              join (eq($$55, $$58)) [cardinality: 150.0, op-cost: 175.0, total-cost: 605.0]
+              -- 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: 25.0, op-cost: 25.0, total-cost: 85.0]
+                        exchange [cardinality: 150.0, op-cost: 150.0, total-cost: 300.0]
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          unnest-map [$$58, $$n] <- index-search("Nation", 0, "tpch", "Nation", true, true, 1, $$56, 1, $$56, true, true, true) [cardinality: 25.0, op-cost: 10.0, total-cost: 60.0]
-                          -- BTREE_SEARCH  |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|
-                              order (ASC, $$56) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                              -- STABLE_SORT [$$56(ASC)]  |PARTITIONED|
+                              empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                exchange [cardinality: 25.0, op-cost: 25.0, total-cost: 130.0]
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  join (eq($$56, $$58)) [cardinality: 25.0, op-cost: 35.0, total-cost: 105.0]
+                  -- HYBRID_HASH_JOIN [$$58][$$56]  |PARTITIONED|
+                    exchange [cardinality: 25.0, op-cost: 25.0, total-cost: 50.0]
+                    -- HASH_PARTITION_EXCHANGE [$$58]  |PARTITIONED|
+                      project ([$$58]) [cardinality: 25.0, op-cost: 0.0, total-cost: 25.0]
+                      -- STREAM_PROJECT  |PARTITIONED|
+                        exchange [cardinality: 25.0, op-cost: 25.0, total-cost: 50.0]
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          data-scan []<-[$$58, $$n] <- tpch.Nation [cardinality: 25.0, op-cost: 25.0, total-cost: 25.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|
+                    exchange [cardinality: 10.0, op-cost: 10.0, total-cost: 20.0]
+                    -- HASH_PARTITION_EXCHANGE [$$56]  |PARTITIONED|
+                      project ([$$56]) [cardinality: 10.0, op-cost: 0.0, total-cost: 10.0]
+                      -- STREAM_PROJECT  |PARTITIONED|
+                        assign [$$56] <- [$$s.getField(3)] [cardinality: 10.0, op-cost: 0.0, total-cost: 10.0]
+                        -- ASSIGN  |PARTITIONED|
+                          project ([$$s]) [cardinality: 10.0, op-cost: 0.0, total-cost: 10.0]
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            exchange [cardinality: 10.0, op-cost: 10.0, total-cost: 20.0]
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              data-scan []<-[$$59, $$s] <- tpch.Supplier [cardinality: 10.0, op-cost: 10.0, total-cost: 10.0]
+                              -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- HASH_PARTITION_EXCHANGE [$$56]  |PARTITIONED|
-                                  project ([$$56]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- STREAM_PROJECT  |PARTITIONED|
-                                    assign [$$56] <- [$$s.getField(3)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                    -- ASSIGN  |PARTITIONED|
-                                      project ([$$s]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                      -- STREAM_PROJECT  |PARTITIONED|
-                                        exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          data-scan []<-[$$59, $$s] <- tpch.Supplier [cardinality: 10.0, op-cost: 10.0, total-cost: 10.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|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.10.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.10.plan
index b4a0891..e015463 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.10.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.10.plan
@@ -1,66 +1,64 @@
-distribute result [$$51] [cardinality: 150.0, op-cost: 0.0, total-cost: 500.0]
+distribute result [$$51] [cardinality: 150.0, op-cost: 0.0, total-cost: 555.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 500.0]
+  exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 555.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$51]) [cardinality: 150.0, op-cost: 0.0, total-cost: 500.0]
+    project ([$$51]) [cardinality: 150.0, op-cost: 0.0, total-cost: 555.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$51] <- [{"n_nationkey": $$58, "s_nationkey": $$56, "c_nationkey": $$55}] [cardinality: 150.0, op-cost: 0.0, total-cost: 500.0]
+      assign [$$51] <- [{"n_nationkey": $$58, "s_nationkey": $$56, "c_nationkey": $$55}] [cardinality: 150.0, op-cost: 0.0, total-cost: 555.0]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 500.0]
+        exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 555.0]
         -- SORT_MERGE_EXCHANGE [$$58(ASC), $$56(ASC), $$55(ASC) ]  |PARTITIONED|
-          order (ASC, $$58) (ASC, $$56) (ASC, $$55) [cardinality: 150.0, op-cost: 0.0, total-cost: 500.0]
+          order (ASC, $$58) (ASC, $$56) (ASC, $$55) [cardinality: 150.0, op-cost: 0.0, total-cost: 555.0]
           -- STABLE_SORT [$$58(ASC), $$56(ASC), $$55(ASC)]  |PARTITIONED|
-            exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 500.0]
+            exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 555.0]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$58, $$56, $$55]) [cardinality: 150.0, op-cost: 0.0, total-cost: 500.0]
-              -- STREAM_PROJECT  |PARTITIONED|
-                exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 500.0]
-                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  join (and(eq($$55, $$58), eq($$56, $$66))) [cardinality: 150.0, op-cost: 225.0, total-cost: 500.0]
-                  -- HYBRID_HASH_JOIN [$$55, $$66][$$58, $$56]  |PARTITIONED|
-                    exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 150.0]
-                    -- RANDOM_PARTITION_EXCHANGE  |PARTITIONED|
-                      assign [$$66] <- [$$55] [cardinality: 150.0, op-cost: 0.0, total-cost: 150.0]
-                      -- ASSIGN  |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: 0.0, total-cost: 150.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|
-                    exchange [cardinality: 25.0, op-cost: 75.0, total-cost: 125.0]
-                    -- BROADCAST_EXCHANGE  |PARTITIONED|
-                      project ([$$56, $$58]) [cardinality: 25.0, op-cost: 0.0, total-cost: 50.0]
+              join (eq($$55, $$58)) [cardinality: 150.0, op-cost: 225.0, total-cost: 555.0]
+              -- HYBRID_HASH_JOIN [$$55][$$58]  |PARTITIONED|
+                exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 150.0]
+                -- RANDOM_PARTITION_EXCHANGE  |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: 25.0, op-cost: 75.0, total-cost: 125.0]
+                        exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 150.0]
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          unnest-map [$$58, $$n] <- index-search("Nation", 0, "tpch", "Nation", true, true, 1, $$56, 1, $$56, true, true, true) [cardinality: 25.0, op-cost: 10.0, total-cost: 50.0]
-                          -- BTREE_SEARCH  |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|
-                              order (ASC, $$56) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                              -- STABLE_SORT [$$56(ASC)]  |PARTITIONED|
+                              empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                exchange [cardinality: 25.0, op-cost: 75.0, total-cost: 180.0]
+                -- BROADCAST_EXCHANGE  |PARTITIONED|
+                  join (eq($$56, $$58)) [cardinality: 25.0, op-cost: 35.0, total-cost: 105.0]
+                  -- HYBRID_HASH_JOIN [$$58][$$56]  |PARTITIONED|
+                    exchange [cardinality: 25.0, op-cost: 25.0, total-cost: 50.0]
+                    -- HASH_PARTITION_EXCHANGE [$$58]  |PARTITIONED|
+                      project ([$$58]) [cardinality: 25.0, op-cost: 0.0, total-cost: 25.0]
+                      -- STREAM_PROJECT  |PARTITIONED|
+                        exchange [cardinality: 25.0, op-cost: 25.0, total-cost: 50.0]
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          data-scan []<-[$$58, $$n] <- tpch.Nation [cardinality: 25.0, op-cost: 25.0, total-cost: 25.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|
+                    exchange [cardinality: 10.0, op-cost: 10.0, total-cost: 20.0]
+                    -- HASH_PARTITION_EXCHANGE [$$56]  |PARTITIONED|
+                      project ([$$56]) [cardinality: 10.0, op-cost: 0.0, total-cost: 10.0]
+                      -- STREAM_PROJECT  |PARTITIONED|
+                        assign [$$56] <- [$$s.getField(3)] [cardinality: 10.0, op-cost: 0.0, total-cost: 10.0]
+                        -- ASSIGN  |PARTITIONED|
+                          project ([$$s]) [cardinality: 10.0, op-cost: 0.0, total-cost: 10.0]
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            exchange [cardinality: 10.0, op-cost: 10.0, total-cost: 20.0]
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              data-scan []<-[$$59, $$s] <- tpch.Supplier [cardinality: 10.0, op-cost: 10.0, total-cost: 10.0]
+                              -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- HASH_PARTITION_EXCHANGE [$$56]  |PARTITIONED|
-                                  project ([$$56]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- STREAM_PROJECT  |PARTITIONED|
-                                    assign [$$56] <- [$$s.getField(3)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                    -- ASSIGN  |PARTITIONED|
-                                      project ([$$s]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                      -- STREAM_PROJECT  |PARTITIONED|
-                                        exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          data-scan []<-[$$59, $$s] <- tpch.Supplier [cardinality: 10.0, op-cost: 10.0, total-cost: 10.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|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.14.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.14.plan
index ea91cd5..71a6d82 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.14.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.14.plan
@@ -1,22 +1,22 @@
-distribute result [$$51] [cardinality: 150.0, op-cost: 0.0, total-cost: 560.0]
+distribute result [$$51] [cardinality: 150.0, op-cost: 0.0, total-cost: 615.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 560.0]
+  exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 615.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$51]) [cardinality: 150.0, op-cost: 0.0, total-cost: 560.0]
+    project ([$$51]) [cardinality: 150.0, op-cost: 0.0, total-cost: 615.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$51] <- [{"n_nationkey": $$59, "s_nationkey": $$56, "c_nationkey": $$55}] [cardinality: 150.0, op-cost: 0.0, total-cost: 560.0]
+      assign [$$51] <- [{"n_nationkey": $$59, "s_nationkey": $$56, "c_nationkey": $$55}] [cardinality: 150.0, op-cost: 0.0, total-cost: 615.0]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 560.0]
+        exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 615.0]
         -- SORT_MERGE_EXCHANGE [$$59(ASC), $$56(ASC), $$55(ASC) ]  |PARTITIONED|
-          order (ASC, $$59) (ASC, $$56) (ASC, $$55) [cardinality: 150.0, op-cost: 0.0, total-cost: 560.0]
+          order (ASC, $$59) (ASC, $$56) (ASC, $$55) [cardinality: 150.0, op-cost: 0.0, total-cost: 615.0]
           -- STABLE_SORT [$$59(ASC), $$56(ASC), $$55(ASC)]  |PARTITIONED|
-            exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 560.0]
+            exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 615.0]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$59, $$56, $$55]) [cardinality: 150.0, op-cost: 0.0, total-cost: 560.0]
+              project ([$$59, $$56, $$55]) [cardinality: 150.0, op-cost: 0.0, total-cost: 615.0]
               -- STREAM_PROJECT  |PARTITIONED|
-                exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 560.0]
+                exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 615.0]
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  join (and(eq($$55, $$59), eq($$56, $$66))) [cardinality: 150.0, op-cost: 175.0, total-cost: 560.0]
+                  join (and(eq($$55, $$59), eq($$56, $$66))) [cardinality: 150.0, op-cost: 175.0, total-cost: 615.0]
                   -- HYBRID_HASH_JOIN [$$55, $$66][$$59, $$56]  |PARTITIONED|
                     exchange [cardinality: 150.0, op-cost: 150.0, total-cost: 300.0]
                     -- HASH_PARTITION_EXCHANGE [$$55, $$66]  |PARTITIONED|
@@ -36,13 +36,13 @@
                                   -- 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: 25.0, op-cost: 25.0, total-cost: 85.0]
+                    exchange [cardinality: 25.0, op-cost: 25.0, total-cost: 140.0]
                     -- HASH_PARTITION_EXCHANGE [$$59, $$56]  |PARTITIONED|
-                      project ([$$56, $$59]) [cardinality: 25.0, op-cost: 0.0, total-cost: 60.0]
+                      project ([$$56, $$59]) [cardinality: 25.0, op-cost: 0.0, total-cost: 115.0]
                       -- STREAM_PROJECT  |PARTITIONED|
-                        exchange [cardinality: 25.0, op-cost: 25.0, total-cost: 85.0]
+                        exchange [cardinality: 25.0, op-cost: 25.0, total-cost: 140.0]
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          unnest-map [$$59, $$n] <- index-search("Nation", 0, "tpch", "Nation", true, true, 1, $$56, 1, $$56, true, true, true) [cardinality: 25.0, op-cost: 10.0, total-cost: 60.0]
+                          unnest-map [$$59, $$n] <- index-search("Nation", 0, "tpch", "Nation", true, true, 1, $$56, 1, $$56, true, true, true) [cardinality: 25.0, op-cost: 65.0, total-cost: 115.0]
                           -- BTREE_SEARCH  |PARTITIONED|
                             exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.16.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.16.plan
index 2700e8a..133262b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.16.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/join/hash-join-with-redundant-variable/hash-join-with-redundant-variable.16.plan
@@ -1,22 +1,22 @@
-distribute result [$$51] [cardinality: 150.0, op-cost: 0.0, total-cost: 500.0]
+distribute result [$$51] [cardinality: 150.0, op-cost: 0.0, total-cost: 555.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 500.0]
+  exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 555.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$51]) [cardinality: 150.0, op-cost: 0.0, total-cost: 500.0]
+    project ([$$51]) [cardinality: 150.0, op-cost: 0.0, total-cost: 555.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$51] <- [{"n_nationkey": $$59, "s_nationkey": $$56, "c_nationkey": $$55}] [cardinality: 150.0, op-cost: 0.0, total-cost: 500.0]
+      assign [$$51] <- [{"n_nationkey": $$59, "s_nationkey": $$56, "c_nationkey": $$55}] [cardinality: 150.0, op-cost: 0.0, total-cost: 555.0]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 500.0]
+        exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 555.0]
         -- SORT_MERGE_EXCHANGE [$$59(ASC), $$56(ASC), $$55(ASC) ]  |PARTITIONED|
-          order (ASC, $$59) (ASC, $$56) (ASC, $$55) [cardinality: 150.0, op-cost: 0.0, total-cost: 500.0]
+          order (ASC, $$59) (ASC, $$56) (ASC, $$55) [cardinality: 150.0, op-cost: 0.0, total-cost: 555.0]
           -- STABLE_SORT [$$59(ASC), $$56(ASC), $$55(ASC)]  |PARTITIONED|
-            exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 500.0]
+            exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 555.0]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$59, $$56, $$55]) [cardinality: 150.0, op-cost: 0.0, total-cost: 500.0]
+              project ([$$59, $$56, $$55]) [cardinality: 150.0, op-cost: 0.0, total-cost: 555.0]
               -- STREAM_PROJECT  |PARTITIONED|
-                exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 500.0]
+                exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 555.0]
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  join (and(eq($$55, $$59), eq($$56, $$66))) [cardinality: 150.0, op-cost: 225.0, total-cost: 500.0]
+                  join (and(eq($$55, $$59), eq($$56, $$66))) [cardinality: 150.0, op-cost: 225.0, total-cost: 555.0]
                   -- HYBRID_HASH_JOIN [$$55, $$66][$$59, $$56]  |PARTITIONED|
                     exchange [cardinality: 150.0, op-cost: 0.0, total-cost: 150.0]
                     -- RANDOM_PARTITION_EXCHANGE  |PARTITIONED|
@@ -36,13 +36,13 @@
                                   -- 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: 25.0, op-cost: 75.0, total-cost: 125.0]
+                    exchange [cardinality: 25.0, op-cost: 75.0, total-cost: 180.0]
                     -- BROADCAST_EXCHANGE  |PARTITIONED|
-                      project ([$$56, $$59]) [cardinality: 25.0, op-cost: 0.0, total-cost: 50.0]
+                      project ([$$56, $$59]) [cardinality: 25.0, op-cost: 0.0, total-cost: 105.0]
                       -- STREAM_PROJECT  |PARTITIONED|
-                        exchange [cardinality: 25.0, op-cost: 75.0, total-cost: 125.0]
+                        exchange [cardinality: 25.0, op-cost: 75.0, total-cost: 180.0]
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          unnest-map [$$59, $$n] <- index-search("Nation", 0, "tpch", "Nation", true, true, 1, $$56, 1, $$56, true, true, true) [cardinality: 25.0, op-cost: 10.0, total-cost: 50.0]
+                          unnest-map [$$59, $$n] <- index-search("Nation", 0, "tpch", "Nation", true, true, 1, $$56, 1, $$56, true, true, true) [cardinality: 25.0, op-cost: 65.0, total-cost: 105.0]
                           -- BTREE_SEARCH  |PARTITIONED|
                             exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/leftouterjoin/index-only-leftouterjoin/index-only-leftouterjoin.007.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/leftouterjoin/index-only-leftouterjoin/index-only-leftouterjoin.007.plan
index a4bd07b..4db64df 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/leftouterjoin/index-only-leftouterjoin/index-only-leftouterjoin.007.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/leftouterjoin/index-only-leftouterjoin/index-only-leftouterjoin.007.plan
@@ -1,60 +1,60 @@
-distribute result [$$52] [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+distribute result [$$52] [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+  exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$52]) [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+    project ([$$52]) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$52] <- [{"t1_id": $$53, "t2_id": $$54}] [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+      assign [$$52] <- [{"t1_id": $$53, "t2_id": $$54}] [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+        exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
         -- SORT_MERGE_EXCHANGE [$$53(ASC), $$54(ASC) ]  |PARTITIONED|
-          order (ASC, $$53) (ASC, $$54) [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+          order (ASC, $$53) (ASC, $$54) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
           -- STABLE_SORT [$$53(ASC), $$54(ASC)]  |PARTITIONED|
-            exchange [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+            exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$53, $$54]) [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+              project ([$$53, $$54]) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
               -- STREAM_PROJECT  |PARTITIONED|
-                select ($$62) [cardinality: 3.15, op-cost: 2.1, total-cost: 12.6]
+                select ($$62) [cardinality: 3.0, op-cost: 11.4, total-cost: 21.9]
                 -- STREAM_SELECT  |PARTITIONED|
-                  window-aggregate [$$62] <- [win-mark-first-missing-impl($$54)] partition [$$53] order (DESC, $$54) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                  window-aggregate [$$62] <- [win-mark-first-missing-impl($$54)] partition [$$53] order (DESC, $$54) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                   -- WINDOW_STREAM  |PARTITIONED|
-                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      order (ASC, $$53) (DESC, $$54) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                      order (ASC, $$53) (DESC, $$54) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                       -- STABLE_SORT [$$53(ASC), $$54(DESC)]  |PARTITIONED|
-                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                         -- HASH_PARTITION_EXCHANGE [$$53]  |PARTITIONED|
-                          project ([$$53, $$54]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                          project ([$$53, $$54]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                           -- STREAM_PROJECT  |PARTITIONED|
                             select (eq($$55, $$t2.getField("c_int32"))) retain-untrue ($$54 <- missing) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |PARTITIONED|
-                              project ([$$53, $$55, $$54, $$t2]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                              project ([$$53, $$55, $$54, $$t2]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                               -- STREAM_PROJECT  |PARTITIONED|
-                                exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   left-outer-unnest-map [$$54, $$t2] <- index-search("ds_inner_untyped", 0, "test", "ds_inner_untyped", true, false, 1, $$61, 1, $$61, true, true, true) [cardinality: 3.0, op-cost: 3.0, total-cost: 3.0]
                                   -- BTREE_SEARCH  |PARTITIONED|
-                                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      order (ASC, $$61) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                      order (ASC, $$61) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                       -- STABLE_SORT [$$61(ASC)]  |PARTITIONED|
-                                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          project ([$$53, $$55, $$61]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                          project ([$$53, $$55, $$61]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                           -- STREAM_PROJECT  |PARTITIONED|
-                                            exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                               left-outer-unnest-map [$$60, $$61] <- index-search("idx_c_int32", 0, "test", "ds_inner_untyped", true, true, 1, $$55, 1, $$55, true, true, true) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                               -- BTREE_SEARCH  |PARTITIONED|
-                                                exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                 -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                  project ([$$53, $$55]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                  project ([$$53, $$55]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                   -- STREAM_PROJECT  |PARTITIONED|
-                                                    assign [$$55] <- [int32($$t1.getField("c_int32"))] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                    assign [$$55] <- [int32($$t1.getField("c_int32"))] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                     -- ASSIGN  |PARTITIONED|
-                                                      exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        data-scan []<-[$$53, $$t1] <- test.ds_outer_untyped [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                                                        data-scan []<-[$$53, $$t1] <- test.ds_outer_untyped [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/leftouterjoin/index-only-leftouterjoin/index-only-leftouterjoin.008.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/leftouterjoin/index-only-leftouterjoin/index-only-leftouterjoin.008.plan
index 21db7f6..9f0651e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/leftouterjoin/index-only-leftouterjoin/index-only-leftouterjoin.008.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/leftouterjoin/index-only-leftouterjoin/index-only-leftouterjoin.008.plan
@@ -1,62 +1,62 @@
-distribute result [$$52] [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+distribute result [$$52] [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+  exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$52]) [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+    project ([$$52]) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$52] <- [{"t1_id": $$73, "t2_id": $$54}] [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+      assign [$$52] <- [{"t1_id": $$73, "t2_id": $$54}] [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+        exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
         -- SORT_MERGE_EXCHANGE [$$73(ASC), $$54(ASC) ]  |PARTITIONED|
-          order (ASC, $$73) (ASC, $$54) [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+          order (ASC, $$73) (ASC, $$54) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
           -- STABLE_SORT [$$73(ASC), $$54(ASC)]  |PARTITIONED|
-            exchange [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+            exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$73, $$54]) [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+              project ([$$73, $$54]) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
               -- STREAM_PROJECT  |PARTITIONED|
-                select ($$74) [cardinality: 3.15, op-cost: 2.1, total-cost: 12.6]
+                select ($$74) [cardinality: 3.0, op-cost: 11.4, total-cost: 21.9]
                 -- STREAM_SELECT  |PARTITIONED|
-                  window-aggregate [$$74] <- [win-mark-first-missing-impl($$54)] partition [$$73] order (DESC, $$54) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                  window-aggregate [$$74] <- [win-mark-first-missing-impl($$54)] partition [$$73] order (DESC, $$54) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                   -- WINDOW_STREAM  |PARTITIONED|
-                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      order (ASC, $$73) (DESC, $$54) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                      order (ASC, $$73) (DESC, $$54) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                       -- STABLE_SORT [$$73(ASC), $$54(DESC)]  |PARTITIONED|
-                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                         -- HASH_PARTITION_EXCHANGE [$$73]  |PARTITIONED|
-                          union ($$70, $$61, $$54) ($$53, $$53, $$73) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                          union ($$70, $$61, $$54) ($$53, $$53, $$73) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                           -- UNION_ALL  |PARTITIONED|
-                            exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              project ([$$70, $$53]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                              project ([$$70, $$53]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                               -- STREAM_PROJECT  |PARTITIONED|
                                 select (eq($$55, $$71.getField(1))) retain-untrue ($$70 <- missing) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- STREAM_SELECT  |PARTITIONED|
-                                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     left-outer-unnest-map [$$70, $$71] <- index-search("ds_inner_typed", 0, "test", "ds_inner_typed", true, false, 1, $$61, 1, $$61, true, true, true) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- BTREE_SEARCH  |PARTITIONED|
-                                      exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        project ([$$53, $$55, $$61]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                        project ([$$53, $$55, $$61]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                         -- STREAM_PROJECT  |PARTITIONED|
-                                          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            split ($$62) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                            split ($$62) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                             -- SPLIT  |PARTITIONED|
-                                              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                 left-outer-unnest-map [$$60, $$61, $$62] <- index-search("idx_c_int32", 0, "test", "ds_inner_typed", true, true, 1, $$55, 1, $$55, true, true, true) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                 -- BTREE_SEARCH  |PARTITIONED|
-                                                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                   -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                    project ([$$53, $$55]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                    project ([$$53, $$55]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                     -- STREAM_PROJECT  |PARTITIONED|
-                                                      assign [$$55] <- [int32($$t1.getField("c_int32"))] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                      assign [$$55] <- [int32($$t1.getField("c_int32"))] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                       -- ASSIGN  |PARTITIONED|
-                                                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          data-scan []<-[$$53, $$t1] <- test.ds_outer_untyped [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                                                          data-scan []<-[$$53, $$t1] <- test.ds_outer_untyped [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                                                           -- DATASOURCE_SCAN  |PARTITIONED|
                                                             exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -72,21 +72,21 @@
                                   -- STREAM_PROJECT  |PARTITIONED|
                                     exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      split ($$62) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                      split ($$62) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                       -- SPLIT  |PARTITIONED|
-                                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                           left-outer-unnest-map [$$60, $$61, $$62] <- index-search("idx_c_int32", 0, "test", "ds_inner_typed", true, true, 1, $$55, 1, $$55, true, true, true) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                           -- BTREE_SEARCH  |PARTITIONED|
-                                            exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                             -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                              project ([$$53, $$55]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                              project ([$$53, $$55]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                               -- STREAM_PROJECT  |PARTITIONED|
-                                                assign [$$55] <- [int32($$t1.getField("c_int32"))] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                assign [$$55] <- [int32($$t1.getField("c_int32"))] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                 -- ASSIGN  |PARTITIONED|
-                                                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    data-scan []<-[$$53, $$t1] <- test.ds_outer_untyped [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                                                    data-scan []<-[$$53, $$t1] <- test.ds_outer_untyped [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                                                     -- DATASOURCE_SCAN  |PARTITIONED|
                                                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/leftouterjoin/index-only-leftouterjoin/index-only-leftouterjoin.009.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/leftouterjoin/index-only-leftouterjoin/index-only-leftouterjoin.009.plan
index 33f5c67..51dccd4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/leftouterjoin/index-only-leftouterjoin/index-only-leftouterjoin.009.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/leftouterjoin/index-only-leftouterjoin/index-only-leftouterjoin.009.plan
@@ -1,60 +1,60 @@
-distribute result [$$52] [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+distribute result [$$52] [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+  exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$52]) [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+    project ([$$52]) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$52] <- [{"t1_id": $$53, "t2_id": $$54}] [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+      assign [$$52] <- [{"t1_id": $$53, "t2_id": $$54}] [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+        exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
         -- SORT_MERGE_EXCHANGE [$$53(ASC), $$54(ASC) ]  |PARTITIONED|
-          order (ASC, $$53) (ASC, $$54) [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+          order (ASC, $$53) (ASC, $$54) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
           -- STABLE_SORT [$$53(ASC), $$54(ASC)]  |PARTITIONED|
-            exchange [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+            exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$53, $$54]) [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+              project ([$$53, $$54]) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
               -- STREAM_PROJECT  |PARTITIONED|
-                select ($$62) [cardinality: 3.15, op-cost: 2.1, total-cost: 12.6]
+                select ($$62) [cardinality: 3.0, op-cost: 11.4, total-cost: 21.9]
                 -- STREAM_SELECT  |PARTITIONED|
-                  window-aggregate [$$62] <- [win-mark-first-missing-impl($$54)] partition [$$53] order (DESC, $$54) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                  window-aggregate [$$62] <- [win-mark-first-missing-impl($$54)] partition [$$53] order (DESC, $$54) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                   -- WINDOW_STREAM  |PARTITIONED|
-                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      order (ASC, $$53) (DESC, $$54) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                      order (ASC, $$53) (DESC, $$54) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                       -- STABLE_SORT [$$53(ASC), $$54(DESC)]  |PARTITIONED|
-                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                         -- HASH_PARTITION_EXCHANGE [$$53]  |PARTITIONED|
-                          project ([$$53, $$54]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                          project ([$$53, $$54]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                           -- STREAM_PROJECT  |PARTITIONED|
                             select (eq($$55, $$t2.getField("c_int32"))) retain-untrue ($$54 <- missing) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |PARTITIONED|
-                              project ([$$53, $$55, $$54, $$t2]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                              project ([$$53, $$55, $$54, $$t2]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                               -- STREAM_PROJECT  |PARTITIONED|
-                                exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   left-outer-unnest-map [$$54, $$t2] <- index-search("ds_inner_untyped", 0, "test", "ds_inner_untyped", true, false, 1, $$61, 1, $$61, true, true, true) [cardinality: 3.0, op-cost: 3.0, total-cost: 3.0]
                                   -- BTREE_SEARCH  |PARTITIONED|
-                                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      order (ASC, $$61) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                      order (ASC, $$61) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                       -- STABLE_SORT [$$61(ASC)]  |PARTITIONED|
-                                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          project ([$$53, $$55, $$61]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                          project ([$$53, $$55, $$61]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                           -- STREAM_PROJECT  |PARTITIONED|
-                                            exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                               left-outer-unnest-map [$$60, $$61] <- index-search("idx_c_int32", 0, "test", "ds_inner_untyped", true, true, 1, $$55, 1, $$55, true, true, true) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                               -- BTREE_SEARCH  |PARTITIONED|
-                                                exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                 -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                  project ([$$53, $$55]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                  project ([$$53, $$55]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                   -- STREAM_PROJECT  |PARTITIONED|
-                                                    assign [$$55] <- [int32($$t1.getField(1))] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                    assign [$$55] <- [int32($$t1.getField(1))] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                     -- ASSIGN  |PARTITIONED|
-                                                      exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        data-scan []<-[$$53, $$t1] <- test.ds_outer_typed [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                                                        data-scan []<-[$$53, $$t1] <- test.ds_outer_typed [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/leftouterjoin/index-only-leftouterjoin/index-only-leftouterjoin.010.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/leftouterjoin/index-only-leftouterjoin/index-only-leftouterjoin.010.plan
index 66c4cf3..7ccdab5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/leftouterjoin/index-only-leftouterjoin/index-only-leftouterjoin.010.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/leftouterjoin/index-only-leftouterjoin/index-only-leftouterjoin.010.plan
@@ -1,62 +1,62 @@
-distribute result [$$52] [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+distribute result [$$52] [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+  exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$52]) [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+    project ([$$52]) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$52] <- [{"t1_id": $$73, "t2_id": $$54}] [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+      assign [$$52] <- [{"t1_id": $$73, "t2_id": $$54}] [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+        exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
         -- SORT_MERGE_EXCHANGE [$$73(ASC), $$54(ASC) ]  |PARTITIONED|
-          order (ASC, $$73) (ASC, $$54) [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+          order (ASC, $$73) (ASC, $$54) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
           -- STABLE_SORT [$$73(ASC), $$54(ASC)]  |PARTITIONED|
-            exchange [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+            exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$73, $$54]) [cardinality: 3.15, op-cost: 0.0, total-cost: 12.6]
+              project ([$$73, $$54]) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
               -- STREAM_PROJECT  |PARTITIONED|
-                select ($$74) [cardinality: 3.15, op-cost: 2.1, total-cost: 12.6]
+                select ($$74) [cardinality: 3.0, op-cost: 11.4, total-cost: 21.9]
                 -- STREAM_SELECT  |PARTITIONED|
-                  window-aggregate [$$74] <- [win-mark-first-missing-impl($$54)] partition [$$73] order (DESC, $$54) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                  window-aggregate [$$74] <- [win-mark-first-missing-impl($$54)] partition [$$73] order (DESC, $$54) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                   -- WINDOW_STREAM  |PARTITIONED|
-                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      order (ASC, $$73) (DESC, $$54) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                      order (ASC, $$73) (DESC, $$54) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                       -- STABLE_SORT [$$73(ASC), $$54(DESC)]  |PARTITIONED|
-                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                         -- HASH_PARTITION_EXCHANGE [$$73]  |PARTITIONED|
-                          union ($$70, $$61, $$54) ($$53, $$53, $$73) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                          union ($$70, $$61, $$54) ($$53, $$53, $$73) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                           -- UNION_ALL  |PARTITIONED|
-                            exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              project ([$$70, $$53]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                              project ([$$70, $$53]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                               -- STREAM_PROJECT  |PARTITIONED|
                                 select (eq($$55, $$71.getField(1))) retain-untrue ($$70 <- missing) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- STREAM_SELECT  |PARTITIONED|
-                                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     left-outer-unnest-map [$$70, $$71] <- index-search("ds_inner_typed", 0, "test", "ds_inner_typed", true, false, 1, $$61, 1, $$61, true, true, true) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- BTREE_SEARCH  |PARTITIONED|
-                                      exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        project ([$$53, $$55, $$61]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                        project ([$$53, $$55, $$61]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                         -- STREAM_PROJECT  |PARTITIONED|
-                                          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            split ($$62) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                            split ($$62) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                             -- SPLIT  |PARTITIONED|
-                                              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                 left-outer-unnest-map [$$60, $$61, $$62] <- index-search("idx_c_int32", 0, "test", "ds_inner_typed", true, true, 1, $$55, 1, $$55, true, true, true) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                 -- BTREE_SEARCH  |PARTITIONED|
-                                                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                   -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                    project ([$$53, $$55]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                    project ([$$53, $$55]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                     -- STREAM_PROJECT  |PARTITIONED|
-                                                      assign [$$55] <- [int32($$t1.getField(1))] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                      assign [$$55] <- [int32($$t1.getField(1))] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                       -- ASSIGN  |PARTITIONED|
-                                                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          data-scan []<-[$$53, $$t1] <- test.ds_outer_typed [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                                                          data-scan []<-[$$53, $$t1] <- test.ds_outer_typed [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                                                           -- DATASOURCE_SCAN  |PARTITIONED|
                                                             exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -72,21 +72,21 @@
                                   -- STREAM_PROJECT  |PARTITIONED|
                                     exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      split ($$62) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                      split ($$62) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                       -- SPLIT  |PARTITIONED|
-                                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                           left-outer-unnest-map [$$60, $$61, $$62] <- index-search("idx_c_int32", 0, "test", "ds_inner_typed", true, true, 1, $$55, 1, $$55, true, true, true) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                           -- BTREE_SEARCH  |PARTITIONED|
-                                            exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                             -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                              project ([$$53, $$55]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                              project ([$$53, $$55]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                               -- STREAM_PROJECT  |PARTITIONED|
-                                                assign [$$55] <- [int32($$t1.getField(1))] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                assign [$$55] <- [int32($$t1.getField(1))] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                 -- ASSIGN  |PARTITIONED|
-                                                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                                                  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    data-scan []<-[$$53, $$t1] <- test.ds_outer_typed [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                                                    data-scan []<-[$$53, $$t1] <- test.ds_outer_typed [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                                                     -- DATASOURCE_SCAN  |PARTITIONED|
                                                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.3.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.3.plan
index 49f6ad2..38c5f61 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.3.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.3.plan
@@ -1,18 +1,18 @@
-distribute result [$$c] [cardinality: 6005.0, op-cost: 0.0, total-cost: 1152.42]
+distribute result [$$c] [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 1152.42]
+  exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    limit 5 offset 5 [cardinality: 6005.0, op-cost: 0.0, total-cost: 1152.42]
+    limit 5 offset 5 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
     -- STREAM_LIMIT  |UNPARTITIONED|
-      exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 1152.42]
+      exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        limit 10 [cardinality: 6005.0, op-cost: 0.0, total-cost: 1152.42]
+        limit 10 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
         -- STREAM_LIMIT  |PARTITIONED|
-          project ([$$c]) [cardinality: 6005.0, op-cost: 0.0, total-cost: 1152.42]
+          project ([$$c]) [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
           -- STREAM_PROJECT  |PARTITIONED|
-            exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 1152.42]
+            exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              data-scan []<-[$$18, $$19, $$c] <- test.LineItem condition (and(lt($$c.getField(2), 150), lt($$c.getField(5), 10000))) limit 10 [cardinality: 6005.0, op-cost: 1152.42, total-cost: 1152.42]
+              data-scan []<-[$$18, $$19, $$c] <- test.LineItem condition (and(lt($$c.getField(2), 150), lt($$c.getField(5), 10000))) limit 10 [cardinality: 6005.0, op-cost: 6005.0, total-cost: 6005.0]
               -- DATASOURCE_SCAN  |PARTITIONED|
                 exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.5.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.5.plan
index 3b85e2a..a9d2b4f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.5.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.5.plan
@@ -1,24 +1,24 @@
-distribute result [$$20] [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+distribute result [$$20] [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+  exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    limit 5 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+    limit 5 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
     -- STREAM_LIMIT  |UNPARTITIONED|
-      exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+      exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        project ([$$20]) [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+        project ([$$20]) [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
         -- STREAM_PROJECT  |PARTITIONED|
-          assign [$$20] <- [{"shipdate": substring($$c.getField(10), 0, 4), "suppkey": gt($$21, 0)}] [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+          assign [$$20] <- [{"shipdate": substring($$c.getField(10), 0, 4), "suppkey": gt($$21, 0)}] [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
           -- ASSIGN  |PARTITIONED|
-            limit 5 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+            limit 5 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
             -- STREAM_LIMIT  |PARTITIONED|
-              assign [$$21] <- [$$c.getField(2)] [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+              assign [$$21] <- [$$c.getField(2)] [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
               -- ASSIGN  |PARTITIONED|
-                project ([$$c]) [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+                project ([$$c]) [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+                  exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    data-scan []<-[$$22, $$23, $$c] <- test.LineItem condition (lt($$c.getField(2), 150)) limit 5 [cardinality: 6005.0, op-cost: 6010.65, total-cost: 6010.65]
+                    data-scan []<-[$$22, $$23, $$c] <- test.LineItem condition (lt($$c.getField(2), 150)) limit 5 [cardinality: 6005.0, op-cost: 6005.0, total-cost: 6005.0]
                     -- DATASOURCE_SCAN  |PARTITIONED|
                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-lookup/push-limit-to-primary-lookup.3.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-lookup/push-limit-to-primary-lookup.3.plan
index 96d3acf..f5fb51e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-lookup/push-limit-to-primary-lookup.3.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-lookup/push-limit-to-primary-lookup.3.plan
@@ -1,18 +1,18 @@
-distribute result [$$c] [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+distribute result [$$c] [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+  exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    limit 5 offset 5 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+    limit 5 offset 5 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
     -- STREAM_LIMIT  |UNPARTITIONED|
-      exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+      exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        limit 10 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+        limit 10 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
         -- STREAM_LIMIT  |PARTITIONED|
-          project ([$$c]) [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+          project ([$$c]) [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
           -- STREAM_PROJECT  |PARTITIONED|
-            exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+            exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              data-scan []<-[$$15, $$16, $$c] <- test.LineItem condition (lt($$c.getField(2), 150)) limit 10 [cardinality: 6005.0, op-cost: 6010.65, total-cost: 6010.65]
+              data-scan []<-[$$15, $$16, $$c] <- test.LineItem condition (lt($$c.getField(2), 150)) limit 10 [cardinality: 6005.0, op-cost: 6005.0, total-cost: 6005.0]
               -- DATASOURCE_SCAN  |PARTITIONED|
                 exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-lookup/push-limit-to-primary-lookup.5.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-lookup/push-limit-to-primary-lookup.5.plan
index 383e104..7aa0db8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-lookup/push-limit-to-primary-lookup.5.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-lookup/push-limit-to-primary-lookup.5.plan
@@ -1,18 +1,18 @@
-distribute result [$$c] [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+distribute result [$$c] [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+  exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    limit 5 offset 5 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+    limit 5 offset 5 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
     -- STREAM_LIMIT  |UNPARTITIONED|
-      exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+      exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        limit 10 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+        limit 10 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
         -- STREAM_LIMIT  |PARTITIONED|
-          project ([$$c]) [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+          project ([$$c]) [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
           -- STREAM_PROJECT  |PARTITIONED|
-            exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6010.65]
+            exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              data-scan []<-[$$17, $$18, $$c] <- test.LineItem condition (lt($$c.getField(2), 150)) limit 10 [cardinality: 6005.0, op-cost: 6010.65, total-cost: 6010.65]
+              data-scan []<-[$$17, $$18, $$c] <- test.LineItem condition (lt($$c.getField(2), 150)) limit 10 [cardinality: 6005.0, op-cost: 6005.0, total-cost: 6005.0]
               -- DATASOURCE_SCAN  |PARTITIONED|
                 exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.3.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.3.plan
index 7c2bdbe..6427067 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.3.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.3.plan
@@ -1,18 +1,18 @@
-distribute result [$$paper] [cardinality: 100.0, op-cost: 0.0, total-cost: 24.0]
+distribute result [$$paper] [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 24.0]
+  exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    limit 5 offset 5 [cardinality: 100.0, op-cost: 0.0, total-cost: 24.0]
+    limit 5 offset 5 [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
     -- STREAM_LIMIT  |UNPARTITIONED|
-      exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 24.0]
+      exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        limit 10 [cardinality: 100.0, op-cost: 0.0, total-cost: 24.0]
+        limit 10 [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
         -- STREAM_LIMIT  |PARTITIONED|
-          project ([$$paper]) [cardinality: 100.0, op-cost: 0.0, total-cost: 24.0]
+          project ([$$paper]) [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
           -- STREAM_PROJECT  |PARTITIONED|
-            exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 24.0]
+            exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              data-scan []<-[$$15, $$paper] <- test.DBLP1 condition (contains($$paper.getField(1), "kimL89")) limit 10 [cardinality: 100.0, op-cost: 24.0, total-cost: 24.0]
+              data-scan []<-[$$15, $$paper] <- test.DBLP1 condition (contains($$paper.getField(1), "kimL89")) limit 10 [cardinality: 100.0, op-cost: 100.0, total-cost: 100.0]
               -- DATASOURCE_SCAN  |PARTITIONED|
                 exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.5.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.5.plan
index fb2c1fd..afebd75 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.5.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.5.plan
@@ -1,25 +1,25 @@
-distribute result [$$37] [cardinality: 2.1, op-cost: 0.0, total-cost: 205.0]
+distribute result [$$37] [cardinality: 2.1, op-cost: 0.0, total-cost: 316.8]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 205.0]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 316.8]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    limit 2 [cardinality: 2.1, op-cost: 0.0, total-cost: 205.0]
+    limit 2 [cardinality: 2.1, op-cost: 0.0, total-cost: 316.8]
     -- STREAM_LIMIT  |UNPARTITIONED|
-      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 205.0]
+      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 316.8]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        project ([$$37]) [cardinality: 2.1, op-cost: 0.0, total-cost: 205.0]
+        project ([$$37]) [cardinality: 2.1, op-cost: 0.0, total-cost: 316.8]
         -- STREAM_PROJECT  |PARTITIONED|
-          assign [$$37] <- [{"dblpid": $$38}] [cardinality: 2.1, op-cost: 0.0, total-cost: 205.0]
+          assign [$$37] <- [{"dblpid": $$38}] [cardinality: 2.1, op-cost: 0.0, total-cost: 316.8]
           -- ASSIGN  |PARTITIONED|
-            limit 2 [cardinality: 2.1, op-cost: 0.0, total-cost: 205.0]
+            limit 2 [cardinality: 2.1, op-cost: 0.0, total-cost: 316.8]
             -- STREAM_LIMIT  |PARTITIONED|
-              project ([$$38]) [cardinality: 2.1, op-cost: 0.0, total-cost: 205.0]
+              project ([$$38]) [cardinality: 2.1, op-cost: 0.0, total-cost: 316.8]
               -- STREAM_PROJECT  |PARTITIONED|
-                exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 205.0]
+                exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 316.8]
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  join (eq($$38, $$41)) [cardinality: 2.1, op-cost: 100.0, total-cost: 205.0]
+                  join (eq($$38, $$41)) [cardinality: 2.1, op-cost: 108.4, total-cost: 316.8]
                   -- HYBRID_HASH_JOIN [$$38][$$41]  |PARTITIONED|
                     exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
-                    -- HASH_PARTITION_EXCHANGE [$$38]  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                       project ([$$38]) [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
                       -- STREAM_PROJECT  |PARTITIONED|
                         assign [$$38] <- [$$d.getField(1)] [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
@@ -34,29 +34,29 @@
                                 -- 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: 100.0, op-cost: 4.0, total-cost: 5.0]
-                    -- HASH_PARTITION_EXCHANGE [$$41]  |PARTITIONED|
-                      project ([$$41]) [cardinality: 100.0, op-cost: 0.0, total-cost: 1.0]
+                    exchange [cardinality: 100.0, op-cost: 8.4, total-cost: 108.4]
+                    -- BROADCAST_EXCHANGE  |PARTITIONED|
+                      project ([$$41]) [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
                       -- STREAM_PROJECT  |UNPARTITIONED|
-                        assign [$$41] <- [get-item($$30, 0).getField(0).getField(1)] [cardinality: 100.0, op-cost: 0.0, total-cost: 1.0]
+                        assign [$$41] <- [get-item($$30, 0).getField(0).getField(1)] [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
                         -- ASSIGN  |UNPARTITIONED|
-                          aggregate [$$30] <- [listify($$29)] [cardinality: 100.0, op-cost: 0.0, total-cost: 1.0]
+                          aggregate [$$30] <- [listify($$29)] [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
                           -- AGGREGATE  |UNPARTITIONED|
-                            limit 1 [cardinality: 100.0, op-cost: 0.0, total-cost: 1.0]
+                            limit 1 [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
                             -- STREAM_LIMIT  |UNPARTITIONED|
-                              exchange [cardinality: 100.0, op-cost: 4.0, total-cost: 5.0]
+                              exchange [cardinality: 100.0, op-cost: 8.4, total-cost: 108.4]
                               -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-                                project ([$$29]) [cardinality: 100.0, op-cost: 0.0, total-cost: 1.0]
+                                project ([$$29]) [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
                                 -- STREAM_PROJECT  |PARTITIONED|
-                                  assign [$$29] <- [{"d": $$d}] [cardinality: 100.0, op-cost: 0.0, total-cost: 1.0]
+                                  assign [$$29] <- [{"d": $$d}] [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
                                   -- ASSIGN  |PARTITIONED|
-                                    limit 1 [cardinality: 100.0, op-cost: 0.0, total-cost: 1.0]
+                                    limit 1 [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
                                     -- STREAM_LIMIT  |PARTITIONED|
-                                      project ([$$d]) [cardinality: 100.0, op-cost: 0.0, total-cost: 1.0]
+                                      project ([$$d]) [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
                                       -- STREAM_PROJECT  |PARTITIONED|
-                                        exchange [cardinality: 100.0, op-cost: 4.0, total-cost: 5.0]
+                                        exchange [cardinality: 100.0, op-cost: 8.4, total-cost: 108.4]
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          data-scan []<-[$$40, $$d] <- test.DBLP1 condition (ends-with($$d.getField(1), "Blakeley95")) limit 1 [cardinality: 100.0, op-cost: 1.0, total-cost: 1.0]
+                                          data-scan []<-[$$40, $$d] <- test.DBLP1 condition (ends-with($$d.getField(1), "Blakeley95")) limit 1 [cardinality: 100.0, op-cost: 100.0, total-cost: 100.0]
                                           -- DATASOURCE_SCAN  |PARTITIONED|
                                             exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.6.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.6.plan
index 26ba31b..9312e62 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.6.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.6.plan
@@ -1,26 +1,26 @@
-distribute result [$$19] [cardinality: 100.0, op-cost: 0.0, total-cost: 2.0]
+distribute result [$$19] [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 2.0]
+  exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    limit 1 [cardinality: 100.0, op-cost: 0.0, total-cost: 2.0]
+    limit 1 [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
     -- STREAM_LIMIT  |UNPARTITIONED|
-      exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 2.0]
+      exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        project ([$$19]) [cardinality: 100.0, op-cost: 0.0, total-cost: 2.0]
+        project ([$$19]) [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
         -- STREAM_PROJECT  |PARTITIONED|
-          assign [$$19] <- [{"$1": substring($$20, 0, 21)}] [cardinality: 100.0, op-cost: 0.0, total-cost: 2.0]
+          assign [$$19] <- [{"$1": substring($$20, 0, 21)}] [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
           -- ASSIGN  |PARTITIONED|
-            limit 1 [cardinality: 100.0, op-cost: 0.0, total-cost: 2.0]
+            limit 1 [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
             -- STREAM_LIMIT  |PARTITIONED|
-              project ([$$20]) [cardinality: 100.0, op-cost: 0.0, total-cost: 2.0]
+              project ([$$20]) [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
               -- STREAM_PROJECT  |PARTITIONED|
-                assign [$$20] <- [$$DBLP1.getField(1)] [cardinality: 100.0, op-cost: 0.0, total-cost: 2.0]
+                assign [$$20] <- [$$DBLP1.getField(1)] [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
                 -- ASSIGN  |PARTITIONED|
-                  project ([$$DBLP1]) [cardinality: 100.0, op-cost: 0.0, total-cost: 2.0]
+                  project ([$$DBLP1]) [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
                   -- STREAM_PROJECT  |PARTITIONED|
-                    exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 2.0]
+                    exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      data-scan []<-[$$21, $$DBLP1] <- test.DBLP1 condition (gt($$DBLP1.getField(1), "series")) limit 1 [cardinality: 100.0, op-cost: 2.0, total-cost: 2.0]
+                      data-scan []<-[$$21, $$DBLP1] <- test.DBLP1 condition (gt($$DBLP1.getField(1), "series")) limit 1 [cardinality: 100.0, op-cost: 100.0, total-cost: 100.0]
                       -- DATASOURCE_SCAN  |PARTITIONED|
                         exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.8.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.8.plan
index 8c007cf..190a98e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.8.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.8.plan
@@ -1,26 +1,26 @@
-distribute result [$$22] [cardinality: 12.0, op-cost: 0.0, total-cost: 3.0]
+distribute result [$$22] [cardinality: 12.0, op-cost: 0.0, total-cost: 12.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 12.0, op-cost: 0.0, total-cost: 3.0]
+  exchange [cardinality: 12.0, op-cost: 0.0, total-cost: 12.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    limit 2 [cardinality: 12.0, op-cost: 0.0, total-cost: 3.0]
+    limit 2 [cardinality: 12.0, op-cost: 0.0, total-cost: 12.0]
     -- STREAM_LIMIT  |UNPARTITIONED|
-      exchange [cardinality: 12.0, op-cost: 0.0, total-cost: 3.0]
+      exchange [cardinality: 12.0, op-cost: 0.0, total-cost: 12.0]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        limit 2 [cardinality: 12.0, op-cost: 0.0, total-cost: 3.0]
+        limit 2 [cardinality: 12.0, op-cost: 0.0, total-cost: 12.0]
         -- STREAM_LIMIT  |PARTITIONED|
-          project ([$$22]) [cardinality: 12.0, op-cost: 0.0, total-cost: 3.0]
+          project ([$$22]) [cardinality: 12.0, op-cost: 0.0, total-cost: 12.0]
           -- STREAM_PROJECT  |PARTITIONED|
-            assign [$$22] <- [$$26.getField("lang")] [cardinality: 12.0, op-cost: 0.0, total-cost: 3.0]
+            assign [$$22] <- [$$26.getField("lang")] [cardinality: 12.0, op-cost: 0.0, total-cost: 12.0]
             -- ASSIGN  |PARTITIONED|
-              project ([$$26]) [cardinality: 12.0, op-cost: 0.0, total-cost: 3.0]
+              project ([$$26]) [cardinality: 12.0, op-cost: 0.0, total-cost: 12.0]
               -- STREAM_PROJECT  |PARTITIONED|
-                assign [$$26] <- [$$t.getField("user")] [cardinality: 12.0, op-cost: 0.0, total-cost: 3.0]
+                assign [$$26] <- [$$t.getField("user")] [cardinality: 12.0, op-cost: 0.0, total-cost: 12.0]
                 -- ASSIGN  |PARTITIONED|
-                  project ([$$t]) [cardinality: 12.0, op-cost: 0.0, total-cost: 3.0]
+                  project ([$$t]) [cardinality: 12.0, op-cost: 0.0, total-cost: 12.0]
                   -- STREAM_PROJECT  |PARTITIONED|
-                    exchange [cardinality: 12.0, op-cost: 0.0, total-cost: 3.0]
+                    exchange [cardinality: 12.0, op-cost: 0.0, total-cost: 12.0]
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      data-scan []<-[$$25, $$t] <- test.TweetMessages condition (and(ge($$t.getField("user").getField("friends_count"), 0), le($$t.getField("user").getField("friends_count"), 150))) limit 2 [cardinality: 12.0, op-cost: 3.0, total-cost: 3.0]
+                      data-scan []<-[$$25, $$t] <- test.TweetMessages condition (and(ge($$t.getField("user").getField("friends_count"), 0), le($$t.getField("user").getField("friends_count"), 150))) limit 2 [cardinality: 12.0, op-cost: 12.0, total-cost: 12.0]
                       -- DATASOURCE_SCAN  |PARTITIONED|
                         exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/objects/load-record-fields/load-record-fields.4.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/objects/load-record-fields/load-record-fields.4.plan
index 494b0cc..0795647 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/objects/load-record-fields/load-record-fields.4.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/objects/load-record-fields/load-record-fields.4.plan
@@ -16,9 +16,9 @@
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                 select (neq(uuid(), uuid())) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                 -- STREAM_SELECT  |PARTITIONED|
-                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    data-scan []<-[$$32, $$md] <- test.MyDataset [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                    data-scan []<-[$$32, $$md] <- test.MyDataset [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                     -- DATASOURCE_SCAN  |PARTITIONED|
                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/objects/load-record-fields/load-record-fields.6.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/objects/load-record-fields/load-record-fields.6.plan
index 1998551..3b0d185 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/objects/load-record-fields/load-record-fields.6.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/objects/load-record-fields/load-record-fields.6.plan
@@ -16,9 +16,9 @@
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                 select (neq(current-date(), date: { 1980-09-10 })) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                 -- STREAM_SELECT  |PARTITIONED|
-                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.1]
+                  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    data-scan []<-[$$32, $$md] <- test.MyDataset [cardinality: 2.0, op-cost: 2.1, total-cost: 2.1]
+                    data-scan []<-[$$32, $$md] <- test.MyDataset [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
                     -- DATASOURCE_SCAN  |PARTITIONED|
                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/view/view-pushdown/view-pushdown.08.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/view/view-pushdown/view-pushdown.08.plan
index 560e511..e15509b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/view/view-pushdown/view-pushdown.08.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/view/view-pushdown/view-pushdown.08.plan
@@ -1,30 +1,30 @@
-distribute result [$$88] [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+distribute result [$$88] [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+  exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$88]) [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+    project ([$$88]) [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$88] <- [{"id": $$91, "review": $$95}] [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+      assign [$$88] <- [{"id": $$91, "review": $$95}] [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
       -- ASSIGN  |UNPARTITIONED|
-        exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+        exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
         -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-          order (ASC, $$91) [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+          order (ASC, $$91) [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
           -- STABLE_SORT [$$91(ASC)]  |UNPARTITIONED|
-            exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+            exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
             -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-              limit 3 [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+              limit 3 [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
               -- STREAM_LIMIT  |UNPARTITIONED|
-                exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                 -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-                  limit 3 [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                  limit 3 [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                   -- STREAM_LIMIT  |PARTITIONED|
-                    project ([$$91, $$95]) [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                    project ([$$91, $$95]) [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      assign [$$95] <- [$$d.getField(1)] [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                      assign [$$95] <- [$$d.getField(1)] [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                       -- ASSIGN  |PARTITIONED|
-                        exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                        exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          data-scan []<-[$$91, $$d] <- test.DatasetWithKnownField condition (and(not(is-unknown(int64-default-null($$d.getField("year")))), not(is-unknown(int64-default-null($$d.getField("quarter")))), eq($$d.getField(1), "good"))) limit 3 [cardinality: 20.0, op-cost: 2.1, total-cost: 2.1]
+                          data-scan []<-[$$91, $$d] <- test.DatasetWithKnownField condition (and(not(is-unknown(int64-default-null($$d.getField("year")))), not(is-unknown(int64-default-null($$d.getField("quarter")))), eq($$d.getField(1), "good"))) limit 3 [cardinality: 20.0, op-cost: 20.0, total-cost: 20.0]
                           -- DATASOURCE_SCAN  |PARTITIONED|
                             exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/view/view-pushdown/view-pushdown.10.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/view/view-pushdown/view-pushdown.10.plan
index 510a157..af0c764 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/view/view-pushdown/view-pushdown.10.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/view/view-pushdown/view-pushdown.10.plan
@@ -1,30 +1,30 @@
-distribute result [$$63] [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+distribute result [$$63] [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+  exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    limit 3 [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+    limit 3 [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
     -- STREAM_LIMIT  |UNPARTITIONED|
-      project ([$$63]) [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+      project ([$$63]) [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
       -- STREAM_PROJECT  |PARTITIONED|
-        assign [$$63] <- [{"id": $$65, "review": $$69}] [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+        assign [$$63] <- [{"id": $$65, "review": $$69}] [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
         -- ASSIGN  |PARTITIONED|
-          exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+          exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
           -- SORT_MERGE_EXCHANGE [$$65(ASC) ]  |PARTITIONED|
-            limit 3 [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+            limit 3 [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
             -- STREAM_LIMIT  |PARTITIONED|
-              exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+              exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                order (topK: 3) (ASC, $$65) [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                order (topK: 3) (ASC, $$65) [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                 -- STABLE_SORT [topK: 3] [$$65(ASC)]  |PARTITIONED|
-                  exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                  exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    project ([$$65, $$69]) [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                    project ([$$65, $$69]) [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      assign [$$69] <- [$$d.getField(1)] [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                      assign [$$69] <- [$$d.getField(1)] [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                       -- ASSIGN  |PARTITIONED|
-                        exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                        exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          data-scan []<-[$$65, $$d] <- test.DatasetWithKnownField [cardinality: 20.0, op-cost: 2.1, total-cost: 2.1]
+                          data-scan []<-[$$65, $$d] <- test.DatasetWithKnownField [cardinality: 20.0, op-cost: 20.0, total-cost: 20.0]
                           -- DATASOURCE_SCAN  |PARTITIONED|
                             exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/view/view-pushdown/view-pushdown.12.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/view/view-pushdown/view-pushdown.12.plan
index 142aa71..1964876 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/view/view-pushdown/view-pushdown.12.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/view/view-pushdown/view-pushdown.12.plan
@@ -1,30 +1,30 @@
-distribute result [$$94] [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+distribute result [$$94] [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+  exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$94]) [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+    project ([$$94]) [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$94] <- [{"id": $$97, "review": $$101}] [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+      assign [$$94] <- [{"id": $$97, "review": $$101}] [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
       -- ASSIGN  |UNPARTITIONED|
-        exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+        exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
         -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-          order (ASC, $$97) [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+          order (ASC, $$97) [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
           -- STABLE_SORT [$$97(ASC)]  |UNPARTITIONED|
-            exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+            exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
             -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-              limit 3 [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+              limit 3 [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
               -- STREAM_LIMIT  |UNPARTITIONED|
-                exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                 -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-                  limit 3 [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                  limit 3 [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                   -- STREAM_LIMIT  |PARTITIONED|
-                    project ([$$97, $$101]) [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                    project ([$$97, $$101]) [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      assign [$$101] <- [$$d.getField(1)] [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                      assign [$$101] <- [$$d.getField(1)] [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                       -- ASSIGN  |PARTITIONED|
-                        exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                        exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          data-scan []<-[$$97, $$d] <- test.DatasetWithKnownField condition (and(not(is-unknown(int64-default-null($$d.getField("year")))), not(is-unknown(int64-default-null($$d.getField("quarter")))), eq($$d.getField(1), "good"))) limit 3 [cardinality: 20.0, op-cost: 2.1, total-cost: 2.1]
+                          data-scan []<-[$$97, $$d] <- test.DatasetWithKnownField condition (and(not(is-unknown(int64-default-null($$d.getField("year")))), not(is-unknown(int64-default-null($$d.getField("quarter")))), eq($$d.getField(1), "good"))) limit 3 [cardinality: 20.0, op-cost: 20.0, total-cost: 20.0]
                           -- DATASOURCE_SCAN  |PARTITIONED|
                             exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/view/view-pushdown/view-pushdown.14.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/view/view-pushdown/view-pushdown.14.plan
index ac2e92f..2913174 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/view/view-pushdown/view-pushdown.14.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/view/view-pushdown/view-pushdown.14.plan
@@ -1,30 +1,30 @@
-distribute result [$$69] [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+distribute result [$$69] [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+  exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    limit 3 [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+    limit 3 [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
     -- STREAM_LIMIT  |UNPARTITIONED|
-      project ([$$69]) [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+      project ([$$69]) [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
       -- STREAM_PROJECT  |PARTITIONED|
-        assign [$$69] <- [{"id": $$71, "review": $$75}] [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+        assign [$$69] <- [{"id": $$71, "review": $$75}] [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
         -- ASSIGN  |PARTITIONED|
-          exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+          exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
           -- SORT_MERGE_EXCHANGE [$$71(ASC) ]  |PARTITIONED|
-            limit 3 [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+            limit 3 [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
             -- STREAM_LIMIT  |PARTITIONED|
-              exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+              exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                order (topK: 3) (ASC, $$71) [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                order (topK: 3) (ASC, $$71) [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                 -- STABLE_SORT [topK: 3] [$$71(ASC)]  |PARTITIONED|
-                  exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                  exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    project ([$$71, $$75]) [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                    project ([$$71, $$75]) [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      assign [$$75] <- [$$d.getField(1)] [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                      assign [$$75] <- [$$d.getField(1)] [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                       -- ASSIGN  |PARTITIONED|
-                        exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 2.1]
+                        exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          data-scan []<-[$$71, $$d] <- test.DatasetWithKnownField [cardinality: 20.0, op-cost: 2.1, total-cost: 2.1]
+                          data-scan []<-[$$71, $$d] <- test.DatasetWithKnownField [cardinality: 20.0, op-cost: 20.0, total-cost: 20.0]
                           -- DATASOURCE_SCAN  |PARTITIONED|
                             exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|