[ASTERIXDB-3330][COMP]: CBO: Cardinality Estimation bugs

Change-Id: Ife44f819c306752e6fdf6ebcefa4a6abbb5df4c1
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17974
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: <murali.krishna@couchbase.com>
Reviewed-by: Vijay Sarathy <vijay.sarathy@couchbase.com>
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 11f221f..f206ada 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
@@ -193,6 +193,6 @@
     }
 
     protected double costSort(double inputCard) {
-        return (inputCard <= 0 ? 0 : inputCard * Math.log(inputCard) / Math.log(2)); // log to the base 2
+        return (inputCard <= 1 ? 0 : inputCard * Math.log(inputCard) / Math.log(2)); // log to the base 2
     }
 }
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
index 5703741..0a16dfd 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
@@ -1347,7 +1347,7 @@
         ILogicalOperator currentOp = inputOp;
 
         boolean constantAssignVarUsedInTopOp = false;
-        if (assignsBeforeTopOpRef != null) {
+        if (assignsBeforeTopOpRef != null && !assignsBeforeTopOpRef.isEmpty()) {
             // From the first ASSIGN (earliest in the plan) to the last ASSGIN (latest)
             for (int i = assignsBeforeTopOpRef.size() - 1; i >= 0; i--) {
                 AssignOperator tmpOp = (AssignOperator) assignsBeforeTopOpRef.get(i).getValue();
@@ -1613,7 +1613,7 @@
 
         // If there are ASSIGN operators before the SELECT or JOIN operator,
         // we need to put these operators between the SELECT or JOIN and the primary index lookup in the left path.
-        if (assignsBeforeTopOpRef != null) {
+        if (assignsBeforeTopOpRef != null && !assignsBeforeTopOpRef.isEmpty()) {
             // Makes the primary unnest-map as the child of the last ASSIGN (from top) in the path.
             assignBeforeTopOp = assignsBeforeTopOpRef.get(assignsBeforeTopOpRef.size() - 1).getValue();
             assignBeforeTopOp.getInputs().clear();
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
index 7ed23f7..fb99151 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
@@ -251,9 +251,6 @@
             opRef.setValue(root);
 
             if (LOGGER.isTraceEnabled()) {
-                String viewInPlan = new ALogicalPlanImpl(opRef).toString(); //useful when debugging
-                LOGGER.trace("viewInPlanAgain");
-                LOGGER.trace(viewInPlan);
                 String viewOutPlan = new ALogicalPlanImpl(opRef).toString(); //useful when debugging
                 LOGGER.trace("viewOutPlan");
                 LOGGER.trace(viewOutPlan);
@@ -793,7 +790,6 @@
                 return i;
             }
         }
-
         return -1;
     }
 
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EstimatedCostComputationVisitor.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EstimatedCostComputationVisitor.java
index 1797a46..44d9da6 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EstimatedCostComputationVisitor.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EstimatedCostComputationVisitor.java
@@ -271,8 +271,14 @@
         Pair<Double, Double> cardCost = new Pair<>(0.0, 0.0);
 
         for (Map.Entry<String, Object> anno : op.getAnnotations().entrySet()) {
-            if (anno.getValue() != null && anno.getKey().equals(OperatorAnnotations.OP_INPUT_CARDINALITY)) {
-                cardCost.setFirst((Double) anno.getValue());
+            if (anno.getValue() != null && anno.getKey().equals(OperatorAnnotations.OP_OUTPUT_CARDINALITY)) {
+                if (op.getSelectCondition() != null) {
+                    cardCost.setFirst((Double) anno.getValue());
+                }
+            } else if (anno.getValue() != null && anno.getKey().equals(OperatorAnnotations.OP_INPUT_CARDINALITY)) {
+                if (op.getSelectCondition() == null) {
+                    cardCost.setFirst((Double) anno.getValue());
+                }
             } else if (anno.getValue() != null && anno.getKey().equals(OperatorAnnotations.OP_COST_TOTAL)) {
                 cardCost.setSecond((Double) anno.getValue());
             }
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 76f87b2..e5166f1 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
@@ -703,7 +703,7 @@
                     jn.aliases.addAll(jnJ.aliases);
                     Collections.sort(jn.aliases);
                     jn.size = jnI.size + jnJ.size;
-                    jn.setCardinality(jn.computeJoinCardinality());
+                    jn.setCardinality(jn.computeJoinCardinality(), true);
                 } else {
                     addPlansToThisJn = jnNewBits.jnIndex;
                 }
@@ -744,7 +744,8 @@
         }
 
         double grpInputCard = (double) Math.round(jnArray[jnNumber].getCardinality() * 100) / 100;
-        double grpOutputCard = (double) Math.round(jnArray[jnNumber].distinctCardinality * 100) / 100;
+        double grpOutputCard =
+                (double) Math.round(Math.min(grpInputCard, jnArray[jnNumber].distinctCardinality) * 100) / 100;
 
         // set the root group-by/distinct operator's cardinality annotations (if exists)
         if (!cboTestMode && this.rootGroupByDistinctOp != null) {
@@ -753,7 +754,7 @@
         }
 
         // set the root order by operator's cardinality annotations (if exists)
-        if (this.rootOrderByOp != null) {
+        if (!cboTestMode && this.rootOrderByOp != null) {
             if (this.rootGroupByDistinctOp != null) {
                 this.rootOrderByOp.getAnnotations().put(OperatorAnnotations.OP_INPUT_CARDINALITY, grpOutputCard);
                 this.rootOrderByOp.getAnnotations().put(OperatorAnnotations.OP_OUTPUT_CARDINALITY, grpOutputCard);
@@ -805,20 +806,20 @@
                     if (idxDetails == null) {
                         return PlanNode.NO_PLAN;
                     }
-                    jn.setOrigCardinality(idxDetails.getSourceCardinality());
+                    jn.setOrigCardinality(idxDetails.getSourceCardinality(), false);
                     jn.setAvgDocSize(idxDetails.getSourceAvgItemSize());
                     jn.setSizeVarsFromDisk(10); // dummy value
                     jn.setSizeVarsAfterScan(10); // dummy value
                 }
                 // multiply by the respective predicate selectivities
-                jn.setCardinality(jn.origCardinality * stats.getSelectivity(leafInput, false));
+                jn.setCardinality(jn.origCardinality * stats.getSelectivity(leafInput, false), false);
             } else {
                 // could be unnest or assign
                 jn.datasetNames = new ArrayList<>(Collections.singleton("unnestOrAssign"));
                 jn.aliases = new ArrayList<>(Collections.singleton("unnestOrAssign"));
                 double card = findInListCard(leafInput);
-                jn.setOrigCardinality(card);
-                jn.setCardinality(card);
+                jn.setOrigCardinality(card, false);
+                jn.setCardinality(card, false);
                 // just a guess
                 jn.size = 10;
             }
@@ -875,22 +876,22 @@
                     }
                     continue;
                 }
-                double origDatasetCard, finalDatasetCard, sampleCard;
+                double origDatasetCard, finalDatasetCard;
+                finalDatasetCard = origDatasetCard = idxDetails.getSourceCardinality();
 
                 DataSourceScanOperator scanOp = findDataSourceScanOperator(leafInput);
                 if (scanOp == null) {
                     continue; // what happens to the cards and sizes then? this may happen in case of in lists
                 }
-                finalDatasetCard = origDatasetCard = idxDetails.getSourceCardinality();
 
-                ILogicalOperator grpByDistinctOp = this.dataScanAndGroupByDistinctOps.get(scanOp);
-                if (grpByDistinctOp != null) {
-                    long distinctCardinality = stats.findDistinctCardinality(grpByDistinctOp);
-                    jn.distinctCardinality = (double) distinctCardinality;
-                    grpByDistinctOp.getAnnotations().put(OperatorAnnotations.OP_INPUT_CARDINALITY,
-                            (double) Math.round(finalDatasetCard * 100) / 100);
-                    grpByDistinctOp.getAnnotations().put(OperatorAnnotations.OP_OUTPUT_CARDINALITY,
-                            (double) Math.round(distinctCardinality * 100) / 100);
+                double sampleCard = Math.min(idxDetails.getSampleCardinalityTarget(), origDatasetCard);
+                if (sampleCard == 0) { // should not happen unless the original dataset is empty
+                    sampleCard = 1; // we may have to make some adjustments to costs when the sample returns very rows.
+
+                    IWarningCollector warningCollector = optCtx.getWarningCollector();
+                    if (warningCollector.shouldWarn()) {
+                        warningCollector.warn(Warning.of(scanOp.getSourceLocation(), ErrorCode.SAMPLE_HAS_ZERO_ROWS));
+                    }
                 }
 
                 List<List<IAObject>> result;
@@ -933,12 +934,12 @@
                 // There are predicates here. So skip the predicates and get the original dataset card.
                 // Now apply all the predicates and get the card after all predicates are applied.
                 result = stats.runSamplingQueryProjection(this.optCtx, leafInput, i, primaryKey);
-                double predicateCardinality = stats.findPredicateCardinality(result, true);
+                double predicateCardinalityFromSample = stats.findPredicateCardinality(result, true);
 
                 double sizeVarsFromDisk;
                 double sizeVarsAfterScan;
 
-                if (predicateCardinality > 0.0) { // otherwise, we get nulls for the averages
+                if (predicateCardinalityFromSample > 0.0) { // otherwise, we get nulls for the averages
                     sizeVarsFromDisk = stats.findSizeVarsFromDisk(result, jn.getNumVarsFromDisk());
                     sizeVarsAfterScan = stats.findSizeVarsAfterScan(result, jn.getNumVarsFromDisk());
                 } else { // in case we did not get any tuples from the sample, get the size by setting the predicate to true.
@@ -956,29 +957,42 @@
                     }
                     selop.getCondition().setValue(saveExpr); // restore the expression
                 }
-                if (predicateCardinality == 0.0) {
-                    predicateCardinality = 0.0001 * idxDetails.getSampleCardinalityTarget();
-                }
-                // now scale up
-                sampleCard = Math.min(idxDetails.getSampleCardinalityTarget(), origDatasetCard);
-                if (sampleCard == 0) { // should not happen unless the original dataset is empty
-                    sampleCard = 1; // we may have to make some adjustments to costs when the sample returns very rows.
 
-                    IWarningCollector warningCollector = optCtx.getWarningCollector();
-                    if (warningCollector.shouldWarn()) {
-                        warningCollector.warn(Warning.of(scanOp.getSourceLocation(), ErrorCode.SAMPLE_HAS_ZERO_ROWS));
-                    }
+                // Adjust for zero predicate cardinality from the sample.
+                predicateCardinalityFromSample = Math.max(predicateCardinalityFromSample, 0.0001);
+
+                // Do the scale up for the final cardinality after the predicates.
+                boolean scaleUp = sampleCard != origDatasetCard;
+                if (scaleUp) {
+                    finalDatasetCard *= predicateCardinalityFromSample / sampleCard;
+                } else {
+                    finalDatasetCard = predicateCardinalityFromSample;
                 }
-                finalDatasetCard *= predicateCardinality / sampleCard;
                 // now switch the input back.
                 parent.getInputs().get(0).setValue(scanOp);
+
                 if (jn.getCardinality() == jn.getOrigCardinality()) { // this means there was no selectivity hint provided
-                    jn.setCardinality(finalDatasetCard);
+                    // If the sample size is the same as the original dataset (happens when the dataset
+                    // is small), no need to assign any artificial min. cardinality as the sample is accurate.
+                    jn.setCardinality(finalDatasetCard, scaleUp);
                 }
+
                 jn.setSizeVarsFromDisk(sizeVarsFromDisk);
                 jn.setSizeVarsAfterScan(sizeVarsAfterScan);
                 jn.setAvgDocSize(idxDetails.getSourceAvgItemSize());
+
+                // Compute the distinct cardinalities for each base join node.
+                ILogicalOperator grpByDistinctOp = this.dataScanAndGroupByDistinctOps.get(scanOp);
+                if (grpByDistinctOp != null) {
+                    long distinctCardinality = stats.findDistinctCardinality(grpByDistinctOp);
+                    jn.distinctCardinality = (double) distinctCardinality;
+                    double grpInputCard = (double) Math.round(finalDatasetCard * 100) / 100;
+                    double grpOutputCard = (double) Math.round(Math.min(grpInputCard, distinctCardinality) * 100) / 100;
+                    grpByDistinctOp.getAnnotations().put(OperatorAnnotations.OP_INPUT_CARDINALITY, grpInputCard);
+                    grpByDistinctOp.getAnnotations().put(OperatorAnnotations.OP_OUTPUT_CARDINALITY, grpOutputCard);
+                }
             }
+
             dataScanPlan = jn.addSingleDatasetPlans();
             if (dataScanPlan == PlanNode.NO_PLAN) {
                 return PlanNode.NO_PLAN;
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 e8d96b3..05cf921 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
@@ -131,18 +131,18 @@
         return cardinality;
     }
 
-    protected void setCardinality(double card) {
+    protected void setCardinality(double card, boolean setMinCard) {
         // Minimum cardinality for operators is MIN_CARD to prevent bad plans due to cardinality under estimation errors.
-        cardinality = Math.max(card, Cost.MIN_CARD);
+        cardinality = setMinCard ? Math.max(card, Cost.MIN_CARD) : card;
     }
 
     public double getOrigCardinality() {
         return origCardinality;
     }
 
-    protected void setOrigCardinality(double card) {
+    protected void setOrigCardinality(double card, boolean setMinCard) {
         // Minimum cardinality for operators is MIN_CARD to prevent bad plans due to cardinality under estimation errors.
-        origCardinality = Math.max(card, Cost.MIN_CARD);
+        origCardinality = setMinCard ? Math.max(card, Cost.MIN_CARD) : card;
     }
 
     public void setAvgDocSize(double avgDocSize) {
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
index f3d89c4..ae070b4 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
@@ -204,30 +204,33 @@
             if (lexpr.getExpressionTag().equals(LogicalExpressionTag.FUNCTION_CALL)) {
                 sel = getSelectivityFromAnnotation(
                         (AbstractFunctionCallExpression) afcExpr.getArguments().get(0).getValue(), join);
-                return 1.0 - sel;
+                // We want to return 1.0 and not 0.0 if there was no annotation
+                return (sel == 1.0) ? 1.0 : 1.0 - sel;
             }
         }
 
         double s;
         PredicateCardinalityAnnotation pca = afcExpr.getAnnotation(PredicateCardinalityAnnotation.class);
-        if (pca != null) {
-            s = pca.getSelectivity();
-            if (s <= 0 || s >= 1) {
-                IWarningCollector warningCollector = joinEnum.optCtx.getWarningCollector();
-                if (warningCollector.shouldWarn()) {
-                    warningCollector.warn(Warning.of(afcExpr.getSourceLocation(), ErrorCode.INAPPLICABLE_HINT,
-                            "selectivity", "Selectivity specified: " + s
-                                    + ", has to be a decimal value greater than 0 and less than 1"));
+        if (!join) {
+            if (pca != null) {
+                s = pca.getSelectivity();
+                if (s <= 0 || s >= 1) {
+                    IWarningCollector warningCollector = joinEnum.optCtx.getWarningCollector();
+                    if (warningCollector.shouldWarn()) {
+                        warningCollector.warn(Warning.of(afcExpr.getSourceLocation(), ErrorCode.INAPPLICABLE_HINT,
+                                "selectivity", "Selectivity specified: " + s
+                                        + ", has to be a decimal value greater than 0 and less than 1"));
+                    }
+                } else {
+                    sel *= s;
                 }
-            } else {
-                sel *= s;
             }
         } else {
             JoinProductivityAnnotation jpa = afcExpr.getAnnotation(JoinProductivityAnnotation.class);
             s = findJoinSelectivity(jpa, afcExpr);
             sel *= s;
         }
-        if (join && s == 1.0) {
+        if (join && sel == 1.0) {
             // assume no selectivity was assigned
             joinEnum.singleDatasetPreds.add(afcExpr);
         }
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q16.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q16.plan
index fab0c7b..715a293 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q16.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q16.plan
@@ -33,11 +33,11 @@
                                         -- HASH_PARTITION_EXCHANGE [$$133, $$134]  |PARTITIONED|
                                           -- STREAM_PROJECT  |PARTITIONED|
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                              -- NESTED_LOOP  |PARTITIONED|
+                                              -- HYBRID_HASH_JOIN [$$138][$$137]  |PARTITIONED|
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                   -- STREAM_PROJECT  |PARTITIONED|
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      -- HYBRID_HASH_JOIN [$$138][$$137]  |PARTITIONED|
+                                                      -- NESTED_LOOP  |PARTITIONED|
                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                           -- STREAM_PROJECT  |PARTITIONED|
                                                             -- ASSIGN  |PARTITIONED|
@@ -46,20 +46,20 @@
                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                         -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                          -- STREAM_SELECT  |PARTITIONED|
+                                                          -- ASSIGN  |PARTITIONED|
                                                             -- STREAM_PROJECT  |PARTITIONED|
-                                                              -- ASSIGN  |PARTITIONED|
-                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- DATASOURCE_SCAN (test.item)  |PARTITIONED|
+                                                              -- STREAM_SELECT  |PARTITIONED|
+                                                                -- ASSIGN  |PARTITIONED|
+                                                                  -- STREAM_PROJECT  |PARTITIONED|
                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                      -- DATASOURCE_SCAN (test.supplier)  |PARTITIONED|
+                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                 -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                  -- ASSIGN  |PARTITIONED|
+                                                  -- STREAM_SELECT  |PARTITIONED|
                                                     -- STREAM_PROJECT  |PARTITIONED|
-                                                      -- STREAM_SELECT  |PARTITIONED|
-                                                        -- ASSIGN  |PARTITIONED|
-                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                      -- ASSIGN  |PARTITIONED|
+                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                          -- DATASOURCE_SCAN (test.item)  |PARTITIONED|
                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                              -- DATASOURCE_SCAN (test.supplier)  |PARTITIONED|
-                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q21.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q21.plan
index 737237c..fa7aebe 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q21.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q21.plan
@@ -41,59 +41,59 @@
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                   -- STREAM_PROJECT  |PARTITIONED|
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      -- HYBRID_HASH_JOIN [$$354][$$365]  |PARTITIONED|
-                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          -- STREAM_PROJECT  |PARTITIONED|
-                                                            -- STREAM_SELECT  |PARTITIONED|
-                                                              -- ASSIGN  |PARTITIONED|
-                                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                    -- DATASOURCE_SCAN (test.nation)  |PARTITIONED|
-                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                        -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                      -- HYBRID_HASH_JOIN [$$351, $$350][$$352, $$362]  |PARTITIONED|
+                                                        -- HASH_PARTITION_EXCHANGE [$$351, $$350]  |PARTITIONED|
                                                           -- STREAM_PROJECT  |PARTITIONED|
                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                               -- HYBRID_HASH_JOIN [$$355][$$366]  |PARTITIONED|
-                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                    -- ASSIGN  |PARTITIONED|
-                                                                      -- STREAM_PROJECT  |PARTITIONED|
-                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                          -- DATASOURCE_SCAN (test.supplier)  |PARTITIONED|
-                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                                -- HASH_PARTITION_EXCHANGE [$$355]  |PARTITIONED|
                                                                   -- STREAM_PROJECT  |PARTITIONED|
                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- HYBRID_HASH_JOIN [$$351, $$350][$$352, $$362]  |PARTITIONED|
-                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                          -- ASSIGN  |PARTITIONED|
-                                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                                      -- HYBRID_HASH_JOIN [$$354][$$365]  |PARTITIONED|
+                                                                        -- HASH_PARTITION_EXCHANGE [$$354]  |PARTITIONED|
+                                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                                            -- STREAM_SELECT  |PARTITIONED|
                                                                               -- ASSIGN  |PARTITIONED|
                                                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                    -- DATASOURCE_SCAN (test.stock)  |PARTITIONED|
+                                                                                    -- DATASOURCE_SCAN (test.nation)  |PARTITIONED|
                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                         -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                        -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                                        -- HASH_PARTITION_EXCHANGE [$$365]  |PARTITIONED|
                                                                           -- STREAM_PROJECT  |PARTITIONED|
-                                                                            -- STREAM_SELECT  |PARTITIONED|
+                                                                            -- ASSIGN  |PARTITIONED|
                                                                               -- STREAM_PROJECT  |PARTITIONED|
-                                                                                -- ASSIGN  |PARTITIONED|
+                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                  -- DATASOURCE_SCAN (test.supplier)  |PARTITIONED|
+                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                -- HASH_PARTITION_EXCHANGE [$$366]  |PARTITIONED|
+                                                                  -- ASSIGN  |PARTITIONED|
+                                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                                      -- ASSIGN  |PARTITIONED|
+                                                                        -- STREAM_PROJECT  |PARTITIONED|
+                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                            -- DATASOURCE_SCAN (test.stock)  |PARTITIONED|
+                                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                        -- HASH_PARTITION_EXCHANGE [$$352, $$362]  |PARTITIONED|
+                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                            -- STREAM_SELECT  |PARTITIONED|
+                                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                                -- ASSIGN  |PARTITIONED|
+                                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                                    -- UNNEST  |PARTITIONED|
+                                                                      -- STREAM_SELECT  |PARTITIONED|
+                                                                        -- STREAM_PROJECT  |PARTITIONED|
+                                                                          -- ASSIGN  |PARTITIONED|
+                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                              -- REPLICATE  |PARTITIONED|
+                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                   -- STREAM_PROJECT  |PARTITIONED|
-                                                                                    -- UNNEST  |PARTITIONED|
-                                                                                      -- STREAM_SELECT  |PARTITIONED|
-                                                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                                                          -- ASSIGN  |PARTITIONED|
-                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                              -- REPLICATE  |PARTITIONED|
-                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                      -- DATASOURCE_SCAN (test.orders)  |PARTITIONED|
-                                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                      -- DATASOURCE_SCAN (test.orders)  |PARTITIONED|
+                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                 -- BROADCAST_EXCHANGE  |PARTITIONED|
                                                   -- ASSIGN  |PARTITIONED|
                                                     -- STREAM_PROJECT  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q5.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q5.plan
index 19bf0b1..e58b399 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q5.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q5.plan
@@ -23,21 +23,21 @@
                             -- STREAM_PROJECT  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                 -- HYBRID_HASH_JOIN [$$274, $$290][$$266, $$269]  |PARTITIONED|
-                                  -- HASH_PARTITION_EXCHANGE [$$274, $$290]  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     -- STREAM_PROJECT  |PARTITIONED|
                                       -- ASSIGN  |PARTITIONED|
                                         -- STREAM_PROJECT  |PARTITIONED|
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                             -- HYBRID_HASH_JOIN [$$256][$$257]  |PARTITIONED|
-                                              -- HASH_PARTITION_EXCHANGE [$$256]  |PARTITIONED|
+                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                     -- HYBRID_HASH_JOIN [$$258][$$274]  |PARTITIONED|
-                                                      -- HASH_PARTITION_EXCHANGE [$$258]  |PARTITIONED|
+                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                         -- STREAM_PROJECT  |PARTITIONED|
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                             -- HYBRID_HASH_JOIN [$$260, $$254, $$263][$$276, $$277, $$278]  |PARTITIONED|
-                                                              -- HASH_PARTITION_EXCHANGE [$$260, $$254, $$263]  |PARTITIONED|
+                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                     -- HYBRID_HASH_JOIN [$$245, $$246][$$254, $$281]  |PARTITIONED|
@@ -63,7 +63,7 @@
                                                                                             -- DATASOURCE_SCAN (test.orders)  |PARTITIONED|
                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                              -- HASH_PARTITION_EXCHANGE [$$276, $$277, $$278]  |PARTITIONED|
+                                                              -- BROADCAST_EXCHANGE  |PARTITIONED|
                                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                                   -- ASSIGN  |PARTITIONED|
                                                                     -- STREAM_PROJECT  |PARTITIONED|
@@ -71,7 +71,7 @@
                                                                         -- DATASOURCE_SCAN (test.customer)  |PARTITIONED|
                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                             -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                      -- HASH_PARTITION_EXCHANGE [$$274]  |PARTITIONED|
+                                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
                                                         -- STREAM_PROJECT  |PARTITIONED|
                                                           -- ASSIGN  |PARTITIONED|
                                                             -- STREAM_PROJECT  |PARTITIONED|
@@ -79,7 +79,7 @@
                                                                 -- DATASOURCE_SCAN (test.nation)  |PARTITIONED|
                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                              -- HASH_PARTITION_EXCHANGE [$$257]  |PARTITIONED|
+                                              -- BROADCAST_EXCHANGE  |PARTITIONED|
                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                   -- STREAM_SELECT  |PARTITIONED|
                                                     -- ASSIGN  |PARTITIONED|
@@ -88,7 +88,7 @@
                                                           -- DATASOURCE_SCAN (test.region)  |PARTITIONED|
                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                  -- HASH_PARTITION_EXCHANGE [$$266, $$269]  |PARTITIONED|
+                                  -- BROADCAST_EXCHANGE  |PARTITIONED|
                                     -- STREAM_PROJECT  |PARTITIONED|
                                       -- ASSIGN  |PARTITIONED|
                                         -- STREAM_PROJECT  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
index 91cd909..b17c6bc 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
@@ -18,87 +18,85 @@
                   -- STREAM_PROJECT  |PARTITIONED|
                     -- ASSIGN  |PARTITIONED|
                       -- STREAM_PROJECT  |PARTITIONED|
-                        -- STREAM_SELECT  |PARTITIONED|
-                          -- STREAM_PROJECT  |PARTITIONED|
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- HYBRID_HASH_JOIN [$$303, $$324][$$277, $$300]  |PARTITIONED|
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- HYBRID_HASH_JOIN [$$277][$$303]  |PARTITIONED|
-                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ASSIGN  |PARTITIONED|
                                   -- STREAM_PROJECT  |PARTITIONED|
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      -- HYBRID_HASH_JOIN [$$324][$$300]  |PARTITIONED|
-                                        -- HASH_PARTITION_EXCHANGE [$$324]  |PARTITIONED|
+                                      -- HYBRID_HASH_JOIN [$$310, $$311][$$275, $$276]  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                           -- STREAM_PROJECT  |PARTITIONED|
-                                            -- ASSIGN  |PARTITIONED|
-                                              -- STREAM_PROJECT  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- HYBRID_HASH_JOIN [$$305, $$306, $$307][$$291, $$293, $$295]  |PARTITIONED|
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  -- HYBRID_HASH_JOIN [$$288][$$304]  |PARTITIONED|
-                                                    -- HASH_PARTITION_EXCHANGE [$$288]  |PARTITIONED|
-                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                      -- HYBRID_HASH_JOIN [$$304][$$288]  |PARTITIONED|
                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          -- HYBRID_HASH_JOIN [$$291, $$293, $$295][$$305, $$306, $$307]  |PARTITIONED|
-                                                            -- HASH_PARTITION_EXCHANGE [$$291, $$293, $$295]  |PARTITIONED|
-                                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                              -- NESTED_LOOP  |PARTITIONED|
                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- HYBRID_HASH_JOIN [$$275, $$276][$$310, $$311]  |PARTITIONED|
-                                                                    -- HASH_PARTITION_EXCHANGE [$$275, $$276]  |PARTITIONED|
+                                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                                    -- ASSIGN  |PARTITIONED|
+                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                        -- REPLICATE  |PARTITIONED|
+                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                                              -- ASSIGN  |PARTITIONED|
+                                                                                -- STREAM_PROJECT  |PARTITIONED|
+                                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                    -- DATASOURCE_SCAN (test.nation)  |PARTITIONED|
+                                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                                  -- REPLICATE  |PARTITIONED|
+                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                       -- STREAM_PROJECT  |PARTITIONED|
                                                                         -- ASSIGN  |PARTITIONED|
                                                                           -- STREAM_PROJECT  |PARTITIONED|
                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                              -- DATASOURCE_SCAN (test.stock)  |PARTITIONED|
+                                                                              -- DATASOURCE_SCAN (test.nation)  |PARTITIONED|
                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                    -- HASH_PARTITION_EXCHANGE [$$310, $$311]  |PARTITIONED|
-                                                                      -- STREAM_PROJECT  |PARTITIONED|
-                                                                        -- STREAM_SELECT  |PARTITIONED|
-                                                                          -- STREAM_PROJECT  |PARTITIONED|
-                                                                            -- ASSIGN  |PARTITIONED|
-                                                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                                                -- UNNEST  |PARTITIONED|
-                                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                                    -- ASSIGN  |PARTITIONED|
-                                                                                      -- STREAM_PROJECT  |PARTITIONED|
-                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                          -- DATASOURCE_SCAN (test.orders)  |PARTITIONED|
-                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                            -- HASH_PARTITION_EXCHANGE [$$305, $$306, $$307]  |PARTITIONED|
+                                                        -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                          -- ASSIGN  |PARTITIONED|
+                                                            -- STREAM_PROJECT  |PARTITIONED|
                                                               -- ASSIGN  |PARTITIONED|
                                                                 -- STREAM_PROJECT  |PARTITIONED|
-                                                                  -- ASSIGN  |PARTITIONED|
-                                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                    -- DATASOURCE_SCAN (test.customer)  |PARTITIONED|
                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- DATASOURCE_SCAN (test.customer)  |PARTITIONED|
-                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                    -- HASH_PARTITION_EXCHANGE [$$304]  |PARTITIONED|
-                                                      -- REPLICATE  |PARTITIONED|
-                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                    -- STREAM_SELECT  |PARTITIONED|
+                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                        -- ASSIGN  |PARTITIONED|
                                                           -- STREAM_PROJECT  |PARTITIONED|
-                                                            -- ASSIGN  |PARTITIONED|
+                                                            -- UNNEST  |PARTITIONED|
                                                               -- STREAM_PROJECT  |PARTITIONED|
-                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- DATASOURCE_SCAN (test.nation)  |PARTITIONED|
+                                                                -- ASSIGN  |PARTITIONED|
+                                                                  -- STREAM_PROJECT  |PARTITIONED|
                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                        -- HASH_PARTITION_EXCHANGE [$$300]  |PARTITIONED|
+                                                                      -- DATASOURCE_SCAN (test.orders)  |PARTITIONED|
+                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                        -- BROADCAST_EXCHANGE  |PARTITIONED|
                                           -- STREAM_PROJECT  |PARTITIONED|
                                             -- ASSIGN  |PARTITIONED|
                                               -- STREAM_PROJECT  |PARTITIONED|
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  -- DATASOURCE_SCAN (test.supplier)  |PARTITIONED|
+                                                  -- DATASOURCE_SCAN (test.stock)  |PARTITIONED|
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                -- BROADCAST_EXCHANGE  |PARTITIONED|
+                            -- BROADCAST_EXCHANGE  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ASSIGN  |PARTITIONED|
                                   -- STREAM_PROJECT  |PARTITIONED|
-                                    -- ASSIGN  |PARTITIONED|
-                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- REPLICATE  |PARTITIONED|
-                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            -- STREAM_PROJECT  |PARTITIONED|
-                                              -- ASSIGN  |PARTITIONED|
-                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- DATASOURCE_SCAN (test.nation)  |PARTITIONED|
-                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- DATASOURCE_SCAN (test.supplier)  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q8.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q8.plan
index 16343e7..cf15f10 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q8.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q8.plan
@@ -24,25 +24,25 @@
                               -- STREAM_PROJECT  |PARTITIONED|
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   -- HYBRID_HASH_JOIN [$$347][$$341]  |PARTITIONED|
-                                    -- HASH_PARTITION_EXCHANGE [$$347]  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         -- ASSIGN  |PARTITIONED|
                                           -- STREAM_PROJECT  |PARTITIONED|
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                               -- HYBRID_HASH_JOIN [$$308][$$309]  |PARTITIONED|
-                                                -- HASH_PARTITION_EXCHANGE [$$308]  |PARTITIONED|
+                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                   -- STREAM_PROJECT  |PARTITIONED|
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                       -- HYBRID_HASH_JOIN [$$311][$$331]  |PARTITIONED|
-                                                        -- HASH_PARTITION_EXCHANGE [$$311]  |PARTITIONED|
+                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                           -- STREAM_PROJECT  |PARTITIONED|
                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                               -- HYBRID_HASH_JOIN [$$313, $$315, $$317][$$333, $$334, $$332]  |PARTITIONED|
-                                                                -- HASH_PARTITION_EXCHANGE [$$313, $$315, $$317]  |PARTITIONED|
+                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                   -- STREAM_PROJECT  |PARTITIONED|
                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                       -- HYBRID_HASH_JOIN [$$306][$$324]  |PARTITIONED|
-                                                                        -- HASH_PARTITION_EXCHANGE [$$306]  |PARTITIONED|
+                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                           -- STREAM_PROJECT  |PARTITIONED|
                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                               -- HYBRID_HASH_JOIN [$$296, $$295][$$306, $$336]  |PARTITIONED|
@@ -68,7 +68,7 @@
                                                                                                       -- DATASOURCE_SCAN (test.orders)  |PARTITIONED|
                                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                           -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                        -- HASH_PARTITION_EXCHANGE [$$324]  |PARTITIONED|
+                                                                        -- BROADCAST_EXCHANGE  |PARTITIONED|
                                                                           -- STREAM_PROJECT  |PARTITIONED|
                                                                             -- STREAM_SELECT  |PARTITIONED|
                                                                               -- ASSIGN  |PARTITIONED|
@@ -77,7 +77,7 @@
                                                                                     -- DATASOURCE_SCAN (test.item)  |PARTITIONED|
                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                         -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                -- HASH_PARTITION_EXCHANGE [$$333, $$334, $$332]  |PARTITIONED|
+                                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
                                                                   -- STREAM_PROJECT  |PARTITIONED|
                                                                     -- ASSIGN  |PARTITIONED|
                                                                       -- STREAM_PROJECT  |PARTITIONED|
@@ -85,7 +85,7 @@
                                                                           -- DATASOURCE_SCAN (test.customer)  |PARTITIONED|
                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                        -- HASH_PARTITION_EXCHANGE [$$331]  |PARTITIONED|
+                                                        -- BROADCAST_EXCHANGE  |PARTITIONED|
                                                           -- STREAM_PROJECT  |PARTITIONED|
                                                             -- ASSIGN  |PARTITIONED|
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -96,7 +96,7 @@
                                                                         -- DATASOURCE_SCAN (test.nation)  |PARTITIONED|
                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                             -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                -- HASH_PARTITION_EXCHANGE [$$309]  |PARTITIONED|
+                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
                                                   -- STREAM_PROJECT  |PARTITIONED|
                                                     -- STREAM_SELECT  |PARTITIONED|
                                                       -- ASSIGN  |PARTITIONED|
@@ -105,7 +105,7 @@
                                                             -- DATASOURCE_SCAN (test.region)  |PARTITIONED|
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                    -- HASH_PARTITION_EXCHANGE [$$341]  |PARTITIONED|
+                                    -- BROADCAST_EXCHANGE  |PARTITIONED|
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         -- ASSIGN  |PARTITIONED|
                                           -- STREAM_PROJECT  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q9.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q9.plan
index 7283aa0..6069455 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q9.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q9.plan
@@ -24,13 +24,13 @@
                               -- STREAM_PROJECT  |PARTITIONED|
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   -- HYBRID_HASH_JOIN [$$228][$$224]  |PARTITIONED|
-                                    -- HASH_PARTITION_EXCHANGE [$$228]  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         -- ASSIGN  |PARTITIONED|
                                           -- STREAM_PROJECT  |PARTITIONED|
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                               -- HYBRID_HASH_JOIN [$$206][$$207]  |PARTITIONED|
-                                                -- HASH_PARTITION_EXCHANGE [$$206]  |PARTITIONED|
+                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                   -- STREAM_PROJECT  |PARTITIONED|
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                       -- HYBRID_HASH_JOIN [$$200, $$199][$$206, $$217]  |PARTITIONED|
@@ -54,7 +54,7 @@
                                                                           -- DATASOURCE_SCAN (test.orders)  |PARTITIONED|
                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                -- HASH_PARTITION_EXCHANGE [$$207]  |PARTITIONED|
+                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
                                                   -- STREAM_PROJECT  |PARTITIONED|
                                                     -- STREAM_SELECT  |PARTITIONED|
                                                       -- ASSIGN  |PARTITIONED|
@@ -63,7 +63,7 @@
                                                             -- DATASOURCE_SCAN (test.item)  |PARTITIONED|
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                    -- HASH_PARTITION_EXCHANGE [$$224]  |PARTITIONED|
+                                    -- BROADCAST_EXCHANGE  |PARTITIONED|
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         -- ASSIGN  |PARTITIONED|
                                           -- STREAM_PROJECT  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/group-by/listify-3.1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/group-by/listify-3.1.plan
index ec40853..85fa62d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/group-by/listify-3.1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/group-by/listify-3.1.plan
@@ -8,27 +8,27 @@
               -- ASSIGN  |LOCAL|
                 -- ONE_TO_ONE_EXCHANGE  |LOCAL|
                   -- NESTED_LOOP  |LOCAL|
-                    -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                      -- UNNEST  |UNPARTITIONED|
-                        -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |LOCAL|
                       -- NESTED_LOOP  |LOCAL|
+                        -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                          -- UNNEST  |UNPARTITIONED|
+                            -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
                         -- ONE_TO_ONE_EXCHANGE  |LOCAL|
                           -- STREAM_PROJECT  |LOCAL|
                             -- ASSIGN  |LOCAL|
-                              -- STREAM_PROJECT  |LOCAL|
-                                -- ASSIGN  |LOCAL|
+                              -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+                                -- REPLICATE  |LOCAL|
                                   -- ONE_TO_ONE_EXCHANGE  |LOCAL|
-                                    -- REPLICATE  |LOCAL|
-                                      -- ONE_TO_ONE_EXCHANGE  |LOCAL|
-                                        -- AGGREGATE  |LOCAL|
-                                          -- STREAM_PROJECT  |LOCAL|
-                                            -- ASSIGN  |LOCAL|
-                                              -- AGGREGATE  |LOCAL|
-                                                -- AGGREGATE  |LOCAL|
-                                                  -- UNNEST  |UNPARTITIONED|
-                                                    -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
-                        -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+                                    -- AGGREGATE  |LOCAL|
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        -- ASSIGN  |LOCAL|
+                                          -- AGGREGATE  |LOCAL|
+                                            -- AGGREGATE  |LOCAL|
+                                              -- UNNEST  |UNPARTITIONED|
+                                                -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |LOCAL|
+                      -- STREAM_PROJECT  |LOCAL|
+                        -- ASSIGN  |LOCAL|
                           -- STREAM_PROJECT  |LOCAL|
                             -- ASSIGN  |LOCAL|
                               -- ONE_TO_ONE_EXCHANGE  |LOCAL|
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
index 890a253..e9f6596 100644
--- 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
@@ -30,15 +30,15 @@
                         }
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                     -- STABLE_SORT [$$47(ASC)]  |PARTITIONED|
-                      -- HASH_PARTITION_EXCHANGE [$$47]  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                         -- STREAM_PROJECT  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             -- HYBRID_HASH_JOIN [$$47][$$49]  |PARTITIONED|
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- HASH_PARTITION_EXCHANGE [$$47]  |PARTITIONED|
                                 -- DATASOURCE_SCAN (test.s)  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                              -- BROADCAST_EXCHANGE  |PARTITIONED|
+                              -- HASH_PARTITION_EXCHANGE [$$49]  |PARTITIONED|
                                 -- STREAM_PROJECT  |UNPARTITIONED|
                                   -- ASSIGN  |UNPARTITIONED|
                                     -- UNNEST  |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
index d6e9fa9..6792ec5 100644
--- 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
@@ -15,14 +15,14 @@
                   -- STREAM_PROJECT  |PARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                       -- HYBRID_HASH_JOIN [$$23][$#1]  |PARTITIONED|
-                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$23]  |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|
+                        -- HASH_PARTITION_EXCHANGE [$#1]  |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
index de7e790..30c5399 100644
--- 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
@@ -21,14 +21,14 @@
                               -- STREAM_PROJECT  |PARTITIONED|
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   -- HYBRID_HASH_JOIN [$$23][$#1]  |PARTITIONED|
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- HASH_PARTITION_EXCHANGE [$$23]  |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|
+                                    -- HASH_PARTITION_EXCHANGE [$#1]  |PARTITIONED|
                                       -- ASSIGN  |UNPARTITIONED|
                                         -- UNNEST  |UNPARTITIONED|
                                           -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
@@ -54,14 +54,14 @@
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                           -- HYBRID_HASH_JOIN [$$23][$#1]  |PARTITIONED|
-                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- HASH_PARTITION_EXCHANGE [$$23]  |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|
+                                            -- HASH_PARTITION_EXCHANGE [$#1]  |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
index 9ba625b..22ea58a 100644
--- 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
@@ -15,14 +15,14 @@
                   -- STREAM_PROJECT  |PARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                       -- HYBRID_HASH_JOIN [$$22][$#1]  |PARTITIONED|
-                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$22]  |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|
+                        -- HASH_PARTITION_EXCHANGE [$#1]  |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
index 148d1b0..84a9315 100644
--- 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
@@ -21,14 +21,14 @@
                               -- STREAM_PROJECT  |PARTITIONED|
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   -- HYBRID_HASH_JOIN [$$22][$#1]  |PARTITIONED|
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- HASH_PARTITION_EXCHANGE [$$22]  |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|
+                                    -- HASH_PARTITION_EXCHANGE [$#1]  |PARTITIONED|
                                       -- ASSIGN  |UNPARTITIONED|
                                         -- UNNEST  |UNPARTITIONED|
                                           -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
@@ -54,14 +54,14 @@
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                           -- HYBRID_HASH_JOIN [$$22][$#1]  |PARTITIONED|
-                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- HASH_PARTITION_EXCHANGE [$$22]  |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|
+                                            -- HASH_PARTITION_EXCHANGE [$#1]  |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
index d6e9fa9..6792ec5 100644
--- 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
@@ -15,14 +15,14 @@
                   -- STREAM_PROJECT  |PARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                       -- HYBRID_HASH_JOIN [$$23][$#1]  |PARTITIONED|
-                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$23]  |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|
+                        -- HASH_PARTITION_EXCHANGE [$#1]  |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
index de7e790..30c5399 100644
--- 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
@@ -21,14 +21,14 @@
                               -- STREAM_PROJECT  |PARTITIONED|
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   -- HYBRID_HASH_JOIN [$$23][$#1]  |PARTITIONED|
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- HASH_PARTITION_EXCHANGE [$$23]  |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|
+                                    -- HASH_PARTITION_EXCHANGE [$#1]  |PARTITIONED|
                                       -- ASSIGN  |UNPARTITIONED|
                                         -- UNNEST  |UNPARTITIONED|
                                           -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
@@ -54,14 +54,14 @@
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                           -- HYBRID_HASH_JOIN [$$23][$#1]  |PARTITIONED|
-                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- HASH_PARTITION_EXCHANGE [$$23]  |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|
+                                            -- HASH_PARTITION_EXCHANGE [$#1]  |PARTITIONED|
                                               -- ASSIGN  |UNPARTITIONED|
                                                 -- UNNEST  |UNPARTITIONED|
                                                   -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpch/q12_shipping.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpch/q12_shipping.plan
index c1f2aff..cd5de62 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpch/q12_shipping.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpch/q12_shipping.plan
@@ -21,15 +21,8 @@
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           -- STREAM_PROJECT  |PARTITIONED|
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- HYBRID_HASH_JOIN [$$122][$$126]  |PARTITIONED|
-                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  -- STREAM_PROJECT  |PARTITIONED|
-                                    -- ASSIGN  |PARTITIONED|
-                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- DATASOURCE_SCAN (tpch.Orders)  |PARTITIONED|
-                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                -- BROADCAST_EXCHANGE  |PARTITIONED|
+                              -- HYBRID_HASH_JOIN [$$126][$$122]  |PARTITIONED|
+                                -- HASH_PARTITION_EXCHANGE [$$126]  |PARTITIONED|
                                   -- STREAM_PROJECT  |PARTITIONED|
                                     -- STREAM_SELECT  |PARTITIONED|
                                       -- ASSIGN  |PARTITIONED|
@@ -38,6 +31,13 @@
                                             -- DATASOURCE_SCAN (tpch.LineItem)  |PARTITIONED|
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                -- HASH_PARTITION_EXCHANGE [$$122]  |PARTITIONED|
+                                  -- STREAM_PROJECT  |PARTITIONED|
+                                    -- ASSIGN  |PARTITIONED|
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        -- DATASOURCE_SCAN (tpch.Orders)  |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.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpch/q12_shipping_broadcast.plan
index c970de6..27e4f5f 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
@@ -17,22 +17,12 @@
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                   -- STREAM_PROJECT  |PARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- HYBRID_HASH_JOIN [$$122][$$125]  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$125][$$122]  |PARTITIONED|
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           -- STREAM_PROJECT  |PARTITIONED|
-                            -- ASSIGN  |PARTITIONED|
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                -- DATASOURCE_SCAN (tpch.Orders)  |PARTITIONED|
-                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                        -- BROADCAST_EXCHANGE  |PARTITIONED|
-                          -- STREAM_PROJECT  |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|
+                              -- HYBRID_HASH_JOIN [$$118][$$124]  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   -- STREAM_PROJECT  |PARTITIONED|
                                     -- STREAM_SELECT  |PARTITIONED|
                                       -- ASSIGN  |PARTITIONED|
@@ -41,3 +31,13 @@
                                             -- 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|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- DATASOURCE_SCAN (tpch.Orders)  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
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 d037732..daf42e8 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
@@ -23,22 +23,12 @@
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                               -- STREAM_PROJECT  |PARTITIONED|
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  -- HYBRID_HASH_JOIN [$$122][$$125]  |PARTITIONED|
+                                  -- HYBRID_HASH_JOIN [$$125][$$122]  |PARTITIONED|
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       -- STREAM_PROJECT  |PARTITIONED|
-                                        -- ASSIGN  |PARTITIONED|
-                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            -- DATASOURCE_SCAN (tpch.Orders)  |PARTITIONED|
-                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                    -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                      -- STREAM_PROJECT  |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|
+                                          -- HYBRID_HASH_JOIN [$$118][$$124]  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                               -- STREAM_PROJECT  |PARTITIONED|
                                                 -- STREAM_SELECT  |PARTITIONED|
                                                   -- ASSIGN  |PARTITIONED|
@@ -47,6 +37,16 @@
                                                         -- 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|
+                                      -- STREAM_PROJECT  |PARTITIONED|
+                                        -- ASSIGN  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- DATASOURCE_SCAN (tpch.Orders)  |PARTITIONED|
+                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                 -- BROADCAST_EXCHANGE  |PARTITIONED|
                   -- AGGREGATE  |UNPARTITIONED|
                     -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
@@ -69,22 +69,12 @@
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                         -- STREAM_PROJECT  |PARTITIONED|
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            -- HYBRID_HASH_JOIN [$$122][$$125]  |PARTITIONED|
+                                            -- HYBRID_HASH_JOIN [$$125][$$122]  |PARTITIONED|
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                 -- STREAM_PROJECT  |PARTITIONED|
-                                                  -- ASSIGN  |PARTITIONED|
-                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      -- DATASOURCE_SCAN (tpch.Orders)  |PARTITIONED|
-                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                              -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                -- STREAM_PROJECT  |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|
+                                                    -- HYBRID_HASH_JOIN [$$118][$$124]  |PARTITIONED|
+                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                         -- STREAM_PROJECT  |PARTITIONED|
                                                           -- STREAM_SELECT  |PARTITIONED|
                                                             -- ASSIGN  |PARTITIONED|
@@ -93,3 +83,13 @@
                                                                   -- 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|
+                                                -- STREAM_PROJECT  |PARTITIONED|
+                                                  -- ASSIGN  |PARTITIONED|
+                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                      -- DATASOURCE_SCAN (tpch.Orders)  |PARTITIONED|
+                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpch/q12_shipping_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpch/q12_shipping_ps.plan
index b926894..03a4f96 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpch/q12_shipping_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpch/q12_shipping_ps.plan
@@ -27,15 +27,8 @@
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       -- STREAM_PROJECT  |PARTITIONED|
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- HYBRID_HASH_JOIN [$$122][$$126]  |PARTITIONED|
-                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                -- ASSIGN  |PARTITIONED|
-                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- DATASOURCE_SCAN (tpch.Orders)  |PARTITIONED|
-                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                            -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                          -- HYBRID_HASH_JOIN [$$126][$$122]  |PARTITIONED|
+                                            -- HASH_PARTITION_EXCHANGE [$$126]  |PARTITIONED|
                                               -- STREAM_PROJECT  |PARTITIONED|
                                                 -- STREAM_SELECT  |PARTITIONED|
                                                   -- ASSIGN  |PARTITIONED|
@@ -44,6 +37,13 @@
                                                         -- DATASOURCE_SCAN (tpch.LineItem)  |PARTITIONED|
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                             -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                            -- HASH_PARTITION_EXCHANGE [$$122]  |PARTITIONED|
+                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                -- ASSIGN  |PARTITIONED|
+                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                    -- DATASOURCE_SCAN (tpch.Orders)  |PARTITIONED|
+                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                     -- BROADCAST_EXCHANGE  |PARTITIONED|
                                       -- UNNEST  |UNPARTITIONED|
                                         -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
@@ -73,15 +73,8 @@
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- HYBRID_HASH_JOIN [$$122][$$126]  |PARTITIONED|
-                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                          -- ASSIGN  |PARTITIONED|
-                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                              -- DATASOURCE_SCAN (tpch.Orders)  |PARTITIONED|
-                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                    -- HYBRID_HASH_JOIN [$$126][$$122]  |PARTITIONED|
+                                                      -- HASH_PARTITION_EXCHANGE [$$126]  |PARTITIONED|
                                                         -- STREAM_PROJECT  |PARTITIONED|
                                                           -- STREAM_SELECT  |PARTITIONED|
                                                             -- ASSIGN  |PARTITIONED|
@@ -90,6 +83,13 @@
                                                                   -- DATASOURCE_SCAN (tpch.LineItem)  |PARTITIONED|
                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                      -- HASH_PARTITION_EXCHANGE [$$122]  |PARTITIONED|
+                                                        -- STREAM_PROJECT  |PARTITIONED|
+                                                          -- ASSIGN  |PARTITIONED|
+                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                              -- DATASOURCE_SCAN (tpch.Orders)  |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/cardinality-estimation/single-collection-queries/single-collection-queries.4.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.4.plan
index 333e491..46521c5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.4.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.4.plan
@@ -1,30 +1,30 @@
-distribute result [$$48] [cardinality: 1500.0, op-cost: 0.0, total-cost: 4491.54]
+distribute result [$$48] [cardinality: 1495.77, op-cost: 0.0, total-cost: 4491.54]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1500.0, op-cost: 0.0, total-cost: 4491.54]
+  exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 4491.54]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$48]) [cardinality: 1500.0, op-cost: 0.0, total-cost: 4491.54]
+    project ([$$48]) [cardinality: 1495.77, op-cost: 0.0, total-cost: 4491.54]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$48] <- [{"$1": $$51}] [cardinality: 1500.0, op-cost: 0.0, total-cost: 4491.54]
+      assign [$$48] <- [{"$1": $$51}] [cardinality: 1495.77, op-cost: 0.0, total-cost: 4491.54]
       -- ASSIGN  |PARTITIONED|
-        project ([$$51]) [cardinality: 1500.0, op-cost: 0.0, total-cost: 4491.54]
+        project ([$$51]) [cardinality: 1495.77, op-cost: 0.0, total-cost: 4491.54]
         -- STREAM_PROJECT  |PARTITIONED|
-          exchange [cardinality: 1500.0, op-cost: 0.0, total-cost: 4491.54]
+          exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 4491.54]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
             group by ([$$o_orderdate := $$54]) decor ([]) {
                       aggregate [$$51] <- [sql-sum-serial($$53)] [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: 1500.0, op-cost: 1495.77, total-cost: 4491.54]
+                   } [cardinality: 1495.77, op-cost: 1495.77, total-cost: 4491.54]
             -- EXTERNAL_GROUP_BY[$$54]  |PARTITIONED|
-              exchange [cardinality: 1500.0, op-cost: 0.0, total-cost: 2995.77]
+              exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 2995.77]
               -- HASH_PARTITION_EXCHANGE [$$54]  |PARTITIONED|
                 group by ([$$54 := $$49]) decor ([]) {
                           aggregate [$$53] <- [sql-count-serial(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: 1500.0, op-cost: 1495.77, total-cost: 2995.77]
+                       } [cardinality: 1495.77, op-cost: 1495.77, total-cost: 2995.77]
                 -- EXTERNAL_GROUP_BY[$$49]  |PARTITIONED|
                   exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 1500.0]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -43,4 +43,4 @@
                                 assign [$$55] <- [5] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- ASSIGN  |PARTITIONED|
                                   empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
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 29b2e72..6443cbc 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,18 +1,18 @@
-distribute result [$$d] [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+distribute result [$$d] [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+  exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$d]) [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+    project ([$$d]) [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+      exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
       -- SORT_MERGE_EXCHANGE [$$20(ASC) ]  |PARTITIONED|
-        order (ASC, $$20) [cardinality: 2.1, op-cost: 2.25, total-cost: 8.25]
+        order (ASC, $$20) [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
         -- STABLE_SORT [$$20(ASC)]  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
+          exchange [cardinality: 1.0, 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: 6.0]
+            project ([$$d, $$20]) [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_PROJECT  |PARTITIONED|
-              select (and(gt($$19, "1"), lt($$19, "3"))) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
+              select (and(gt($$19, "1"), lt($$19, "3"))) [cardinality: 1.0, 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: 6.0]
                 -- ASSIGN  |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 8f1e8e5..b1679c3 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,18 +1,18 @@
-distribute result [$$d] [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+distribute result [$$d] [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+  exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$d]) [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+    project ([$$d]) [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+      exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
       -- SORT_MERGE_EXCHANGE [$$20(ASC) ]  |PARTITIONED|
-        order (ASC, $$20) [cardinality: 2.1, op-cost: 2.25, total-cost: 8.25]
+        order (ASC, $$20) [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
         -- STABLE_SORT [$$20(ASC)]  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
+          exchange [cardinality: 0.0, 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: 6.0]
+            project ([$$d, $$20]) [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_PROJECT  |PARTITIONED|
-              select (and(gt($$19, 1), lt($$19, 3))) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
+              select (and(gt($$19, 1), lt($$19, 3))) [cardinality: 0.0, 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: 6.0]
                 -- ASSIGN  |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 3b70b19..7675958 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,18 +1,18 @@
-distribute result [$$d] [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+distribute result [$$d] [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+  exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$d]) [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+    project ([$$d]) [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+      exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
       -- SORT_MERGE_EXCHANGE [$$28(ASC) ]  |PARTITIONED|
-        order (ASC, $$28) [cardinality: 2.1, op-cost: 2.25, total-cost: 8.25]
+        order (ASC, $$28) [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
         -- STABLE_SORT [$$28(ASC)]  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
+          exchange [cardinality: 0.0, 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: 6.0]
+            project ([$$d, $$28]) [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_PROJECT  |PARTITIONED|
-              select ($$26) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
+              select ($$26) [cardinality: 0.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: 6.0]
                 -- STREAM_PROJECT  |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 15f3bc60..48b09a6 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,18 +1,18 @@
-distribute result [$$d] [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+distribute result [$$d] [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+  exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$d]) [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+    project ([$$d]) [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+      exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
       -- SORT_MERGE_EXCHANGE [$$28(ASC) ]  |PARTITIONED|
-        order (ASC, $$28) [cardinality: 2.1, op-cost: 2.25, total-cost: 8.25]
+        order (ASC, $$28) [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
         -- STABLE_SORT [$$28(ASC)]  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
+          exchange [cardinality: 1.0, 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: 6.0]
+            project ([$$d, $$28]) [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_PROJECT  |PARTITIONED|
-              select ($$26) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
+              select ($$26) [cardinality: 1.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: 6.0]
                 -- STREAM_PROJECT  |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 b9513d6..b21c699 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,16 +1,16 @@
-distribute result [$$item] [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+distribute result [$$item] [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+  exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$item]) [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+    project ([$$item]) [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+      exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
       -- SORT_MERGE_EXCHANGE [$$27(ASC), $$item(ASC) ]  |PARTITIONED|
-        order (ASC, $$27) (ASC, $$item) [cardinality: 2.1, op-cost: 2.25, total-cost: 8.25]
+        order (ASC, $$27) (ASC, $$item) [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
         -- STABLE_SORT [$$27(ASC), $$item(ASC)]  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
+          exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            select (eq($$item, 100)) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
+            select (eq($$item, 100)) [cardinality: 1.0, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_SELECT  |PARTITIONED|
               project ([$$27, $$item]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
               -- STREAM_PROJECT  |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 d104fce..8bc1c8c 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,16 +1,16 @@
-distribute result [$$item] [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+distribute result [$$item] [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+  exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$item]) [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+    project ([$$item]) [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+      exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
       -- SORT_MERGE_EXCHANGE [$$27(ASC), $$item(ASC) ]  |PARTITIONED|
-        order (ASC, $$27) (ASC, $$item) [cardinality: 2.1, op-cost: 2.25, total-cost: 8.25]
+        order (ASC, $$27) (ASC, $$item) [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
         -- STABLE_SORT [$$27(ASC), $$item(ASC)]  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
+          exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            select (gt($$item, 10000)) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
+            select (gt($$item, 10000)) [cardinality: 0.0, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_SELECT  |PARTITIONED|
               project ([$$27, $$item]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
               -- STREAM_PROJECT  |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 9f5018d..d8a8cd0 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,20 +1,20 @@
-distribute result [$$31] [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+distribute result [$$31] [cardinality: 2.0, op-cost: 0.0, total-cost: 8.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 8.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$31]) [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+    project ([$$31]) [cardinality: 2.0, op-cost: 0.0, total-cost: 8.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$31] <- [{"a": $$34, "item": $$item}] [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+      assign [$$31] <- [{"a": $$34, "item": $$item}] [cardinality: 2.0, op-cost: 0.0, total-cost: 8.0]
       -- ASSIGN  |PARTITIONED|
-        project ([$$34, $$item]) [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+        project ([$$34, $$item]) [cardinality: 2.0, op-cost: 0.0, total-cost: 8.0]
         -- STREAM_PROJECT  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 8.0]
           -- SORT_MERGE_EXCHANGE [$$35(ASC), $$34(ASC), $$item(ASC) ]  |PARTITIONED|
-            order (ASC, $$35) (ASC, $$34) (ASC, $$item) [cardinality: 2.1, op-cost: 2.25, total-cost: 8.25]
+            order (ASC, $$35) (ASC, $$34) (ASC, $$item) [cardinality: 2.0, op-cost: 2.0, total-cost: 8.0]
             -- STABLE_SORT [$$35(ASC), $$34(ASC), $$item(ASC)]  |PARTITIONED|
-              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
+              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 6.0]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                select (gt($$item, 10)) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
+                select (gt($$item, 10)) [cardinality: 2.0, op-cost: 0.0, total-cost: 6.0]
                 -- STREAM_SELECT  |PARTITIONED|
                   project ([$$35, $$34, $$item]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                   -- STREAM_PROJECT  |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 9936002..3be0e8f 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,18 +1,18 @@
-distribute result [$$48] [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
+distribute result [$$48] [cardinality: 2.0, op-cost: 0.0, total-cost: 30.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
+  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 30.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$48]) [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
+    project ([$$48]) [cardinality: 2.0, op-cost: 0.0, total-cost: 30.0]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$48] <- [{"$1": $$50}] [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
+      assign [$$48] <- [{"$1": $$50}] [cardinality: 2.0, op-cost: 0.0, total-cost: 30.0]
       -- ASSIGN  |UNPARTITIONED|
-        aggregate [$$50] <- [agg-sql-sum($$52)] [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
+        aggregate [$$50] <- [agg-sql-sum($$52)] [cardinality: 2.0, op-cost: 0.0, total-cost: 30.0]
         -- AGGREGATE  |UNPARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
+          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 30.0]
           -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-            aggregate [$$52] <- [agg-sql-count(1)] [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
+            aggregate [$$52] <- [agg-sql-count(1)] [cardinality: 2.0, op-cost: 0.0, total-cost: 30.0]
             -- AGGREGATE  |PARTITIONED|
-              select (gt(numeric-add($$D, 1), 2018)) [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
+              select (gt(numeric-add($$D, 1), 2018)) [cardinality: 2.0, op-cost: 0.0, total-cost: 30.0]
               -- STREAM_SELECT  |PARTITIONED|
                 project ([$$D]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                 -- STREAM_PROJECT  |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 a66d6a8..73b314b 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,18 +1,18 @@
-distribute result [$$51] [cardinality: 2.1, op-cost: 0.0, total-cost: 8.0]
+distribute result [$$51] [cardinality: 1.0, op-cost: 0.0, total-cost: 8.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.0]
+  exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 8.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$51]) [cardinality: 2.1, op-cost: 0.0, total-cost: 8.0]
+    project ([$$51]) [cardinality: 1.0, op-cost: 0.0, total-cost: 8.0]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$51] <- [{"$1": $$53}] [cardinality: 2.1, op-cost: 0.0, total-cost: 8.0]
+      assign [$$51] <- [{"$1": $$53}] [cardinality: 1.0, op-cost: 0.0, total-cost: 8.0]
       -- ASSIGN  |UNPARTITIONED|
-        aggregate [$$53] <- [agg-sql-sum($$57)] [cardinality: 2.1, op-cost: 0.0, total-cost: 8.0]
+        aggregate [$$53] <- [agg-sql-sum($$57)] [cardinality: 1.0, op-cost: 0.0, total-cost: 8.0]
         -- AGGREGATE  |UNPARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.0]
+          exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 8.0]
           -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-            aggregate [$$57] <- [agg-sql-count(1)] [cardinality: 2.1, op-cost: 0.0, total-cost: 8.0]
+            aggregate [$$57] <- [agg-sql-count(1)] [cardinality: 1.0, op-cost: 0.0, total-cost: 8.0]
             -- AGGREGATE  |PARTITIONED|
-              select ($$44) [cardinality: 2.1, op-cost: 0.0, total-cost: 8.0]
+              select ($$44) [cardinality: 1.0, op-cost: 0.0, total-cost: 8.0]
               -- STREAM_SELECT  |PARTITIONED|
                 project ([$$44]) [cardinality: 8.0, op-cost: 0.0, total-cost: 8.0]
                 -- STREAM_PROJECT  |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 307a75a..dfc23ab 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,18 +1,18 @@
-distribute result [$$37] [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
+distribute result [$$37] [cardinality: 1.0, op-cost: 0.0, total-cost: 30.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
+  exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 30.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$37]) [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
+    project ([$$37]) [cardinality: 1.0, op-cost: 0.0, total-cost: 30.0]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$37] <- [{"$1": $$39}] [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
+      assign [$$37] <- [{"$1": $$39}] [cardinality: 1.0, op-cost: 0.0, total-cost: 30.0]
       -- ASSIGN  |UNPARTITIONED|
-        aggregate [$$39] <- [agg-sql-sum($$42)] [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
+        aggregate [$$39] <- [agg-sql-sum($$42)] [cardinality: 1.0, op-cost: 0.0, total-cost: 30.0]
         -- AGGREGATE  |UNPARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
+          exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 30.0]
           -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-            aggregate [$$42] <- [agg-sql-count(1)] [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
+            aggregate [$$42] <- [agg-sql-count(1)] [cardinality: 1.0, op-cost: 0.0, total-cost: 30.0]
             -- AGGREGATE  |PARTITIONED|
-              select (array-contains($$C.getField("checkin_times").getField("dates"), "2018-05-25")) [cardinality: 2.1, op-cost: 0.0, total-cost: 30.0]
+              select (array-contains($$C.getField("checkin_times").getField("dates"), "2018-05-25")) [cardinality: 1.0, op-cost: 0.0, total-cost: 30.0]
               -- STREAM_SELECT  |PARTITIONED|
                 project ([$$C]) [cardinality: 30.0, op-cost: 0.0, total-cost: 30.0]
                 -- STREAM_PROJECT  |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 d5c9c4e..c523b20 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,18 +1,18 @@
-distribute result [$$d] [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+distribute result [$$d] [cardinality: 5.0, op-cost: 0.0, total-cost: 17.61]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+  exchange [cardinality: 5.0, op-cost: 0.0, total-cost: 17.61]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$d]) [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+    project ([$$d]) [cardinality: 5.0, op-cost: 0.0, total-cost: 17.61]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+      exchange [cardinality: 5.0, op-cost: 0.0, total-cost: 17.61]
       -- SORT_MERGE_EXCHANGE [$$20(ASC) ]  |PARTITIONED|
-        order (ASC, $$20) [cardinality: 2.1, op-cost: 2.25, total-cost: 8.25]
+        order (ASC, $$20) [cardinality: 5.0, op-cost: 11.61, total-cost: 17.61]
         -- STABLE_SORT [$$20(ASC)]  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
+          exchange [cardinality: 5.0, 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: 6.0]
+            project ([$$d, $$20]) [cardinality: 5.0, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_PROJECT  |PARTITIONED|
-              select ($$18) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
+              select ($$18) [cardinality: 5.0, op-cost: 0.0, total-cost: 6.0]
               -- STREAM_SELECT  |PARTITIONED|
                 project ([$$20, $$d, $$18]) [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                 -- STREAM_PROJECT  |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 b4d870f..b1b4bc2 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
@@ -1,16 +1,16 @@
-distribute result [$$d] [cardinality: 6.0, op-cost: 0.0, total-cost: 41.94]
+distribute result [$$d] [cardinality: 6.0, op-cost: 0.0, total-cost: 37.02]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 41.94]
+  exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 37.02]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$d]) [cardinality: 6.0, op-cost: 0.0, total-cost: 41.94]
+    project ([$$d]) [cardinality: 6.0, op-cost: 0.0, total-cost: 37.02]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 41.94]
+      exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 37.02]
       -- SORT_MERGE_EXCHANGE [$$24(ASC) ]  |PARTITIONED|
-        project ([$$d, $$24]) [cardinality: 6.0, op-cost: 0.0, total-cost: 41.94]
+        project ([$$d, $$24]) [cardinality: 6.0, op-cost: 0.0, total-cost: 37.02]
         -- STREAM_PROJECT  |PARTITIONED|
           select ($$18) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
           -- STREAM_SELECT  |PARTITIONED|
-            exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 41.94]
+            exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 37.02]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               group by ([$$24 := $$20]) decor ([$$d]) {
                         aggregate [$$18] <- [empty-stream()] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
@@ -19,11 +19,11 @@
                           -- 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: 17.97, total-cost: 41.94]
+                     } [cardinality: 6.0, op-cost: 15.51, total-cost: 37.02]
               -- PRE_CLUSTERED_GROUP_BY[$$20]  |PARTITIONED|
-                exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 23.97]
+                exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 21.51]
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  order (ASC, $$20) [cardinality: 6.0, op-cost: 17.97, total-cost: 23.97]
+                  order (ASC, $$20) [cardinality: 6.0, op-cost: 15.51, total-cost: 21.51]
                   -- STABLE_SORT [$$20(ASC)]  |PARTITIONED|
                     exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 6.0]
                     -- HASH_PARTITION_EXCHANGE [$$20]  |PARTITIONED|
@@ -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: 6.6, op-cost: 12.6, total-cost: 29.1]
+                          left outer join (not(if-missing-or-null(neq($$21, $#1), false))) [cardinality: 6.0, op-cost: 6.0, total-cost: 17.0]
                           -- 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 232b103..ec838b6 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,18 +1,18 @@
-distribute result [$$d] [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+distribute result [$$d] [cardinality: 3.0, op-cost: 0.0, total-cost: 10.75]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+  exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 10.75]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$d]) [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+    project ([$$d]) [cardinality: 3.0, op-cost: 0.0, total-cost: 10.75]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 8.25]
+      exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 10.75]
       -- SORT_MERGE_EXCHANGE [$$28(ASC) ]  |PARTITIONED|
-        order (ASC, $$28) [cardinality: 2.1, op-cost: 2.25, total-cost: 8.25]
+        order (ASC, $$28) [cardinality: 3.0, op-cost: 4.75, total-cost: 10.75]
         -- STABLE_SORT [$$28(ASC)]  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 6.0]
+          exchange [cardinality: 3.0, 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: 6.0]
+            project ([$$d, $$28]) [cardinality: 3.0, op-cost: 0.0, total-cost: 6.0]
             -- STREAM_PROJECT  |PARTITIONED|
-              select ($$26) [cardinality: 2.1, op-cost: 0.0, total-cost: 6.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: 6.0]
                 -- STREAM_PROJECT  |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 809fffc..9f01ff8 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.1, op-cost: 0.0, total-cost: 4.35]
+distribute result [$$18] [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$18]) [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+    project ([$$18]) [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$18] <- [{"display_url": $$22}] [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+      assign [$$18] <- [{"display_url": $$22}] [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
       -- ASSIGN  |PARTITIONED|
-        project ([$$22]) [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+        project ([$$22]) [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
         -- STREAM_PROJECT  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
           -- SORT_MERGE_EXCHANGE [$$20(ASC) ]  |PARTITIONED|
-            order (ASC, $$20) [cardinality: 2.1, op-cost: 2.25, total-cost: 4.35]
+            order (ASC, $$20) [cardinality: 2.0, op-cost: 2.0, total-cost: 4.0]
             -- STABLE_SORT [$$20(ASC)]  |PARTITIONED|
-              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                project ([$$22, $$20]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                project ([$$22, $$20]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  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 [$$22] <- [get-item($$p.getField("entities").getField("urls"), 0).getField("display_url")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                   -- ASSIGN  |PARTITIONED|
-                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      data-scan []<-[$$20, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                      data-scan []<-[$$20, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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.006.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.006.plan
index ff4f100..4c75f25 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
@@ -1,32 +1,32 @@
-distribute result [$$22] [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+distribute result [$$22] [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+  exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$22]) [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+    project ([$$22]) [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$22] <- [{"display_url": $$27}] [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+      assign [$$22] <- [{"display_url": $$27}] [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
       -- ASSIGN  |PARTITIONED|
-        project ([$$27]) [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+        project ([$$27]) [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
         -- STREAM_PROJECT  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+          exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
           -- SORT_MERGE_EXCHANGE [$$25(ASC) ]  |PARTITIONED|
-            order (ASC, $$25) [cardinality: 2.1, op-cost: 2.25, total-cost: 4.35]
+            order (ASC, $$25) [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
             -- STABLE_SORT [$$25(ASC)]  |PARTITIONED|
-              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+              exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                project ([$$27, $$25]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                project ([$$27, $$25]) [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  assign [$$27] <- [array-star($$24).getField("display_url")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                  assign [$$27] <- [array-star($$24).getField("display_url")] [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
                   -- ASSIGN  |PARTITIONED|
-                    select (not(is-missing($$24))) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                    select (not(is-missing($$24))) [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
                     -- STREAM_SELECT  |PARTITIONED|
-                      project ([$$25, $$24]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                      project ([$$25, $$24]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                       -- STREAM_PROJECT  |PARTITIONED|
-                        assign [$$24] <- [$$p.getField("entities").getField("urls")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                        assign [$$24] <- [$$p.getField("entities").getField("urls")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                         -- ASSIGN  |PARTITIONED|
-                          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$25, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                            data-scan []<-[$$25, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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.008.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.008.plan
index b8e63d5..8631f06 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.1, op-cost: 0.0, total-cost: 4.35]
+distribute result [$$28] [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$28]) [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+    project ([$$28]) [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$28] <- [{"display_url": $$urls.getField("display_url")}] [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+      assign [$$28] <- [{"display_url": $$urls.getField("display_url")}] [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
       -- ASSIGN  |PARTITIONED|
-        project ([$$urls]) [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+        project ([$$urls]) [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
         -- STREAM_PROJECT  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
           -- SORT_MERGE_EXCHANGE [$$30(ASC) ]  |PARTITIONED|
-            order (ASC, $$30) [cardinality: 2.1, op-cost: 2.25, total-cost: 4.35]
+            order (ASC, $$30) [cardinality: 2.0, op-cost: 2.0, total-cost: 4.0]
             -- STABLE_SORT [$$30(ASC)]  |PARTITIONED|
-              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                project ([$$urls, $$30]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                project ([$$urls, $$30]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  unnest $$urls <- scan-collection($$31) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                  unnest $$urls <- scan-collection($$31) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                   -- UNNEST  |PARTITIONED|
-                    project ([$$30, $$31]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                    project ([$$30, $$31]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      assign [$$31] <- [$$p.getField("entities").getField("urls")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                      assign [$$31] <- [$$p.getField("entities").getField("urls")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                       -- ASSIGN  |PARTITIONED|
-                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          data-scan []<-[$$30, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                          data-scan []<-[$$30, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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.010.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.010.plan
index e50e0db..0579a38 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
@@ -1,16 +1,16 @@
-distribute result [$$50] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+distribute result [$$50] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    aggregate [$$50] <- [agg-sql-sum($$54)] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+    aggregate [$$50] <- [agg-sql-sum($$54)] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
     -- AGGREGATE  |UNPARTITIONED|
-      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+      exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        aggregate [$$54] <- [agg-sql-count(1)] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+        aggregate [$$54] <- [agg-sql-count(1)] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
         -- AGGREGATE  |PARTITIONED|
-          select ($$42) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+          select ($$42) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
           -- STREAM_SELECT  |PARTITIONED|
-            project ([$$42]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+            project ([$$42]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
             -- 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.1, op-cost: 0.0, total-cost: 2.1]
+                     } [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
               -- SUBPLAN  |PARTITIONED|
-                project ([$$51]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                project ([$$51]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  assign [$$51] <- [$$p.getField("entities").getField("urls")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                  assign [$$51] <- [$$p.getField("entities").getField("urls")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                   -- ASSIGN  |PARTITIONED|
-                    project ([$$p]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                    project ([$$p]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                      exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$49, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                        data-scan []<-[$$49, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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.012.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/array-access-pushdown/array-access-pushdown.012.plan
index 1ed05d54..7355bbe 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.1, op-cost: 0.0, total-cost: 4.35]
+distribute result [$$19] [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$19]) [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+    project ([$$19]) [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$19] <- [get-item(get-item(get-item($$25.getField("coordinates"), 0), 0), 0)] [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+      assign [$$19] <- [get-item(get-item(get-item($$25.getField("coordinates"), 0), 0), 0)] [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
       -- ASSIGN  |PARTITIONED|
-        project ([$$25]) [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+        project ([$$25]) [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
         -- STREAM_PROJECT  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
           -- SORT_MERGE_EXCHANGE [$$21(ASC) ]  |PARTITIONED|
-            order (ASC, $$21) [cardinality: 2.1, op-cost: 2.25, total-cost: 4.35]
+            order (ASC, $$21) [cardinality: 2.0, op-cost: 2.0, total-cost: 4.0]
             -- STABLE_SORT [$$21(ASC)]  |PARTITIONED|
-              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                project ([$$25, $$21]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                project ([$$25, $$21]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  assign [$$25] <- [$$p.getField("place").getField("bounding_box")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                  assign [$$25] <- [$$p.getField("place").getField("bounding_box")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                   -- ASSIGN  |PARTITIONED|
-                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      data-scan []<-[$$21, $$p] <- test.ColumnDataset project ({place:{bounding_box:{coordinates:[[[any]]]}}}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                      data-scan []<-[$$21, $$p] <- test.ColumnDataset project ({place:{bounding_box:{coordinates:[[[any]]]}}}) [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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/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 8dd8690..2f7637f 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.1, op-cost: 0.0, total-cost: 4.35]
+distribute result [$$18] [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$18]) [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+    project ([$$18]) [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$18] <- [{"id": $$20.getField("id"), "name": $$20.getField("name")}] [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+      assign [$$18] <- [{"id": $$20.getField("id"), "name": $$20.getField("name")}] [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
       -- ASSIGN  |PARTITIONED|
-        project ([$$20]) [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+        project ([$$20]) [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
         -- STREAM_PROJECT  |PARTITIONED|
-          assign [$$20] <- [$$p.getField("user")] [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+          assign [$$20] <- [$$p.getField("user")] [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
           -- ASSIGN  |PARTITIONED|
-            project ([$$p]) [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+            project ([$$p]) [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
             -- STREAM_PROJECT  |PARTITIONED|
-              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
               -- SORT_MERGE_EXCHANGE [$$21(ASC) ]  |PARTITIONED|
-                order (ASC, $$21) [cardinality: 2.1, op-cost: 2.25, total-cost: 4.35]
+                order (ASC, $$21) [cardinality: 2.0, op-cost: 2.0, total-cost: 4.0]
                 -- STABLE_SORT [$$21(ASC)]  |PARTITIONED|
-                  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    data-scan []<-[$$21, $$p] <- test.ColumnDataset4 project ({user:{name:any,id:any}}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                    data-scan []<-[$$21, $$p] <- test.ColumnDataset4 project ({user:{name:any,id:any}}) [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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/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 c4b9b3b..46ba8c3 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.1, op-cost: 0.0, total-cost: 2.1]
+distribute result [$$34] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    aggregate [$$34] <- [agg-sql-sum($$35)] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+    aggregate [$$34] <- [agg-sql-sum($$35)] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
     -- AGGREGATE  |UNPARTITIONED|
-      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+      exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        aggregate [$$35] <- [agg-sql-count(1)] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+        aggregate [$$35] <- [agg-sql-count(1)] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
         -- AGGREGATE  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            data-scan []<-[$$33, $$p] <- test.ColumnDataset4 project ({}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+            data-scan []<-[$$33, $$p] <- test.ColumnDataset4 project ({}) [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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/join/condition-pushdown/condition-pushdown.012.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/join/condition-pushdown/condition-pushdown.012.plan
index 47546eb..76ba916 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/join/condition-pushdown/condition-pushdown.012.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/join/condition-pushdown/condition-pushdown.012.plan
@@ -1,28 +1,28 @@
-distribute result [$$32] [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+distribute result [$$32] [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$32]) [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+    project ([$$32]) [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$32] <- [{"c1": $$40, "c2": $$41}] [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+      assign [$$32] <- [{"c1": $$40, "c2": $$41}] [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
         -- SORT_MERGE_EXCHANGE [$$40(ASC), $$41(ASC) ]  |PARTITIONED|
-          order (ASC, $$40) (ASC, $$41) [cardinality: 2.1, op-cost: 2.25, total-cost: 23.25]
+          order (ASC, $$40) (ASC, $$41) [cardinality: 2.1, op-cost: 2.25, total-cost: 13.35]
           -- STABLE_SORT [$$40(ASC), $$41(ASC)]  |PARTITIONED|
-            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 21.0]
+            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 11.1]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$40, $$41]) [cardinality: 2.1, op-cost: 0.0, total-cost: 21.0]
+              project ([$$40, $$41]) [cardinality: 2.1, op-cost: 0.0, total-cost: 11.1]
               -- STREAM_PROJECT  |PARTITIONED|
-                select (eq($$37, $$t2.getField("c_s"))) [cardinality: 2.1, op-cost: 10.5, total-cost: 21.0]
+                select (eq($$37, $$t2.getField("c_s"))) [cardinality: 2.1, op-cost: 6.1, total-cost: 11.1]
                 -- STREAM_SELECT  |PARTITIONED|
-                  assign [$$41] <- [$$t2.getField("c_x")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                  assign [$$41] <- [$$t2.getField("c_x")] [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                   -- ASSIGN  |PARTITIONED|
-                    project ([$$40, $$37, $$t2]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                    project ([$$40, $$37, $$t2]) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                      exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        unnest-map [$$36, $$t2] <- index-search("TestOpenColumn2", 0, "Default", "test", "TestOpenColumn2", true, false, 1, $$45, 1, $$45, true, true, true) project ({c_s:any,c_x:any}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                        unnest-map [$$36, $$t2] <- index-search("TestOpenColumn2", 0, "Default", "test", "TestOpenColumn2", true, false, 1, $$45, 1, $$45, true, true, true) project ({c_s:any,c_x:any}) [cardinality: 1.0, op-cost: 1.0, total-cost: 1.0]
                         -- BTREE_SEARCH  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -46,7 +46,7 @@
                                             -- STREAM_PROJECT  |PARTITIONED|
                                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                data-scan []<-[$$35, $$t1] <- test.TestOpenColumn1 project ({c_s:any,c_x:any}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                                                data-scan []<-[$$35, $$t1] <- test.TestOpenColumn1 project ({c_s:any,c_x:any}) [cardinality: 1.0, op-cost: 1.0, total-cost: 1.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/join/condition-pushdown/condition-pushdown.014.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/join/condition-pushdown/condition-pushdown.014.plan
index 90f5172..e3ab5d1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/join/condition-pushdown/condition-pushdown.014.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/join/condition-pushdown/condition-pushdown.014.plan
@@ -1,30 +1,30 @@
-distribute result [$$37] [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+distribute result [$$37] [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$37]) [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+    project ([$$37]) [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$37] <- [{"c1": $$47, "c2": $$48}] [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+      assign [$$37] <- [{"c1": $$47, "c2": $$48}] [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
         -- SORT_MERGE_EXCHANGE [$$47(ASC), $$48(ASC) ]  |PARTITIONED|
-          order (ASC, $$47) (ASC, $$48) [cardinality: 2.1, op-cost: 2.25, total-cost: 23.25]
+          order (ASC, $$47) (ASC, $$48) [cardinality: 2.1, op-cost: 2.25, total-cost: 13.35]
           -- STABLE_SORT [$$47(ASC), $$48(ASC)]  |PARTITIONED|
-            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 21.0]
+            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 11.1]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$47, $$48]) [cardinality: 2.1, op-cost: 0.0, total-cost: 21.0]
+              project ([$$47, $$48]) [cardinality: 2.1, op-cost: 0.0, total-cost: 11.1]
               -- STREAM_PROJECT  |PARTITIONED|
-                select (eq($$42, $$t2.getField("c_s"))) [cardinality: 2.1, op-cost: 10.5, total-cost: 21.0]
+                select (eq($$42, $$t2.getField("c_s"))) [cardinality: 2.1, op-cost: 6.1, total-cost: 11.1]
                 -- STREAM_SELECT  |PARTITIONED|
-                  select (eq($$t2.getField("c_i64"), 2.25)) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                  select (eq($$t2.getField("c_i64"), 2.25)) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                   -- STREAM_SELECT  |PARTITIONED|
-                    assign [$$48] <- [$$t2.getField("c_x")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                    assign [$$48] <- [$$t2.getField("c_x")] [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                     -- ASSIGN  |PARTITIONED|
-                      project ([$$47, $$42, $$t2]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                      project ([$$47, $$42, $$t2]) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                       -- STREAM_PROJECT  |PARTITIONED|
-                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                        exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          unnest-map [$$41, $$t2] <- index-search("TestOpenColumn2", 0, "Default", "test", "TestOpenColumn2", true, false, 1, $$52, 1, $$52, true, true, true) project ({c_i64:any,c_s:any,c_x:any}) range-filter on: eq($$t2.getField("c_i64"), 2.25) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                          unnest-map [$$41, $$t2] <- index-search("TestOpenColumn2", 0, "Default", "test", "TestOpenColumn2", true, false, 1, $$52, 1, $$52, true, true, true) project ({c_i64:any,c_s:any,c_x:any}) range-filter on: eq($$t2.getField("c_i64"), 2.25) [cardinality: 1.0, op-cost: 1.0, total-cost: 1.0]
                           -- BTREE_SEARCH  |PARTITIONED|
                             exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -44,7 +44,7 @@
                                           -- STREAM_PROJECT  |PARTITIONED|
                                             assign [$$42] <- [to-string($$t1.getField("c_s"))] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                             -- ASSIGN  |PARTITIONED|
-                                              select (eq($$t1.getField("c_i64"), 2)) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                              select (eq($$t1.getField("c_i64"), 2)) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                                               -- STREAM_SELECT  |PARTITIONED|
                                                 assign [$$47] <- [$$t1.getField("c_x")] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                 -- ASSIGN  |PARTITIONED|
@@ -52,7 +52,7 @@
                                                   -- STREAM_PROJECT  |PARTITIONED|
                                                     exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      data-scan []<-[$$40, $$t1] <- test.TestOpenColumn1 project ({c_i64:any,c_s:any,c_x:any}) filter on: eq($$t1.getField("c_i64"), 2) range-filter on: eq($$t1.getField("c_i64"), 2) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                                                      data-scan []<-[$$40, $$t1] <- test.TestOpenColumn1 project ({c_i64:any,c_s:any,c_x:any}) filter on: eq($$t1.getField("c_i64"), 2) range-filter on: eq($$t1.getField("c_i64"), 2) [cardinality: 1.0, op-cost: 1.0, total-cost: 1.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/join/condition-pushdown/condition-pushdown.021.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/join/condition-pushdown/condition-pushdown.021.plan
index a93082e..9f54990 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/join/condition-pushdown/condition-pushdown.021.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/join/condition-pushdown/condition-pushdown.021.plan
@@ -1,28 +1,28 @@
-distribute result [$$32] [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+distribute result [$$32] [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$32]) [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+    project ([$$32]) [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$32] <- [{"c1": $$40, "c2": $$41}] [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+      assign [$$32] <- [{"c1": $$40, "c2": $$41}] [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
         -- SORT_MERGE_EXCHANGE [$$40(ASC), $$41(ASC) ]  |PARTITIONED|
-          order (ASC, $$40) (ASC, $$41) [cardinality: 2.1, op-cost: 2.25, total-cost: 23.25]
+          order (ASC, $$40) (ASC, $$41) [cardinality: 2.1, op-cost: 2.25, total-cost: 13.35]
           -- STABLE_SORT [$$40(ASC), $$41(ASC)]  |PARTITIONED|
-            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 21.0]
+            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 11.1]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$40, $$41]) [cardinality: 2.1, op-cost: 0.0, total-cost: 21.0]
+              project ([$$40, $$41]) [cardinality: 2.1, op-cost: 0.0, total-cost: 11.1]
               -- STREAM_PROJECT  |PARTITIONED|
-                select (eq($$37, $$t2.getField("c_s"))) [cardinality: 2.1, op-cost: 10.5, total-cost: 21.0]
+                select (eq($$37, $$t2.getField("c_s"))) [cardinality: 2.1, op-cost: 6.1, total-cost: 11.1]
                 -- STREAM_SELECT  |PARTITIONED|
-                  assign [$$41] <- [$$t2.getField("c_x")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                  assign [$$41] <- [$$t2.getField("c_x")] [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                   -- ASSIGN  |PARTITIONED|
-                    project ([$$40, $$37, $$t2]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                    project ([$$40, $$37, $$t2]) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                      exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        unnest-map [$$36, $$t2] <- index-search("TestOpenRow2", 0, "Default", "test", "TestOpenRow2", true, false, 1, $$45, 1, $$45, true, true, true) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                        unnest-map [$$36, $$t2] <- index-search("TestOpenRow2", 0, "Default", "test", "TestOpenRow2", true, false, 1, $$45, 1, $$45, true, true, true) [cardinality: 1.0, op-cost: 1.0, total-cost: 1.0]
                         -- BTREE_SEARCH  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -46,7 +46,7 @@
                                             -- STREAM_PROJECT  |PARTITIONED|
                                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                data-scan []<-[$$35, $$t1] <- test.TestOpenColumn1 project ({c_s:any,c_x:any}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                                                data-scan []<-[$$35, $$t1] <- test.TestOpenColumn1 project ({c_s:any,c_x:any}) [cardinality: 1.0, op-cost: 1.0, total-cost: 1.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/join/condition-pushdown/condition-pushdown.023.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/join/condition-pushdown/condition-pushdown.023.plan
index acadbbd..f9b8fa0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/join/condition-pushdown/condition-pushdown.023.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/join/condition-pushdown/condition-pushdown.023.plan
@@ -1,30 +1,30 @@
-distribute result [$$37] [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+distribute result [$$37] [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$37]) [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+    project ([$$37]) [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$37] <- [{"c1": $$47, "c2": $$48}] [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+      assign [$$37] <- [{"c1": $$47, "c2": $$48}] [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
         -- SORT_MERGE_EXCHANGE [$$47(ASC), $$48(ASC) ]  |PARTITIONED|
-          order (ASC, $$47) (ASC, $$48) [cardinality: 2.1, op-cost: 2.25, total-cost: 23.25]
+          order (ASC, $$47) (ASC, $$48) [cardinality: 2.1, op-cost: 2.25, total-cost: 13.35]
           -- STABLE_SORT [$$47(ASC), $$48(ASC)]  |PARTITIONED|
-            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 21.0]
+            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 11.1]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$47, $$48]) [cardinality: 2.1, op-cost: 0.0, total-cost: 21.0]
+              project ([$$47, $$48]) [cardinality: 2.1, op-cost: 0.0, total-cost: 11.1]
               -- STREAM_PROJECT  |PARTITIONED|
-                select (eq($$42, $$t2.getField("c_s"))) [cardinality: 2.1, op-cost: 10.5, total-cost: 21.0]
+                select (eq($$42, $$t2.getField("c_s"))) [cardinality: 2.1, op-cost: 6.1, total-cost: 11.1]
                 -- STREAM_SELECT  |PARTITIONED|
-                  select (eq($$t2.getField("c_i64"), 2.25)) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                  select (eq($$t2.getField("c_i64"), 2.25)) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                   -- STREAM_SELECT  |PARTITIONED|
-                    assign [$$48] <- [$$t2.getField("c_x")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                    assign [$$48] <- [$$t2.getField("c_x")] [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                     -- ASSIGN  |PARTITIONED|
-                      project ([$$47, $$42, $$t2]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                      project ([$$47, $$42, $$t2]) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                       -- STREAM_PROJECT  |PARTITIONED|
-                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                        exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          unnest-map [$$41, $$t2] <- index-search("TestOpenRow2", 0, "Default", "test", "TestOpenRow2", true, false, 1, $$52, 1, $$52, true, true, true) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                          unnest-map [$$41, $$t2] <- index-search("TestOpenRow2", 0, "Default", "test", "TestOpenRow2", true, false, 1, $$52, 1, $$52, true, true, true) [cardinality: 1.0, op-cost: 1.0, total-cost: 1.0]
                           -- BTREE_SEARCH  |PARTITIONED|
                             exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -44,7 +44,7 @@
                                           -- STREAM_PROJECT  |PARTITIONED|
                                             assign [$$42] <- [to-string($$t1.getField("c_s"))] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                             -- ASSIGN  |PARTITIONED|
-                                              select (eq($$t1.getField("c_i64"), 2)) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                              select (eq($$t1.getField("c_i64"), 2)) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                                               -- STREAM_SELECT  |PARTITIONED|
                                                 assign [$$47] <- [$$t1.getField("c_x")] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                 -- ASSIGN  |PARTITIONED|
@@ -52,7 +52,7 @@
                                                   -- STREAM_PROJECT  |PARTITIONED|
                                                     exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      data-scan []<-[$$40, $$t1] <- test.TestOpenColumn1 project ({c_i64:any,c_s:any,c_x:any}) filter on: eq($$t1.getField("c_i64"), 2) range-filter on: eq($$t1.getField("c_i64"), 2) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                                                      data-scan []<-[$$40, $$t1] <- test.TestOpenColumn1 project ({c_i64:any,c_s:any,c_x:any}) filter on: eq($$t1.getField("c_i64"), 2) range-filter on: eq($$t1.getField("c_i64"), 2) [cardinality: 1.0, op-cost: 1.0, total-cost: 1.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/join/condition-pushdown/condition-pushdown.031.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/join/condition-pushdown/condition-pushdown.031.plan
index ddb3f27..446cab5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/join/condition-pushdown/condition-pushdown.031.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/join/condition-pushdown/condition-pushdown.031.plan
@@ -1,28 +1,28 @@
-distribute result [$$32] [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+distribute result [$$32] [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$32]) [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+    project ([$$32]) [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$32] <- [{"c1": $$40, "c2": $$41}] [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+      assign [$$32] <- [{"c1": $$40, "c2": $$41}] [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
         -- SORT_MERGE_EXCHANGE [$$40(ASC), $$41(ASC) ]  |PARTITIONED|
-          order (ASC, $$40) (ASC, $$41) [cardinality: 2.1, op-cost: 2.25, total-cost: 23.25]
+          order (ASC, $$40) (ASC, $$41) [cardinality: 2.1, op-cost: 2.25, total-cost: 13.35]
           -- STABLE_SORT [$$40(ASC), $$41(ASC)]  |PARTITIONED|
-            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 21.0]
+            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 11.1]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$40, $$41]) [cardinality: 2.1, op-cost: 0.0, total-cost: 21.0]
+              project ([$$40, $$41]) [cardinality: 2.1, op-cost: 0.0, total-cost: 11.1]
               -- STREAM_PROJECT  |PARTITIONED|
-                select (eq($$37, $$t2.getField("c_s"))) [cardinality: 2.1, op-cost: 10.5, total-cost: 21.0]
+                select (eq($$37, $$t2.getField("c_s"))) [cardinality: 2.1, op-cost: 6.1, total-cost: 11.1]
                 -- STREAM_SELECT  |PARTITIONED|
-                  assign [$$41] <- [$$t2.getField("c_x")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                  assign [$$41] <- [$$t2.getField("c_x")] [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                   -- ASSIGN  |PARTITIONED|
-                    project ([$$40, $$37, $$t2]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                    project ([$$40, $$37, $$t2]) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                      exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        unnest-map [$$36, $$t2] <- index-search("TestOpenColumn2", 0, "Default", "test", "TestOpenColumn2", true, false, 1, $$45, 1, $$45, true, true, true) project ({c_s:any,c_x:any}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                        unnest-map [$$36, $$t2] <- index-search("TestOpenColumn2", 0, "Default", "test", "TestOpenColumn2", true, false, 1, $$45, 1, $$45, true, true, true) project ({c_s:any,c_x:any}) [cardinality: 1.0, op-cost: 1.0, total-cost: 1.0]
                         -- BTREE_SEARCH  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -46,7 +46,7 @@
                                             -- STREAM_PROJECT  |PARTITIONED|
                                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                data-scan []<-[$$35, $$t1] <- test.TestOpenRow1 [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                                                data-scan []<-[$$35, $$t1] <- test.TestOpenRow1 [cardinality: 1.0, op-cost: 1.0, total-cost: 1.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/join/condition-pushdown/condition-pushdown.033.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/join/condition-pushdown/condition-pushdown.033.plan
index a8e1b83..dce1f3f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/join/condition-pushdown/condition-pushdown.033.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/join/condition-pushdown/condition-pushdown.033.plan
@@ -1,30 +1,30 @@
-distribute result [$$37] [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+distribute result [$$37] [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$37]) [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+    project ([$$37]) [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$37] <- [{"c1": $$47, "c2": $$48}] [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+      assign [$$37] <- [{"c1": $$47, "c2": $$48}] [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 23.25]
+        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 13.35]
         -- SORT_MERGE_EXCHANGE [$$47(ASC), $$48(ASC) ]  |PARTITIONED|
-          order (ASC, $$47) (ASC, $$48) [cardinality: 2.1, op-cost: 2.25, total-cost: 23.25]
+          order (ASC, $$47) (ASC, $$48) [cardinality: 2.1, op-cost: 2.25, total-cost: 13.35]
           -- STABLE_SORT [$$47(ASC), $$48(ASC)]  |PARTITIONED|
-            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 21.0]
+            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 11.1]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$47, $$48]) [cardinality: 2.1, op-cost: 0.0, total-cost: 21.0]
+              project ([$$47, $$48]) [cardinality: 2.1, op-cost: 0.0, total-cost: 11.1]
               -- STREAM_PROJECT  |PARTITIONED|
-                select (eq($$42, $$t2.getField("c_s"))) [cardinality: 2.1, op-cost: 10.5, total-cost: 21.0]
+                select (eq($$42, $$t2.getField("c_s"))) [cardinality: 2.1, op-cost: 6.1, total-cost: 11.1]
                 -- STREAM_SELECT  |PARTITIONED|
-                  select (eq($$t2.getField("c_i64"), 2.25)) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                  select (eq($$t2.getField("c_i64"), 2.25)) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                   -- STREAM_SELECT  |PARTITIONED|
-                    assign [$$48] <- [$$t2.getField("c_x")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                    assign [$$48] <- [$$t2.getField("c_x")] [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                     -- ASSIGN  |PARTITIONED|
-                      project ([$$47, $$42, $$t2]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                      project ([$$47, $$42, $$t2]) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                       -- STREAM_PROJECT  |PARTITIONED|
-                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                        exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          unnest-map [$$41, $$t2] <- index-search("TestOpenColumn2", 0, "Default", "test", "TestOpenColumn2", true, false, 1, $$52, 1, $$52, true, true, true) project ({c_i64:any,c_s:any,c_x:any}) range-filter on: eq($$t2.getField("c_i64"), 2.25) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                          unnest-map [$$41, $$t2] <- index-search("TestOpenColumn2", 0, "Default", "test", "TestOpenColumn2", true, false, 1, $$52, 1, $$52, true, true, true) project ({c_i64:any,c_s:any,c_x:any}) range-filter on: eq($$t2.getField("c_i64"), 2.25) [cardinality: 1.0, op-cost: 1.0, total-cost: 1.0]
                           -- BTREE_SEARCH  |PARTITIONED|
                             exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -44,7 +44,7 @@
                                           -- STREAM_PROJECT  |PARTITIONED|
                                             assign [$$42] <- [to-string($$t1.getField("c_s"))] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                             -- ASSIGN  |PARTITIONED|
-                                              select (eq($$t1.getField("c_i64"), 2)) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                              select (eq($$t1.getField("c_i64"), 2)) [cardinality: 1.0, op-cost: 0.0, total-cost: 1.0]
                                               -- STREAM_SELECT  |PARTITIONED|
                                                 assign [$$47] <- [$$t1.getField("c_x")] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                 -- ASSIGN  |PARTITIONED|
@@ -52,7 +52,7 @@
                                                   -- STREAM_PROJECT  |PARTITIONED|
                                                     exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      data-scan []<-[$$40, $$t1] <- test.TestOpenRow1 [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                                                      data-scan []<-[$$40, $$t1] <- test.TestOpenRow1 [cardinality: 1.0, op-cost: 1.0, total-cost: 1.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/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 6168bb4..f003312 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,38 +1,38 @@
-distribute result [$$61] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
+distribute result [$$61] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$61]) [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
+    project ([$$61]) [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$61] <- [{"$1": $$66, "$2": $$67}] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
+      assign [$$61] <- [{"$1": $$66, "$2": $$67}] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
       -- ASSIGN  |UNPARTITIONED|
-        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 [$$66, $$67] <- [agg-global-sql-sum($$70), agg-global-sql-sum($$71)] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
         -- AGGREGATE  |UNPARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
           -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-            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 [$$70, $$71] <- [agg-local-sql-sum($$54), agg-local-sql-sum($$59)] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
             -- AGGREGATE  |PARTITIONED|
-              project ([$$54, $$59]) [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
+              project ([$$54, $$59]) [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
               -- STREAM_PROJECT  |PARTITIONED|
-                assign [$$59, $$54] <- [object-length($$p2), object-length($$p1)] [cardinality: 2.1, 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.0]
                 -- ASSIGN  |PARTITIONED|
-                  project ([$$p1, $$p2]) [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
+                  project ([$$p1, $$p2]) [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
                   -- STREAM_PROJECT  |PARTITIONED|
-                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
+                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      join (eq($$63, $$62)) [cardinality: 2.1, op-cost: 4.2, total-cost: 12.6]
+                      join (eq($$63, $$62)) [cardinality: 2.1, op-cost: 4.0, total-cost: 12.0]
                       -- HYBRID_HASH_JOIN [$$62][$$63]  |PARTITIONED|
-                        exchange [cardinality: 2.1, op-cost: 2.1, total-cost: 4.2]
+                        exchange [cardinality: 2.0, op-cost: 2.0, total-cost: 4.0]
                         -- HASH_PARTITION_EXCHANGE [$$62]  |PARTITIONED|
-                          data-scan []<-[$$62, $$p1] <- test.ColumnDataset [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                          data-scan []<-[$$62, $$p1] <- test.ColumnDataset [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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: 2.1, op-cost: 2.1, total-cost: 4.2]
+                        exchange [cardinality: 2.0, op-cost: 2.0, total-cost: 4.0]
                         -- HASH_PARTITION_EXCHANGE [$$63]  |PARTITIONED|
-                          data-scan []<-[$$63, $$p2] <- test.RowDataset [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                          data-scan []<-[$$63, $$p2] <- test.RowDataset [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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/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 f2c16a9..9bc4e63 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
@@ -1,28 +1,28 @@
-distribute result [$$p1] [cardinality: 2.0, op-cost: 0.0, total-cost: 8.6]
+distribute result [$$p1] [cardinality: 2.0, op-cost: 0.0, total-cost: 8.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 8.6]
+  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 8.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$p1]) [cardinality: 2.0, op-cost: 0.0, total-cost: 8.6]
+    project ([$$p1]) [cardinality: 2.0, op-cost: 0.0, total-cost: 8.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 8.6]
+      exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 8.0]
       -- SORT_MERGE_EXCHANGE [$$16(ASC) ]  |PARTITIONED|
-        order (ASC, $$16) [cardinality: 2.0, op-cost: 2.0, total-cost: 8.6]
+        order (ASC, $$16) [cardinality: 2.0, op-cost: 2.0, total-cost: 8.0]
         -- STABLE_SORT [$$16(ASC)]  |PARTITIONED|
-          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 6.6]
+          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 6.0]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            distinct ([$$p1]) [cardinality: 2.0, op-cost: 2.25, total-cost: 6.6]
+            distinct ([$$p1]) [cardinality: 2.0, op-cost: 2.0, total-cost: 6.0]
             -- PRE_SORTED_DISTINCT_BY  |PARTITIONED|
-              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                order (ASC, $$p1) [cardinality: 2.1, op-cost: 2.25, total-cost: 4.35]
+                order (ASC, $$p1) [cardinality: 2.0, op-cost: 2.0, total-cost: 4.0]
                 -- STABLE_SORT [$$p1(ASC)]  |PARTITIONED|
-                  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                   -- HASH_PARTITION_EXCHANGE [$$p1]  |PARTITIONED|
-                    select (neq($$16, "0")) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                    select (neq($$16, "0")) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                     -- STREAM_SELECT  |PARTITIONED|
-                      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                      exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$16, $$p1] <- test.ColumnDataset [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                        data-scan []<-[$$16, $$p1] <- test.ColumnDataset [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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/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 366a247..e95038f 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
@@ -1,56 +1,52 @@
-distribute result [$$69] [cardinality: 2.0, op-cost: 0.0, total-cost: 8.3]
+distribute result [$$69] [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 8.3]
+  exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$69]) [cardinality: 2.0, op-cost: 0.0, total-cost: 8.3]
+    project ([$$69]) [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$69] <- [{"text": $$text, "$1": $$73}] [cardinality: 2.0, op-cost: 0.0, total-cost: 8.3]
+      assign [$$69] <- [{"text": $$text, "$1": $$73}] [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 8.3]
+        exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
         -- SORT_MERGE_EXCHANGE [$$text(ASC) ]  |PARTITIONED|
-          order (ASC, $$text) [cardinality: 2.0, op-cost: 2.0, total-cost: 8.3]
-          -- STABLE_SORT [$$text(ASC)]  |PARTITIONED|
-            exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 6.3]
-            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              group by ([$$text := $$81]) decor ([]) {
-                        aggregate [$$73] <- [global-sql-sum-serial($$80)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+          group by ([$$text := $$81]) decor ([]) {
+                    aggregate [$$73] <- [agg-global-sql-sum($$80)] [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: 1.0, op-cost: 0.0, total-cost: 2.0]
+          -- SORT_GROUP_BY[$$81]  |PARTITIONED|
+            exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
+            -- HASH_PARTITION_EXCHANGE [$$81]  |PARTITIONED|
+              group by ([$$81 := $$71]) decor ([]) {
+                        aggregate [$$80] <- [agg-local-sql-sum(sql-count($$75))] [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: 2.1, total-cost: 6.3]
-              -- EXTERNAL_GROUP_BY[$$81]  |PARTITIONED|
-                exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 4.2]
-                -- HASH_PARTITION_EXCHANGE [$$81]  |PARTITIONED|
-                  group by ([$$81 := $$71]) decor ([]) {
-                            aggregate [$$80] <- [local-sql-sum-serial(sql-count($$75))] [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: 2.1, total-cost: 4.2]
-                  -- EXTERNAL_GROUP_BY[$$71]  |PARTITIONED|
-                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
-                    -- 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.1, op-cost: 0.0, total-cost: 2.1]
-                        -- STREAM_PROJECT  |PARTITIONED|
-                          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.1, op-cost: 0.0, total-cost: 2.1]
-                            -- UNNEST  |PARTITIONED|
-                              project ([$$75]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                     } [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
+              -- SORT_GROUP_BY[$$71]  |PARTITIONED|
+                exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  select (eq(lowercase($$71), "string")) [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
+                  -- STREAM_SELECT  |PARTITIONED|
+                    project ([$$75, $$71]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+                    -- STREAM_PROJECT  |PARTITIONED|
+                      assign [$$71] <- [$$ht.getField("display_url")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+                      -- ASSIGN  |PARTITIONED|
+                        unnest $$ht <- scan-collection($$75) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+                        -- UNNEST  |PARTITIONED|
+                          project ([$$75]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            assign [$$75] <- [$$p1.getField("entities").getField("urls")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+                            -- ASSIGN  |PARTITIONED|
+                              project ([$$p1]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                               -- STREAM_PROJECT  |PARTITIONED|
-                                assign [$$75] <- [$$p1.getField("entities").getField("urls")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
-                                -- ASSIGN  |PARTITIONED|
-                                  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.1, op-cost: 0.0, total-cost: 2.1]
+                                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.0]
+                                  -- 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.0, total-cost: 2.0]
+                                    -- DATASOURCE_SCAN  |PARTITIONED|
+                                      exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                       -- 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.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|
+                                        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.010.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.010.plan
index 964914b..625c281 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
@@ -1,58 +1,54 @@
-distribute result [$$68] [cardinality: 2.0, op-cost: 0.0, total-cost: 8.3]
+distribute result [$$68] [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 8.3]
+  exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$68]) [cardinality: 2.0, op-cost: 0.0, total-cost: 8.3]
+    project ([$$68]) [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$68] <- [{"text": $$text, "$1": $$72}] [cardinality: 2.0, op-cost: 0.0, total-cost: 8.3]
+      assign [$$68] <- [{"text": $$text, "$1": $$72}] [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 8.3]
+        exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
         -- SORT_MERGE_EXCHANGE [$$text(ASC) ]  |PARTITIONED|
-          order (ASC, $$text) [cardinality: 2.0, op-cost: 2.0, total-cost: 8.3]
-          -- STABLE_SORT [$$text(ASC)]  |PARTITIONED|
-            exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 6.3]
-            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              group by ([$$text := $$79]) decor ([]) {
-                        aggregate [$$72] <- [global-sql-sum-serial($$78)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+          group by ([$$text := $$79]) decor ([]) {
+                    aggregate [$$72] <- [agg-global-sql-sum($$78)] [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: 1.0, op-cost: 0.0, total-cost: 2.0]
+          -- SORT_GROUP_BY[$$79]  |PARTITIONED|
+            exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
+            -- HASH_PARTITION_EXCHANGE [$$79]  |PARTITIONED|
+              group by ([$$79 := $$70]) decor ([]) {
+                        aggregate [$$78] <- [agg-local-sql-sum(sql-sum($$75))] [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: 2.1, total-cost: 6.3]
-              -- EXTERNAL_GROUP_BY[$$79]  |PARTITIONED|
-                exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 4.2]
-                -- HASH_PARTITION_EXCHANGE [$$79]  |PARTITIONED|
-                  group by ([$$79 := $$70]) decor ([]) {
-                            aggregate [$$78] <- [local-sql-sum-serial(sql-sum($$75))] [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: 2.1, total-cost: 4.2]
-                  -- EXTERNAL_GROUP_BY[$$70]  |PARTITIONED|
-                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
-                    -- 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.1, op-cost: 0.0, total-cost: 2.1]
+                     } [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
+              -- SORT_GROUP_BY[$$70]  |PARTITIONED|
+                exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  select (eq(lowercase($$70), "string")) [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
+                  -- STREAM_SELECT  |PARTITIONED|
+                    project ([$$75, $$70]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+                    -- STREAM_PROJECT  |PARTITIONED|
+                      assign [$$75, $$70] <- [$$ht.getField("indices"), $$ht.getField("display_url")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+                      -- ASSIGN  |PARTITIONED|
+                        project ([$$ht]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                         -- STREAM_PROJECT  |PARTITIONED|
-                          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.1, op-cost: 0.0, total-cost: 2.1]
+                          unnest $$ht <- scan-collection($$74) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+                          -- UNNEST  |PARTITIONED|
+                            project ([$$74]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                             -- STREAM_PROJECT  |PARTITIONED|
-                              unnest $$ht <- scan-collection($$74) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
-                              -- UNNEST  |PARTITIONED|
-                                project ([$$74]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                              assign [$$74] <- [$$p1.getField("entities").getField("urls")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+                              -- ASSIGN  |PARTITIONED|
+                                project ([$$p1]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                 -- STREAM_PROJECT  |PARTITIONED|
-                                  assign [$$74] <- [$$p1.getField("entities").getField("urls")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
-                                  -- ASSIGN  |PARTITIONED|
-                                    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.1, op-cost: 0.0, total-cost: 2.1]
+                                  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.0]
+                                    -- 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.0, total-cost: 2.0]
+                                      -- DATASOURCE_SCAN  |PARTITIONED|
+                                        exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                         -- 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.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|
+                                          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.012.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.012.plan
index 8f9fcf0..56818bf 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
@@ -1,32 +1,32 @@
-distribute result [$$22] [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+distribute result [$$22] [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+  exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$22]) [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+    project ([$$22]) [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$22] <- [{"display_url": $$27}] [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+      assign [$$22] <- [{"display_url": $$27}] [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
       -- ASSIGN  |PARTITIONED|
-        project ([$$27]) [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+        project ([$$27]) [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
         -- STREAM_PROJECT  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+          exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
           -- SORT_MERGE_EXCHANGE [$$25(ASC) ]  |PARTITIONED|
-            order (ASC, $$25) [cardinality: 2.1, op-cost: 2.25, total-cost: 4.35]
+            order (ASC, $$25) [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
             -- STABLE_SORT [$$25(ASC)]  |PARTITIONED|
-              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+              exchange [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                project ([$$27, $$25]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                project ([$$27, $$25]) [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  assign [$$27] <- [get-item($$24, 0).getField("display_url")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                  assign [$$27] <- [get-item($$24, 0).getField("display_url")] [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
                   -- ASSIGN  |PARTITIONED|
-                    select (eq(sql-count($$24), 1)) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                    select (eq(sql-count($$24), 1)) [cardinality: 1.0, op-cost: 0.0, total-cost: 2.0]
                     -- STREAM_SELECT  |PARTITIONED|
-                      project ([$$25, $$24]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                      project ([$$25, $$24]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                       -- STREAM_PROJECT  |PARTITIONED|
-                        assign [$$24] <- [$$p.getField("entities").getField("urls")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                        assign [$$24] <- [$$p.getField("entities").getField("urls")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                         -- ASSIGN  |PARTITIONED|
-                          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$25, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                            data-scan []<-[$$25, $$p] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]}}) [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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/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 a214af8..d3f44d6 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: 0.0, op-cost: 0.0, total-cost: 6.6]
+distribute result [$$101] [cardinality: 0.0, op-cost: 0.0, total-cost: 6.5]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.6]
+  exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.5]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$101]) [cardinality: 0.0, op-cost: 0.0, total-cost: 6.6]
+    project ([$$101]) [cardinality: 0.0, op-cost: 0.0, total-cost: 6.5]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$101] <- [{"uname": $$uname, "cnt": $$105}] [cardinality: 0.0, op-cost: 0.0, total-cost: 6.6]
+      assign [$$101] <- [{"uname": $$uname, "cnt": $$105}] [cardinality: 0.0, op-cost: 0.0, total-cost: 6.5]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.6]
+        exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.5]
         -- SORT_MERGE_EXCHANGE [$$105(DESC), $$uname(ASC) ]  |PARTITIONED|
-          order (DESC, $$105) (ASC, $$uname) [cardinality: 0.0, op-cost: 0.0, total-cost: 6.6]
+          order (DESC, $$105) (ASC, $$uname) [cardinality: 0.0, op-cost: 0.0, total-cost: 6.5]
           -- STABLE_SORT [$$105(DESC), $$uname(ASC)]  |PARTITIONED|
-            exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.6]
+            exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.5]
             -- 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: 0.0, op-cost: 0.0, total-cost: 6.6]
+                     } [cardinality: 0.0, op-cost: 0.0, total-cost: 6.5]
               -- SORT_GROUP_BY[$$116]  |PARTITIONED|
-                exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.6]
+                exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.5]
                 -- 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: 0.0, op-cost: 0.0, total-cost: 6.6]
+                         } [cardinality: 0.0, op-cost: 0.0, total-cost: 6.5]
                   -- SORT_GROUP_BY[$$102]  |PARTITIONED|
-                    exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.6]
+                    exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.5]
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      project ([$$102]) [cardinality: 0.0, op-cost: 0.0, total-cost: 6.6]
+                      project ([$$102]) [cardinality: 0.0, op-cost: 0.0, total-cost: 6.5]
                       -- STREAM_PROJECT  |PARTITIONED|
                         select ($$92) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- STREAM_SELECT  |PARTITIONED|
-                          project ([$$92, $$102]) [cardinality: 0.0, op-cost: 0.0, total-cost: 6.6]
+                          project ([$$92, $$102]) [cardinality: 0.0, op-cost: 0.0, total-cost: 6.5]
                           -- STREAM_PROJECT  |PARTITIONED|
-                            exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.6]
+                            exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 6.5]
                             -- 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: 0.0, op-cost: 2.25, total-cost: 6.6]
+                                     } [cardinality: 0.0, op-cost: 2.25, total-cost: 6.5]
                               -- PRE_CLUSTERED_GROUP_BY[$$112]  |PARTITIONED|
-                                exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+                                exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 4.25]
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  order (ASC, $$112) [cardinality: 2.1, op-cost: 2.25, total-cost: 4.35]
+                                  order (ASC, $$112) [cardinality: 2.0, op-cost: 2.25, total-cost: 4.25]
                                   -- STABLE_SORT [$$112(ASC)]  |PARTITIONED|
-                                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                     -- HASH_PARTITION_EXCHANGE [$$112]  |PARTITIONED|
-                                      project ([$$102, $$113, $$112]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                      project ([$$102, $$113, $$112]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                       -- STREAM_PROJECT  |PARTITIONED|
-                                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          left outer join (eq($$106, $$88)) [cardinality: 2.1, op-cost: 4.2, total-cost: 12.6]
+                                          left outer join (eq($$106, $$88)) [cardinality: 2.1, op-cost: 2.0, total-cost: 8.0]
                                           -- HYBRID_HASH_JOIN [$$106][$$88]  |PARTITIONED|
-                                            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                            exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                             -- HASH_PARTITION_EXCHANGE [$$106]  |PARTITIONED|
-                                              running-aggregate [$$112] <- [create-query-uid()] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                              running-aggregate [$$112] <- [create-query-uid()] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                               -- RUNNING_AGGREGATE  |PARTITIONED|
-                                                project ([$$102, $$106]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                project ([$$102, $$106]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                 -- STREAM_PROJECT  |PARTITIONED|
-                                                  assign [$$106] <- [$$ht1.getField("display_url")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                  assign [$$106] <- [$$ht1.getField("display_url")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                   -- ASSIGN  |PARTITIONED|
-                                                    project ([$$102, $$ht1]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                    project ([$$102, $$ht1]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                     -- STREAM_PROJECT  |PARTITIONED|
-                                                      unnest $$ht1 <- scan-collection($$107) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                      unnest $$ht1 <- scan-collection($$107) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                       -- UNNEST  |PARTITIONED|
-                                                        project ([$$107, $$102]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                        project ([$$107, $$102]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                         -- STREAM_PROJECT  |PARTITIONED|
-                                                          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 [$$107, $$102] <- [$$p1.getField("entities").getField("urls"), $$p1.getField("user").getField("name")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                           -- ASSIGN  |PARTITIONED|
-                                                            project ([$$p1]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                            project ([$$p1]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                             -- STREAM_PROJECT  |PARTITIONED|
-                                                              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                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]
+                                                                data-scan []<-[$$103, $$p1] <- test.ColumnDataset project ({entities:{urls:[{display_url:any}]},user:{name:any}}) [cardinality: 2.0, op-cost: 2.0, total-cost: 2.0]
                                                                 -- 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.1, op-cost: 2.1, total-cost: 2.1]
+                                                              data-scan []<-[$$104, $$p2] <- test.RowDataset [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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/other-pushdowns/other-pushdowns.015.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.015.plan
index 2c56948..69b9fe2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.015.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.015.plan
@@ -1,52 +1,52 @@
-distribute result [$$52] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
+distribute result [$$52] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$52]) [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
+    project ([$$52]) [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$52] <- [{"$1": $$57}] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
+      assign [$$52] <- [{"$1": $$57}] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
       -- ASSIGN  |UNPARTITIONED|
-        aggregate [$$57] <- [agg-sql-sum($$60)] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
+        aggregate [$$57] <- [agg-sql-sum($$60)] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
         -- AGGREGATE  |UNPARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
+          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
           -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-            aggregate [$$60] <- [agg-sql-count($$50)] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
+            aggregate [$$60] <- [agg-sql-count($$50)] [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
             -- AGGREGATE  |PARTITIONED|
-              project ([$$50]) [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
+              project ([$$50]) [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
               -- STREAM_PROJECT  |PARTITIONED|
-                exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 12.6]
+                exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 12.0]
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  join (eq($$55, $$56)) [cardinality: 2.1, op-cost: 4.2, total-cost: 12.6]
+                  join (eq($$55, $$56)) [cardinality: 2.1, op-cost: 4.0, total-cost: 12.0]
                   -- HYBRID_HASH_JOIN [$$55][$$56]  |PARTITIONED|
-                    exchange [cardinality: 2.1, op-cost: 2.1, total-cost: 4.2]
+                    exchange [cardinality: 2.0, op-cost: 2.0, total-cost: 4.0]
                     -- HASH_PARTITION_EXCHANGE [$$55]  |PARTITIONED|
-                      assign [$$50] <- [$$55.getField("y")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                      assign [$$50] <- [$$55.getField("y")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                       -- ASSIGN  |PARTITIONED|
-                        project ([$$55]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                        project ([$$55]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                         -- STREAM_PROJECT  |PARTITIONED|
-                          assign [$$55] <- [$$c.getField("x")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                          assign [$$55] <- [$$c.getField("x")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                           -- ASSIGN  |PARTITIONED|
-                            project ([$$c]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                            project ([$$c]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                             -- STREAM_PROJECT  |PARTITIONED|
-                              exchange [cardinality: 2.1, op-cost: 2.1, total-cost: 4.2]
+                              exchange [cardinality: 2.0, op-cost: 2.0, total-cost: 4.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                data-scan []<-[$$53, $$c] <- test.ColumnDataset project ({x:any}) [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                                data-scan []<-[$$53, $$c] <- test.ColumnDataset project ({x:any}) [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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: 2.1, op-cost: 2.1, total-cost: 4.2]
+                    exchange [cardinality: 2.0, op-cost: 2.0, total-cost: 4.0]
                     -- HASH_PARTITION_EXCHANGE [$$56]  |PARTITIONED|
-                      project ([$$56]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                      project ([$$56]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                       -- STREAM_PROJECT  |PARTITIONED|
-                        assign [$$56] <- [$$r.getField("x")] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                        assign [$$56] <- [$$r.getField("x")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                         -- ASSIGN  |PARTITIONED|
-                          project ([$$r]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                          project ([$$r]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                           -- STREAM_PROJECT  |PARTITIONED|
-                            exchange [cardinality: 2.1, op-cost: 2.1, total-cost: 4.2]
+                            exchange [cardinality: 2.0, op-cost: 2.0, total-cost: 4.0]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              data-scan []<-[$$54, $$r] <- test.RowDataset [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                              data-scan []<-[$$54, $$r] <- test.RowDataset [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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/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 252264a..1361fdb 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.0, op-cost: 0.0, total-cost: 26.65]
+distribute result [$$52] [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 26.65]
+  exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$52]) [cardinality: 3.0, op-cost: 0.0, total-cost: 26.65]
+    project ([$$52]) [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$52] <- [{"t1_id": $$53, "t2_id": $$54}] [cardinality: 3.0, op-cost: 0.0, total-cost: 26.65]
+      assign [$$52] <- [{"t1_id": $$53, "t2_id": $$54}] [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 26.65]
+        exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
         -- SORT_MERGE_EXCHANGE [$$53(ASC), $$54(ASC) ]  |PARTITIONED|
-          order (ASC, $$53) (ASC, $$54) [cardinality: 3.0, op-cost: 4.75, total-cost: 26.65]
+          order (ASC, $$53) (ASC, $$54) [cardinality: 3.0, op-cost: 4.75, total-cost: 25.75]
           -- STABLE_SORT [$$53(ASC), $$54(ASC)]  |PARTITIONED|
-            exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
+            exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.0]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$53, $$54]) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
+              project ([$$53, $$54]) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.0]
               -- STREAM_PROJECT  |PARTITIONED|
-                select ($$62) [cardinality: 3.0, op-cost: 11.4, total-cost: 21.9]
+                select ($$62) [cardinality: 3.0, op-cost: 11.0, total-cost: 21.0]
                 -- STREAM_SELECT  |PARTITIONED|
-                  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-aggregate [$$62] <- [win-mark-first-missing-impl($$54)] partition [$$53] order (DESC, $$54) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                   -- WINDOW_STREAM  |PARTITIONED|
-                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      order (ASC, $$53) (DESC, $$54) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                      order (ASC, $$53) (DESC, $$54) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                       -- STABLE_SORT [$$53(ASC), $$54(DESC)]  |PARTITIONED|
-                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                         -- HASH_PARTITION_EXCHANGE [$$53]  |PARTITIONED|
-                          project ([$$53, $$54]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                          project ([$$53, $$54]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                           -- 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.1, op-cost: 0.0, total-cost: 2.1]
+                              project ([$$53, $$55, $$54, $$t2]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                               -- STREAM_PROJECT  |PARTITIONED|
-                                exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   left-outer-unnest-map [$$54, $$t2] <- index-search("ds_inner_untyped", 0, "Default", "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.1, op-cost: 0.0, total-cost: 2.1]
+                                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      order (ASC, $$61) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                      order (ASC, $$61) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                       -- STABLE_SORT [$$61(ASC)]  |PARTITIONED|
-                                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          project ([$$53, $$55, $$61]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                          project ([$$53, $$55, $$61]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                           -- STREAM_PROJECT  |PARTITIONED|
-                                            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                            exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                               left-outer-unnest-map [$$60, $$61] <- index-search("idx_c_int32", 0, "Default", "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.1, op-cost: 0.0, total-cost: 2.1]
+                                                exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                 -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                  project ([$$53, $$55]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                  project ([$$53, $$55]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                   -- STREAM_PROJECT  |PARTITIONED|
-                                                    assign [$$55] <- [int32($$t1.getField("c_int32"))] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                    assign [$$55] <- [int32($$t1.getField("c_int32"))] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                     -- ASSIGN  |PARTITIONED|
-                                                      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                      exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        data-scan []<-[$$53, $$t1] <- test.ds_outer_untyped [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                                                        data-scan []<-[$$53, $$t1] <- test.ds_outer_untyped [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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/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 db7e8fc..ce7648e 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.0, op-cost: 0.0, total-cost: 26.65]
+distribute result [$$52] [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 26.65]
+  exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$52]) [cardinality: 3.0, op-cost: 0.0, total-cost: 26.65]
+    project ([$$52]) [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$52] <- [{"t1_id": $$73, "t2_id": $$54}] [cardinality: 3.0, op-cost: 0.0, total-cost: 26.65]
+      assign [$$52] <- [{"t1_id": $$73, "t2_id": $$54}] [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 26.65]
+        exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
         -- SORT_MERGE_EXCHANGE [$$73(ASC), $$54(ASC) ]  |PARTITIONED|
-          order (ASC, $$73) (ASC, $$54) [cardinality: 3.0, op-cost: 4.75, total-cost: 26.65]
+          order (ASC, $$73) (ASC, $$54) [cardinality: 3.0, op-cost: 4.75, total-cost: 25.75]
           -- STABLE_SORT [$$73(ASC), $$54(ASC)]  |PARTITIONED|
-            exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
+            exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.0]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$73, $$54]) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
+              project ([$$73, $$54]) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.0]
               -- STREAM_PROJECT  |PARTITIONED|
-                select ($$74) [cardinality: 3.0, op-cost: 11.4, total-cost: 21.9]
+                select ($$74) [cardinality: 3.0, op-cost: 11.0, total-cost: 21.0]
                 -- STREAM_SELECT  |PARTITIONED|
-                  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-aggregate [$$74] <- [win-mark-first-missing-impl($$54)] partition [$$73] order (DESC, $$54) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                   -- WINDOW_STREAM  |PARTITIONED|
-                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      order (ASC, $$73) (DESC, $$54) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                      order (ASC, $$73) (DESC, $$54) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                       -- STABLE_SORT [$$73(ASC), $$54(DESC)]  |PARTITIONED|
-                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                         -- HASH_PARTITION_EXCHANGE [$$73]  |PARTITIONED|
-                          union ($$70, $$61, $$54) ($$53, $$53, $$73) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                          union ($$70, $$61, $$54) ($$53, $$53, $$73) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                           -- UNION_ALL  |PARTITIONED|
-                            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                            exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              project ([$$70, $$53]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                              project ([$$70, $$53]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                               -- 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.1, op-cost: 0.0, total-cost: 2.1]
+                                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     left-outer-unnest-map [$$70, $$71] <- index-search("ds_inner_typed", 0, "Default", "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.1, op-cost: 0.0, total-cost: 2.1]
+                                      exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        project ([$$53, $$55, $$61]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                        project ([$$53, $$55, $$61]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                         -- STREAM_PROJECT  |PARTITIONED|
-                                          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            split ($$62) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                            split ($$62) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                             -- SPLIT  |PARTITIONED|
-                                              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                 left-outer-unnest-map [$$60, $$61, $$62] <- index-search("idx_c_int32", 0, "Default", "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.1, op-cost: 0.0, total-cost: 2.1]
+                                                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                   -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                    project ([$$53, $$55]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                    project ([$$53, $$55]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                     -- STREAM_PROJECT  |PARTITIONED|
-                                                      assign [$$55] <- [int32($$t1.getField("c_int32"))] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                      assign [$$55] <- [int32($$t1.getField("c_int32"))] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                       -- ASSIGN  |PARTITIONED|
-                                                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          data-scan []<-[$$53, $$t1] <- test.ds_outer_untyped [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                                                          data-scan []<-[$$53, $$t1] <- test.ds_outer_untyped [cardinality: 2.0, op-cost: 2.0, total-cost: 2.0]
                                                           -- 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.1, op-cost: 0.0, total-cost: 2.1]
+                                      split ($$62) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                       -- SPLIT  |PARTITIONED|
-                                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                           left-outer-unnest-map [$$60, $$61, $$62] <- index-search("idx_c_int32", 0, "Default", "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.1, op-cost: 0.0, total-cost: 2.1]
+                                            exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                             -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                              project ([$$53, $$55]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                              project ([$$53, $$55]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                               -- STREAM_PROJECT  |PARTITIONED|
-                                                assign [$$55] <- [int32($$t1.getField("c_int32"))] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                assign [$$55] <- [int32($$t1.getField("c_int32"))] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                 -- ASSIGN  |PARTITIONED|
-                                                  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    data-scan []<-[$$53, $$t1] <- test.ds_outer_untyped [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                                                    data-scan []<-[$$53, $$t1] <- test.ds_outer_untyped [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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/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 ce1a0a4..354bace 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.0, op-cost: 0.0, total-cost: 26.65]
+distribute result [$$52] [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 26.65]
+  exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$52]) [cardinality: 3.0, op-cost: 0.0, total-cost: 26.65]
+    project ([$$52]) [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$52] <- [{"t1_id": $$53, "t2_id": $$54}] [cardinality: 3.0, op-cost: 0.0, total-cost: 26.65]
+      assign [$$52] <- [{"t1_id": $$53, "t2_id": $$54}] [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 26.65]
+        exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
         -- SORT_MERGE_EXCHANGE [$$53(ASC), $$54(ASC) ]  |PARTITIONED|
-          order (ASC, $$53) (ASC, $$54) [cardinality: 3.0, op-cost: 4.75, total-cost: 26.65]
+          order (ASC, $$53) (ASC, $$54) [cardinality: 3.0, op-cost: 4.75, total-cost: 25.75]
           -- STABLE_SORT [$$53(ASC), $$54(ASC)]  |PARTITIONED|
-            exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
+            exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.0]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$53, $$54]) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
+              project ([$$53, $$54]) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.0]
               -- STREAM_PROJECT  |PARTITIONED|
-                select ($$62) [cardinality: 3.0, op-cost: 11.4, total-cost: 21.9]
+                select ($$62) [cardinality: 3.0, op-cost: 11.0, total-cost: 21.0]
                 -- STREAM_SELECT  |PARTITIONED|
-                  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-aggregate [$$62] <- [win-mark-first-missing-impl($$54)] partition [$$53] order (DESC, $$54) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                   -- WINDOW_STREAM  |PARTITIONED|
-                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      order (ASC, $$53) (DESC, $$54) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                      order (ASC, $$53) (DESC, $$54) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                       -- STABLE_SORT [$$53(ASC), $$54(DESC)]  |PARTITIONED|
-                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                         -- HASH_PARTITION_EXCHANGE [$$53]  |PARTITIONED|
-                          project ([$$53, $$54]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                          project ([$$53, $$54]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                           -- 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.1, op-cost: 0.0, total-cost: 2.1]
+                              project ([$$53, $$55, $$54, $$t2]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                               -- STREAM_PROJECT  |PARTITIONED|
-                                exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   left-outer-unnest-map [$$54, $$t2] <- index-search("ds_inner_untyped", 0, "Default", "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.1, op-cost: 0.0, total-cost: 2.1]
+                                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      order (ASC, $$61) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                      order (ASC, $$61) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                       -- STABLE_SORT [$$61(ASC)]  |PARTITIONED|
-                                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          project ([$$53, $$55, $$61]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                          project ([$$53, $$55, $$61]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                           -- STREAM_PROJECT  |PARTITIONED|
-                                            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                            exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                               left-outer-unnest-map [$$60, $$61] <- index-search("idx_c_int32", 0, "Default", "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.1, op-cost: 0.0, total-cost: 2.1]
+                                                exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                 -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                  project ([$$53, $$55]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                  project ([$$53, $$55]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                   -- STREAM_PROJECT  |PARTITIONED|
-                                                    assign [$$55] <- [int32($$t1.getField(1))] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                    assign [$$55] <- [int32($$t1.getField(1))] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                     -- ASSIGN  |PARTITIONED|
-                                                      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                      exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        data-scan []<-[$$53, $$t1] <- test.ds_outer_typed [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                                                        data-scan []<-[$$53, $$t1] <- test.ds_outer_typed [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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/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 74c21b9..0e7b3a6 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.0, op-cost: 0.0, total-cost: 26.65]
+distribute result [$$52] [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 26.65]
+  exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$52]) [cardinality: 3.0, op-cost: 0.0, total-cost: 26.65]
+    project ([$$52]) [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$52] <- [{"t1_id": $$73, "t2_id": $$54}] [cardinality: 3.0, op-cost: 0.0, total-cost: 26.65]
+      assign [$$52] <- [{"t1_id": $$73, "t2_id": $$54}] [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
       -- ASSIGN  |PARTITIONED|
-        exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 26.65]
+        exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 25.75]
         -- SORT_MERGE_EXCHANGE [$$73(ASC), $$54(ASC) ]  |PARTITIONED|
-          order (ASC, $$73) (ASC, $$54) [cardinality: 3.0, op-cost: 4.75, total-cost: 26.65]
+          order (ASC, $$73) (ASC, $$54) [cardinality: 3.0, op-cost: 4.75, total-cost: 25.75]
           -- STABLE_SORT [$$73(ASC), $$54(ASC)]  |PARTITIONED|
-            exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
+            exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 21.0]
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              project ([$$73, $$54]) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.9]
+              project ([$$73, $$54]) [cardinality: 3.0, op-cost: 0.0, total-cost: 21.0]
               -- STREAM_PROJECT  |PARTITIONED|
-                select ($$74) [cardinality: 3.0, op-cost: 11.4, total-cost: 21.9]
+                select ($$74) [cardinality: 3.0, op-cost: 11.0, total-cost: 21.0]
                 -- STREAM_SELECT  |PARTITIONED|
-                  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-aggregate [$$74] <- [win-mark-first-missing-impl($$54)] partition [$$73] order (DESC, $$54) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                   -- WINDOW_STREAM  |PARTITIONED|
-                    exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                    exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      order (ASC, $$73) (DESC, $$54) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                      order (ASC, $$73) (DESC, $$54) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                       -- STABLE_SORT [$$73(ASC), $$54(DESC)]  |PARTITIONED|
-                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                         -- HASH_PARTITION_EXCHANGE [$$73]  |PARTITIONED|
-                          union ($$70, $$61, $$54) ($$53, $$53, $$73) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                          union ($$70, $$61, $$54) ($$53, $$53, $$73) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                           -- UNION_ALL  |PARTITIONED|
-                            exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                            exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              project ([$$70, $$53]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                              project ([$$70, $$53]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                               -- 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.1, op-cost: 0.0, total-cost: 2.1]
+                                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     left-outer-unnest-map [$$70, $$71] <- index-search("ds_inner_typed", 0, "Default", "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.1, op-cost: 0.0, total-cost: 2.1]
+                                      exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        project ([$$53, $$55, $$61]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                        project ([$$53, $$55, $$61]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                         -- STREAM_PROJECT  |PARTITIONED|
-                                          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            split ($$62) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                            split ($$62) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                             -- SPLIT  |PARTITIONED|
-                                              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                 left-outer-unnest-map [$$60, $$61, $$62] <- index-search("idx_c_int32", 0, "Default", "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.1, op-cost: 0.0, total-cost: 2.1]
+                                                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                   -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                    project ([$$53, $$55]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                    project ([$$53, $$55]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                     -- STREAM_PROJECT  |PARTITIONED|
-                                                      assign [$$55] <- [int32($$t1.getField(1))] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                      assign [$$55] <- [int32($$t1.getField(1))] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                       -- ASSIGN  |PARTITIONED|
-                                                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          data-scan []<-[$$53, $$t1] <- test.ds_outer_typed [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                                                          data-scan []<-[$$53, $$t1] <- test.ds_outer_typed [cardinality: 2.0, op-cost: 2.0, total-cost: 2.0]
                                                           -- 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.1, op-cost: 0.0, total-cost: 2.1]
+                                      split ($$62) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                       -- SPLIT  |PARTITIONED|
-                                        exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                        exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                           left-outer-unnest-map [$$60, $$61, $$62] <- index-search("idx_c_int32", 0, "Default", "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.1, op-cost: 0.0, total-cost: 2.1]
+                                            exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                             -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                              project ([$$53, $$55]) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                              project ([$$53, $$55]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                               -- STREAM_PROJECT  |PARTITIONED|
-                                                assign [$$55] <- [int32($$t1.getField(1))] [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                assign [$$55] <- [int32($$t1.getField(1))] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                 -- ASSIGN  |PARTITIONED|
-                                                  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                                                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    data-scan []<-[$$53, $$t1] <- test.ds_outer_typed [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                                                    data-scan []<-[$$53, $$t1] <- test.ds_outer_typed [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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.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 38c5f61..08a8317 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: 6005.0]
+distribute result [$$c] [cardinality: 1152.42, op-cost: 0.0, total-cost: 6005.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+  exchange [cardinality: 1152.42, 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: 6005.0]
+    limit 5 offset 5 [cardinality: 1152.42, op-cost: 0.0, total-cost: 6005.0]
     -- STREAM_LIMIT  |UNPARTITIONED|
-      exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+      exchange [cardinality: 1152.42, op-cost: 0.0, total-cost: 6005.0]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        limit 10 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+        limit 10 [cardinality: 1152.42, op-cost: 0.0, total-cost: 6005.0]
         -- STREAM_LIMIT  |PARTITIONED|
-          project ([$$c]) [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+          project ([$$c]) [cardinality: 1152.42, op-cost: 0.0, total-cost: 6005.0]
           -- STREAM_PROJECT  |PARTITIONED|
-            exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+            exchange [cardinality: 1152.42, 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: 6005.0, total-cost: 6005.0]
+              data-scan []<-[$$18, $$19, $$c] <- test.LineItem condition (and(lt($$c.getField(2), 150), lt($$c.getField(5), 10000))) limit 10 [cardinality: 1152.42, 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 a9d2b4f..653da45 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: 6005.0]
+distribute result [$$20] [cardinality: 6010.65, op-cost: 0.0, total-cost: 6005.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+  exchange [cardinality: 6010.65, op-cost: 0.0, total-cost: 6005.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    limit 5 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+    limit 5 [cardinality: 6010.65, op-cost: 0.0, total-cost: 6005.0]
     -- STREAM_LIMIT  |UNPARTITIONED|
-      exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+      exchange [cardinality: 6010.65, op-cost: 0.0, total-cost: 6005.0]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        project ([$$20]) [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+        project ([$$20]) [cardinality: 6010.65, 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: 6005.0]
+          assign [$$20] <- [{"shipdate": substring($$c.getField(10), 0, 4), "suppkey": gt($$21, 0)}] [cardinality: 6010.65, op-cost: 0.0, total-cost: 6005.0]
           -- ASSIGN  |PARTITIONED|
-            limit 5 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+            limit 5 [cardinality: 6010.65, 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: 6005.0]
+              assign [$$21] <- [$$c.getField(2)] [cardinality: 6010.65, op-cost: 0.0, total-cost: 6005.0]
               -- ASSIGN  |PARTITIONED|
-                project ([$$c]) [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+                project ([$$c]) [cardinality: 6010.65, op-cost: 0.0, total-cost: 6005.0]
                 -- STREAM_PROJECT  |PARTITIONED|
-                  exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+                  exchange [cardinality: 6010.65, 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: 6005.0, total-cost: 6005.0]
+                    data-scan []<-[$$22, $$23, $$c] <- test.LineItem condition (lt($$c.getField(2), 150)) limit 5 [cardinality: 6010.65, 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 f5fb51e..d6b8239 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: 6005.0]
+distribute result [$$c] [cardinality: 6010.65, op-cost: 0.0, total-cost: 6005.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+  exchange [cardinality: 6010.65, 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: 6005.0]
+    limit 5 offset 5 [cardinality: 6010.65, op-cost: 0.0, total-cost: 6005.0]
     -- STREAM_LIMIT  |UNPARTITIONED|
-      exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+      exchange [cardinality: 6010.65, op-cost: 0.0, total-cost: 6005.0]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        limit 10 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+        limit 10 [cardinality: 6010.65, op-cost: 0.0, total-cost: 6005.0]
         -- STREAM_LIMIT  |PARTITIONED|
-          project ([$$c]) [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+          project ([$$c]) [cardinality: 6010.65, op-cost: 0.0, total-cost: 6005.0]
           -- STREAM_PROJECT  |PARTITIONED|
-            exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+            exchange [cardinality: 6010.65, 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: 6005.0, total-cost: 6005.0]
+              data-scan []<-[$$15, $$16, $$c] <- test.LineItem condition (lt($$c.getField(2), 150)) limit 10 [cardinality: 6010.65, 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 7aa0db8..f5a335b 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: 6005.0]
+distribute result [$$c] [cardinality: 6010.65, op-cost: 0.0, total-cost: 6005.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+  exchange [cardinality: 6010.65, 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: 6005.0]
+    limit 5 offset 5 [cardinality: 6010.65, op-cost: 0.0, total-cost: 6005.0]
     -- STREAM_LIMIT  |UNPARTITIONED|
-      exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+      exchange [cardinality: 6010.65, op-cost: 0.0, total-cost: 6005.0]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        limit 10 [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+        limit 10 [cardinality: 6010.65, op-cost: 0.0, total-cost: 6005.0]
         -- STREAM_LIMIT  |PARTITIONED|
-          project ([$$c]) [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+          project ([$$c]) [cardinality: 6010.65, op-cost: 0.0, total-cost: 6005.0]
           -- STREAM_PROJECT  |PARTITIONED|
-            exchange [cardinality: 6005.0, op-cost: 0.0, total-cost: 6005.0]
+            exchange [cardinality: 6010.65, 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: 6005.0, total-cost: 6005.0]
+              data-scan []<-[$$17, $$18, $$c] <- test.LineItem condition (lt($$c.getField(2), 150)) limit 10 [cardinality: 6010.65, 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 6427067..cdc4cc7 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: 100.0]
+distribute result [$$paper] [cardinality: 24.0, op-cost: 0.0, total-cost: 100.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
+  exchange [cardinality: 24.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: 100.0]
+    limit 5 offset 5 [cardinality: 24.0, op-cost: 0.0, total-cost: 100.0]
     -- STREAM_LIMIT  |UNPARTITIONED|
-      exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
+      exchange [cardinality: 24.0, op-cost: 0.0, total-cost: 100.0]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        limit 10 [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
+        limit 10 [cardinality: 24.0, op-cost: 0.0, total-cost: 100.0]
         -- STREAM_LIMIT  |PARTITIONED|
-          project ([$$paper]) [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
+          project ([$$paper]) [cardinality: 24.0, op-cost: 0.0, total-cost: 100.0]
           -- STREAM_PROJECT  |PARTITIONED|
-            exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
+            exchange [cardinality: 24.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: 100.0, total-cost: 100.0]
+              data-scan []<-[$$15, $$paper] <- test.DBLP1 condition (contains($$paper.getField(1), "kimL89")) limit 10 [cardinality: 24.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 afebd75..44c16f4 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: 316.8]
+distribute result [$$37] [cardinality: 2.1, op-cost: 0.0, total-cost: 304.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 316.8]
+  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 304.0]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    limit 2 [cardinality: 2.1, op-cost: 0.0, total-cost: 316.8]
+    limit 2 [cardinality: 2.1, op-cost: 0.0, total-cost: 304.0]
     -- STREAM_LIMIT  |UNPARTITIONED|
-      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 316.8]
+      exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 304.0]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        project ([$$37]) [cardinality: 2.1, op-cost: 0.0, total-cost: 316.8]
+        project ([$$37]) [cardinality: 2.1, op-cost: 0.0, total-cost: 304.0]
         -- STREAM_PROJECT  |PARTITIONED|
-          assign [$$37] <- [{"dblpid": $$38}] [cardinality: 2.1, op-cost: 0.0, total-cost: 316.8]
+          assign [$$37] <- [{"dblpid": $$38}] [cardinality: 2.1, op-cost: 0.0, total-cost: 304.0]
           -- ASSIGN  |PARTITIONED|
-            limit 2 [cardinality: 2.1, op-cost: 0.0, total-cost: 316.8]
+            limit 2 [cardinality: 2.1, op-cost: 0.0, total-cost: 304.0]
             -- STREAM_LIMIT  |PARTITIONED|
-              project ([$$38]) [cardinality: 2.1, op-cost: 0.0, total-cost: 316.8]
+              project ([$$38]) [cardinality: 2.1, op-cost: 0.0, total-cost: 304.0]
               -- STREAM_PROJECT  |PARTITIONED|
-                exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 316.8]
+                exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 304.0]
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  join (eq($$38, $$41)) [cardinality: 2.1, op-cost: 108.4, total-cost: 316.8]
+                  join (eq($$38, $$41)) [cardinality: 2.1, op-cost: 100.0, total-cost: 304.0]
                   -- HYBRID_HASH_JOIN [$$38][$$41]  |PARTITIONED|
                     exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- HASH_PARTITION_EXCHANGE [$$38]  |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: 8.4, total-cost: 108.4]
-                    -- BROADCAST_EXCHANGE  |PARTITIONED|
-                      project ([$$41]) [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
+                    exchange [cardinality: 1.0, op-cost: 4.0, total-cost: 104.0]
+                    -- HASH_PARTITION_EXCHANGE [$$41]  |PARTITIONED|
+                      project ([$$41]) [cardinality: 1.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: 100.0]
+                        assign [$$41] <- [get-item($$30, 0).getField(0).getField(1)] [cardinality: 1.0, op-cost: 0.0, total-cost: 100.0]
                         -- ASSIGN  |UNPARTITIONED|
-                          aggregate [$$30] <- [listify($$29)] [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
+                          aggregate [$$30] <- [listify($$29)] [cardinality: 1.0, op-cost: 0.0, total-cost: 100.0]
                           -- AGGREGATE  |UNPARTITIONED|
-                            limit 1 [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
+                            limit 1 [cardinality: 1.0, op-cost: 0.0, total-cost: 100.0]
                             -- STREAM_LIMIT  |UNPARTITIONED|
-                              exchange [cardinality: 100.0, op-cost: 8.4, total-cost: 108.4]
+                              exchange [cardinality: 1.0, op-cost: 4.0, total-cost: 104.0]
                               -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-                                project ([$$29]) [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
+                                project ([$$29]) [cardinality: 1.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: 100.0]
+                                  assign [$$29] <- [{"d": $$d}] [cardinality: 1.0, op-cost: 0.0, total-cost: 100.0]
                                   -- ASSIGN  |PARTITIONED|
-                                    limit 1 [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
+                                    limit 1 [cardinality: 1.0, op-cost: 0.0, total-cost: 100.0]
                                     -- STREAM_LIMIT  |PARTITIONED|
-                                      project ([$$d]) [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
+                                      project ([$$d]) [cardinality: 1.0, op-cost: 0.0, total-cost: 100.0]
                                       -- STREAM_PROJECT  |PARTITIONED|
-                                        exchange [cardinality: 100.0, op-cost: 8.4, total-cost: 108.4]
+                                        exchange [cardinality: 1.0, op-cost: 4.0, total-cost: 104.0]
                                         -- 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: 100.0, total-cost: 100.0]
+                                          data-scan []<-[$$40, $$d] <- test.DBLP1 condition (ends-with($$d.getField(1), "Blakeley95")) limit 1 [cardinality: 1.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 9312e62..92cdd0c 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: 100.0]
+distribute result [$$19] [cardinality: 2.0, op-cost: 0.0, total-cost: 100.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
+  exchange [cardinality: 2.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: 100.0]
+    limit 1 [cardinality: 2.0, op-cost: 0.0, total-cost: 100.0]
     -- STREAM_LIMIT  |UNPARTITIONED|
-      exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
+      exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 100.0]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        project ([$$19]) [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
+        project ([$$19]) [cardinality: 2.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: 100.0]
+          assign [$$19] <- [{"$1": substring($$20, 0, 21)}] [cardinality: 2.0, op-cost: 0.0, total-cost: 100.0]
           -- ASSIGN  |PARTITIONED|
-            limit 1 [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
+            limit 1 [cardinality: 2.0, op-cost: 0.0, total-cost: 100.0]
             -- STREAM_LIMIT  |PARTITIONED|
-              project ([$$20]) [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
+              project ([$$20]) [cardinality: 2.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: 100.0]
+                assign [$$20] <- [$$DBLP1.getField(1)] [cardinality: 2.0, op-cost: 0.0, total-cost: 100.0]
                 -- ASSIGN  |PARTITIONED|
-                  project ([$$DBLP1]) [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
+                  project ([$$DBLP1]) [cardinality: 2.0, op-cost: 0.0, total-cost: 100.0]
                   -- STREAM_PROJECT  |PARTITIONED|
-                    exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 100.0]
+                    exchange [cardinality: 2.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: 100.0, total-cost: 100.0]
+                      data-scan []<-[$$21, $$DBLP1] <- test.DBLP1 condition (gt($$DBLP1.getField(1), "series")) limit 1 [cardinality: 2.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 190a98e..d70573c 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: 12.0]
+distribute result [$$22] [cardinality: 3.0, op-cost: 0.0, total-cost: 12.0]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 12.0, op-cost: 0.0, total-cost: 12.0]
+  exchange [cardinality: 3.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: 12.0]
+    limit 2 [cardinality: 3.0, op-cost: 0.0, total-cost: 12.0]
     -- STREAM_LIMIT  |UNPARTITIONED|
-      exchange [cardinality: 12.0, op-cost: 0.0, total-cost: 12.0]
+      exchange [cardinality: 3.0, op-cost: 0.0, total-cost: 12.0]
       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-        limit 2 [cardinality: 12.0, op-cost: 0.0, total-cost: 12.0]
+        limit 2 [cardinality: 3.0, op-cost: 0.0, total-cost: 12.0]
         -- STREAM_LIMIT  |PARTITIONED|
-          project ([$$22]) [cardinality: 12.0, op-cost: 0.0, total-cost: 12.0]
+          project ([$$22]) [cardinality: 3.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: 12.0]
+            assign [$$22] <- [$$26.getField("lang")] [cardinality: 3.0, op-cost: 0.0, total-cost: 12.0]
             -- ASSIGN  |PARTITIONED|
-              project ([$$26]) [cardinality: 12.0, op-cost: 0.0, total-cost: 12.0]
+              project ([$$26]) [cardinality: 3.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: 12.0]
+                assign [$$26] <- [$$t.getField("user")] [cardinality: 3.0, op-cost: 0.0, total-cost: 12.0]
                 -- ASSIGN  |PARTITIONED|
-                  project ([$$t]) [cardinality: 12.0, op-cost: 0.0, total-cost: 12.0]
+                  project ([$$t]) [cardinality: 3.0, op-cost: 0.0, total-cost: 12.0]
                   -- STREAM_PROJECT  |PARTITIONED|
-                    exchange [cardinality: 12.0, op-cost: 0.0, total-cost: 12.0]
+                    exchange [cardinality: 3.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: 12.0, total-cost: 12.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: 3.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 cda317c..2ec98bb 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
@@ -1,24 +1,24 @@
-distribute result [$$30] [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+distribute result [$$30] [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$30]) [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+    project ([$$30]) [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$30] <- [$$md.getField("name")] [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+      assign [$$30] <- [$$md.getField("name")] [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
       -- ASSIGN  |PARTITIONED|
-        project ([$$md]) [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+        project ([$$md]) [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
         -- STREAM_PROJECT  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
           -- SORT_MERGE_EXCHANGE [$$32(ASC) ]  |PARTITIONED|
-            order (ASC, $$32) [cardinality: 2.1, op-cost: 2.25, total-cost: 4.35]
+            order (ASC, $$32) [cardinality: 2.0, op-cost: 2.0, total-cost: 4.0]
             -- STABLE_SORT [$$32(ASC)]  |PARTITIONED|
-              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                select (neq(uuid(), uuid())) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                select (neq(uuid(), uuid())) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                 -- STREAM_SELECT  |PARTITIONED|
-                  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    data-scan []<-[$$32, $$md] <- test.MyDataset [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                    data-scan []<-[$$32, $$md] <- test.MyDataset [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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.6.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/objects/load-record-fields/load-record-fields.6.plan
index 71bc6b0..32dbed9 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
@@ -1,24 +1,24 @@
-distribute result [$$30] [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+distribute result [$$30] [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$30]) [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+    project ([$$30]) [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$30] <- [$$md.getField("name")] [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+      assign [$$30] <- [$$md.getField("name")] [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
       -- ASSIGN  |PARTITIONED|
-        project ([$$md]) [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+        project ([$$md]) [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
         -- STREAM_PROJECT  |PARTITIONED|
-          exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 4.35]
+          exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 4.0]
           -- SORT_MERGE_EXCHANGE [$$32(ASC) ]  |PARTITIONED|
-            order (ASC, $$32) [cardinality: 2.1, op-cost: 2.25, total-cost: 4.35]
+            order (ASC, $$32) [cardinality: 2.0, op-cost: 2.0, total-cost: 4.0]
             -- STABLE_SORT [$$32(ASC)]  |PARTITIONED|
-              exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+              exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                select (neq(current-date(), date: { 1980-09-10 })) [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                select (neq(current-date(), date: { 1980-09-10 })) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                 -- STREAM_SELECT  |PARTITIONED|
-                  exchange [cardinality: 2.1, op-cost: 0.0, total-cost: 2.1]
+                  exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    data-scan []<-[$$32, $$md] <- test.MyDataset [cardinality: 2.1, op-cost: 2.1, total-cost: 2.1]
+                    data-scan []<-[$$32, $$md] <- test.MyDataset [cardinality: 2.0, op-cost: 2.0, total-cost: 2.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.08.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/view/view-pushdown/view-pushdown.08.plan
index 38d0890..de730dc 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: 22.25]
+distribute result [$$88] [cardinality: 6.0, op-cost: 0.0, total-cost: 35.51]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 22.25]
+  exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 35.51]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$88]) [cardinality: 20.0, op-cost: 0.0, total-cost: 22.25]
+    project ([$$88]) [cardinality: 6.0, op-cost: 0.0, total-cost: 35.51]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$88] <- [{"id": $$91, "review": $$95}] [cardinality: 20.0, op-cost: 0.0, total-cost: 22.25]
+      assign [$$88] <- [{"id": $$91, "review": $$95}] [cardinality: 6.0, op-cost: 0.0, total-cost: 35.51]
       -- ASSIGN  |UNPARTITIONED|
-        exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 22.25]
+        exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 35.51]
         -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-          order (ASC, $$91) [cardinality: 20.0, op-cost: 2.25, total-cost: 22.25]
+          order (ASC, $$91) [cardinality: 6.0, op-cost: 15.51, total-cost: 35.51]
           -- STABLE_SORT [$$91(ASC)]  |UNPARTITIONED|
-            exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
+            exchange [cardinality: 6.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: 20.0]
+              limit 3 [cardinality: 6.0, op-cost: 0.0, total-cost: 20.0]
               -- STREAM_LIMIT  |UNPARTITIONED|
-                exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
+                exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 20.0]
                 -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-                  limit 3 [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
+                  limit 3 [cardinality: 6.0, op-cost: 0.0, total-cost: 20.0]
                   -- STREAM_LIMIT  |PARTITIONED|
-                    project ([$$91, $$95]) [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
+                    project ([$$91, $$95]) [cardinality: 6.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: 20.0]
+                      assign [$$95] <- [$$d.getField(1)] [cardinality: 6.0, op-cost: 0.0, total-cost: 20.0]
                       -- ASSIGN  |PARTITIONED|
-                        exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
+                        exchange [cardinality: 6.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: 20.0, total-cost: 20.0]
+                          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: 6.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 288cbb8..40bee5c 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: 22.25]
+distribute result [$$94] [cardinality: 6.0, op-cost: 0.0, total-cost: 35.51]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 22.25]
+  exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 35.51]
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    project ([$$94]) [cardinality: 20.0, op-cost: 0.0, total-cost: 22.25]
+    project ([$$94]) [cardinality: 6.0, op-cost: 0.0, total-cost: 35.51]
     -- STREAM_PROJECT  |UNPARTITIONED|
-      assign [$$94] <- [{"id": $$97, "review": $$101}] [cardinality: 20.0, op-cost: 0.0, total-cost: 22.25]
+      assign [$$94] <- [{"id": $$97, "review": $$101}] [cardinality: 6.0, op-cost: 0.0, total-cost: 35.51]
       -- ASSIGN  |UNPARTITIONED|
-        exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 22.25]
+        exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 35.51]
         -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-          order (ASC, $$97) [cardinality: 20.0, op-cost: 2.25, total-cost: 22.25]
+          order (ASC, $$97) [cardinality: 6.0, op-cost: 15.51, total-cost: 35.51]
           -- STABLE_SORT [$$97(ASC)]  |UNPARTITIONED|
-            exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
+            exchange [cardinality: 6.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: 20.0]
+              limit 3 [cardinality: 6.0, op-cost: 0.0, total-cost: 20.0]
               -- STREAM_LIMIT  |UNPARTITIONED|
-                exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
+                exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 20.0]
                 -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-                  limit 3 [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
+                  limit 3 [cardinality: 6.0, op-cost: 0.0, total-cost: 20.0]
                   -- STREAM_LIMIT  |PARTITIONED|
-                    project ([$$97, $$101]) [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
+                    project ([$$97, $$101]) [cardinality: 6.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: 20.0]
+                      assign [$$101] <- [$$d.getField(1)] [cardinality: 6.0, op-cost: 0.0, total-cost: 20.0]
                       -- ASSIGN  |PARTITIONED|
-                        exchange [cardinality: 20.0, op-cost: 0.0, total-cost: 20.0]
+                        exchange [cardinality: 6.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: 20.0, total-cost: 20.0]
+                          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: 6.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/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/AbstractLogicalOperatorPrettyPrintVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/AbstractLogicalOperatorPrettyPrintVisitor.java
index 36ee59f..8a08161 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/AbstractLogicalOperatorPrettyPrintVisitor.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/AbstractLogicalOperatorPrettyPrintVisitor.java
@@ -29,6 +29,7 @@
 import org.apache.hyracks.algebricks.core.algebra.base.OperatorAnnotations;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractOperatorWithNestedPlans;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.DataSourceScanOperator;
 import org.apache.hyracks.algebricks.core.algebra.visitors.ILogicalExpressionVisitor;
 import org.apache.hyracks.algebricks.core.algebra.visitors.ILogicalOperatorVisitor;
 
@@ -76,7 +77,11 @@
         Double opCard;
 
         if (op.getOperatorTag() == LogicalOperatorTag.DATASOURCESCAN) {
-            opCard = (Double) getAnnotationValue(op, OperatorAnnotations.OP_INPUT_CARDINALITY);
+            if (((DataSourceScanOperator) op).getSelectCondition() != null) {
+                opCard = (Double) getAnnotationValue(op, OperatorAnnotations.OP_OUTPUT_CARDINALITY);
+            } else {
+                opCard = (Double) getAnnotationValue(op, OperatorAnnotations.OP_INPUT_CARDINALITY);
+            }
         } else {
             opCard = (Double) getAnnotationValue(op, OperatorAnnotations.OP_OUTPUT_CARDINALITY);
         }