[ASTERIXDB-3550][COMP] Allow project operators inside subplan

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
Queries containing subplan are slow without the projects. Useless variables inside subplan are projected out.

Ext-ref: MB-49756
Change-Id: I236a52923c181395cf7501926010ca9899cae9e8
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19321
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/ASTERIXDB-2402.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/ASTERIXDB-2402.plan
index 1dff738..1c327d2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/ASTERIXDB-2402.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/ASTERIXDB-2402.plan
@@ -18,23 +18,29 @@
                     -- MICRO_PRE_CLUSTERED_GROUP_BY[$$230]  |LOCAL|
                       order (ASC, $$230)
                       -- MICRO_STABLE_SORT [$$230(ASC)]  |LOCAL|
-                        assign [$$230] <- [$$sub.getField("BrokerEndpoint")]
+                        assign [$$230] <- [$$sub.getField("BrokerEndpoint")] project: [$$260, $$259, $$230]
                         -- ASSIGN  |LOCAL|
-                          unnest $$sub <- scan-collection($$219)
+                          unnest $$sub <- scan-collection($$219) project: [$$260, $$259, $$sub]
                           -- UNNEST  |LOCAL|
-                            subplan {
-                                      aggregate [$$219] <- [listify($$218)]
-                                      -- AGGREGATE  |LOCAL|
-                                        assign [$$218] <- [{"sub": $$sub}]
-                                        -- ASSIGN  |LOCAL|
-                                          unnest $$sub <- scan-collection($$256)
-                                          -- UNNEST  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                   }
-                            -- SUBPLAN  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                            project ([$$260, $$259, $$219])
+                            -- STREAM_PROJECT  |LOCAL|
+                              subplan {
+                                        aggregate [$$219] <- [listify($$218)]
+                                        -- AGGREGATE  |LOCAL|
+                                          assign [$$218] <- [{"sub": $$sub}]
+                                          -- ASSIGN  |LOCAL|
+                                            unnest $$sub <- scan-collection($$256) project: [$$sub]
+                                            -- UNNEST  |LOCAL|
+                                              project ([$$256])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                     }
+                              -- SUBPLAN  |LOCAL|
+                                project ([$$260, $$259, $$256])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
              }
       -- SUBPLAN  |PARTITIONED|
         project ([$$260, $$259, $$256])
@@ -64,8 +70,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$268)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$253, $$238, $$268])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$267]  |PARTITIONED|
                                 exchange
@@ -96,8 +104,10 @@
                                                                           -- AGGREGATE  |LOCAL|
                                                                             select (not(is-missing($$236)))
                                                                             -- STREAM_SELECT  |LOCAL|
-                                                                              nested tuple source
-                                                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                              project ([$$232, $$236])
+                                                                              -- STREAM_PROJECT  |LOCAL|
+                                                                                nested tuple source
+                                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                        }
                                                                 -- MICRO_PRE_CLUSTERED_GROUP_BY[$$324, $$325]  |LOCAL|
                                                                   select (and(not(is-missing($$321)), not(is-missing($$323))))
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.10.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.10.plan
index aeb19d0..515e40a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.10.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.10.plan
@@ -13,8 +13,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$72)
                       -- MICRO_STABLE_SORT [$$72(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$72])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.11.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.11.plan
index 548b0cd..5423304 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.11.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.11.plan
@@ -13,8 +13,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$72)
                       -- MICRO_STABLE_SORT [$$72(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$72])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
                {
                   aggregate [$$83] <- [agg-sql-sum($$77)]
@@ -23,8 +25,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$77)
                       -- MICRO_STABLE_SORT [$$77(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$77])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.12.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.12.plan
index 78a3a5d..725fd90 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.12.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.12.plan
@@ -19,8 +19,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$76)
                       -- MICRO_STABLE_SORT [$$76(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$76])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.13.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.13.plan
index 9eb6774..7344fe4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.13.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.13.plan
@@ -13,8 +13,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$88)
                       -- MICRO_STABLE_SORT [$$88(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$88])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
                {
                   aggregate [$$105] <- [agg-sql-sum($$93)]
@@ -29,8 +31,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$98)
                       -- MICRO_STABLE_SORT [$$98(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$98])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.14.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.14.plan
index 1052301..7cd1833 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.14.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.14.plan
@@ -13,8 +13,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$112)
                       -- MICRO_STABLE_SORT [$$112(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$112])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
                {
                   aggregate [$$159, $$163, $$165] <- [agg-sql-sum($$117), agg-sql-count($$112), agg-sql-avg($$122)]
@@ -29,8 +31,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$122)
                       -- MICRO_STABLE_SORT [$$122(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$122])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
                {
                   aggregate [$$162, $$164] <- [agg-sql-avg($$117), agg-sql-count($$117)]
@@ -39,8 +43,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$117)
                       -- MICRO_STABLE_SORT [$$117(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$117])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.16.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.16.plan
index 9b628cf..9e7a0b3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.16.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.16.plan
@@ -13,8 +13,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$x)
                       -- MICRO_STABLE_SORT [$$x(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$x])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
                {
                   aggregate [$$147, $$151, $$153] <- [agg-global-sql-sum($$182), agg-sql-sum($$183), agg-global-sql-avg($$184)]
@@ -31,8 +33,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$z)
                       -- MICRO_STABLE_SORT [$$z(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$z])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
                {
                   aggregate [$$150, $$152] <- [agg-sql-avg($$y), agg-sql-count($$y)]
@@ -41,8 +45,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$y)
                       -- MICRO_STABLE_SORT [$$y(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$y])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$g]  |LOCAL|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.17.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.17.plan
index b8fa1cf..16a48c6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.17.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.17.plan
@@ -19,8 +19,10 @@
                           -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                             order (ASC, $$124)
                             -- MICRO_STABLE_SORT [$$124(ASC)]  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$124])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                      }
                      {
                         aggregate [$$293] <- [agg-sql-sum($$129)]
@@ -29,8 +31,10 @@
                           -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                             order (ASC, $$129)
                             -- MICRO_STABLE_SORT [$$129(ASC)]  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$129])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                      }
               -- PRE_CLUSTERED_GROUP_BY[$$156]  |PARTITIONED|
                 exchange
@@ -100,8 +104,10 @@
                           -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                             order (ASC, $$142)
                             -- MICRO_STABLE_SORT [$$142(ASC)]  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$142])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                      }
                      {
                         aggregate [$$295] <- [agg-sql-sum($$147)]
@@ -110,8 +116,10 @@
                           -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                             order (ASC, $$147)
                             -- MICRO_STABLE_SORT [$$147(ASC)]  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$147])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                      }
               -- PRE_CLUSTERED_GROUP_BY[$$157]  |PARTITIONED|
                 exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.9.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.9.plan
index c7ec943..7ddb43e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.9.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.9.plan
@@ -13,8 +13,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$68)
                       -- MICRO_STABLE_SORT [$$68(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$68])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.10.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.10.plan
index 0b3845b..465c8f7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.10.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.10.plan
@@ -20,8 +20,10 @@
                       -- AGGREGATE  |LOCAL|
                         select (gt($$93, 0))
                         -- STREAM_SELECT  |LOCAL|
-                          nested tuple source
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          project ([$$66, $$82, $$93])
+                          -- STREAM_PROJECT  |LOCAL|
+                            nested tuple source
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                    }
             -- PRE_CLUSTERED_GROUP_BY[$$85]  |PARTITIONED|
               exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.4.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.4.plan
index 548cfe0..a001339 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.4.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.4.plan
@@ -20,8 +20,10 @@
                       -- AGGREGATE  |LOCAL|
                         select (gt($$62, 0))
                         -- STREAM_SELECT  |LOCAL|
-                          nested tuple source
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          project ([$$62])
+                          -- STREAM_PROJECT  |LOCAL|
+                            nested tuple source
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                    }
             -- PRE_CLUSTERED_GROUP_BY[$$61]  |PARTITIONED|
               exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.5.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.5.plan
index 4cfa640..17012b7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.5.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.5.plan
@@ -32,8 +32,10 @@
                                   -- AGGREGATE  |LOCAL|
                                     select (gt($$120, 0))
                                     -- STREAM_SELECT  |LOCAL|
-                                      nested tuple source
-                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      project ([$$120])
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                }
                         -- PRE_CLUSTERED_GROUP_BY[$$118]  |PARTITIONED|
                           exchange
@@ -84,8 +86,10 @@
                                     -- AGGREGATE  |LOCAL|
                                       select (gt($$121, 0))
                                       -- STREAM_SELECT  |LOCAL|
-                                        nested tuple source
-                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                        project ([$$121])
+                                        -- STREAM_PROJECT  |LOCAL|
+                                          nested tuple source
+                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                                  }
                           -- PRE_CLUSTERED_GROUP_BY[$$119]  |PARTITIONED|
                             exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.6.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.6.plan
index f0a897c..01d4ad4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.6.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.6.plan
@@ -9,8 +9,10 @@
                 -- AGGREGATE  |UNPARTITIONED|
                   select (eq($$125, 0))
                   -- STREAM_SELECT  |UNPARTITIONED|
-                    nested tuple source
-                    -- NESTED_TUPLE_SOURCE  |UNPARTITIONED|
+                    project ([$$125, $$tenk.tenthous])
+                    -- STREAM_PROJECT  |UNPARTITIONED|
+                      nested tuple source
+                      -- NESTED_TUPLE_SOURCE  |UNPARTITIONED|
              }
       -- WINDOW  |UNPARTITIONED|
         window-aggregate [] <- [] order (ASC, $$tenk.tenthous) frame on (ASC, $$tenk.tenthous) start unbounded end [$$tenk.tenthous] {
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.7.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.7.plan
index 20cd7fa..f3032e7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.7.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.7.plan
@@ -11,8 +11,10 @@
                   -- AGGREGATE  |UNPARTITIONED|
                     select (lt($$187, 3000))
                     -- STREAM_SELECT  |UNPARTITIONED|
-                      nested tuple source
-                      -- NESTED_TUPLE_SOURCE  |UNPARTITIONED|
+                      project ([$$188, $$187])
+                      -- STREAM_PROJECT  |UNPARTITIONED|
+                        nested tuple source
+                        -- NESTED_TUPLE_SOURCE  |UNPARTITIONED|
                }
         -- WINDOW  |UNPARTITIONED|
           project ([$$twenty, $$189, $$193, $$194, $$188, $$187])
@@ -22,8 +24,10 @@
                       -- AGGREGATE  |UNPARTITIONED|
                         select (lt($$twenty, 10))
                         -- STREAM_SELECT  |UNPARTITIONED|
-                          nested tuple source
-                          -- NESTED_TUPLE_SOURCE  |UNPARTITIONED|
+                          project ([$$twenty, $$186])
+                          -- STREAM_PROJECT  |UNPARTITIONED|
+                            nested tuple source
+                            -- NESTED_TUPLE_SOURCE  |UNPARTITIONED|
                    }
             -- WINDOW  |UNPARTITIONED|
               project ([$$twenty, $$189, $$193, $$188, $$187, $$186])
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.8.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.8.plan
index d7aca6d..8d53c40 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.8.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-subclause/agg_filter_01/agg_filter_01.8.plan
@@ -16,14 +16,18 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (not(if-missing-or-null(gt($$x, 0), false)))
                                   -- STREAM_SELECT  |LOCAL|
-                                    unnest $$x <- scan-collection(ordered-list-constructor($$74, numeric-add($$74, $$74)))
+                                    unnest $$x <- scan-collection(ordered-list-constructor($$74, numeric-add($$74, $$74))) project: [$$x]
                                     -- UNNEST  |LOCAL|
-                                      nested tuple source
-                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      project ([$$74])
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- SUBPLAN  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$74])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$70]  |PARTITIONED|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/any-and-every-1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/any-and-every-1.plan
index 6ab4db5..31a066b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/any-and-every-1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/any-and-every-1.plan
@@ -13,8 +13,10 @@
                     -- AGGREGATE  |LOCAL|
                       unnest $$I <- scan-collection($$32)
                       -- UNNEST  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$32])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$32] <- [$$D.getField("items")]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/any-and-every-2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/any-and-every-2.plan
index 981d916..435e26a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/any-and-every-2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/any-and-every-2.plan
@@ -16,16 +16,20 @@
                                 -- AGGREGATE  |LOCAL|
                                   unnest $$J <- scan-collection($$48)
                                   -- UNNEST  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$48])
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- SUBPLAN  |LOCAL|
-                        assign [$$48] <- [$$I.getField("items")]
+                        assign [$$48] <- [$$I.getField("items")] project: [$$48]
                         -- ASSIGN  |LOCAL|
-                          unnest $$I <- scan-collection($$47)
+                          unnest $$I <- scan-collection($$47) project: [$$I]
                           -- UNNEST  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                            project ([$$47])
+                            -- STREAM_PROJECT  |LOCAL|
+                              nested tuple source
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$47] <- [$$D.getField("items")]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/any-and-every-3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/any-and-every-3.plan
index 3c577a8..abc621b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/any-and-every-3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/any-and-every-3.plan
@@ -13,10 +13,12 @@
                     -- AGGREGATE  |LOCAL|
                       unnest $$J <- scan-collection($$47)
                       -- UNNEST  |LOCAL|
-                        unnest $$I <- scan-collection($$46)
+                        unnest $$I <- scan-collection($$46) project: [$$47, $$I]
                         -- UNNEST  |LOCAL|
-                          nested tuple source
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          project ([$$47, $$46])
+                          -- STREAM_PROJECT  |LOCAL|
+                            nested tuple source
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$47, $$46] <- [$$D.getField("other_items"), $$D.getField("items")]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query4.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query4.plan
index e794791..2c8a32a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query4.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query4.plan
@@ -13,12 +13,14 @@
                     -- AGGREGATE  |LOCAL|
                       select (and(eq($$43, 2), eq($$42, 3)))
                       -- STREAM_SELECT  |LOCAL|
-                        assign [$$43, $$42] <- [$$DI.getField("field2"), $$DI.getField("field3")]
+                        assign [$$43, $$42] <- [$$DI.getField("field2"), $$DI.getField("field3")] project: [$$43, $$42]
                         -- ASSIGN  |LOCAL|
-                          unnest $$DI <- scan-collection($$41)
+                          unnest $$DI <- scan-collection($$41) project: [$$DI]
                           -- UNNEST  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                            project ([$$41])
+                            -- STREAM_PROJECT  |LOCAL|
+                              nested tuple source
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             select (and(eq($$D.getField("field1"), 1), eq($$D.getField("field4"), 4)))
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query5.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query5.plan
index 310f454..10b488c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query5.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query5.plan
@@ -13,27 +13,33 @@
                     -- AGGREGATE  |LOCAL|
                       select ($$48)
                       -- STREAM_SELECT  |LOCAL|
-                        subplan {
-                                  aggregate [$$48] <- [non-empty-stream()]
-                                  -- AGGREGATE  |LOCAL|
-                                    select (and(eq($$64, 2), eq($$63, 3), eq($$62, 3)))
-                                    -- STREAM_SELECT  |LOCAL|
-                                      assign [$$64, $$63, $$62] <- [$$DII.getField("field2"), $$DII.getField("field3"), $$DII.getField("field3_notindexed")]
-                                      -- ASSIGN  |LOCAL|
-                                        unnest $$DII <- scan-collection($$61)
-                                        -- UNNEST  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
-                               }
-                        -- SUBPLAN  |LOCAL|
-                          select (eq($$60, 2))
-                          -- STREAM_SELECT  |LOCAL|
-                            assign [$$61, $$60] <- [$$DOI.getField("inner_items"), $$DOI.getField("field2_notindexed")]
-                            -- ASSIGN  |LOCAL|
-                              unnest $$DOI <- scan-collection($$59)
-                              -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$48])
+                        -- STREAM_PROJECT  |LOCAL|
+                          subplan {
+                                    aggregate [$$48] <- [non-empty-stream()]
+                                    -- AGGREGATE  |LOCAL|
+                                      select (and(eq($$64, 2), eq($$63, 3), eq($$62, 3)))
+                                      -- STREAM_SELECT  |LOCAL|
+                                        assign [$$64, $$63, $$62] <- [$$DII.getField("field2"), $$DII.getField("field3"), $$DII.getField("field3_notindexed")] project: [$$64, $$63, $$62]
+                                        -- ASSIGN  |LOCAL|
+                                          unnest $$DII <- scan-collection($$61) project: [$$DII]
+                                          -- UNNEST  |LOCAL|
+                                            project ([$$61])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                 }
+                          -- SUBPLAN  |LOCAL|
+                            select (eq($$60, 2)) project: [$$61]
+                            -- STREAM_SELECT  |LOCAL|
+                              assign [$$61, $$60] <- [$$DOI.getField("inner_items"), $$DOI.getField("field2_notindexed")] project: [$$61, $$60]
+                              -- ASSIGN  |LOCAL|
+                                unnest $$DOI <- scan-collection($$59) project: [$$DOI]
+                                -- UNNEST  |LOCAL|
+                                  project ([$$59])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             select (and(eq($$D.getField("field1"), 1), eq($$D.getField("field4"), 4)))
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query8.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query8.plan
index 4b4bbc4..431b4f7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query8.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query8.plan
@@ -13,12 +13,14 @@
                     -- AGGREGATE  |LOCAL|
                       select (and(eq($$69, to-bigint($$70)), eq($$67, to-bigint($$68))))
                       -- STREAM_SELECT  |LOCAL|
-                        assign [$$69, $$67] <- [$$D1I.getField("field2"), $$D1I.getField("field3")]
+                        assign [$$69, $$67] <- [$$D1I.getField("field2"), $$D1I.getField("field3")] project: [$$70, $$68, $$69, $$67]
                         -- ASSIGN  |LOCAL|
-                          unnest $$D1I <- scan-collection($$66)
+                          unnest $$D1I <- scan-collection($$66) project: [$$70, $$68, $$D1I]
                           -- UNNEST  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                            project ([$$70, $$68, $$66])
+                            -- STREAM_PROJECT  |LOCAL|
+                              nested tuple source
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$66] <- [$$D1.getField("items")]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query9.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query9.plan
index a95a723..12d38cc 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query9.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query9.plan
@@ -13,27 +13,33 @@
                     -- AGGREGATE  |LOCAL|
                       select ($$70)
                       -- STREAM_SELECT  |LOCAL|
-                        subplan {
-                                  aggregate [$$70] <- [non-empty-stream()]
-                                  -- AGGREGATE  |LOCAL|
-                                    select (and(eq($$96, to-bigint($$97)), eq($$94, to-bigint($$95)), eq($$92, to-bigint($$93))))
-                                    -- STREAM_SELECT  |LOCAL|
-                                      assign [$$96, $$94, $$92] <- [$$DII.getField("field2"), $$DII.getField("field3"), $$DII.getField("field3_notindexed")]
-                                      -- ASSIGN  |LOCAL|
-                                        unnest $$DII <- scan-collection($$91)
-                                        -- UNNEST  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
-                               }
-                        -- SUBPLAN  |LOCAL|
-                          select (eq($$89, to-bigint($$90)))
-                          -- STREAM_SELECT  |LOCAL|
-                            assign [$$91, $$89] <- [$$DOI.getField("inner_items"), $$DOI.getField("field2_notindexed")]
-                            -- ASSIGN  |LOCAL|
-                              unnest $$DOI <- scan-collection($$88)
-                              -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$70])
+                        -- STREAM_PROJECT  |LOCAL|
+                          subplan {
+                                    aggregate [$$70] <- [non-empty-stream()]
+                                    -- AGGREGATE  |LOCAL|
+                                      select (and(eq($$96, to-bigint($$97)), eq($$94, to-bigint($$95)), eq($$92, to-bigint($$93))))
+                                      -- STREAM_SELECT  |LOCAL|
+                                        assign [$$96, $$94, $$92] <- [$$DII.getField("field2"), $$DII.getField("field3"), $$DII.getField("field3_notindexed")] project: [$$97, $$95, $$93, $$96, $$94, $$92]
+                                        -- ASSIGN  |LOCAL|
+                                          unnest $$DII <- scan-collection($$91) project: [$$97, $$95, $$93, $$DII]
+                                          -- UNNEST  |LOCAL|
+                                            project ([$$97, $$95, $$93, $$91])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                 }
+                          -- SUBPLAN  |LOCAL|
+                            select (eq($$89, to-bigint($$90))) project: [$$97, $$95, $$93, $$91]
+                            -- STREAM_SELECT  |LOCAL|
+                              assign [$$91, $$89] <- [$$DOI.getField("inner_items"), $$DOI.getField("field2_notindexed")] project: [$$97, $$95, $$93, $$90, $$91, $$89]
+                              -- ASSIGN  |LOCAL|
+                                unnest $$DOI <- scan-collection($$88) project: [$$97, $$95, $$93, $$90, $$DOI]
+                                -- UNNEST  |LOCAL|
+                                  project ([$$97, $$95, $$93, $$90, $$88])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$88] <- [$$D1.getField("outer_items")]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query1.plan
index 5e1aacb..a73743e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query1.plan
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$61, $#4))
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $#4 <- scan-collection($$60)
+                              unnest $#4 <- scan-collection($$60) project: [$$61, $#4]
                               -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$61, $$60])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   select (eq($$C.getField(1), "--Ni3oJ4VOqfOEu7Sj2Vzg")) project: [$$61, $$60]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query2.plan
index bb28529..b939b1c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query2.plan
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$70, $$D))
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$D <- scan-collection($$69)
+                              unnest $$D <- scan-collection($$69) project: [$$70, $$D]
                               -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$70, $$69])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   select (eq($$C.getField(1), "--Ni3oJ4VOqfOEu7Sj2Vzg")) project: [$$70, $$69]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query3.plan
index bcd2bd8..01ed8e1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query3.plan
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (not(if-missing-or-null(eq($$74, $$D), false)))
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$D <- scan-collection($$72)
+                              unnest $$D <- scan-collection($$72) project: [$$74, $$D]
                               -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$74, $$72])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   select (and(gt(len($$72), 0), eq($$C.getField(1), "--Ni3oJ4VOqfOEu7Sj2Vzg"))) project: [$$74, $$72]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query4.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query4.plan
index 9a50d42..e75b900 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query4.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query4.plan
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$77, $#5))
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $#5 <- scan-collection($$78)
+                              unnest $#5 <- scan-collection($$78) project: [$$77, $#5]
                               -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$77, $$78])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$78] <- [$$B.getField(2)] project: [$$77, $$78]
@@ -66,10 +68,12 @@
                                                                 -- AGGREGATE  |LOCAL|
                                                                   select (eq($$77, $#4))
                                                                   -- STREAM_SELECT  |LOCAL|
-                                                                    unnest $#4 <- scan-collection($$76)
+                                                                    unnest $#4 <- scan-collection($$76) project: [$$77, $#4]
                                                                     -- UNNEST  |LOCAL|
-                                                                      nested tuple source
-                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                      project ([$$77, $$76])
+                                                                      -- STREAM_PROJECT  |LOCAL|
+                                                                        nested tuple source
+                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                              }
                                                       -- SUBPLAN  |PARTITIONED|
                                                         assign [$$76] <- [$$A.getField(2)] project: [$$77, $$76]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query5.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query5.plan
index af39183..e941135 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query5.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-1/query5.plan
@@ -19,8 +19,10 @@
                           -- AGGREGATE  |LOCAL|
                             unnest $$D <- scan-collection($$71)
                             -- UNNEST  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$72, $$71])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   select (eq($$C.getField(1), "--Ni3oJ4VOqfOEu7Sj2Vzg")) project: [$$72, $$71]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-2/query1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-2/query1.plan
index bcdf9fd..c96188a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-2/query1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-2/query1.plan
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$62, $#4))
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $#4 <- scan-collection($$61)
+                              unnest $#4 <- scan-collection($$61) project: [$$62, $#4]
                               -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$62, $$61])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$61] <- [$$C.getField(2).getField(0)] project: [$$62, $$61]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-2/query2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-2/query2.plan
index 9878797..3b15f0e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-2/query2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-2/query2.plan
@@ -19,8 +19,10 @@
                           -- AGGREGATE  |LOCAL|
                             unnest $$D <- scan-collection($$72)
                             -- UNNEST  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$73, $$72])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$72] <- [$$C.getField(2).getField(0)] project: [$$73, $$72]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-2/query3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-2/query3.plan
index 0734e88..543cfa8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-2/query3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-2/query3.plan
@@ -19,7 +19,7 @@
                           -- AGGREGATE  |LOCAL|
                             select (not(if-missing-or-null(eq($$71, $$D), false)))
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$D <- scan-collection($$70)
+                              unnest $$D <- scan-collection($$70) project: [$$71, $$D]
                               -- UNNEST  |LOCAL|
                                 nested tuple source
                                 -- NESTED_TUPLE_SOURCE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-3/query1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-3/query1.plan
index cff7aa5..4b4c346 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-3/query1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-3/query1.plan
@@ -19,12 +19,14 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$71, $$72))
                             -- STREAM_SELECT  |LOCAL|
-                              assign [$$71] <- [$$D.getField(0)]
+                              assign [$$71] <- [$$D.getField(0)] project: [$$72, $$71]
                               -- ASSIGN  |LOCAL|
-                                unnest $$D <- scan-collection($$70)
+                                unnest $$D <- scan-collection($$70) project: [$$72, $$D]
                                 -- UNNEST  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$72, $$70])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   select (eq($$C.getField(1), "--Ni3oJ4VOqfOEu7Sj2Vzg")) project: [$$72, $$70]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-3/query2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-3/query2.plan
index 7a8a0ad..f1b88e8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-3/query2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-3/query2.plan
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             assign [$$73] <- [$$D.getField(0)]
                             -- ASSIGN  |LOCAL|
-                              unnest $$D <- scan-collection($$72)
+                              unnest $$D <- scan-collection($$72) project: [$$74, $$D]
                               -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$74, $$72])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   select (eq($$C.getField(1), "--Ni3oJ4VOqfOEu7Sj2Vzg")) project: [$$74, $$72]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-4/query1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-4/query1.plan
index b9e7921..de0b132 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-4/query1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-4/query1.plan
@@ -19,23 +19,29 @@
                           -- AGGREGATE  |LOCAL|
                             select ($$66)
                             -- STREAM_SELECT  |LOCAL|
-                              subplan {
-                                        aggregate [$$66] <- [non-empty-stream()]
-                                        -- AGGREGATE  |LOCAL|
-                                          select (eq($$D, $$84))
-                                          -- STREAM_SELECT  |LOCAL|
-                                            unnest $$D <- scan-collection($$83)
-                                            -- UNNEST  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                     }
-                              -- SUBPLAN  |LOCAL|
-                                assign [$$83] <- [$$CT.getField(1)]
-                                -- ASSIGN  |LOCAL|
-                                  unnest $$CT <- scan-collection($$82)
-                                  -- UNNEST  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$66])
+                              -- STREAM_PROJECT  |LOCAL|
+                                subplan {
+                                          aggregate [$$66] <- [non-empty-stream()]
+                                          -- AGGREGATE  |LOCAL|
+                                            select (eq($$D, $$84))
+                                            -- STREAM_SELECT  |LOCAL|
+                                              unnest $$D <- scan-collection($$83) project: [$$84, $$D]
+                                              -- UNNEST  |LOCAL|
+                                                project ([$$84, $$83])
+                                                -- STREAM_PROJECT  |LOCAL|
+                                                  nested tuple source
+                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                       }
+                                -- SUBPLAN  |LOCAL|
+                                  assign [$$83] <- [$$CT.getField(1)] project: [$$84, $$83]
+                                  -- ASSIGN  |LOCAL|
+                                    unnest $$CT <- scan-collection($$82) project: [$$84, $$CT]
+                                    -- UNNEST  |LOCAL|
+                                      project ([$$84, $$82])
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   select (eq($$C.getField(1), "--Ni3oJ4VOqfOEu7Sj2Vzg")) project: [$$84, $$82]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-4/query2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-4/query2.plan
index 8328a4a..0fbb1b8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-4/query2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-4/query2.plan
@@ -19,23 +19,29 @@
                           -- AGGREGATE  |LOCAL|
                             select (not(if-missing-or-null($$66, false)))
                             -- STREAM_SELECT  |LOCAL|
-                              subplan {
-                                        aggregate [$$66] <- [non-empty-stream()]
-                                        -- AGGREGATE  |LOCAL|
-                                          select (eq($$D, $$88))
-                                          -- STREAM_SELECT  |LOCAL|
-                                            unnest $$D <- scan-collection($$87)
-                                            -- UNNEST  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                     }
-                              -- SUBPLAN  |LOCAL|
-                                assign [$$87] <- [$$CT.getField(1)]
-                                -- ASSIGN  |LOCAL|
-                                  unnest $$CT <- scan-collection($$84)
-                                  -- UNNEST  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$66])
+                              -- STREAM_PROJECT  |LOCAL|
+                                subplan {
+                                          aggregate [$$66] <- [non-empty-stream()]
+                                          -- AGGREGATE  |LOCAL|
+                                            select (eq($$D, $$88))
+                                            -- STREAM_SELECT  |LOCAL|
+                                              unnest $$D <- scan-collection($$87) project: [$$88, $$D]
+                                              -- UNNEST  |LOCAL|
+                                                project ([$$88, $$87])
+                                                -- STREAM_PROJECT  |LOCAL|
+                                                  nested tuple source
+                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                       }
+                                -- SUBPLAN  |LOCAL|
+                                  assign [$$87] <- [$$CT.getField(1)] project: [$$88, $$87]
+                                  -- ASSIGN  |LOCAL|
+                                    unnest $$CT <- scan-collection($$84) project: [$$88, $$CT]
+                                    -- UNNEST  |LOCAL|
+                                      project ([$$88, $$84])
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   select (and(eq($$C.getField(1), "--Ni3oJ4VOqfOEu7Sj2Vzg"), gt(len($$84), 0))) project: [$$88, $$84]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-4/query3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-4/query3.plan
index da4ecf8..eaf9850 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-4/query3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-4/query3.plan
@@ -22,16 +22,20 @@
                                       -- AGGREGATE  |LOCAL|
                                         unnest $$D <- scan-collection($$87)
                                         -- UNNEST  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$88, $$87])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                             -- SUBPLAN  |LOCAL|
-                              assign [$$87] <- [$$CT.getField(1)]
+                              assign [$$87] <- [$$CT.getField(1)] project: [$$88, $$87]
                               -- ASSIGN  |LOCAL|
-                                unnest $$CT <- scan-collection($$86)
+                                unnest $$CT <- scan-collection($$86) project: [$$88, $$CT]
                                 -- UNNEST  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$88, $$86])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   select (eq($$C.getField(1), "--Ni3oJ4VOqfOEu7Sj2Vzg")) project: [$$88, $$86]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-4/query4.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-4/query4.plan
index 10e665d..97ec283 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-4/query4.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/join-quantified-queries/use-case-4/query4.plan
@@ -22,16 +22,20 @@
                                       -- AGGREGATE  |LOCAL|
                                         unnest $$D <- scan-collection($$132)
                                         -- UNNEST  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$130, $$132])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                             -- SUBPLAN  |LOCAL|
-                              assign [$$132] <- [$$CT.getField(1)]
+                              assign [$$132] <- [$$CT.getField(1)] project: [$$130, $$132]
                               -- ASSIGN  |LOCAL|
-                                unnest $$CT <- scan-collection($$131)
+                                unnest $$CT <- scan-collection($$131) project: [$$130, $$CT]
                                 -- UNNEST  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$130, $$131])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$131] <- [$$B.getField(2)] project: [$$130, $$131]
@@ -78,16 +82,20 @@
                                                                             -- AGGREGATE  |LOCAL|
                                                                               unnest $$D <- scan-collection($$129)
                                                                               -- UNNEST  |LOCAL|
-                                                                                nested tuple source
-                                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                project ([$$130, $$129])
+                                                                                -- STREAM_PROJECT  |LOCAL|
+                                                                                  nested tuple source
+                                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                          }
                                                                   -- SUBPLAN  |LOCAL|
-                                                                    assign [$$129] <- [$$CT.getField(1)]
+                                                                    assign [$$129] <- [$$CT.getField(1)] project: [$$130, $$129]
                                                                     -- ASSIGN  |LOCAL|
-                                                                      unnest $$CT <- scan-collection($$128)
+                                                                      unnest $$CT <- scan-collection($$128) project: [$$130, $$CT]
                                                                       -- UNNEST  |LOCAL|
-                                                                        nested tuple source
-                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                        project ([$$130, $$128])
+                                                                        -- STREAM_PROJECT  |LOCAL|
+                                                                          nested tuple source
+                                                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                              }
                                                       -- SUBPLAN  |PARTITIONED|
                                                         assign [$$128] <- [$$A.getField(2)] project: [$$130, $$128]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query1.plan
index b930afb..8ef888f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query1.plan
@@ -13,12 +13,14 @@
                     -- AGGREGATE  |LOCAL|
                       select (and(eq($$36, 284), eq($$35, 263)))
                       -- STREAM_SELECT  |LOCAL|
-                        assign [$$36, $$35] <- [$$v.getField("a"), $$v.getField("b")]
+                        assign [$$36, $$35] <- [$$v.getField("a"), $$v.getField("b")] project: [$$36, $$35]
                         -- ASSIGN  |LOCAL|
-                          unnest $$v <- scan-collection($$34)
+                          unnest $$v <- scan-collection($$34) project: [$$v]
                           -- UNNEST  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                            project ([$$34])
+                            -- STREAM_PROJECT  |LOCAL|
+                              nested tuple source
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$34] <- [$$k.getField("uarr_i")]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query2.plan
index a8e9cac..c1080e9 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query2.plan
@@ -13,12 +13,14 @@
                     -- AGGREGATE  |LOCAL|
                       select (and(eq($$39, 284), eq($$38, 263), eq($$37, 123)))
                       -- STREAM_SELECT  |LOCAL|
-                        assign [$$39, $$38, $$37] <- [$$v.getField("a"), $$v.getField("b"), $$v.getField("c")]
+                        assign [$$39, $$38, $$37] <- [$$v.getField("a"), $$v.getField("b"), $$v.getField("c")] project: [$$39, $$38, $$37]
                         -- ASSIGN  |LOCAL|
-                          unnest $$v <- scan-collection($$36)
+                          unnest $$v <- scan-collection($$36) project: [$$v]
                           -- UNNEST  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                            project ([$$36])
+                            -- STREAM_PROJECT  |LOCAL|
+                              nested tuple source
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$36] <- [$$k.getField("uarr_i")]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query1.plan
index 6298ffb..94d9ee2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query1.plan
@@ -13,14 +13,16 @@
                     -- AGGREGATE  |LOCAL|
                       select (eq($$J, 2))
                       -- STREAM_SELECT  |LOCAL|
-                        unnest $$J <- scan-collection($$45)
+                        unnest $$J <- scan-collection($$45) project: [$$J]
                         -- UNNEST  |LOCAL|
-                          select (eq($$I, 1))
+                          select (eq($$I, 1)) project: [$$45]
                           -- STREAM_SELECT  |LOCAL|
-                            unnest $$I <- scan-collection($$44)
+                            unnest $$I <- scan-collection($$44) project: [$$45, $$I]
                             -- UNNEST  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$45, $$44])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$45, $$44] <- [$$D1.getField("other_items"), $$D1.getField("items")]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query10.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query10.plan
index 588f524..1b47b23 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query10.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query10.plan
@@ -13,21 +13,27 @@
                     -- AGGREGATE  |LOCAL|
                       select (eq(true, $#2))
                       -- STREAM_SELECT  |LOCAL|
-                        unnest $#2 <- scan-collection(ordered-list-constructor(eq($$29, "a"), $$22))
+                        unnest $#2 <- scan-collection(ordered-list-constructor(eq($$29, "a"), $$22)) project: [$#2]
                         -- UNNEST  |LOCAL|
-                          subplan {
-                                    aggregate [$$22] <- [non-empty-stream()]
-                                    -- AGGREGATE  |LOCAL|
-                                      select (eq("b", $#1))
-                                      -- STREAM_SELECT  |LOCAL|
-                                        unnest $#1 <- scan-collection($$28)
-                                        -- UNNEST  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                 }
-                          -- SUBPLAN  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          project ([$$29, $$22])
+                          -- STREAM_PROJECT  |LOCAL|
+                            subplan {
+                                      aggregate [$$22] <- [non-empty-stream()]
+                                      -- AGGREGATE  |LOCAL|
+                                        select (eq("b", $#1))
+                                        -- STREAM_SELECT  |LOCAL|
+                                          unnest $#1 <- scan-collection($$28) project: [$#1]
+                                          -- UNNEST  |LOCAL|
+                                            project ([$$28])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                   }
+                            -- SUBPLAN  |LOCAL|
+                              project ([$$29, $$28])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$29, $$28] <- [$$D1.getField("val"), $$D1.getField("items")]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query11.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query11.plan
index 5581b76..e3cc936 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query11.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query11.plan
@@ -13,32 +13,42 @@
                     -- AGGREGATE  |LOCAL|
                       select (eq(true, $#3))
                       -- STREAM_SELECT  |LOCAL|
-                        unnest $#3 <- scan-collection(ordered-list-constructor(eq($$37, "a"), $$29))
+                        unnest $#3 <- scan-collection(ordered-list-constructor(eq($$37, "a"), $$29)) project: [$#3]
                         -- UNNEST  |LOCAL|
-                          subplan {
-                                    aggregate [$$29] <- [non-empty-stream()]
-                                    -- AGGREGATE  |LOCAL|
-                                      select (eq(true, $#2))
-                                      -- STREAM_SELECT  |LOCAL|
-                                        unnest $#2 <- scan-collection(ordered-list-constructor(eq($$36, "c"), $$27))
-                                        -- UNNEST  |LOCAL|
-                                          subplan {
-                                                    aggregate [$$27] <- [non-empty-stream()]
-                                                    -- AGGREGATE  |LOCAL|
-                                                      select (eq("b", $#1))
-                                                      -- STREAM_SELECT  |LOCAL|
-                                                        unnest $#1 <- scan-collection($$35)
-                                                        -- UNNEST  |LOCAL|
-                                                          nested tuple source
-                                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                 }
-                                          -- SUBPLAN  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                 }
-                          -- SUBPLAN  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          project ([$$37, $$29])
+                          -- STREAM_PROJECT  |LOCAL|
+                            subplan {
+                                      aggregate [$$29] <- [non-empty-stream()]
+                                      -- AGGREGATE  |LOCAL|
+                                        select (eq(true, $#2))
+                                        -- STREAM_SELECT  |LOCAL|
+                                          unnest $#2 <- scan-collection(ordered-list-constructor(eq($$36, "c"), $$27)) project: [$#2]
+                                          -- UNNEST  |LOCAL|
+                                            project ([$$36, $$27])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              subplan {
+                                                        aggregate [$$27] <- [non-empty-stream()]
+                                                        -- AGGREGATE  |LOCAL|
+                                                          select (eq("b", $#1))
+                                                          -- STREAM_SELECT  |LOCAL|
+                                                            unnest $#1 <- scan-collection($$35) project: [$#1]
+                                                            -- UNNEST  |LOCAL|
+                                                              project ([$$35])
+                                                              -- STREAM_PROJECT  |LOCAL|
+                                                                nested tuple source
+                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                     }
+                                              -- SUBPLAN  |LOCAL|
+                                                project ([$$36, $$35])
+                                                -- STREAM_PROJECT  |LOCAL|
+                                                  nested tuple source
+                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                   }
+                            -- SUBPLAN  |LOCAL|
+                              project ([$$37, $$36, $$35])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$37, $$36, $$35] <- [$$D1.getField("val"), $$D1.getField("val2"), $$D1.getField("items")]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query2.plan
index baede90..144c9f4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query2.plan
@@ -13,14 +13,16 @@
                     -- AGGREGATE  |LOCAL|
                       select (eq($$J, 2))
                       -- STREAM_SELECT  |LOCAL|
-                        unnest $$J <- scan-collection($$45)
+                        unnest $$J <- scan-collection($$45) project: [$$J]
                         -- UNNEST  |LOCAL|
-                          select (eq($$I, 1))
+                          select (eq($$I, 1)) project: [$$45]
                           -- STREAM_SELECT  |LOCAL|
-                            unnest $$I <- scan-collection($$44)
+                            unnest $$I <- scan-collection($$44) project: [$$45, $$I]
                             -- UNNEST  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$45, $$44])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$45, $$44] <- [$$D1.getField("other_items"), $$D1.getField(1)]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query3.plan
index 40eba97..8382620 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query3.plan
@@ -13,18 +13,20 @@
                     -- AGGREGATE  |LOCAL|
                       select (eq($$49, 2))
                       -- STREAM_SELECT  |LOCAL|
-                        assign [$$49] <- [$$J.getField("item")]
+                        assign [$$49] <- [$$J.getField("item")] project: [$$49]
                         -- ASSIGN  |LOCAL|
-                          unnest $$J <- scan-collection($$48)
+                          unnest $$J <- scan-collection($$48) project: [$$J]
                           -- UNNEST  |LOCAL|
-                            select (eq($$47, 1))
+                            select (eq($$47, 1)) project: [$$48]
                             -- STREAM_SELECT  |LOCAL|
-                              assign [$$47] <- [$$I.getField("item")]
+                              assign [$$47] <- [$$I.getField("item")] project: [$$48, $$47]
                               -- ASSIGN  |LOCAL|
-                                unnest $$I <- scan-collection($$46)
+                                unnest $$I <- scan-collection($$46) project: [$$48, $$I]
                                 -- UNNEST  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$48, $$46])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$48, $$46] <- [$$D1.getField("other_items"), $$D1.getField("items")]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query4.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query4.plan
index 6fd232a..a23f87d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query4.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query4.plan
@@ -13,18 +13,20 @@
                     -- AGGREGATE  |LOCAL|
                       select (eq($$49, 2))
                       -- STREAM_SELECT  |LOCAL|
-                        assign [$$49] <- [$$J.getField("item")]
+                        assign [$$49] <- [$$J.getField("item")] project: [$$49]
                         -- ASSIGN  |LOCAL|
-                          unnest $$J <- scan-collection($$48)
+                          unnest $$J <- scan-collection($$48) project: [$$J]
                           -- UNNEST  |LOCAL|
-                            select (eq($$47, 1))
+                            select (eq($$47, 1)) project: [$$48]
                             -- STREAM_SELECT  |LOCAL|
-                              assign [$$47] <- [$$I.getField(0)]
+                              assign [$$47] <- [$$I.getField(0)] project: [$$48, $$47]
                               -- ASSIGN  |LOCAL|
-                                unnest $$I <- scan-collection($$46)
+                                unnest $$I <- scan-collection($$46) project: [$$48, $$I]
                                 -- UNNEST  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$48, $$46])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$48, $$46] <- [$$D1.getField("other_items"), $$D1.getField(1)]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query5.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query5.plan
index feabc78..b20c8e4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query5.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query5.plan
@@ -13,37 +13,43 @@
                     -- AGGREGATE  |LOCAL|
                       select ($$68)
                       -- STREAM_SELECT  |LOCAL|
-                        subplan {
-                                  aggregate [$$68] <- [non-empty-stream()]
-                                  -- AGGREGATE  |LOCAL|
-                                    select (eq($$80, 2))
-                                    -- STREAM_SELECT  |LOCAL|
-                                      assign [$$80] <- [$$J2.getField("item")]
-                                      -- ASSIGN  |LOCAL|
-                                        unnest $$J2 <- scan-collection($$79)
-                                        -- UNNEST  |LOCAL|
-                                          select (eq($$78, 1))
-                                          -- STREAM_SELECT  |LOCAL|
-                                            assign [$$78] <- [$$I2.getField("item")]
-                                            -- ASSIGN  |LOCAL|
-                                              unnest $$I2 <- scan-collection($$77)
-                                              -- UNNEST  |LOCAL|
-                                                nested tuple source
-                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                               }
-                        -- SUBPLAN  |LOCAL|
-                          select (eq($$76, 2))
-                          -- STREAM_SELECT  |LOCAL|
-                            assign [$$76] <- [$$J.getField("item")]
-                            -- ASSIGN  |LOCAL|
-                              unnest $$J <- scan-collection($$75)
-                              -- UNNEST  |LOCAL|
-                                assign [$$79, $$77] <- [$$I1.getField("other_inner_items"), $$I1.getField("inner_items")]
-                                -- ASSIGN  |LOCAL|
-                                  unnest $$I1 <- scan-collection($$74)
-                                  -- UNNEST  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$68])
+                        -- STREAM_PROJECT  |LOCAL|
+                          subplan {
+                                    aggregate [$$68] <- [non-empty-stream()]
+                                    -- AGGREGATE  |LOCAL|
+                                      select (eq($$80, 2))
+                                      -- STREAM_SELECT  |LOCAL|
+                                        assign [$$80] <- [$$J2.getField("item")] project: [$$80]
+                                        -- ASSIGN  |LOCAL|
+                                          unnest $$J2 <- scan-collection($$79) project: [$$J2]
+                                          -- UNNEST  |LOCAL|
+                                            select (eq($$78, 1)) project: [$$79]
+                                            -- STREAM_SELECT  |LOCAL|
+                                              assign [$$78] <- [$$I2.getField("item")] project: [$$79, $$78]
+                                              -- ASSIGN  |LOCAL|
+                                                unnest $$I2 <- scan-collection($$77) project: [$$79, $$I2]
+                                                -- UNNEST  |LOCAL|
+                                                  project ([$$79, $$77])
+                                                  -- STREAM_PROJECT  |LOCAL|
+                                                    nested tuple source
+                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                 }
+                          -- SUBPLAN  |LOCAL|
+                            select (eq($$76, 2)) project: [$$79, $$77]
+                            -- STREAM_SELECT  |LOCAL|
+                              assign [$$76] <- [$$J.getField("item")] project: [$$79, $$77, $$76]
+                              -- ASSIGN  |LOCAL|
+                                unnest $$J <- scan-collection($$75) project: [$$79, $$77, $$J]
+                                -- UNNEST  |LOCAL|
+                                  assign [$$79, $$77] <- [$$I1.getField("other_inner_items"), $$I1.getField("inner_items")] project: [$$75, $$79, $$77]
+                                  -- ASSIGN  |LOCAL|
+                                    unnest $$I1 <- scan-collection($$74) project: [$$75, $$I1]
+                                    -- UNNEST  |LOCAL|
+                                      project ([$$75, $$74])
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$75, $$74] <- [$$D1.getField("other_items"), $$D1.getField("outer_items")]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query6.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query6.plan
index ebe4342..a52a3f6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query6.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query6.plan
@@ -13,37 +13,43 @@
                     -- AGGREGATE  |LOCAL|
                       select ($$68)
                       -- STREAM_SELECT  |LOCAL|
-                        subplan {
-                                  aggregate [$$68] <- [non-empty-stream()]
-                                  -- AGGREGATE  |LOCAL|
-                                    select (eq($$80, 2))
-                                    -- STREAM_SELECT  |LOCAL|
-                                      assign [$$80] <- [$$J2.getField("item")]
-                                      -- ASSIGN  |LOCAL|
-                                        unnest $$J2 <- scan-collection($$79)
-                                        -- UNNEST  |LOCAL|
-                                          select (eq($$78, 1))
-                                          -- STREAM_SELECT  |LOCAL|
-                                            assign [$$78] <- [$$I2.getField(0)]
-                                            -- ASSIGN  |LOCAL|
-                                              unnest $$I2 <- scan-collection($$77)
-                                              -- UNNEST  |LOCAL|
-                                                nested tuple source
-                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                               }
-                        -- SUBPLAN  |LOCAL|
-                          select (eq($$76, 2))
-                          -- STREAM_SELECT  |LOCAL|
-                            assign [$$76] <- [$$J.getField("item")]
-                            -- ASSIGN  |LOCAL|
-                              unnest $$J <- scan-collection($$75)
-                              -- UNNEST  |LOCAL|
-                                assign [$$79, $$77] <- [$$I1.getField("other_inner_items"), $$I1.getField(0)]
-                                -- ASSIGN  |LOCAL|
-                                  unnest $$I1 <- scan-collection($$74)
-                                  -- UNNEST  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$68])
+                        -- STREAM_PROJECT  |LOCAL|
+                          subplan {
+                                    aggregate [$$68] <- [non-empty-stream()]
+                                    -- AGGREGATE  |LOCAL|
+                                      select (eq($$80, 2))
+                                      -- STREAM_SELECT  |LOCAL|
+                                        assign [$$80] <- [$$J2.getField("item")] project: [$$80]
+                                        -- ASSIGN  |LOCAL|
+                                          unnest $$J2 <- scan-collection($$79) project: [$$J2]
+                                          -- UNNEST  |LOCAL|
+                                            select (eq($$78, 1)) project: [$$79]
+                                            -- STREAM_SELECT  |LOCAL|
+                                              assign [$$78] <- [$$I2.getField(0)] project: [$$79, $$78]
+                                              -- ASSIGN  |LOCAL|
+                                                unnest $$I2 <- scan-collection($$77) project: [$$79, $$I2]
+                                                -- UNNEST  |LOCAL|
+                                                  project ([$$79, $$77])
+                                                  -- STREAM_PROJECT  |LOCAL|
+                                                    nested tuple source
+                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                 }
+                          -- SUBPLAN  |LOCAL|
+                            select (eq($$76, 2)) project: [$$79, $$77]
+                            -- STREAM_SELECT  |LOCAL|
+                              assign [$$76] <- [$$J.getField("item")] project: [$$79, $$77, $$76]
+                              -- ASSIGN  |LOCAL|
+                                unnest $$J <- scan-collection($$75) project: [$$79, $$77, $$J]
+                                -- UNNEST  |LOCAL|
+                                  assign [$$79, $$77] <- [$$I1.getField("other_inner_items"), $$I1.getField(0)] project: [$$75, $$79, $$77]
+                                  -- ASSIGN  |LOCAL|
+                                    unnest $$I1 <- scan-collection($$74) project: [$$75, $$I1]
+                                    -- UNNEST  |LOCAL|
+                                      project ([$$75, $$74])
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$75, $$74] <- [$$D1.getField("other_items"), $$D1.getField(1)]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query7.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query7.plan
index 6f45c65..8b6891d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query7.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query7.plan
@@ -13,14 +13,16 @@
                     -- AGGREGATE  |LOCAL|
                       assign [$$51] <- [$$J.getField("item")]
                       -- ASSIGN  |LOCAL|
-                        unnest $$J <- scan-collection($$49)
+                        unnest $$J <- scan-collection($$49) project: [$$50, $$J]
                         -- UNNEST  |LOCAL|
-                          assign [$$50] <- [$$I.getField(0)]
+                          assign [$$50] <- [$$I.getField(0)] project: [$$49, $$50]
                           -- ASSIGN  |LOCAL|
-                            unnest $$I <- scan-collection($$48)
+                            unnest $$I <- scan-collection($$48) project: [$$49, $$I]
                             -- UNNEST  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$49, $$48])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$49, $$48] <- [$$D1.getField("other_items"), $$D1.getField(1)]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query8.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query8.plan
index 9563f8f..8612501 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query8.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query8.plan
@@ -16,26 +16,30 @@
                                 -- AGGREGATE  |LOCAL|
                                   assign [$$83] <- [$$J2.getField("item")]
                                   -- ASSIGN  |LOCAL|
-                                    unnest $$J2 <- scan-collection($$81)
+                                    unnest $$J2 <- scan-collection($$81) project: [$$82, $$J2]
                                     -- UNNEST  |LOCAL|
-                                      assign [$$82] <- [$$I2.getField(0)]
+                                      assign [$$82] <- [$$I2.getField(0)] project: [$$81, $$82]
                                       -- ASSIGN  |LOCAL|
-                                        unnest $$I2 <- scan-collection($$80)
+                                        unnest $$I2 <- scan-collection($$80) project: [$$81, $$I2]
                                         -- UNNEST  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$81, $$80])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- SUBPLAN  |LOCAL|
-                        assign [$$84] <- [$$J.getField("item")]
+                        assign [$$84] <- [$$J.getField("item")] project: [$$81, $$80, $$84]
                         -- ASSIGN  |LOCAL|
-                          unnest $$J <- scan-collection($$79)
+                          unnest $$J <- scan-collection($$79) project: [$$81, $$80, $$J]
                           -- UNNEST  |LOCAL|
-                            assign [$$81, $$80] <- [$$I1.getField("other_inner_items"), $$I1.getField(0)]
+                            assign [$$81, $$80] <- [$$I1.getField("other_inner_items"), $$I1.getField(0)] project: [$$79, $$81, $$80]
                             -- ASSIGN  |LOCAL|
-                              unnest $$I1 <- scan-collection($$78)
+                              unnest $$I1 <- scan-collection($$78) project: [$$79, $$I1]
                               -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$79, $$78])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$79, $$78] <- [$$D1.getField("other_items"), $$D1.getField(1)]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query9.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query9.plan
index 628fa95..1834bcd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query9.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-quantifiers/query9.plan
@@ -16,26 +16,30 @@
                                 -- AGGREGATE  |LOCAL|
                                   assign [$$85] <- [$$J2.getField("item")]
                                   -- ASSIGN  |LOCAL|
-                                    unnest $$J2 <- scan-collection($$83)
+                                    unnest $$J2 <- scan-collection($$83) project: [$$84, $$J2]
                                     -- UNNEST  |LOCAL|
-                                      assign [$$84] <- [$$I2.getField(0)]
+                                      assign [$$84] <- [$$I2.getField(0)] project: [$$83, $$84]
                                       -- ASSIGN  |LOCAL|
-                                        unnest $$I2 <- scan-collection($$82)
+                                        unnest $$I2 <- scan-collection($$82) project: [$$83, $$I2]
                                         -- UNNEST  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$83, $$82])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- SUBPLAN  |LOCAL|
-                        assign [$$86] <- [$$J.getField("item")]
+                        assign [$$86] <- [$$J.getField("item")] project: [$$87, $$83, $$82, $$86]
                         -- ASSIGN  |LOCAL|
-                          unnest $$J <- scan-collection($$81)
+                          unnest $$J <- scan-collection($$81) project: [$$87, $$83, $$82, $$J]
                           -- UNNEST  |LOCAL|
-                            assign [$$87, $$83, $$82] <- [$$I1.getField(0), $$I1.getField("other_inner_items"), $$I1.getField(1)]
+                            assign [$$87, $$83, $$82] <- [$$I1.getField(0), $$I1.getField("other_inner_items"), $$I1.getField(1)] project: [$$81, $$87, $$83, $$82]
                             -- ASSIGN  |LOCAL|
-                              unnest $$I1 <- scan-collection($$80)
+                              unnest $$I1 <- scan-collection($$80) project: [$$81, $$I1]
                               -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$81, $$80])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$81, $$80] <- [$$D1.getField("other_items"), $$D1.getField(1)]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query1.plan
index 8b34dc9..afad331 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query1.plan
@@ -13,10 +13,12 @@
                     -- AGGREGATE  |LOCAL|
                       select (eq("2016-04-26 19:49:16", $#1))
                       -- STREAM_SELECT  |LOCAL|
-                        unnest $#1 <- scan-collection($$22)
+                        unnest $#1 <- scan-collection($$22) project: [$#1]
                         -- UNNEST  |LOCAL|
-                          nested tuple source
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          project ([$$22])
+                          -- STREAM_PROJECT  |LOCAL|
+                            nested tuple source
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$23, $$22] <- [$$C.getField(1), $$C.getField(2)] project: [$$23, $$22]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query2.plan
index 9e6bfe1..29641fe 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query2.plan
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (and(gt($$D, "2016"), lt($$D, "2017")))
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$D <- scan-collection($$53)
+                              unnest $$D <- scan-collection($$53) project: [$$D]
                               -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$53])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$53] <- [$$C.getField(2)] project: [$$53]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query3.plan
index c867b71..a61c2fb 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query3.plan
@@ -19,7 +19,7 @@
                           -- AGGREGATE  |LOCAL|
                             select (not(if-missing-or-null(and(gt($$D, "2016"), lt($$D, "2017")), false)))
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$D <- scan-collection($$57)
+                              unnest $$D <- scan-collection($$57) project: [$$D]
                               -- UNNEST  |LOCAL|
                                 nested tuple source
                                 -- NESTED_TUPLE_SOURCE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query4.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query4.plan
index 47421df..a2a2a43 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query4.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query4.plan
@@ -19,8 +19,10 @@
                           -- AGGREGATE  |LOCAL|
                             unnest $$D <- scan-collection($$55)
                             -- UNNEST  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$55])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$55] <- [$$C.getField(2)] project: [$$55]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query5.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query5.plan
index 5c67893..b531199 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query5.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-1/query5.plan
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (not(if-missing-or-null(and(gt($$D, "2016"), lt($$D, "2017")), false)))
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$D <- scan-collection($$62)
+                              unnest $$D <- scan-collection($$62) project: [$$D]
                               -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$62])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   select (and(lt(0, len($$C.getField("dates_notindexed"))), lt(0, len($$C.getField("dates_notindexed_2"))))) project: [$$62]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query1.plan
index 83042d4..b7f8a6c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query1.plan
@@ -13,10 +13,12 @@
                     -- AGGREGATE  |LOCAL|
                       select (eq("2016-04-26", $#1))
                       -- STREAM_SELECT  |LOCAL|
-                        unnest $#1 <- scan-collection($$23)
+                        unnest $#1 <- scan-collection($$23) project: [$#1]
                         -- UNNEST  |LOCAL|
-                          nested tuple source
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          project ([$$23])
+                          -- STREAM_PROJECT  |LOCAL|
+                            nested tuple source
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$23, $$24] <- [$$C.getField(2).getField(0), $$C.getField(1)] project: [$$24, $$23]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query2.plan
index 6186d80..afe9620 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query2.plan
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (and(gt($$D, "2016"), lt($$D, "2017")))
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$D <- scan-collection($$54)
+                              unnest $$D <- scan-collection($$54) project: [$$D]
                               -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$54])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$54] <- [$$C.getField(2).getField(0)] project: [$$54]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query3.plan
index ebc473b..9b04e01 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query3.plan
@@ -19,8 +19,10 @@
                           -- AGGREGATE  |LOCAL|
                             unnest $$D <- scan-collection($$56)
                             -- UNNEST  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$56])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$56] <- [$$C.getField(2).getField(0)] project: [$$56]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query4.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query4.plan
index 8ea231a..000440c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query4.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query4.plan
@@ -19,8 +19,10 @@
                           -- AGGREGATE  |LOCAL|
                             unnest $$D <- scan-collection($$56)
                             -- UNNEST  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$56])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$56] <- [$$C.getField(2).getField("dates_notindexed")] project: [$$56]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query5.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query5.plan
index 9baec23..6bf553c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query5.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-2/query5.plan
@@ -19,8 +19,10 @@
                           -- AGGREGATE  |LOCAL|
                             unnest $$D <- scan-collection($$55)
                             -- UNNEST  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$55])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$55] <- [$$C.getField(2).getField(0)] project: [$$55]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-3/query1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-3/query1.plan
index 42318aa..0a9b8c8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-3/query1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-3/query1.plan
@@ -13,12 +13,14 @@
                     -- AGGREGATE  |LOCAL|
                       select (eq("2016-04-26", $$33))
                       -- STREAM_SELECT  |LOCAL|
-                        assign [$$33] <- [$$D.getField(0)]
+                        assign [$$33] <- [$$D.getField(0)] project: [$$33]
                         -- ASSIGN  |LOCAL|
-                          unnest $$D <- scan-collection($$32)
+                          unnest $$D <- scan-collection($$32) project: [$$D]
                           -- UNNEST  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                            project ([$$32])
+                            -- STREAM_PROJECT  |LOCAL|
+                              nested tuple source
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$34, $$32] <- [$$C.getField(1), $$C.getField(2)] project: [$$34, $$32]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-3/query2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-3/query2.plan
index b18026c..d9f24ac 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-3/query2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-3/query2.plan
@@ -13,12 +13,14 @@
                     -- AGGREGATE  |LOCAL|
                       select (and(eq($$37, "2016-04-26"), eq($$36, "19:49:16")))
                       -- STREAM_SELECT  |LOCAL|
-                        assign [$$37, $$36] <- [$$D.getField(0), $$D.getField(1)]
+                        assign [$$37, $$36] <- [$$D.getField(0), $$D.getField(1)] project: [$$37, $$36]
                         -- ASSIGN  |LOCAL|
-                          unnest $$D <- scan-collection($$35)
+                          unnest $$D <- scan-collection($$35) project: [$$D]
                           -- UNNEST  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                            project ([$$35])
+                            -- STREAM_PROJECT  |LOCAL|
+                              nested tuple source
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$38, $$35] <- [$$C.getField(1), $$C.getField(2)] project: [$$38, $$35]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-3/query3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-3/query3.plan
index a0d16c7..f62d1b3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-3/query3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-3/query3.plan
@@ -13,10 +13,12 @@
                     -- AGGREGATE  |LOCAL|
                       assign [$$38] <- [$$D.getField(0)]
                       -- ASSIGN  |LOCAL|
-                        unnest $$D <- scan-collection($$37)
+                        unnest $$D <- scan-collection($$37) project: [$$D]
                         -- UNNEST  |LOCAL|
-                          nested tuple source
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          project ([$$37])
+                          -- STREAM_PROJECT  |LOCAL|
+                            nested tuple source
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$40, $$37] <- [$$C.getField(1), $$C.getField(2)] project: [$$40, $$37]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-3/query4.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-3/query4.plan
index 08f5c1d..7f00c32 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-3/query4.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-3/query4.plan
@@ -13,10 +13,12 @@
                     -- AGGREGATE  |LOCAL|
                       assign [$$38] <- [$$D.getField("date_notindexed")]
                       -- ASSIGN  |LOCAL|
-                        unnest $$D <- scan-collection($$37)
+                        unnest $$D <- scan-collection($$37) project: [$$D]
                         -- UNNEST  |LOCAL|
-                          nested tuple source
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          project ([$$37])
+                          -- STREAM_PROJECT  |LOCAL|
+                            nested tuple source
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$40, $$37] <- [$$C.getField(1), $$C.getField(2)] project: [$$40, $$37]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query1.plan
index 5984a7f..287548d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query1.plan
@@ -13,23 +13,29 @@
                     -- AGGREGATE  |LOCAL|
                       select ($$29)
                       -- STREAM_SELECT  |LOCAL|
-                        subplan {
-                                  aggregate [$$29] <- [non-empty-stream()]
-                                  -- AGGREGATE  |LOCAL|
-                                    select (eq("2016-04-26", $#1))
-                                    -- STREAM_SELECT  |LOCAL|
-                                      unnest $#1 <- scan-collection($$36)
-                                      -- UNNEST  |LOCAL|
-                                        nested tuple source
-                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
-                               }
-                        -- SUBPLAN  |LOCAL|
-                          assign [$$36] <- [$$D.getField(0)]
-                          -- ASSIGN  |LOCAL|
-                            unnest $$D <- scan-collection($$35)
-                            -- UNNEST  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$29])
+                        -- STREAM_PROJECT  |LOCAL|
+                          subplan {
+                                    aggregate [$$29] <- [non-empty-stream()]
+                                    -- AGGREGATE  |LOCAL|
+                                      select (eq("2016-04-26", $#1))
+                                      -- STREAM_SELECT  |LOCAL|
+                                        unnest $#1 <- scan-collection($$36) project: [$#1]
+                                        -- UNNEST  |LOCAL|
+                                          project ([$$36])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                 }
+                          -- SUBPLAN  |LOCAL|
+                            assign [$$36] <- [$$D.getField(0)] project: [$$36]
+                            -- ASSIGN  |LOCAL|
+                              unnest $$D <- scan-collection($$35) project: [$$D]
+                              -- UNNEST  |LOCAL|
+                                project ([$$35])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$37, $$35] <- [$$C.getField(1), $$C.getField(2)] project: [$$37, $$35]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query2.plan
index 0be5838..1e8374f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query2.plan
@@ -13,23 +13,29 @@
                     -- AGGREGATE  |LOCAL|
                       select ($$38)
                       -- STREAM_SELECT  |LOCAL|
-                        subplan {
-                                  aggregate [$$38] <- [non-empty-stream()]
-                                  -- AGGREGATE  |LOCAL|
-                                    select (eq($$D, "2016-04-26"))
-                                    -- STREAM_SELECT  |LOCAL|
-                                      unnest $$D <- scan-collection($$45)
-                                      -- UNNEST  |LOCAL|
-                                        nested tuple source
-                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
-                               }
-                        -- SUBPLAN  |LOCAL|
-                          assign [$$45] <- [$$CT.getField(0)]
-                          -- ASSIGN  |LOCAL|
-                            unnest $$CT <- scan-collection($$44)
-                            -- UNNEST  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$38])
+                        -- STREAM_PROJECT  |LOCAL|
+                          subplan {
+                                    aggregate [$$38] <- [non-empty-stream()]
+                                    -- AGGREGATE  |LOCAL|
+                                      select (eq($$D, "2016-04-26"))
+                                      -- STREAM_SELECT  |LOCAL|
+                                        unnest $$D <- scan-collection($$45) project: [$$D]
+                                        -- UNNEST  |LOCAL|
+                                          project ([$$45])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                 }
+                          -- SUBPLAN  |LOCAL|
+                            assign [$$45] <- [$$CT.getField(0)] project: [$$45]
+                            -- ASSIGN  |LOCAL|
+                              unnest $$CT <- scan-collection($$44) project: [$$CT]
+                              -- UNNEST  |LOCAL|
+                                project ([$$44])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$46, $$44] <- [$$C.getField(1), $$C.getField(2)] project: [$$46, $$44]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query3.plan
index 8fab13b..ec7620b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query3.plan
@@ -16,18 +16,22 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (eq("2019-06-07", $$D))
                                   -- STREAM_SELECT  |LOCAL|
-                                    unnest $$D <- scan-collection($$47)
+                                    unnest $$D <- scan-collection($$47) project: [$$D]
                                     -- UNNEST  |LOCAL|
-                                      nested tuple source
-                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      project ([$$47])
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- SUBPLAN  |LOCAL|
-                        assign [$$47] <- [$$CT.getField(0)]
+                        assign [$$47] <- [$$CT.getField(0)] project: [$$47]
                         -- ASSIGN  |LOCAL|
-                          unnest $$CT <- scan-collection($$46)
+                          unnest $$CT <- scan-collection($$46) project: [$$CT]
                           -- UNNEST  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                            project ([$$46])
+                            -- STREAM_PROJECT  |LOCAL|
+                              nested tuple source
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$48, $$46] <- [$$C.getField(1), $$C.getField(2)] project: [$$48, $$46]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query4.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query4.plan
index f623f98..2d13646 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query4.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query4.plan
@@ -13,21 +13,27 @@
                     -- AGGREGATE  |LOCAL|
                       select (and($$38, eq($$39, 0)))
                       -- STREAM_SELECT  |LOCAL|
-                        subplan {
-                                  aggregate [$$38, $$39] <- [non-empty-stream(), agg-sql-count(switch-case(gt($$D, "2019-06-07"), true, null, true))]
-                                  -- AGGREGATE  |LOCAL|
-                                    unnest $$D <- scan-collection($$47)
-                                    -- UNNEST  |LOCAL|
-                                      nested tuple source
-                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
-                               }
-                        -- SUBPLAN  |LOCAL|
-                          assign [$$47] <- [$$CT.getField(0)]
-                          -- ASSIGN  |LOCAL|
-                            unnest $$CT <- scan-collection($$46)
-                            -- UNNEST  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$38, $$39])
+                        -- STREAM_PROJECT  |LOCAL|
+                          subplan {
+                                    aggregate [$$38, $$39] <- [non-empty-stream(), agg-sql-count(switch-case(gt($$D, "2019-06-07"), true, null, true))]
+                                    -- AGGREGATE  |LOCAL|
+                                      unnest $$D <- scan-collection($$47)
+                                      -- UNNEST  |LOCAL|
+                                        project ([$$47])
+                                        -- STREAM_PROJECT  |LOCAL|
+                                          nested tuple source
+                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                 }
+                          -- SUBPLAN  |LOCAL|
+                            assign [$$47] <- [$$CT.getField(0)] project: [$$47]
+                            -- ASSIGN  |LOCAL|
+                              unnest $$CT <- scan-collection($$46) project: [$$CT]
+                              -- UNNEST  |LOCAL|
+                                project ([$$46])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$48, $$46] <- [$$C.getField(1), $$C.getField(2)] project: [$$48, $$46]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query5.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query5.plan
index b8831e0..49bcc0a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query5.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query5.plan
@@ -16,16 +16,20 @@
                                 -- AGGREGATE  |LOCAL|
                                   unnest $$D <- scan-collection($$49)
                                   -- UNNEST  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$49])
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- SUBPLAN  |LOCAL|
-                        assign [$$49] <- [$$CT.getField(0)]
+                        assign [$$49] <- [$$CT.getField(0)] project: [$$49]
                         -- ASSIGN  |LOCAL|
-                          unnest $$CT <- scan-collection($$48)
+                          unnest $$CT <- scan-collection($$48) project: [$$CT]
                           -- UNNEST  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                            project ([$$48])
+                            -- STREAM_PROJECT  |LOCAL|
+                              nested tuple source
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$50, $$48] <- [$$C.getField(1), $$C.getField(2)] project: [$$50, $$48]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query6.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query6.plan
index e3a147f..ad65aba 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query6.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query6.plan
@@ -18,18 +18,22 @@
                                   -- AGGREGATE  |LOCAL|
                                     select (not(if-missing-or-null(gt($$D, "2019-06-07"), false)))
                                     -- STREAM_SELECT  |LOCAL|
-                                      unnest $$D <- scan-collection($$49)
+                                      unnest $$D <- scan-collection($$49) project: [$$D]
                                       -- UNNEST  |LOCAL|
-                                        nested tuple source
-                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                        project ([$$49])
+                                        -- STREAM_PROJECT  |LOCAL|
+                                          nested tuple source
+                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                                }
                         -- SUBPLAN  |LOCAL|
-                          assign [$$49] <- [$$CT.getField(0)]
+                          assign [$$49] <- [$$CT.getField(0)] project: [$$49]
                           -- ASSIGN  |LOCAL|
-                            unnest $$CT <- scan-collection($$48)
+                            unnest $$CT <- scan-collection($$48) project: [$$CT]
                             -- UNNEST  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$48])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             assign [$$51, $$48] <- [$$C.getField(1), $$C.getField(2)] project: [$$51, $$48]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query7.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query7.plan
index cebca6e..d3445b7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query7.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/use-case-4/query7.plan
@@ -18,18 +18,22 @@
                                   -- AGGREGATE  |LOCAL|
                                     select (not(if-missing-or-null(gt($$D, "2019-06-07"), false)))
                                     -- STREAM_SELECT  |LOCAL|
-                                      unnest $$D <- scan-collection($$57)
+                                      unnest $$D <- scan-collection($$57) project: [$$D]
                                       -- UNNEST  |LOCAL|
-                                        nested tuple source
-                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                        project ([$$57])
+                                        -- STREAM_PROJECT  |LOCAL|
+                                          nested tuple source
+                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                                }
                         -- SUBPLAN  |LOCAL|
-                          assign [$$58, $$57] <- [$$CT.getField("num"), $$CT.getField(0)]
+                          assign [$$58, $$57] <- [$$CT.getField("num"), $$CT.getField(0)] project: [$$58, $$57]
                           -- ASSIGN  |LOCAL|
-                            unnest $$CT <- scan-collection($$55)
+                            unnest $$CT <- scan-collection($$55) project: [$$CT]
                             -- UNNEST  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$55])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             select (lt(0, len($$55)))
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_ps.plan
index 49a942e..803308d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_ps.plan
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$45)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$45, $$46])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$70]  |PARTITIONED|
                       exchange
@@ -120,8 +122,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$45)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$45, $$46])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$70]  |PARTITIONED|
                                 exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02.plan
index 6e61876..edb048a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02.plan
@@ -11,8 +11,10 @@
                   -- AGGREGATE  |LOCAL|
                     select (not(is-missing($$49)))
                     -- STREAM_SELECT  |LOCAL|
-                      nested tuple source
-                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                      project ([$$49, $$51])
+                      -- STREAM_PROJECT  |LOCAL|
+                        nested tuple source
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$48]  |PARTITIONED|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_ps.plan
index cb4a6c9..f6b4f0d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_ps.plan
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$49)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$49, $$51])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$48]  |PARTITIONED|
                       exchange
@@ -90,8 +92,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$49)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$49, $$51])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$48]  |PARTITIONED|
                                 exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-01.plan
index 68dcc74..f243c19 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-01.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-01.plan
@@ -41,8 +41,10 @@
                                                 -- AGGREGATE  |LOCAL|
                                                   select (not(is-missing($$148)))
                                                   -- STREAM_SELECT  |LOCAL|
-                                                    nested tuple source
-                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                    project ([$$148])
+                                                    -- STREAM_PROJECT  |LOCAL|
+                                                      nested tuple source
+                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                                              }
                                       -- PRE_CLUSTERED_GROUP_BY[$$130]  |PARTITIONED|
                                         exchange
@@ -134,8 +136,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$150)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$150])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$133]  |PARTITIONED|
                                 exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-02.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-02.plan
index 05f1a9e..4c27807 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-02.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-02.plan
@@ -41,8 +41,10 @@
                                                 -- AGGREGATE  |LOCAL|
                                                   select (not(is-missing($$148)))
                                                   -- STREAM_SELECT  |LOCAL|
-                                                    nested tuple source
-                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                    project ([$$148])
+                                                    -- STREAM_PROJECT  |LOCAL|
+                                                      nested tuple source
+                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                                              }
                                       -- PRE_CLUSTERED_GROUP_BY[$$130]  |PARTITIONED|
                                         exchange
@@ -134,8 +136,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$150)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$150])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$133]  |PARTITIONED|
                                 exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-03.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-03.plan
index 45cb450..007150d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-03.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-03.plan
@@ -41,8 +41,10 @@
                                                 -- AGGREGATE  |LOCAL|
                                                   select (not(is-missing($$148)))
                                                   -- STREAM_SELECT  |LOCAL|
-                                                    nested tuple source
-                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                    project ([$$148])
+                                                    -- STREAM_PROJECT  |LOCAL|
+                                                      nested tuple source
+                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                                              }
                                       -- PRE_CLUSTERED_GROUP_BY[$$130]  |PARTITIONED|
                                         exchange
@@ -130,8 +132,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$150)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$150])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$133]  |PARTITIONED|
                                 exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-04.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-04.plan
index a2a803d..9fc45a0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-04.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-04.plan
@@ -41,8 +41,10 @@
                                                 -- AGGREGATE  |LOCAL|
                                                   select (not(is-missing($$148)))
                                                   -- STREAM_SELECT  |LOCAL|
-                                                    nested tuple source
-                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                    project ([$$148])
+                                                    -- STREAM_PROJECT  |LOCAL|
+                                                      nested tuple source
+                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                                              }
                                       -- PRE_CLUSTERED_GROUP_BY[$$130]  |PARTITIONED|
                                         exchange
@@ -126,8 +128,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$150)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$150])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$133]  |PARTITIONED|
                                 exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/ch2/ch2_q16.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/ch2/ch2_q16.plan
index 9899664..cf8178d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/ch2/ch2_q16.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/ch2/ch2_q16.plan
@@ -17,10 +17,12 @@
                         -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                           order (ASC, $$150)
                           -- MICRO_STABLE_SORT [$$150(ASC)]  |LOCAL|
-                            assign [$$150] <- [numeric-mod(numeric-multiply($$143, $$144), 10000)]
+                            assign [$$150] <- [numeric-mod(numeric-multiply($$143, $$144), 10000)] project: [$$150]
                             -- ASSIGN  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$143, $$144])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                    }
             -- PRE_CLUSTERED_GROUP_BY[$$129, $$130, $$131]  |PARTITIONED|
               exchange
@@ -42,8 +44,10 @@
                                       -- AGGREGATE  |LOCAL|
                                         select (not(is-missing($$145)))
                                         -- STREAM_SELECT  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$145])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                             -- PRE_CLUSTERED_GROUP_BY[$$133, $$134]  |PARTITIONED|
                               exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/ch2/ch2_q20.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/ch2/ch2_q20.plan
index 3eba9df..9da618d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/ch2/ch2_q20.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/ch2/ch2_q20.plan
@@ -29,8 +29,10 @@
                                     -- AGGREGATE  |LOCAL|
                                       select (not(is-missing($$197)))
                                       -- STREAM_SELECT  |LOCAL|
-                                        nested tuple source
-                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                        project ([$$197])
+                                        -- STREAM_PROJECT  |LOCAL|
+                                          nested tuple source
+                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                                  }
                           -- PRE_CLUSTERED_GROUP_BY[$$177]  |PARTITIONED|
                             exchange
@@ -102,8 +104,10 @@
                                                                                 -- AGGREGATE  |LOCAL|
                                                                                   select (not(is-missing($$195)))
                                                                                   -- STREAM_SELECT  |LOCAL|
-                                                                                    nested tuple source
-                                                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                    project ([$$195])
+                                                                                    -- STREAM_PROJECT  |LOCAL|
+                                                                                      nested tuple source
+                                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                              }
                                                                       -- PRE_CLUSTERED_GROUP_BY[$$179]  |PARTITIONED|
                                                                         exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/ch2/ch2_q22.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/ch2/ch2_q22.plan
index c340af1..3fa0f66 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/ch2/ch2_q22.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/ch2/ch2_q22.plan
@@ -46,8 +46,10 @@
                                       -- AGGREGATE  |LOCAL|
                                         select (not(is-missing($$167)))
                                         -- STREAM_SELECT  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$167])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                             -- PRE_CLUSTERED_GROUP_BY[$$166]  |PARTITIONED|
                               exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/ch2/ch2_q4.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/ch2/ch2_q4.plan
index 352f6c4..53c773f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/ch2/ch2_q4.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/ch2/ch2_q4.plan
@@ -33,12 +33,14 @@
                               -- AGGREGATE  |LOCAL|
                                 select (ge($$79, string(numeric-add(date($$80), duration: {P7D }))))
                                 -- STREAM_SELECT  |LOCAL|
-                                  assign [$$79] <- [$$ol.getField("ol_delivery_d")]
+                                  assign [$$79] <- [$$ol.getField("ol_delivery_d")] project: [$$80, $$79]
                                   -- ASSIGN  |LOCAL|
-                                    unnest $$ol <- scan-collection($$78)
+                                    unnest $$ol <- scan-collection($$78) project: [$$80, $$ol]
                                     -- UNNEST  |LOCAL|
-                                      nested tuple source
-                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      project ([$$80, $$78])
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- SUBPLAN  |PARTITIONED|
                       select (and(lt($$80, "2015-10-01 00:00:00.000000"), ge($$80, "2015-07-01 00:00:00.000000")))
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/common-expr-01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/common-expr-01.plan
index 9ea6aaf..3948bcd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/common-expr-01.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/common-expr-01.plan
@@ -45,8 +45,10 @@
                                           -- AGGREGATE  |LOCAL|
                                             select (not(is-missing($$190)))
                                             -- STREAM_SELECT  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              project ([$$190])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                        }
                                 -- PRE_CLUSTERED_GROUP_BY[$$181]  |PARTITIONED|
                                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/group-by/sugar-06-distinct.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/group-by/sugar-06-distinct.plan
index 23c3e27..1fc740a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/group-by/sugar-06-distinct.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/group-by/sugar-06-distinct.plan
@@ -23,8 +23,10 @@
                               -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                                 order (ASC, $$53)
                                 -- MICRO_STABLE_SORT [$$53(ASC)]  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$53])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                          }
                   -- PRE_CLUSTERED_GROUP_BY[$$57]  |PARTITIONED|
                     exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/issue741.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/issue741.plan
index 36a6df9..1ce0780 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/issue741.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/issue741.plan
@@ -11,8 +11,10 @@
                   -- AGGREGATE  |LOCAL|
                     select (not(is-missing($$61)))
                     -- STREAM_SELECT  |LOCAL|
-                      nested tuple source
-                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                      project ([$$61])
+                      -- STREAM_PROJECT  |LOCAL|
+                        nested tuple source
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$60]  |PARTITIONED|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.plan
index 5952503..22906db 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.plan
@@ -11,8 +11,10 @@
                   -- AGGREGATE  |LOCAL|
                     select (not(is-missing($$63)))
                     -- STREAM_SELECT  |LOCAL|
-                      nested tuple source
-                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                      project ([$$63, $$65])
+                      -- STREAM_PROJECT  |LOCAL|
+                        nested tuple source
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$62]  |PARTITIONED|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01_ps.plan
index 045a498..de65ee7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01_ps.plan
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$63)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$63, $$65])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$62]  |PARTITIONED|
                       exchange
@@ -170,8 +172,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$63)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$63, $$65])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$62]  |PARTITIONED|
                                 exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01.plan
index 825a5f8..628ef5b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01.plan
@@ -11,8 +11,10 @@
                   -- AGGREGATE  |LOCAL|
                     select (not(is-missing($$63)))
                     -- STREAM_SELECT  |LOCAL|
-                      nested tuple source
-                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                      project ([$$63, $$65])
+                      -- STREAM_PROJECT  |LOCAL|
+                        nested tuple source
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$62]  |PARTITIONED|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01_ps.plan
index 980f630..4392ad6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01_ps.plan
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$63)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$63, $$65])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$62]  |PARTITIONED|
                       exchange
@@ -116,8 +118,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$63)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$63, $$65])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$62]  |PARTITIONED|
                                 exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/joins/inner_right_corr.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/joins/inner_right_corr.plan
index db55da3..2057829 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/joins/inner_right_corr.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/joins/inner_right_corr.plan
@@ -15,8 +15,10 @@
                       -- AGGREGATE  |LOCAL|
                         select (not(is-missing($$93)))
                         -- STREAM_SELECT  |LOCAL|
-                          nested tuple source
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          project ([$$93])
+                          -- STREAM_PROJECT  |LOCAL|
+                            nested tuple source
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- PRE_CLUSTERED_GROUP_BY[$$76]  |PARTITIONED|
             exchange
@@ -58,10 +60,12 @@
                                             -- STREAM_SELECT  |LOCAL|
                                               assign [$$88] <- [$$85.getField("b")]
                                               -- ASSIGN  |LOCAL|
-                                                unnest $$85 <- scan-collection($$90)
+                                                unnest $$85 <- scan-collection($$90) project: [$$87, $$85]
                                                 -- UNNEST  |LOCAL|
-                                                  nested tuple source
-                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                  project ([$$90, $$87])
+                                                  -- STREAM_PROJECT  |LOCAL|
+                                                    nested tuple source
+                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                                        }
                                 -- SUBPLAN  |PARTITIONED|
                                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/joins/nested_query_with_bcast.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/joins/nested_query_with_bcast.plan
index 896daea..ab51db7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/joins/nested_query_with_bcast.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/joins/nested_query_with_bcast.plan
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$44)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$33, $$44])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$40]  |PARTITIONED|
                       exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/loj-super-key_01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/loj-super-key_01.plan
index 5446096..86afbf7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/loj-super-key_01.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/loj-super-key_01.plan
@@ -13,8 +13,10 @@
                     -- AGGREGATE  |LOCAL|
                       select (not(is-missing($$59)))
                       -- STREAM_SELECT  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$ps, $$59])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- PRE_CLUSTERED_GROUP_BY[$$49, $$50]  |PARTITIONED|
             exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/loj-super-key_02.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/loj-super-key_02.plan
index 13d0338..b279aaa 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/loj-super-key_02.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/loj-super-key_02.plan
@@ -13,8 +13,10 @@
                     -- AGGREGATE  |LOCAL|
                       select (not(is-missing($$59)))
                       -- STREAM_SELECT  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$li, $$59])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- PRE_CLUSTERED_GROUP_BY[$$49, $$50]  |PARTITIONED|
             exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/micro_external_sort/micro_external_sort.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/micro_external_sort/micro_external_sort.plan
index cf93f82..c1f5aef 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/micro_external_sort/micro_external_sort.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/micro_external_sort/micro_external_sort.plan
@@ -22,10 +22,12 @@
                       -- MICRO_PRE_CLUSTERED_GROUP_BY[$$164]  |LOCAL|
                         order (ASC, $$164)
                         -- MICRO_STABLE_SORT [$$164(ASC)]  |LOCAL|
-                          assign [$$157] <- [$$143.getField(3)]
+                          assign [$$157] <- [$$143.getField(3)] project: [$$164, $$157]
                           -- ASSIGN  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                            project ([$$164, $$143])
+                            -- STREAM_PROJECT  |LOCAL|
+                              nested tuple source
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$163]  |LOCAL|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_ps.plan
index 6312b51..32776e4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_ps.plan
@@ -25,8 +25,10 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (not(is-missing($$55)))
                                   -- STREAM_SELECT  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$55, $$61, $$59])
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- PRE_CLUSTERED_GROUP_BY[$$54]  |PARTITIONED|
                         exchange
@@ -96,8 +98,10 @@
                                           -- AGGREGATE  |LOCAL|
                                             select (not(is-missing($$55)))
                                             -- STREAM_SELECT  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              project ([$$55, $$61, $$59])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                        }
                                 -- PRE_CLUSTERED_GROUP_BY[$$54]  |PARTITIONED|
                                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_ps.plan
index 3e0aecd..0bc6a8d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_ps.plan
@@ -25,8 +25,10 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (not(is-missing($$61)))
                                   -- STREAM_SELECT  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$61, $$68, $$66])
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- PRE_CLUSTERED_GROUP_BY[$$60]  |PARTITIONED|
                         exchange
@@ -96,8 +98,10 @@
                                           -- AGGREGATE  |LOCAL|
                                             select (not(is-missing($$61)))
                                             -- STREAM_SELECT  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              project ([$$61, $$68, $$66])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                        }
                                 -- PRE_CLUSTERED_GROUP_BY[$$60]  |PARTITIONED|
                                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01_ps.plan
index 50b646a..85921bf 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01_ps.plan
@@ -25,8 +25,10 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (not(is-missing($$75)))
                                   -- STREAM_SELECT  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$79, $$82, $$75])
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- PRE_CLUSTERED_GROUP_BY[$$74]  |PARTITIONED|
                         exchange
@@ -186,8 +188,10 @@
                                           -- AGGREGATE  |LOCAL|
                                             select (not(is-missing($$75)))
                                             -- STREAM_SELECT  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              project ([$$79, $$82, $$75])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                        }
                                 -- PRE_CLUSTERED_GROUP_BY[$$74]  |PARTITIONED|
                                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01_ps.plan
index d57acf2..ad9d7e8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01_ps.plan
@@ -25,8 +25,10 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (not(is-missing($$75)))
                                   -- STREAM_SELECT  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$79, $$82, $$75])
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- PRE_CLUSTERED_GROUP_BY[$$74]  |PARTITIONED|
                         exchange
@@ -124,8 +126,10 @@
                                           -- AGGREGATE  |LOCAL|
                                             select (not(is-missing($$75)))
                                             -- STREAM_SELECT  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              project ([$$79, $$82, $$75])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                        }
                                 -- PRE_CLUSTERED_GROUP_BY[$$74]  |PARTITIONED|
                                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01_ps.plan
index 19ab548..732c1f6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01_ps.plan
@@ -25,8 +25,10 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (not(is-missing($$65)))
                                   -- STREAM_SELECT  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$71, $$67, $$65])
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- PRE_CLUSTERED_GROUP_BY[$$64]  |PARTITIONED|
                         exchange
@@ -100,8 +102,10 @@
                                           -- AGGREGATE  |LOCAL|
                                             select (not(is-missing($$65)))
                                             -- STREAM_SELECT  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              project ([$$71, $$67, $$65])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                        }
                                 -- PRE_CLUSTERED_GROUP_BY[$$64]  |PARTITIONED|
                                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02_ps.plan
index b2eb0ab..c675be2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02_ps.plan
@@ -25,8 +25,10 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (not(is-missing($$72)))
                                   -- STREAM_SELECT  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$76, $$74, $$72])
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- PRE_CLUSTERED_GROUP_BY[$$71]  |PARTITIONED|
                         exchange
@@ -100,8 +102,10 @@
                                           -- AGGREGATE  |LOCAL|
                                             select (not(is-missing($$72)))
                                             -- STREAM_SELECT  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              project ([$$76, $$74, $$72])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                        }
                                 -- PRE_CLUSTERED_GROUP_BY[$$71]  |PARTITIONED|
                                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1_ps.plan
index 77b58c2..5b7e383 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1_ps.plan
@@ -25,8 +25,10 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (not(is-missing($$55)))
                                   -- STREAM_SELECT  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$55, $$61, $$59])
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- PRE_CLUSTERED_GROUP_BY[$$54]  |PARTITIONED|
                         exchange
@@ -96,8 +98,10 @@
                                           -- AGGREGATE  |LOCAL|
                                             select (not(is-missing($$55)))
                                             -- STREAM_SELECT  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              project ([$$55, $$61, $$59])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                        }
                                 -- PRE_CLUSTERED_GROUP_BY[$$54]  |PARTITIONED|
                                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2_ps.plan
index a9fa16e..dff5585 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2_ps.plan
@@ -25,8 +25,10 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (not(is-missing($$55)))
                                   -- STREAM_SELECT  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$55, $$61, $$59])
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- PRE_CLUSTERED_GROUP_BY[$$54]  |PARTITIONED|
                         exchange
@@ -96,8 +98,10 @@
                                           -- AGGREGATE  |LOCAL|
                                             select (not(is-missing($$55)))
                                             -- STREAM_SELECT  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              project ([$$55, $$61, $$59])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                        }
                                 -- PRE_CLUSTERED_GROUP_BY[$$54]  |PARTITIONED|
                                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1_ps.plan
index 2965279..c7348ea 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1_ps.plan
@@ -25,8 +25,10 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (not(is-missing($$61)))
                                   -- STREAM_SELECT  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$61, $$68, $$66])
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- PRE_CLUSTERED_GROUP_BY[$$60]  |PARTITIONED|
                         exchange
@@ -96,8 +98,10 @@
                                           -- AGGREGATE  |LOCAL|
                                             select (not(is-missing($$61)))
                                             -- STREAM_SELECT  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              project ([$$61, $$68, $$66])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                        }
                                 -- PRE_CLUSTERED_GROUP_BY[$$60]  |PARTITIONED|
                                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2_ps.plan
index 4abfab0..5f5035d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2_ps.plan
@@ -25,8 +25,10 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (not(is-missing($$61)))
                                   -- STREAM_SELECT  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$61, $$68, $$66])
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- PRE_CLUSTERED_GROUP_BY[$$60]  |PARTITIONED|
                         exchange
@@ -96,8 +98,10 @@
                                           -- AGGREGATE  |LOCAL|
                                             select (not(is-missing($$61)))
                                             -- STREAM_SELECT  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              project ([$$61, $$68, $$66])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                        }
                                 -- PRE_CLUSTERED_GROUP_BY[$$60]  |PARTITIONED|
                                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01_ps.plan
index 16819c3..59fd32a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01_ps.plan
@@ -25,8 +25,10 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (not(is-missing($$75)))
                                   -- STREAM_SELECT  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$79, $$82, $$75])
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- PRE_CLUSTERED_GROUP_BY[$$74]  |PARTITIONED|
                         exchange
@@ -186,8 +188,10 @@
                                           -- AGGREGATE  |LOCAL|
                                             select (not(is-missing($$75)))
                                             -- STREAM_SELECT  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              project ([$$79, $$82, $$75])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                        }
                                 -- PRE_CLUSTERED_GROUP_BY[$$74]  |PARTITIONED|
                                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01_ps.plan
index 6f10b5d..67d3b48 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01_ps.plan
@@ -25,8 +25,10 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (not(is-missing($$65)))
                                   -- STREAM_SELECT  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$71, $$67, $$65])
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- PRE_CLUSTERED_GROUP_BY[$$64]  |PARTITIONED|
                         exchange
@@ -100,8 +102,10 @@
                                           -- AGGREGATE  |LOCAL|
                                             select (not(is-missing($$65)))
                                             -- STREAM_SELECT  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              project ([$$71, $$67, $$65])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                        }
                                 -- PRE_CLUSTERED_GROUP_BY[$$64]  |PARTITIONED|
                                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02_ps.plan
index c0220b5..e3d15ba 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02_ps.plan
@@ -25,8 +25,10 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (not(is-missing($$72)))
                                   -- STREAM_SELECT  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$76, $$74, $$72])
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- PRE_CLUSTERED_GROUP_BY[$$71]  |PARTITIONED|
                         exchange
@@ -100,8 +102,10 @@
                                           -- AGGREGATE  |LOCAL|
                                             select (not(is-missing($$72)))
                                             -- STREAM_SELECT  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              project ([$$76, $$74, $$72])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                        }
                                 -- PRE_CLUSTERED_GROUP_BY[$$71]  |PARTITIONED|
                                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested_loj2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested_loj2.plan
index bebe54d..699b501 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested_loj2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested_loj2.plan
@@ -16,8 +16,10 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (not(is-missing($$79)))
                                   -- STREAM_SELECT  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$l, $$79])
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- MICRO_PRE_CLUSTERED_GROUP_BY[$$72]  |LOCAL|
                         select (not(is-missing($$81)))
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1_ps.plan
index 2889a3f..2624bca 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1_ps.plan
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$45)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$45, $$46])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$44]  |PARTITIONED|
                       exchange
@@ -90,8 +92,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$45)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$45, $$46])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$44]  |PARTITIONED|
                                 exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2_ps.plan
index e3b654f..aa8f645 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2_ps.plan
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$45)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$45, $$46])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$44]  |PARTITIONED|
                       exchange
@@ -90,8 +92,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$45)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$45, $$46])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$44]  |PARTITIONED|
                                 exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1_ps.plan
index 5ce84a7..af1f87b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1_ps.plan
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$49)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$49, $$51])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$48]  |PARTITIONED|
                       exchange
@@ -90,8 +92,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$49)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$49, $$51])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$48]  |PARTITIONED|
                                 exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2_ps.plan
index e8e8bf4..40f0c80 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2_ps.plan
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$49)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$49, $$51])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$48]  |PARTITIONED|
                       exchange
@@ -90,8 +92,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$49)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$49, $$51])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$48]  |PARTITIONED|
                                 exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01_ps.plan
index 52654f2..1504f20 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01_ps.plan
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$63)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$63, $$65])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$62]  |PARTITIONED|
                       exchange
@@ -170,8 +172,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$63)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$63, $$65])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$62]  |PARTITIONED|
                                 exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01_ps.plan
index 0a28910..fddb751 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01_ps.plan
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$58)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$58, $$59])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$57]  |PARTITIONED|
                       exchange
@@ -94,8 +96,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$58)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$58, $$59])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$57]  |PARTITIONED|
                                 exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02_ps.plan
index 6c9a0c3..6811625 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-enforced/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02_ps.plan
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$62)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$62, $$64])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$61]  |PARTITIONED|
                       exchange
@@ -94,8 +96,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$62)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$62, $$64])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$61]  |PARTITIONED|
                                 exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/push-project-through-group.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/push-project-through-group.plan
index c9b45e9..4ba34eb 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/push-project-through-group.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/push-project-through-group.plan
@@ -11,8 +11,10 @@
                   -- AGGREGATE  |LOCAL|
                     select (not(is-missing($$50)))
                     -- STREAM_SELECT  |LOCAL|
-                      nested tuple source
-                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                      project ([$$40, $$50])
+                      -- STREAM_PROJECT  |LOCAL|
+                        nested tuple source
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$45]  |PARTITIONED|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/quantifiers/query-ASTERIXDB-2696.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/quantifiers/query-ASTERIXDB-2696.plan
index 1cba9ea..705c8c4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/quantifiers/query-ASTERIXDB-2696.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/quantifiers/query-ASTERIXDB-2696.plan
@@ -16,14 +16,18 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (ge($$x, 50))
                                   -- STREAM_SELECT  |LOCAL|
-                                    unnest $$x <- scan-collection($$78)
+                                    unnest $$x <- scan-collection($$78) project: [$$x]
                                     -- UNNEST  |LOCAL|
-                                      nested tuple source
-                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      project ([$$78])
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- SUBPLAN  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$78])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$75]  |LOCAL|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-2408.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-2408.plan
index f56c182..a97c504 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-2408.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-2408.plan
@@ -21,8 +21,10 @@
                             -- AGGREGATE  |LOCAL|
                               select (not(is-missing($$52)))
                               -- STREAM_SELECT  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$47, $$52])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                          }
                   -- PRE_CLUSTERED_GROUP_BY[$$46]  |PARTITIONED|
                     exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-2408_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-2408_ps.plan
index c7267f0..880ea76 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-2408_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-2408_ps.plan
@@ -29,8 +29,10 @@
                                     -- AGGREGATE  |LOCAL|
                                       select (not(is-missing($$52)))
                                       -- STREAM_SELECT  |LOCAL|
-                                        nested tuple source
-                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                        project ([$$47, $$52])
+                                        -- STREAM_PROJECT  |LOCAL|
+                                          nested tuple source
+                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                                  }
                           -- PRE_CLUSTERED_GROUP_BY[$$46]  |PARTITIONED|
                             exchange
@@ -94,8 +96,10 @@
                                               -- AGGREGATE  |LOCAL|
                                                 select (not(is-missing($$52)))
                                                 -- STREAM_SELECT  |LOCAL|
-                                                  nested tuple source
-                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                  project ([$$47, $$52])
+                                                  -- STREAM_PROJECT  |LOCAL|
+                                                    nested tuple source
+                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                                            }
                                     -- PRE_CLUSTERED_GROUP_BY[$$46]  |PARTITIONED|
                                       exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-2.plan
index bab4b0d..af2d3dc 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-2.plan
@@ -30,16 +30,20 @@
                           -- AGGREGATE  |LOCAL|
                             select (gt($$124, 0.05))
                             -- STREAM_SELECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$l, $$124])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                        {
                           aggregate [$$127] <- [agg-count($$l)]
                           -- AGGREGATE  |LOCAL|
                             select (le($$124, 0.05))
                             -- STREAM_SELECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$l, $$124])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- PRE_CLUSTERED_GROUP_BY[$$114, $$115]  |PARTITIONED|
                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-2_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-2_ps.plan
index 24eb512..072fdfd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-2_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-2_ps.plan
@@ -42,16 +42,20 @@
                                       -- AGGREGATE  |LOCAL|
                                         select (gt($$124, 0.05))
                                         -- STREAM_SELECT  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$l, $$124])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                                    {
                                       aggregate [$$127] <- [agg-count($$l)]
                                       -- AGGREGATE  |LOCAL|
                                         select (le($$124, 0.05))
                                         -- STREAM_SELECT  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$l, $$124])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                             -- PRE_CLUSTERED_GROUP_BY[$$114, $$115]  |PARTITIONED|
                               exchange
@@ -112,16 +116,20 @@
                                                 -- AGGREGATE  |LOCAL|
                                                   select (gt($$124, 0.05))
                                                   -- STREAM_SELECT  |LOCAL|
-                                                    nested tuple source
-                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                    project ([$$l, $$124])
+                                                    -- STREAM_PROJECT  |LOCAL|
+                                                      nested tuple source
+                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                                              }
                                              {
                                                 aggregate [$$127] <- [agg-count($$l)]
                                                 -- AGGREGATE  |LOCAL|
                                                   select (le($$124, 0.05))
                                                   -- STREAM_SELECT  |LOCAL|
-                                                    nested tuple source
-                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                    project ([$$l, $$124])
+                                                    -- STREAM_PROJECT  |LOCAL|
+                                                      nested tuple source
+                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                                              }
                                       -- PRE_CLUSTERED_GROUP_BY[$$114, $$115]  |PARTITIONED|
                                         exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-3.plan
index b98f872..db7858c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-3.plan
@@ -30,16 +30,20 @@
                           -- AGGREGATE  |LOCAL|
                             select (gt($$135, 0.05))
                             -- STREAM_SELECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$l, $$135])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                        {
                           aggregate [$$138] <- [agg-count($$l)]
                           -- AGGREGATE  |LOCAL|
                             select (le($$135, 0.05))
                             -- STREAM_SELECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$l, $$135])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- PRE_CLUSTERED_GROUP_BY[$$126, $$127]  |PARTITIONED|
                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-3_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-3_ps.plan
index 4d3af5c..886d0a2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-3_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-3_ps.plan
@@ -42,16 +42,20 @@
                                       -- AGGREGATE  |LOCAL|
                                         select (gt($$135, 0.05))
                                         -- STREAM_SELECT  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$l, $$135])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                                    {
                                       aggregate [$$138] <- [agg-count($$l)]
                                       -- AGGREGATE  |LOCAL|
                                         select (le($$135, 0.05))
                                         -- STREAM_SELECT  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$l, $$135])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                             -- PRE_CLUSTERED_GROUP_BY[$$126, $$127]  |PARTITIONED|
                               exchange
@@ -112,16 +116,20 @@
                                                 -- AGGREGATE  |LOCAL|
                                                   select (gt($$135, 0.05))
                                                   -- STREAM_SELECT  |LOCAL|
-                                                    nested tuple source
-                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                    project ([$$l, $$135])
+                                                    -- STREAM_PROJECT  |LOCAL|
+                                                      nested tuple source
+                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                                              }
                                              {
                                                 aggregate [$$138] <- [agg-count($$l)]
                                                 -- AGGREGATE  |LOCAL|
                                                   select (le($$135, 0.05))
                                                   -- STREAM_SELECT  |LOCAL|
-                                                    nested tuple source
-                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                    project ([$$l, $$135])
+                                                    -- STREAM_PROJECT  |LOCAL|
+                                                      nested tuple source
+                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                                              }
                                       -- PRE_CLUSTERED_GROUP_BY[$$126, $$127]  |PARTITIONED|
                                         exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810.plan
index b925f4a..07dbf5a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810.plan
@@ -30,16 +30,20 @@
                           -- AGGREGATE  |LOCAL|
                             select (gt($$146, 0.05))
                             -- STREAM_SELECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$l, $$146])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                        {
                           aggregate [$$149] <- [agg-count($$l)]
                           -- AGGREGATE  |LOCAL|
                             select (le($$146, 0.05))
                             -- STREAM_SELECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$l, $$146])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- PRE_CLUSTERED_GROUP_BY[$$138, $$139]  |PARTITIONED|
                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810_ps.plan
index 510903c..c3ed25f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810_ps.plan
@@ -42,16 +42,20 @@
                                       -- AGGREGATE  |LOCAL|
                                         select (gt($$146, 0.05))
                                         -- STREAM_SELECT  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$l, $$146])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                                    {
                                       aggregate [$$149] <- [agg-count($$l)]
                                       -- AGGREGATE  |LOCAL|
                                         select (le($$146, 0.05))
                                         -- STREAM_SELECT  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$l, $$146])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                             -- PRE_CLUSTERED_GROUP_BY[$$138, $$139]  |PARTITIONED|
                               exchange
@@ -112,16 +116,20 @@
                                                 -- AGGREGATE  |LOCAL|
                                                   select (gt($$146, 0.05))
                                                   -- STREAM_SELECT  |LOCAL|
-                                                    nested tuple source
-                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                    project ([$$l, $$146])
+                                                    -- STREAM_PROJECT  |LOCAL|
+                                                      nested tuple source
+                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                                              }
                                              {
                                                 aggregate [$$149] <- [agg-count($$l)]
                                                 -- AGGREGATE  |LOCAL|
                                                   select (le($$146, 0.05))
                                                   -- STREAM_SELECT  |LOCAL|
-                                                    nested tuple source
-                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                    project ([$$l, $$146])
+                                                    -- STREAM_PROJECT  |LOCAL|
+                                                      nested tuple source
+                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                                              }
                                       -- PRE_CLUSTERED_GROUP_BY[$$138, $$139]  |PARTITIONED|
                                         exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue562_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue562_ps.plan
index 4f32889..4840561 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue562_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue562_ps.plan
@@ -58,8 +58,10 @@
                                                   -- AGGREGATE  |LOCAL|
                                                     select (not(is-missing($$170)))
                                                     -- STREAM_SELECT  |LOCAL|
-                                                      nested tuple source
-                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                      project ([$$o, $$170])
+                                                      -- STREAM_PROJECT  |LOCAL|
+                                                        nested tuple source
+                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                }
                                         -- PRE_CLUSTERED_GROUP_BY[$$169]  |PARTITIONED|
                                           exchange
@@ -174,8 +176,10 @@
                                                             -- AGGREGATE  |LOCAL|
                                                               select (not(is-missing($$170)))
                                                               -- STREAM_SELECT  |LOCAL|
-                                                                nested tuple source
-                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                project ([$$o, $$170])
+                                                                -- STREAM_PROJECT  |LOCAL|
+                                                                  nested tuple source
+                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                          }
                                                   -- PRE_CLUSTERED_GROUP_BY[$$169]  |PARTITIONED|
                                                     exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query_issue3316.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query_issue3316.plan
index b869d74..acd74b2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query_issue3316.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query_issue3316.plan
@@ -21,8 +21,10 @@
                             -- AGGREGATE  |LOCAL|
                               select (not(is-missing($$317)))
                               -- STREAM_SELECT  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$190, $$317])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                          }
                   -- PRE_CLUSTERED_GROUP_BY[$$227]  |PARTITIONED|
                     exchange
@@ -40,8 +42,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$226)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$155, $$226])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$193]  |PARTITIONED|
                                 exchange
@@ -91,8 +95,10 @@
                                                                         -- AGGREGATE  |LOCAL|
                                                                           select (not(is-missing($$239)))
                                                                           -- STREAM_SELECT  |LOCAL|
-                                                                            nested tuple source
-                                                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                            project ([$$239])
+                                                                            -- STREAM_PROJECT  |LOCAL|
+                                                                              nested tuple source
+                                                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                      }
                                                               -- PRE_CLUSTERED_GROUP_BY[$$225, $$194]  |PARTITIONED|
                                                                 exchange
@@ -180,8 +186,10 @@
                                                                                                   -- AGGREGATE  |LOCAL|
                                                                                                     select (not(is-missing($$253)))
                                                                                                     -- STREAM_SELECT  |LOCAL|
-                                                                                                      nested tuple source
-                                                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                      project ([$$145, $$253])
+                                                                                                      -- STREAM_PROJECT  |LOCAL|
+                                                                                                        nested tuple source
+                                                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                              }
                                                                                       -- PRE_CLUSTERED_GROUP_BY[$$238, $$235]  |PARTITIONED|
                                                                                         exchange
@@ -425,8 +433,10 @@
                                                                 -- AGGREGATE  |LOCAL|
                                                                   select (not(is-missing($$387)))
                                                                   -- STREAM_SELECT  |LOCAL|
-                                                                    nested tuple source
-                                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                    project ([$$387])
+                                                                    -- STREAM_PROJECT  |LOCAL|
+                                                                      nested tuple source
+                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                              }
                                                       -- PRE_CLUSTERED_GROUP_BY[$$256, $$196]  |PARTITIONED|
                                                         exchange
@@ -456,8 +466,10 @@
                                                                                         -- AGGREGATE  |LOCAL|
                                                                                           select (not(is-missing($$262)))
                                                                                           -- STREAM_SELECT  |LOCAL|
-                                                                                            nested tuple source
-                                                                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                            project ([$$262])
+                                                                                            -- STREAM_PROJECT  |LOCAL|
+                                                                                              nested tuple source
+                                                                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                      }
                                                                               -- PRE_CLUSTERED_GROUP_BY[$$257]  |PARTITIONED|
                                                                                 exchange
@@ -519,8 +531,10 @@
                                                                                                                         -- AGGREGATE  |LOCAL|
                                                                                                                           select (not(is-missing($$280)))
                                                                                                                           -- STREAM_SELECT  |LOCAL|
-                                                                                                                            nested tuple source
-                                                                                                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                            project ([$$280])
+                                                                                                                            -- STREAM_PROJECT  |LOCAL|
+                                                                                                                              nested tuple source
+                                                                                                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                                      }
                                                                                                               -- PRE_CLUSTERED_GROUP_BY[$$268, $$270]  |PARTITIONED|
                                                                                                                 exchange
@@ -610,8 +624,10 @@
                                                                                                                                                   -- AGGREGATE  |LOCAL|
                                                                                                                                                     select (not(is-missing($$296)))
                                                                                                                                                     -- STREAM_SELECT  |LOCAL|
-                                                                                                                                                      nested tuple source
-                                                                                                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                                                      project ([$$297, $$296])
+                                                                                                                                                      -- STREAM_PROJECT  |LOCAL|
+                                                                                                                                                        nested tuple source
+                                                                                                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                                                              }
                                                                                                                                       -- PRE_CLUSTERED_GROUP_BY[$$284, $$285]  |PARTITIONED|
                                                                                                                                         exchange
@@ -865,8 +881,10 @@
                                                                                           -- AGGREGATE  |LOCAL|
                                                                                             select (not(is-missing($$458)))
                                                                                             -- STREAM_SELECT  |LOCAL|
-                                                                                              nested tuple source
-                                                                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                              project ([$$180, $$458])
+                                                                                              -- STREAM_PROJECT  |LOCAL|
+                                                                                                nested tuple source
+                                                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                      }
                                                                               -- PRE_CLUSTERED_GROUP_BY[$$327, $$326]  |PARTITIONED|
                                                                                 exchange
@@ -896,8 +914,10 @@
                                                                                                                 -- AGGREGATE  |LOCAL|
                                                                                                                   select (not(is-missing($$332)))
                                                                                                                   -- STREAM_SELECT  |LOCAL|
-                                                                                                                    nested tuple source
-                                                                                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                    project ([$$332])
+                                                                                                                    -- STREAM_PROJECT  |LOCAL|
+                                                                                                                      nested tuple source
+                                                                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                              }
                                                                                                       -- PRE_CLUSTERED_GROUP_BY[$$328]  |PARTITIONED|
                                                                                                         exchange
@@ -959,8 +979,10 @@
                                                                                                                                                 -- AGGREGATE  |LOCAL|
                                                                                                                                                   select (not(is-missing($$350)))
                                                                                                                                                   -- STREAM_SELECT  |LOCAL|
-                                                                                                                                                    nested tuple source
-                                                                                                                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                                                    project ([$$350])
+                                                                                                                                                    -- STREAM_PROJECT  |LOCAL|
+                                                                                                                                                      nested tuple source
+                                                                                                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                                                              }
                                                                                                                                       -- PRE_CLUSTERED_GROUP_BY[$$338, $$340]  |PARTITIONED|
                                                                                                                                         exchange
@@ -1050,8 +1072,10 @@
                                                                                                                                                                           -- AGGREGATE  |LOCAL|
                                                                                                                                                                             select (not(is-missing($$366)))
                                                                                                                                                                             -- STREAM_SELECT  |LOCAL|
-                                                                                                                                                                              nested tuple source
-                                                                                                                                                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                                                                              project ([$$367, $$366])
+                                                                                                                                                                              -- STREAM_PROJECT  |LOCAL|
+                                                                                                                                                                                nested tuple source
+                                                                                                                                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                                                                                      }
                                                                                                                                                               -- PRE_CLUSTERED_GROUP_BY[$$354, $$355]  |PARTITIONED|
                                                                                                                                                                 exchange
@@ -1329,8 +1353,10 @@
                                                                                                                                   -- AGGREGATE  |LOCAL|
                                                                                                                                     select (not(is-missing($$403)))
                                                                                                                                     -- STREAM_SELECT  |LOCAL|
-                                                                                                                                      nested tuple source
-                                                                                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                                      project ([$$403])
+                                                                                                                                      -- STREAM_PROJECT  |LOCAL|
+                                                                                                                                        nested tuple source
+                                                                                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                                                }
                                                                                                                         -- PRE_CLUSTERED_GROUP_BY[$$399]  |PARTITIONED|
                                                                                                                           exchange
@@ -1388,8 +1414,10 @@
                                                                                                                                                                   -- AGGREGATE  |LOCAL|
                                                                                                                                                                     select (not(is-missing($$421)))
                                                                                                                                                                     -- STREAM_SELECT  |LOCAL|
-                                                                                                                                                                      nested tuple source
-                                                                                                                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                                                                      project ([$$421])
+                                                                                                                                                                      -- STREAM_PROJECT  |LOCAL|
+                                                                                                                                                                        nested tuple source
+                                                                                                                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                                                                                }
                                                                                                                                                         -- PRE_CLUSTERED_GROUP_BY[$$409, $$411]  |PARTITIONED|
                                                                                                                                                           exchange
@@ -1475,8 +1503,10 @@
                                                                                                                                                                                             -- AGGREGATE  |LOCAL|
                                                                                                                                                                                               select (not(is-missing($$437)))
                                                                                                                                                                                               -- STREAM_SELECT  |LOCAL|
-                                                                                                                                                                                                nested tuple source
-                                                                                                                                                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                                                                                                project ([$$438, $$437])
+                                                                                                                                                                                                -- STREAM_PROJECT  |LOCAL|
+                                                                                                                                                                                                  nested tuple source
+                                                                                                                                                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                                                                                                        }
                                                                                                                                                                                 -- PRE_CLUSTERED_GROUP_BY[$$425, $$426]  |PARTITIONED|
                                                                                                                                                                                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/remove_listify.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/remove_listify.plan
index 56a855c..136f622 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/remove_listify.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/remove_listify.plan
@@ -15,10 +15,12 @@
                       -- AGGREGATE  |LOCAL|
                         select (and(ge($$139, numeric-subtract($$147, 5)), le($$139, $$147), not(is-missing($$152))))
                         -- STREAM_SELECT  |LOCAL|
-                          assign [$$139] <- [$$113.getField("f2")]
+                          assign [$$139] <- [$$113.getField("f2")] project: [$$147, $$152, $$139]
                           -- ASSIGN  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                            project ([$$147, $$152, $$113])
+                            -- STREAM_PROJECT  |LOCAL|
+                              nested tuple source
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- PRE_CLUSTERED_GROUP_BY[$$141]  |PARTITIONED|
             exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01_ps.plan
index 93871a6..d988ae1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01_ps.plan
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$58)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$58, $$59])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$97]  |PARTITIONED|
                       exchange
@@ -138,8 +140,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$58)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$58, $$59])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$97]  |PARTITIONED|
                                 exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.plan
index 3d86c89..eb7df10 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.plan
@@ -11,8 +11,10 @@
                   -- AGGREGATE  |LOCAL|
                     select (not(is-missing($$62)))
                     -- STREAM_SELECT  |LOCAL|
-                      nested tuple source
-                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                      project ([$$62, $$64])
+                      -- STREAM_PROJECT  |LOCAL|
+                        nested tuple source
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$61]  |PARTITIONED|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02_ps.plan
index 676fd67..687d8ef 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02_ps.plan
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$62)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$62, $$64])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$61]  |PARTITIONED|
                       exchange
@@ -94,8 +96,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$62)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$62, $$64])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$61]  |PARTITIONED|
                                 exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/exists.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/exists.plan
index 26805a8..6b8aab7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/exists.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/exists.plan
@@ -46,8 +46,10 @@
                                       -- AGGREGATE  |LOCAL|
                                         select (not(is-missing($$188)))
                                         -- STREAM_SELECT  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$o, $$188])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                             -- PRE_CLUSTERED_GROUP_BY[$$187]  |PARTITIONED|
                               exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/exists_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/exists_ps.plan
index 16bd503..3b1ce8a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/exists_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/exists_ps.plan
@@ -58,8 +58,10 @@
                                                   -- AGGREGATE  |LOCAL|
                                                     select (not(is-missing($$188)))
                                                     -- STREAM_SELECT  |LOCAL|
-                                                      nested tuple source
-                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                      project ([$$o, $$188])
+                                                      -- STREAM_PROJECT  |LOCAL|
+                                                        nested tuple source
+                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                }
                                         -- PRE_CLUSTERED_GROUP_BY[$$187]  |PARTITIONED|
                                           exchange
@@ -190,8 +192,10 @@
                                                             -- AGGREGATE  |LOCAL|
                                                               select (not(is-missing($$188)))
                                                               -- STREAM_SELECT  |LOCAL|
-                                                                nested tuple source
-                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                project ([$$o, $$188])
+                                                                -- STREAM_PROJECT  |LOCAL|
+                                                                  nested tuple source
+                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                          }
                                                   -- PRE_CLUSTERED_GROUP_BY[$$187]  |PARTITIONED|
                                                     exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in.plan
index b9e0186..8e4b5d9 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in.plan
@@ -15,8 +15,10 @@
                       -- AGGREGATE  |LOCAL|
                         select (not(is-missing($$52)))
                         -- STREAM_SELECT  |LOCAL|
-                          nested tuple source
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          project ([$$52])
+                          -- STREAM_PROJECT  |LOCAL|
+                            nested tuple source
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                    }
             -- PRE_CLUSTERED_GROUP_BY[$$48]  |PARTITIONED|
               exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_2.plan
index 7869a45..fddb1fa 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_2.plan
@@ -11,8 +11,10 @@
                   -- AGGREGATE  |LOCAL|
                     select (not(is-missing($$25)))
                     -- STREAM_SELECT  |LOCAL|
-                      nested tuple source
-                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                      project ([$$25])
+                      -- STREAM_PROJECT  |LOCAL|
+                        nested tuple source
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_2_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_2_ps.plan
index 22cc503..ca7311c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_2_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_2_ps.plan
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$25)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$25])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
                       exchange
@@ -82,8 +84,10 @@
                                       -- AGGREGATE  |LOCAL|
                                         select (not(is-missing($$25)))
                                         -- STREAM_SELECT  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$25])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                             -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
                               exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_4.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_4.plan
index a4e3699..aa852ea 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_4.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_4.plan
@@ -11,8 +11,10 @@
                   -- AGGREGATE  |LOCAL|
                     select (not(is-missing($$24)))
                     -- STREAM_SELECT  |LOCAL|
-                      nested tuple source
-                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                      project ([$$24])
+                      -- STREAM_PROJECT  |LOCAL|
+                        nested tuple source
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$21]  |PARTITIONED|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_4_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_4_ps.plan
index 6c20d83..b97aa3e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_4_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_4_ps.plan
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$24)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$24])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$21]  |PARTITIONED|
                       exchange
@@ -82,8 +84,10 @@
                                       -- AGGREGATE  |LOCAL|
                                         select (not(is-missing($$24)))
                                         -- STREAM_SELECT  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$24])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                             -- PRE_CLUSTERED_GROUP_BY[$$21]  |PARTITIONED|
                               exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_6.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_6.plan
index 7869a45..fddb1fa 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_6.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_6.plan
@@ -11,8 +11,10 @@
                   -- AGGREGATE  |LOCAL|
                     select (not(is-missing($$25)))
                     -- STREAM_SELECT  |LOCAL|
-                      nested tuple source
-                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                      project ([$$25])
+                      -- STREAM_PROJECT  |LOCAL|
+                        nested tuple source
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_6_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_6_ps.plan
index 22cc503..ca7311c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_6_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_as_or_6_ps.plan
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$25)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$25])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
                       exchange
@@ -82,8 +84,10 @@
                                       -- AGGREGATE  |LOCAL|
                                         select (not(is-missing($$25)))
                                         -- STREAM_SELECT  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$25])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                             -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
                               exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_3.plan
index 3663e21..429c3c8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_3.plan
@@ -21,8 +21,10 @@
                             -- AGGREGATE  |LOCAL|
                               select (not(is-missing($$111)))
                               -- STREAM_SELECT  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$111])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                          }
                   -- PRE_CLUSTERED_GROUP_BY[$$110]  |PARTITIONED|
                     exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_4.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_4.plan
index a684e10..3273732 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_4.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_4.plan
@@ -21,8 +21,10 @@
                             -- AGGREGATE  |LOCAL|
                               select (not(is-missing($$131)))
                               -- STREAM_SELECT  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$131])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                          }
                   -- PRE_CLUSTERED_GROUP_BY[$$130]  |PARTITIONED|
                     exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_5.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_5.plan
index 5cb2dce..5d07d54 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_5.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_5.plan
@@ -21,8 +21,10 @@
                             -- AGGREGATE  |LOCAL|
                               select (not(is-missing($$131)))
                               -- STREAM_SELECT  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$131])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                          }
                   -- PRE_CLUSTERED_GROUP_BY[$$130]  |PARTITIONED|
                     exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_6.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_6.plan
index 44f61a1..a561711 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_6.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_6.plan
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$117, $#3))
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $#3 <- scan-collection($$96)
+                              unnest $#3 <- scan-collection($$96) project: [$$117, $#3]
                               -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$117, $$96])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_7.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_7.plan
index 44f61a1..a561711 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_7.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_7.plan
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$117, $#3))
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $#3 <- scan-collection($$96)
+                              unnest $#3 <- scan-collection($$96) project: [$$117, $#3]
                               -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$117, $$96])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- SUBPLAN  |PARTITIONED|
                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_8.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_8.plan
index 61c6bfd..37cf2f0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_8.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_let_8.plan
@@ -21,8 +21,10 @@
                             -- AGGREGATE  |LOCAL|
                               select (not(is-missing($$111)))
                               -- STREAM_SELECT  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$111])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                          }
                   -- PRE_CLUSTERED_GROUP_BY[$$100, $$i1, $$103, $$99, $$110]  |PARTITIONED|
                     exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_ps.plan
index a09a030..34e22c0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_ps.plan
@@ -27,8 +27,10 @@
                                   -- AGGREGATE  |LOCAL|
                                     select (not(is-missing($$52)))
                                     -- STREAM_SELECT  |LOCAL|
-                                      nested tuple source
-                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      project ([$$52])
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                }
                         -- PRE_CLUSTERED_GROUP_BY[$$48]  |PARTITIONED|
                           exchange
@@ -92,8 +94,10 @@
                                           -- AGGREGATE  |LOCAL|
                                             select (not(is-missing($$52)))
                                             -- STREAM_SELECT  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              project ([$$52])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                        }
                                 -- PRE_CLUSTERED_GROUP_BY[$$48]  |PARTITIONED|
                                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/not_exists.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/not_exists.plan
index f7d776c..f8335d2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/not_exists.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/not_exists.plan
@@ -46,8 +46,10 @@
                                       -- AGGREGATE  |LOCAL|
                                         select (not(is-missing($$189)))
                                         -- STREAM_SELECT  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$o, $$189])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                             -- PRE_CLUSTERED_GROUP_BY[$$188]  |PARTITIONED|
                               exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/not_exists_ps.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/not_exists_ps.plan
index 46692e4..f6b762b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/not_exists_ps.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/not_exists_ps.plan
@@ -58,8 +58,10 @@
                                                   -- AGGREGATE  |LOCAL|
                                                     select (not(is-missing($$189)))
                                                     -- STREAM_SELECT  |LOCAL|
-                                                      nested tuple source
-                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                      project ([$$o, $$189])
+                                                      -- STREAM_PROJECT  |LOCAL|
+                                                        nested tuple source
+                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                }
                                         -- PRE_CLUSTERED_GROUP_BY[$$188]  |PARTITIONED|
                                           exchange
@@ -190,8 +192,10 @@
                                                             -- AGGREGATE  |LOCAL|
                                                               select (not(is-missing($$189)))
                                                               -- STREAM_SELECT  |LOCAL|
-                                                                nested tuple source
-                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                project ([$$o, $$189])
+                                                                -- STREAM_PROJECT  |LOCAL|
+                                                                  nested tuple source
+                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                          }
                                                   -- PRE_CLUSTERED_GROUP_BY[$$188]  |PARTITIONED|
                                                     exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-1572.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-1572.plan
index 0826577..ab0bce1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-1572.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-1572.plan
@@ -11,8 +11,10 @@
                   -- AGGREGATE  |LOCAL|
                     select (eq($$57, 2))
                     -- STREAM_SELECT  |LOCAL|
-                      nested tuple source
-                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                      project ([$$57])
+                      -- STREAM_PROJECT  |LOCAL|
+                        nested tuple source
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- SUBPLAN  |PARTITIONED|
           subplan {
@@ -20,8 +22,10 @@
                     -- AGGREGATE  |LOCAL|
                       select (eq($$57, 1))
                       -- STREAM_SELECT  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$57])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- SUBPLAN  |PARTITIONED|
             subplan {
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-2815-2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-2815-2.plan
index d0edd9f..ed1b247 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-2815-2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-2815-2.plan
@@ -19,8 +19,10 @@
                           -- AGGREGATE  |LOCAL|
                             select (not(is-missing($$95)))
                             -- STREAM_SELECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$74, $$95])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- PRE_CLUSTERED_GROUP_BY[$$83]  |PARTITIONED|
                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-2815-3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-2815-3.plan
index 0ce602e..e186cf5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-2815-3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-2815-3.plan
@@ -19,8 +19,10 @@
                           -- AGGREGATE  |LOCAL|
                             select (not(is-missing($$101)))
                             -- STREAM_SELECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$79, $$101])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- PRE_CLUSTERED_GROUP_BY[$$89]  |PARTITIONED|
                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-2815.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-2815.plan
index edd692d..62cc9d8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-2815.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-2815.plan
@@ -21,8 +21,10 @@
                             -- AGGREGATE  |LOCAL|
                               select (not(is-missing($$88)))
                               -- STREAM_SELECT  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$67, $$88])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                          }
                   -- PRE_CLUSTERED_GROUP_BY[$$75]  |PARTITIONED|
                     exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-3006.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-3006.plan
index f4c8eb0..4680a16 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-3006.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-3006.plan
@@ -24,8 +24,10 @@
                           -- AGGREGATE  |LOCAL|
                             select (not(is-missing($$57)))
                             -- STREAM_SELECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$57])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- PRE_CLUSTERED_GROUP_BY[$$49]  |PARTITIONED|
                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581-correlated-2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581-correlated-2.plan
index 32968f9..fe8e731 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581-correlated-2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581-correlated-2.plan
@@ -19,8 +19,10 @@
                           -- AGGREGATE  |LOCAL|
                             select (not(is-missing($$235)))
                             -- STREAM_SELECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$235])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                      }
               -- PRE_CLUSTERED_GROUP_BY[$$234]  |PARTITIONED|
                 exchange
@@ -44,8 +46,10 @@
                                           -- AGGREGATE  |LOCAL|
                                             select (not(is-missing($$233)))
                                             -- STREAM_SELECT  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              project ([$$122, $$233])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$196]  |PARTITIONED|
                                 exchange
@@ -65,8 +69,10 @@
                                                       -- AGGREGATE  |LOCAL|
                                                         select (not(is-missing($$195)))
                                                         -- STREAM_SELECT  |LOCAL|
-                                                          nested tuple source
-                                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                          project ([$$137, $$195])
+                                                          -- STREAM_PROJECT  |LOCAL|
+                                                            nested tuple source
+                                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                  }
                                           -- PRE_CLUSTERED_GROUP_BY[$$144]  |PARTITIONED|
                                             exchange
@@ -125,8 +131,10 @@
                                                                               -- AGGREGATE  |LOCAL|
                                                                                 select (not(is-missing($$189)))
                                                                                 -- STREAM_SELECT  |LOCAL|
-                                                                                  nested tuple source
-                                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                  project ([$$135, $$189])
+                                                                                  -- STREAM_PROJECT  |LOCAL|
+                                                                                    nested tuple source
+                                                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                            }
                                                                     -- PRE_CLUSTERED_GROUP_BY[$$188, $$193]  |PARTITIONED|
                                                                       exchange
@@ -168,8 +176,10 @@
                                                                                                                   -- AGGREGATE  |LOCAL|
                                                                                                                     select (not(is-missing($$217)))
                                                                                                                     -- STREAM_SELECT  |LOCAL|
-                                                                                                                      nested tuple source
-                                                                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                      project ([$$217])
+                                                                                                                      -- STREAM_PROJECT  |LOCAL|
+                                                                                                                        nested tuple source
+                                                                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                              }
                                                                                                       -- PRE_CLUSTERED_GROUP_BY[$$215]  |PARTITIONED|
                                                                                                         exchange
@@ -274,8 +284,10 @@
                                                               -- AGGREGATE  |LOCAL|
                                                                 select (not(is-missing($$199)))
                                                                 -- STREAM_SELECT  |LOCAL|
-                                                                  nested tuple source
-                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                  project ([$$120, $$199])
+                                                                  -- STREAM_PROJECT  |LOCAL|
+                                                                    nested tuple source
+                                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                            }
                                                     -- PRE_CLUSTERED_GROUP_BY[$$198, $$231]  |PARTITIONED|
                                                       exchange
@@ -307,8 +319,10 @@
                                                                                         -- AGGREGATE  |LOCAL|
                                                                                           select (not(is-missing($$197)))
                                                                                           -- STREAM_SELECT  |LOCAL|
-                                                                                            nested tuple source
-                                                                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                            project ([$$197])
+                                                                                            -- STREAM_PROJECT  |LOCAL|
+                                                                                              nested tuple source
+                                                                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                    }
                                                                             -- PRE_CLUSTERED_GROUP_BY[$$201]  |PARTITIONED|
                                                                               exchange
@@ -328,8 +342,10 @@
                                                                                                     -- AGGREGATE  |LOCAL|
                                                                                                       select (not(is-missing($$205)))
                                                                                                       -- STREAM_SELECT  |LOCAL|
-                                                                                                        nested tuple source
-                                                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                        project ([$$205])
+                                                                                                        -- STREAM_PROJECT  |LOCAL|
+                                                                                                          nested tuple source
+                                                                                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                }
                                                                                         -- PRE_CLUSTERED_GROUP_BY[$$202]  |PARTITIONED|
                                                                                           exchange
@@ -388,8 +404,10 @@
                                                                                                                             -- AGGREGATE  |LOCAL|
                                                                                                                               select (not(is-missing($$222)))
                                                                                                                               -- STREAM_SELECT  |LOCAL|
-                                                                                                                                nested tuple source
-                                                                                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                                project ([$$222])
+                                                                                                                                -- STREAM_PROJECT  |LOCAL|
+                                                                                                                                  nested tuple source
+                                                                                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                                          }
                                                                                                                   -- PRE_CLUSTERED_GROUP_BY[$$209, $$210]  |PARTITIONED|
                                                                                                                     exchange
@@ -427,8 +445,10 @@
                                                                                                                                                             -- AGGREGATE  |LOCAL|
                                                                                                                                                               select (not(is-missing($$217)))
                                                                                                                                                               -- STREAM_SELECT  |LOCAL|
-                                                                                                                                                                nested tuple source
-                                                                                                                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                                                                project ([$$217])
+                                                                                                                                                                -- STREAM_PROJECT  |LOCAL|
+                                                                                                                                                                  nested tuple source
+                                                                                                                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                                                                        }
                                                                                                                                                 -- PRE_CLUSTERED_GROUP_BY[$$215]  |PARTITIONED|
                                                                                                                                                   exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581-correlated.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581-correlated.plan
index f06b823..d6e351f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581-correlated.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581-correlated.plan
@@ -19,8 +19,10 @@
                           -- AGGREGATE  |LOCAL|
                             select (not(is-missing($$223)))
                             -- STREAM_SELECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$137, $$223])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                      }
               -- PRE_CLUSTERED_GROUP_BY[$$180]  |PARTITIONED|
                 exchange
@@ -44,8 +46,10 @@
                                           -- AGGREGATE  |LOCAL|
                                             select (not(is-missing($$179)))
                                             -- STREAM_SELECT  |LOCAL|
-                                              nested tuple source
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              project ([$$122, $$179])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$164]  |PARTITIONED|
                                 exchange
@@ -65,8 +69,10 @@
                                                       -- AGGREGATE  |LOCAL|
                                                         select (not(is-missing($$163)))
                                                         -- STREAM_SELECT  |LOCAL|
-                                                          nested tuple source
-                                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                          project ([$$163])
+                                                          -- STREAM_PROJECT  |LOCAL|
+                                                            nested tuple source
+                                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                  }
                                           -- PRE_CLUSTERED_GROUP_BY[$$144]  |PARTITIONED|
                                             exchange
@@ -155,8 +161,10 @@
                                                               -- AGGREGATE  |LOCAL|
                                                                 select (not(is-missing($$166)))
                                                                 -- STREAM_SELECT  |LOCAL|
-                                                                  nested tuple source
-                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                  project ([$$120, $$166])
+                                                                  -- STREAM_PROJECT  |LOCAL|
+                                                                    nested tuple source
+                                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                            }
                                                     -- PRE_CLUSTERED_GROUP_BY[$$165, $$168]  |PARTITIONED|
                                                       exchange
@@ -200,8 +208,10 @@
                                                                                                     -- AGGREGATE  |LOCAL|
                                                                                                       select (not(is-missing($$208)))
                                                                                                       -- STREAM_SELECT  |LOCAL|
-                                                                                                        nested tuple source
-                                                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                        project ([$$208])
+                                                                                                        -- STREAM_PROJECT  |LOCAL|
+                                                                                                          nested tuple source
+                                                                                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                }
                                                                                         -- PRE_CLUSTERED_GROUP_BY[$$206]  |PARTITIONED|
                                                                                           exchange
@@ -302,8 +312,10 @@
                                                   -- AGGREGATE  |LOCAL|
                                                     select (not(is-missing($$182)))
                                                     -- STREAM_SELECT  |LOCAL|
-                                                      nested tuple source
-                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                      project ([$$135, $$182])
+                                                      -- STREAM_PROJECT  |LOCAL|
+                                                        nested tuple source
+                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                }
                                         -- PRE_CLUSTERED_GROUP_BY[$$181, $$184]  |PARTITIONED|
                                           exchange
@@ -337,8 +349,10 @@
                                                                               -- AGGREGATE  |LOCAL|
                                                                                 select (not(is-missing($$196)))
                                                                                 -- STREAM_SELECT  |LOCAL|
-                                                                                  nested tuple source
-                                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                  project ([$$196])
+                                                                                  -- STREAM_PROJECT  |LOCAL|
+                                                                                    nested tuple source
+                                                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                          }
                                                                   -- PRE_CLUSTERED_GROUP_BY[$$185]  |PARTITIONED|
                                                                     exchange
@@ -366,8 +380,10 @@
                                                                                                   -- AGGREGATE  |LOCAL|
                                                                                                     select (not(is-missing($$208)))
                                                                                                     -- STREAM_SELECT  |LOCAL|
-                                                                                                      nested tuple source
-                                                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                      project ([$$208])
+                                                                                                      -- STREAM_PROJECT  |LOCAL|
+                                                                                                        nested tuple source
+                                                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                              }
                                                                                       -- PRE_CLUSTERED_GROUP_BY[$$206]  |PARTITIONED|
                                                                                         exchange
@@ -448,8 +464,10 @@
                                                                                                   -- AGGREGATE  |LOCAL|
                                                                                                     select (not(is-missing($$213)))
                                                                                                     -- STREAM_SELECT  |LOCAL|
-                                                                                                      nested tuple source
-                                                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                      project ([$$213])
+                                                                                                      -- STREAM_PROJECT  |LOCAL|
+                                                                                                        nested tuple source
+                                                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                }
                                                                                         -- PRE_CLUSTERED_GROUP_BY[$$200, $$201]  |PARTITIONED|
                                                                                           exchange
@@ -489,8 +507,10 @@
                                                                                                                                     -- AGGREGATE  |LOCAL|
                                                                                                                                       select (not(is-missing($$208)))
                                                                                                                                       -- STREAM_SELECT  |LOCAL|
-                                                                                                                                        nested tuple source
-                                                                                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                                        project ([$$208])
+                                                                                                                                        -- STREAM_PROJECT  |LOCAL|
+                                                                                                                                          nested tuple source
+                                                                                                                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                                                }
                                                                                                                         -- PRE_CLUSTERED_GROUP_BY[$$206]  |PARTITIONED|
                                                                                                                           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581.plan
index 45c34fe..813b13b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581.plan
@@ -35,8 +35,10 @@
                             -- AGGREGATE  |LOCAL|
                               select (not(is-missing($$199)))
                               -- STREAM_SELECT  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$143, $$199])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
                 -- PRE_CLUSTERED_GROUP_BY[$$173]  |LOCAL|
                   exchange
@@ -56,8 +58,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$172)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$126, $$172])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                             -- PRE_CLUSTERED_GROUP_BY[$$109]  |LOCAL|
                               exchange
@@ -223,8 +227,10 @@
                                                     -- AGGREGATE  |LOCAL|
                                                       select (not(is-missing($$182)))
                                                       -- STREAM_SELECT  |LOCAL|
-                                                        nested tuple source
-                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                        project ([$$182])
+                                                        -- STREAM_PROJECT  |LOCAL|
+                                                          nested tuple source
+                                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                }
                                         -- PRE_CLUSTERED_GROUP_BY[$$175]  |LOCAL|
                                           exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1591.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1591.plan
index f0a76d2..43c2015 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1591.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1591.plan
@@ -32,8 +32,10 @@
                                   -- AGGREGATE  |LOCAL|
                                     select (not(is-missing($$191)))
                                     -- STREAM_SELECT  |LOCAL|
-                                      nested tuple source
-                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      project ([$$cs1, $$dd1, $$191])
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                }
                         -- PRE_CLUSTERED_GROUP_BY[$$189, $$190]  |PARTITIONED|
                           exchange
@@ -64,8 +66,10 @@
                                                       -- AGGREGATE  |LOCAL|
                                                         select (not(is-missing($$188)))
                                                         -- STREAM_SELECT  |LOCAL|
-                                                          nested tuple source
-                                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                          project ([$$ws1, $$dd1, $$188])
+                                                          -- STREAM_PROJECT  |LOCAL|
+                                                            nested tuple source
+                                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                    }
                                             -- PRE_CLUSTERED_GROUP_BY[$$186, $$187]  |PARTITIONED|
                                               exchange
@@ -100,8 +104,10 @@
                                                                               -- AGGREGATE  |LOCAL|
                                                                                 select (not(is-missing($$185)))
                                                                                 -- STREAM_SELECT  |LOCAL|
-                                                                                  nested tuple source
-                                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                  project ([$$ss1, $$dd1, $$185])
+                                                                                  -- STREAM_PROJECT  |LOCAL|
+                                                                                    nested tuple source
+                                                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                            }
                                                                     -- PRE_CLUSTERED_GROUP_BY[$$150, $$151]  |PARTITIONED|
                                                                       exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ASTERIXDB-2402.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ASTERIXDB-2402.plan
index c7d8549..a54b6df 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ASTERIXDB-2402.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ASTERIXDB-2402.plan
@@ -18,23 +18,29 @@
                     -- MICRO_PRE_CLUSTERED_GROUP_BY[$$230]  |LOCAL|
                       order (ASC, $$230)
                       -- MICRO_STABLE_SORT [$$230(ASC)]  |LOCAL|
-                        assign [$$230] <- [$$sub.getField("BrokerEndpoint")]
+                        assign [$$230] <- [$$sub.getField("BrokerEndpoint")] project: [$$260, $$259, $$230]
                         -- ASSIGN  |LOCAL|
-                          unnest $$sub <- scan-collection($$219)
+                          unnest $$sub <- scan-collection($$219) project: [$$260, $$259, $$sub]
                           -- UNNEST  |LOCAL|
-                            subplan {
-                                      aggregate [$$219] <- [listify($$218)]
-                                      -- AGGREGATE  |LOCAL|
-                                        assign [$$218] <- [{"sub": $$sub}]
-                                        -- ASSIGN  |LOCAL|
-                                          unnest $$sub <- scan-collection($$256)
-                                          -- UNNEST  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                   }
-                            -- SUBPLAN  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                            project ([$$260, $$259, $$219])
+                            -- STREAM_PROJECT  |LOCAL|
+                              subplan {
+                                        aggregate [$$219] <- [listify($$218)]
+                                        -- AGGREGATE  |LOCAL|
+                                          assign [$$218] <- [{"sub": $$sub}]
+                                          -- ASSIGN  |LOCAL|
+                                            unnest $$sub <- scan-collection($$256) project: [$$sub]
+                                            -- UNNEST  |LOCAL|
+                                              project ([$$256])
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                     }
+                              -- SUBPLAN  |LOCAL|
+                                project ([$$260, $$259, $$256])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
              }
       -- SUBPLAN  |PARTITIONED|
         project ([$$260, $$259, $$256])
@@ -64,8 +70,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$268)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$253, $$238, $$268])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$267]  |PARTITIONED|
                                 exchange
@@ -96,8 +104,10 @@
                                                                           -- AGGREGATE  |LOCAL|
                                                                             select (not(is-missing($$236)))
                                                                             -- STREAM_SELECT  |LOCAL|
-                                                                              nested tuple source
-                                                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                              project ([$$232, $$236])
+                                                                              -- STREAM_PROJECT  |LOCAL|
+                                                                                nested tuple source
+                                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                        }
                                                                 -- MICRO_PRE_CLUSTERED_GROUP_BY[$$321, $$322]  |LOCAL|
                                                                   select (and(not(is-missing($$318)), not(is-missing($$320))))
@@ -272,7 +282,7 @@
                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                   exchange
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    join (and(eq($$248, $$239), eq($$250, $$240))) [cardinality: 1000000.0, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                    join (and(eq($$248, $$239), eq($$250, $$240)))
                                                     -- HYBRID_HASH_JOIN [$$248, $$250][$$239, $$240]  |PARTITIONED|
                                                       exchange
                                                       -- HASH_PARTITION_EXCHANGE [$$248, $$250]  |PARTITIONED|
@@ -280,7 +290,7 @@
                                                         -- ASSIGN  |PARTITIONED|
                                                           exchange
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            data-scan []<-[$$237, $$238, $$bs] <- channels.EmergenciesNearMeChannelBrokerSubscriptions [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                            data-scan []<-[$$237, $$238, $$bs] <- channels.EmergenciesNearMeChannelBrokerSubscriptions
                                                             -- DATASOURCE_SCAN  |PARTITIONED|
                                                               exchange
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -292,7 +302,7 @@
                                                         -- ASSIGN  |PARTITIONED|
                                                           exchange
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            data-scan []<-[$$239, $$240, $$b] <- channels.Broker [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                            data-scan []<-[$$239, $$240, $$b] <- channels.Broker
                                                             -- DATASOURCE_SCAN  |PARTITIONED|
                                                               exchange
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.10.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.10.plan
index f663a4e..515e40a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.10.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.10.plan
@@ -13,8 +13,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$72)
                       -- MICRO_STABLE_SORT [$$72(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$72])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
@@ -25,31 +27,31 @@
               -- HASH_PARTITION_EXCHANGE [$$g]  |PARTITIONED|
                 join (true)
                 -- NESTED_LOOP  |PARTITIONED|
-                  exchange [cardinality: 1.0E12, op-cost: 0.0, total-cost: 1.000006E12]
+                  exchange
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    join (true) [cardinality: 1.0E12, op-cost: 1.0E12, total-cost: 1.000006E12]
+                    join (true)
                     -- NESTED_LOOP  |PARTITIONED|
-                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                      exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        assign [$$72] <- [$$x.getField(1)] project: [$$72] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                        assign [$$72] <- [$$x.getField(1)] project: [$$72]
                         -- ASSIGN  |PARTITIONED|
-                          project ([$$x]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                          project ([$$x])
                           -- STREAM_PROJECT  |PARTITIONED|
-                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            exchange
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              data-scan []<-[$$80, $$x] <- test.d1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                              data-scan []<-[$$80, $$x] <- test.d1
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   empty-tuple-source
                                   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                      exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                      exchange
                       -- BROADCAST_EXCHANGE  |PARTITIONED|
-                        project ([]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                        project ([])
                         -- STREAM_PROJECT  |PARTITIONED|
-                          exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                          exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$81, $$y] <- test.d2 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                            data-scan []<-[$$81, $$y] <- test.d2
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.11.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.11.plan
index 11620b2..5423304 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.11.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.11.plan
@@ -13,8 +13,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$72)
                       -- MICRO_STABLE_SORT [$$72(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$72])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
                {
                   aggregate [$$83] <- [agg-sql-sum($$77)]
@@ -23,8 +25,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$77)
                       -- MICRO_STABLE_SORT [$$77(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$77])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
@@ -35,33 +39,33 @@
               -- HASH_PARTITION_EXCHANGE [$$g]  |PARTITIONED|
                 join (true)
                 -- NESTED_LOOP  |PARTITIONED|
-                  exchange [cardinality: 1.0E12, op-cost: 0.0, total-cost: 1.000006E12]
+                  exchange
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    join (true) [cardinality: 1.0E12, op-cost: 1.0E12, total-cost: 1.000006E12]
+                    join (true)
                     -- NESTED_LOOP  |PARTITIONED|
-                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                      exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        assign [$$72] <- [$$x.getField(1)] project: [$$72] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                        assign [$$72] <- [$$x.getField(1)] project: [$$72]
                         -- ASSIGN  |PARTITIONED|
-                          project ([$$x]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                          project ([$$x])
                           -- STREAM_PROJECT  |PARTITIONED|
-                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            exchange
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              data-scan []<-[$$80, $$x] <- test.d1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                              data-scan []<-[$$80, $$x] <- test.d1
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   empty-tuple-source
                                   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                      exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                      exchange
                       -- BROADCAST_EXCHANGE  |PARTITIONED|
-                        assign [$$77] <- [$$y.getField(1)] project: [$$77] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                        assign [$$77] <- [$$y.getField(1)] project: [$$77]
                         -- ASSIGN  |PARTITIONED|
-                          project ([$$y]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                          project ([$$y])
                           -- STREAM_PROJECT  |PARTITIONED|
-                            exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                            exchange
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              data-scan []<-[$$81, $$y] <- test.d2 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                              data-scan []<-[$$81, $$y] <- test.d2
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.12.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.12.plan
index cdf64bc..725fd90 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.12.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.12.plan
@@ -19,8 +19,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$76)
                       -- MICRO_STABLE_SORT [$$76(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$76])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
@@ -31,31 +33,31 @@
               -- HASH_PARTITION_EXCHANGE [$$g]  |PARTITIONED|
                 join (true)
                 -- NESTED_LOOP  |PARTITIONED|
-                  exchange [cardinality: 1.0E12, op-cost: 0.0, total-cost: 1.000006E12]
+                  exchange
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    join (true) [cardinality: 1.0E12, op-cost: 1.0E12, total-cost: 1.000006E12]
+                    join (true)
                     -- NESTED_LOOP  |PARTITIONED|
-                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                      exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        assign [$$76] <- [$$x.getField(1)] project: [$$76] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                        assign [$$76] <- [$$x.getField(1)] project: [$$76]
                         -- ASSIGN  |PARTITIONED|
-                          project ([$$x]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                          project ([$$x])
                           -- STREAM_PROJECT  |PARTITIONED|
-                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            exchange
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              data-scan []<-[$$89, $$x] <- test.d1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                              data-scan []<-[$$89, $$x] <- test.d1
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   empty-tuple-source
                                   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                      exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                      exchange
                       -- BROADCAST_EXCHANGE  |PARTITIONED|
-                        project ([]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                        project ([])
                         -- STREAM_PROJECT  |PARTITIONED|
-                          exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                          exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$90, $$y] <- test.d2 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                            data-scan []<-[$$90, $$y] <- test.d2
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.13.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.13.plan
index 7ecd634..7344fe4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.13.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.13.plan
@@ -13,8 +13,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$88)
                       -- MICRO_STABLE_SORT [$$88(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$88])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
                {
                   aggregate [$$105] <- [agg-sql-sum($$93)]
@@ -29,8 +31,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$98)
                       -- MICRO_STABLE_SORT [$$98(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$98])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
@@ -41,51 +45,51 @@
               -- HASH_PARTITION_EXCHANGE [$$g]  |PARTITIONED|
                 join (true)
                 -- NESTED_LOOP  |PARTITIONED|
-                  exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                  exchange
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    join (true) [cardinality: 9.223372036854776E16, op-cost: 9.223372036854776E16, total-cost: 9.223372036854776E16]
+                    join (true)
                     -- NESTED_LOOP  |PARTITIONED|
-                      exchange [cardinality: 1.0E12, op-cost: 0.0, total-cost: 1.000006E12]
+                      exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        join (true) [cardinality: 1.0E12, op-cost: 1.0E12, total-cost: 1.000006E12]
+                        join (true)
                         -- NESTED_LOOP  |PARTITIONED|
-                          exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                          exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            assign [$$88] <- [$$x.getField(1)] project: [$$88] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            assign [$$88] <- [$$x.getField(1)] project: [$$88]
                             -- ASSIGN  |PARTITIONED|
-                              project ([$$x]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                              project ([$$x])
                               -- STREAM_PROJECT  |PARTITIONED|
-                                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan []<-[$$101, $$x] <- test.d1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                  data-scan []<-[$$101, $$x] <- test.d1
                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                     exchange
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       empty-tuple-source
                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                          exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                          exchange
                           -- BROADCAST_EXCHANGE  |PARTITIONED|
-                            assign [$$93] <- [$$y.getField(1)] project: [$$93] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            assign [$$93] <- [$$y.getField(1)] project: [$$93]
                             -- ASSIGN  |PARTITIONED|
-                              project ([$$y]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                              project ([$$y])
                               -- STREAM_PROJECT  |PARTITIONED|
-                                exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                                exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan []<-[$$102, $$y] <- test.d2 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                  data-scan []<-[$$102, $$y] <- test.d2
                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                     exchange
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       empty-tuple-source
                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                      exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                      exchange
                       -- BROADCAST_EXCHANGE  |PARTITIONED|
-                        assign [$$98] <- [$$z.getField(1)] project: [$$98] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                        assign [$$98] <- [$$z.getField(1)] project: [$$98]
                         -- ASSIGN  |PARTITIONED|
-                          project ([$$z]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                          project ([$$z])
                           -- STREAM_PROJECT  |PARTITIONED|
-                            exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                            exchange
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              data-scan []<-[$$103, $$z] <- test.d3 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                              data-scan []<-[$$103, $$z] <- test.d3
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.14.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.14.plan
index 4e6f920..7cd1833 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.14.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.14.plan
@@ -13,8 +13,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$112)
                       -- MICRO_STABLE_SORT [$$112(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$112])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
                {
                   aggregate [$$159, $$163, $$165] <- [agg-sql-sum($$117), agg-sql-count($$112), agg-sql-avg($$122)]
@@ -29,8 +31,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$122)
                       -- MICRO_STABLE_SORT [$$122(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$122])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
                {
                   aggregate [$$162, $$164] <- [agg-sql-avg($$117), agg-sql-count($$117)]
@@ -39,8 +43,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$117)
                       -- MICRO_STABLE_SORT [$$117(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$117])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
@@ -51,51 +57,51 @@
               -- HASH_PARTITION_EXCHANGE [$$g]  |PARTITIONED|
                 join (true)
                 -- NESTED_LOOP  |PARTITIONED|
-                  exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                  exchange
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    join (true) [cardinality: 9.223372036854776E16, op-cost: 9.223372036854776E16, total-cost: 9.223372036854776E16]
+                    join (true)
                     -- NESTED_LOOP  |PARTITIONED|
-                      exchange [cardinality: 1.0E12, op-cost: 0.0, total-cost: 1.000006E12]
+                      exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        join (true) [cardinality: 1.0E12, op-cost: 1.0E12, total-cost: 1.000006E12]
+                        join (true)
                         -- NESTED_LOOP  |PARTITIONED|
-                          exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                          exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            assign [$$112] <- [$$x.getField(1)] project: [$$112] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            assign [$$112] <- [$$x.getField(1)] project: [$$112]
                             -- ASSIGN  |PARTITIONED|
-                              project ([$$x]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                              project ([$$x])
                               -- STREAM_PROJECT  |PARTITIONED|
-                                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan []<-[$$155, $$x] <- test.d1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                  data-scan []<-[$$155, $$x] <- test.d1
                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                     exchange
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       empty-tuple-source
                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                          exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                          exchange
                           -- BROADCAST_EXCHANGE  |PARTITIONED|
-                            assign [$$117] <- [$$y.getField(1)] project: [$$117] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            assign [$$117] <- [$$y.getField(1)] project: [$$117]
                             -- ASSIGN  |PARTITIONED|
-                              project ([$$y]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                              project ([$$y])
                               -- STREAM_PROJECT  |PARTITIONED|
-                                exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                                exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan []<-[$$156, $$y] <- test.d2 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                  data-scan []<-[$$156, $$y] <- test.d2
                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                     exchange
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       empty-tuple-source
                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                      exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                      exchange
                       -- BROADCAST_EXCHANGE  |PARTITIONED|
-                        assign [$$122] <- [$$z.getField(1)] project: [$$122] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                        assign [$$122] <- [$$z.getField(1)] project: [$$122]
                         -- ASSIGN  |PARTITIONED|
-                          project ([$$z]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                          project ([$$z])
                           -- STREAM_PROJECT  |PARTITIONED|
-                            exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                            exchange
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              data-scan []<-[$$157, $$z] <- test.d3 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                              data-scan []<-[$$157, $$z] <- test.d3
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.9.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.9.plan
index 3be0ae0..7ddb43e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.9.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/aggregate-sql-sugar/distinct_mixed/distinct_mixed.9.plan
@@ -13,8 +13,10 @@
                     -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                       order (ASC, $$68)
                       -- MICRO_STABLE_SORT [$$68(ASC)]  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                        project ([$$68])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
@@ -25,31 +27,31 @@
               -- HASH_PARTITION_EXCHANGE [$$g]  |PARTITIONED|
                 join (true)
                 -- NESTED_LOOP  |PARTITIONED|
-                  exchange [cardinality: 1.0E12, op-cost: 0.0, total-cost: 1.000006E12]
+                  exchange
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    join (true) [cardinality: 1.0E12, op-cost: 1.0E12, total-cost: 1.000006E12]
+                    join (true)
                     -- NESTED_LOOP  |PARTITIONED|
-                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                      exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        assign [$$68] <- [$$x.getField(1)] project: [$$68] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                        assign [$$68] <- [$$x.getField(1)] project: [$$68]
                         -- ASSIGN  |PARTITIONED|
-                          project ([$$x]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                          project ([$$x])
                           -- STREAM_PROJECT  |PARTITIONED|
-                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            exchange
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              data-scan []<-[$$71, $$x] <- test.d1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                              data-scan []<-[$$71, $$x] <- test.d1
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   empty-tuple-source
                                   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                      exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                      exchange
                       -- BROADCAST_EXCHANGE  |PARTITIONED|
-                        project ([]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                        project ([])
                         -- STREAM_PROJECT  |PARTITIONED|
-                          exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                          exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$72, $$y] <- test.d2 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                            data-scan []<-[$$72, $$y] <- test.d2
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/atomic-and-array-queries/query4.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/atomic-and-array-queries/query4.plan
index dcfd44c..031ab19 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/atomic-and-array-queries/query4.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/atomic-and-array-queries/query4.plan
@@ -1,35 +1,37 @@
-distribute result [$$37] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+distribute result [$$37]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$37] <- [{"D": $$D}] project: [$$37] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+    assign [$$37] <- [{"D": $$D}] project: [$$37]
     -- ASSIGN  |PARTITIONED|
-      select ($$32) project: [$$D] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+      select ($$32) project: [$$D]
       -- STREAM_SELECT  |PARTITIONED|
-        project ([$$D, $$32]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+        project ([$$D, $$32])
         -- STREAM_PROJECT  |PARTITIONED|
           subplan {
                     aggregate [$$32] <- [non-empty-stream()]
                     -- AGGREGATE  |LOCAL|
                       select (and(eq($$43, 2), eq($$42, 3)))
                       -- STREAM_SELECT  |LOCAL|
-                        assign [$$43, $$42] <- [$$DI.getField("field2"), $$DI.getField("field3")]
+                        assign [$$43, $$42] <- [$$DI.getField("field2"), $$DI.getField("field3")] project: [$$43, $$42]
                         -- ASSIGN  |LOCAL|
-                          unnest $$DI <- scan-collection($$41)
+                          unnest $$DI <- scan-collection($$41) project: [$$DI]
                           -- UNNEST  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                 } [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            project ([$$41])
+                            -- STREAM_PROJECT  |LOCAL|
+                              nested tuple source
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                 }
           -- SUBPLAN  |PARTITIONED|
             select (and(eq($$D.getField("field1"), 1), eq($$D.getField("field4"), 4)))
             -- STREAM_SELECT  |PARTITIONED|
-              assign [$$41] <- [$$D.getField("items")] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+              assign [$$41] <- [$$D.getField("items")]
               -- ASSIGN  |PARTITIONED|
-                project ([$$D]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                project ([$$D])
                 -- STREAM_PROJECT  |PARTITIONED|
-                  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                  exchange
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    data-scan []<-[$$38, $$D] <- TestDataverse.Dataset1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                    data-scan []<-[$$38, $$D] <- TestDataverse.Dataset1
                     -- DATASOURCE_SCAN  |PARTITIONED|
                       exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/atomic-and-array-queries/query5.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/atomic-and-array-queries/query5.plan
index 260dd51..117496f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/atomic-and-array-queries/query5.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/atomic-and-array-queries/query5.plan
@@ -1,50 +1,56 @@
-distribute result [$$55] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+distribute result [$$55]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$55] <- [{"D": $$D}] project: [$$55] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+    assign [$$55] <- [{"D": $$D}] project: [$$55]
     -- ASSIGN  |PARTITIONED|
-      select ($$50) project: [$$D] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+      select ($$50) project: [$$D]
       -- STREAM_SELECT  |PARTITIONED|
-        project ([$$D, $$50]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+        project ([$$D, $$50])
         -- STREAM_PROJECT  |PARTITIONED|
           subplan {
                     aggregate [$$50] <- [non-empty-stream()]
                     -- AGGREGATE  |LOCAL|
                       select ($$48)
                       -- STREAM_SELECT  |LOCAL|
-                        subplan {
-                                  aggregate [$$48] <- [non-empty-stream()]
-                                  -- AGGREGATE  |LOCAL|
-                                    select (and(eq($$64, 2), eq($$63, 3), eq($$62, 3)))
-                                    -- STREAM_SELECT  |LOCAL|
-                                      assign [$$64, $$63, $$62] <- [$$DII.getField("field2"), $$DII.getField("field3"), $$DII.getField("field3_notindexed")]
-                                      -- ASSIGN  |LOCAL|
-                                        unnest $$DII <- scan-collection($$61)
-                                        -- UNNEST  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
-                               }
-                        -- SUBPLAN  |LOCAL|
-                          select (eq($$60, 2))
-                          -- STREAM_SELECT  |LOCAL|
-                            assign [$$61, $$60] <- [$$DOI.getField("inner_items"), $$DOI.getField("field2_notindexed")]
-                            -- ASSIGN  |LOCAL|
-                              unnest $$DOI <- scan-collection($$59)
-                              -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                 } [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                        project ([$$48])
+                        -- STREAM_PROJECT  |LOCAL|
+                          subplan {
+                                    aggregate [$$48] <- [non-empty-stream()]
+                                    -- AGGREGATE  |LOCAL|
+                                      select (and(eq($$64, 2), eq($$63, 3), eq($$62, 3)))
+                                      -- STREAM_SELECT  |LOCAL|
+                                        assign [$$64, $$63, $$62] <- [$$DII.getField("field2"), $$DII.getField("field3"), $$DII.getField("field3_notindexed")] project: [$$64, $$63, $$62]
+                                        -- ASSIGN  |LOCAL|
+                                          unnest $$DII <- scan-collection($$61) project: [$$DII]
+                                          -- UNNEST  |LOCAL|
+                                            project ([$$61])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                 }
+                          -- SUBPLAN  |LOCAL|
+                            select (eq($$60, 2)) project: [$$61]
+                            -- STREAM_SELECT  |LOCAL|
+                              assign [$$61, $$60] <- [$$DOI.getField("inner_items"), $$DOI.getField("field2_notindexed")] project: [$$61, $$60]
+                              -- ASSIGN  |LOCAL|
+                                unnest $$DOI <- scan-collection($$59) project: [$$DOI]
+                                -- UNNEST  |LOCAL|
+                                  project ([$$59])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                 }
           -- SUBPLAN  |PARTITIONED|
             select (and(eq($$D.getField("field1"), 1), eq($$D.getField("field4"), 4)))
             -- STREAM_SELECT  |PARTITIONED|
-              assign [$$59] <- [$$D.getField("outer_items")] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+              assign [$$59] <- [$$D.getField("outer_items")]
               -- ASSIGN  |PARTITIONED|
-                project ([$$D]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                project ([$$D])
                 -- STREAM_PROJECT  |PARTITIONED|
-                  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                  exchange
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    data-scan []<-[$$56, $$D] <- TestDataverse.Dataset1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                    data-scan []<-[$$56, $$D] <- TestDataverse.Dataset1
                     -- DATASOURCE_SCAN  |PARTITIONED|
                       exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/atomic-and-array-queries/query8.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/atomic-and-array-queries/query8.plan
index c98f46e..431b4f7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/atomic-and-array-queries/query8.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/atomic-and-array-queries/query8.plan
@@ -1,33 +1,35 @@
-distribute result [$$57] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+distribute result [$$57]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$57] <- [{"D2": $$D2, "D1": $$D1}] project: [$$57] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+    assign [$$57] <- [{"D2": $$D2, "D1": $$D1}] project: [$$57]
     -- ASSIGN  |PARTITIONED|
       select ($$50) project: [$$D2, $$D1]
       -- STREAM_SELECT  |PARTITIONED|
-        project ([$$D2, $$D1, $$50]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+        project ([$$D2, $$D1, $$50])
         -- STREAM_PROJECT  |PARTITIONED|
           subplan {
                     aggregate [$$50] <- [non-empty-stream()]
                     -- AGGREGATE  |LOCAL|
                       select (and(eq($$69, to-bigint($$70)), eq($$67, to-bigint($$68))))
                       -- STREAM_SELECT  |LOCAL|
-                        assign [$$69, $$67] <- [$$D1I.getField("field2"), $$D1I.getField("field3")]
+                        assign [$$69, $$67] <- [$$D1I.getField("field2"), $$D1I.getField("field3")] project: [$$70, $$68, $$69, $$67]
                         -- ASSIGN  |LOCAL|
-                          unnest $$D1I <- scan-collection($$66)
+                          unnest $$D1I <- scan-collection($$66) project: [$$70, $$68, $$D1I]
                           -- UNNEST  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                 } [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            project ([$$70, $$68, $$66])
+                            -- STREAM_PROJECT  |LOCAL|
+                              nested tuple source
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                 }
           -- SUBPLAN  |PARTITIONED|
-            assign [$$66] <- [$$D1.getField("items")] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+            assign [$$66] <- [$$D1.getField("items")]
             -- ASSIGN  |PARTITIONED|
-              project ([$$D2, $$70, $$68, $$D1]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+              project ([$$D2, $$70, $$68, $$D1])
               -- STREAM_PROJECT  |PARTITIONED|
-                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                exchange
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  unnest-map [$$59, $$D1] <- index-search("Dataset1", 0, "Default", "TestDataverse", "Dataset1", true, false, 1, $$77, 1, $$77, true, true, true) [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                  unnest-map [$$59, $$D1] <- index-search("Dataset1", 0, "Default", "TestDataverse", "Dataset1", true, false, 1, $$77, 1, $$77, true, true, true)
                   -- BTREE_SEARCH  |PARTITIONED|
                     exchange
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -61,7 +63,7 @@
                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                   exchange
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    data-scan []<-[$$58, $$D2] <- TestDataverse.Dataset2 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                    data-scan []<-[$$58, $$D2] <- TestDataverse.Dataset2
                                                     -- DATASOURCE_SCAN  |PARTITIONED|
                                                       exchange
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/atomic-and-array-queries/query9.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/atomic-and-array-queries/query9.plan
index e0f846d..12d38cc 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/atomic-and-array-queries/query9.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/atomic-and-array-queries/query9.plan
@@ -1,48 +1,54 @@
-distribute result [$$79] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+distribute result [$$79]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$79] <- [{"D2": $$D2, "D1": $$D1}] project: [$$79] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+    assign [$$79] <- [{"D2": $$D2, "D1": $$D1}] project: [$$79]
     -- ASSIGN  |PARTITIONED|
       select ($$72) project: [$$D2, $$D1]
       -- STREAM_SELECT  |PARTITIONED|
-        project ([$$D2, $$D1, $$72]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+        project ([$$D2, $$D1, $$72])
         -- STREAM_PROJECT  |PARTITIONED|
           subplan {
                     aggregate [$$72] <- [non-empty-stream()]
                     -- AGGREGATE  |LOCAL|
                       select ($$70)
                       -- STREAM_SELECT  |LOCAL|
-                        subplan {
-                                  aggregate [$$70] <- [non-empty-stream()]
-                                  -- AGGREGATE  |LOCAL|
-                                    select (and(eq($$96, to-bigint($$97)), eq($$94, to-bigint($$95)), eq($$92, to-bigint($$93))))
-                                    -- STREAM_SELECT  |LOCAL|
-                                      assign [$$96, $$94, $$92] <- [$$DII.getField("field2"), $$DII.getField("field3"), $$DII.getField("field3_notindexed")]
-                                      -- ASSIGN  |LOCAL|
-                                        unnest $$DII <- scan-collection($$91)
-                                        -- UNNEST  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
-                               }
-                        -- SUBPLAN  |LOCAL|
-                          select (eq($$89, to-bigint($$90)))
-                          -- STREAM_SELECT  |LOCAL|
-                            assign [$$91, $$89] <- [$$DOI.getField("inner_items"), $$DOI.getField("field2_notindexed")]
-                            -- ASSIGN  |LOCAL|
-                              unnest $$DOI <- scan-collection($$88)
-                              -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                 } [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                        project ([$$70])
+                        -- STREAM_PROJECT  |LOCAL|
+                          subplan {
+                                    aggregate [$$70] <- [non-empty-stream()]
+                                    -- AGGREGATE  |LOCAL|
+                                      select (and(eq($$96, to-bigint($$97)), eq($$94, to-bigint($$95)), eq($$92, to-bigint($$93))))
+                                      -- STREAM_SELECT  |LOCAL|
+                                        assign [$$96, $$94, $$92] <- [$$DII.getField("field2"), $$DII.getField("field3"), $$DII.getField("field3_notindexed")] project: [$$97, $$95, $$93, $$96, $$94, $$92]
+                                        -- ASSIGN  |LOCAL|
+                                          unnest $$DII <- scan-collection($$91) project: [$$97, $$95, $$93, $$DII]
+                                          -- UNNEST  |LOCAL|
+                                            project ([$$97, $$95, $$93, $$91])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                 }
+                          -- SUBPLAN  |LOCAL|
+                            select (eq($$89, to-bigint($$90))) project: [$$97, $$95, $$93, $$91]
+                            -- STREAM_SELECT  |LOCAL|
+                              assign [$$91, $$89] <- [$$DOI.getField("inner_items"), $$DOI.getField("field2_notindexed")] project: [$$97, $$95, $$93, $$90, $$91, $$89]
+                              -- ASSIGN  |LOCAL|
+                                unnest $$DOI <- scan-collection($$88) project: [$$97, $$95, $$93, $$90, $$DOI]
+                                -- UNNEST  |LOCAL|
+                                  project ([$$97, $$95, $$93, $$90, $$88])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                 }
           -- SUBPLAN  |PARTITIONED|
-            assign [$$88] <- [$$D1.getField("outer_items")] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+            assign [$$88] <- [$$D1.getField("outer_items")]
             -- ASSIGN  |PARTITIONED|
-              project ([$$D2, $$97, $$95, $$93, $$90, $$D1]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+              project ([$$D2, $$97, $$95, $$93, $$90, $$D1])
               -- STREAM_PROJECT  |PARTITIONED|
-                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                exchange
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  unnest-map [$$81, $$D1] <- index-search("Dataset1", 0, "Default", "TestDataverse", "Dataset1", true, false, 1, $$108, 1, $$108, true, true, true) [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                  unnest-map [$$81, $$D1] <- index-search("Dataset1", 0, "Default", "TestDataverse", "Dataset1", true, false, 1, $$108, 1, $$108, true, true, true)
                   -- BTREE_SEARCH  |PARTITIONED|
                     exchange
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -76,7 +82,7 @@
                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                   exchange
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    data-scan []<-[$$80, $$D2] <- TestDataverse.Dataset2 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                    data-scan []<-[$$80, $$D2] <- TestDataverse.Dataset2
                                                     -- DATASOURCE_SCAN  |PARTITIONED|
                                                       exchange
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/multiple-indexes/query1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/multiple-indexes/query1.plan
index afb642e62..74994b8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/multiple-indexes/query1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/multiple-indexes/query1.plan
@@ -1,33 +1,35 @@
-distribute result [$$32] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+distribute result [$$32]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$32] <- [{"k": $$k}] project: [$$32] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+    assign [$$32] <- [{"k": $$k}] project: [$$32]
     -- ASSIGN  |PARTITIONED|
-      select ($$30) project: [$$k] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+      select ($$30) project: [$$k]
       -- STREAM_SELECT  |PARTITIONED|
-        project ([$$k, $$30]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+        project ([$$k, $$30])
         -- STREAM_PROJECT  |PARTITIONED|
           subplan {
                     aggregate [$$30] <- [non-empty-stream()]
                     -- AGGREGATE  |LOCAL|
                       select (and(eq($$36, 284), eq($$35, 263)))
                       -- STREAM_SELECT  |LOCAL|
-                        assign [$$36, $$35] <- [$$v.getField("a"), $$v.getField("b")]
+                        assign [$$36, $$35] <- [$$v.getField("a"), $$v.getField("b")] project: [$$36, $$35]
                         -- ASSIGN  |LOCAL|
-                          unnest $$v <- scan-collection($$34)
+                          unnest $$v <- scan-collection($$34) project: [$$v]
                           -- UNNEST  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                 } [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            project ([$$34])
+                            -- STREAM_PROJECT  |LOCAL|
+                              nested tuple source
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                 }
           -- SUBPLAN  |PARTITIONED|
-            assign [$$34] <- [$$k.getField("uarr_i")] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+            assign [$$34] <- [$$k.getField("uarr_i")]
             -- ASSIGN  |PARTITIONED|
-              project ([$$k]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+              project ([$$k])
               -- STREAM_PROJECT  |PARTITIONED|
-                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                exchange
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  data-scan []<-[$$33, $$k] <- test.KSI [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                  data-scan []<-[$$33, $$k] <- test.KSI
                   -- DATASOURCE_SCAN  |PARTITIONED|
                     exchange
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/multiple-indexes/query2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/multiple-indexes/query2.plan
index b226f93..bcfdc05 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/multiple-indexes/query2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/multiple-indexes/query2.plan
@@ -1,33 +1,35 @@
-distribute result [$$34] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+distribute result [$$34]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$34] <- [{"k": $$k}] project: [$$34] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+    assign [$$34] <- [{"k": $$k}] project: [$$34]
     -- ASSIGN  |PARTITIONED|
-      select ($$32) project: [$$k] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+      select ($$32) project: [$$k]
       -- STREAM_SELECT  |PARTITIONED|
-        project ([$$k, $$32]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+        project ([$$k, $$32])
         -- STREAM_PROJECT  |PARTITIONED|
           subplan {
                     aggregate [$$32] <- [non-empty-stream()]
                     -- AGGREGATE  |LOCAL|
                       select (and(eq($$39, 284), eq($$38, 263), eq($$37, 123)))
                       -- STREAM_SELECT  |LOCAL|
-                        assign [$$39, $$38, $$37] <- [$$v.getField("a"), $$v.getField("b"), $$v.getField("c")]
+                        assign [$$39, $$38, $$37] <- [$$v.getField("a"), $$v.getField("b"), $$v.getField("c")] project: [$$39, $$38, $$37]
                         -- ASSIGN  |LOCAL|
-                          unnest $$v <- scan-collection($$36)
+                          unnest $$v <- scan-collection($$36) project: [$$v]
                           -- UNNEST  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                 } [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            project ([$$36])
+                            -- STREAM_PROJECT  |LOCAL|
+                              nested tuple source
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                 }
           -- SUBPLAN  |PARTITIONED|
-            assign [$$36] <- [$$k.getField("uarr_i")] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+            assign [$$36] <- [$$k.getField("uarr_i")]
             -- ASSIGN  |PARTITIONED|
-              project ([$$k]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+              project ([$$k])
               -- STREAM_PROJECT  |PARTITIONED|
-                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                exchange
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  data-scan []<-[$$35, $$k] <- test.KSI [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                  data-scan []<-[$$35, $$k] <- test.KSI
                   -- DATASOURCE_SCAN  |PARTITIONED|
                     exchange
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/multiple-quantifiers/query7.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/multiple-quantifiers/query7.plan
index 13c7d3b..81266ca 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/multiple-quantifiers/query7.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/multiple-quantifiers/query7.plan
@@ -1,35 +1,37 @@
-distribute result [$$46] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+distribute result [$$46]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$46] <- [{"D1": $$D1}] project: [$$46] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+    assign [$$46] <- [{"D1": $$D1}] project: [$$46]
     -- ASSIGN  |PARTITIONED|
-      select (and($$42, eq($$43, 0))) project: [$$D1] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+      select (and($$42, eq($$43, 0))) project: [$$D1]
       -- STREAM_SELECT  |PARTITIONED|
-        project ([$$D1, $$42, $$43]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+        project ([$$D1, $$42, $$43])
         -- STREAM_PROJECT  |PARTITIONED|
           subplan {
                     aggregate [$$42, $$43] <- [non-empty-stream(), agg-sql-count(switch-case(and(eq($$50, 1), eq($$51, 2)), true, null, true))]
                     -- AGGREGATE  |LOCAL|
                       assign [$$51] <- [$$J.getField("item")]
                       -- ASSIGN  |LOCAL|
-                        unnest $$J <- scan-collection($$49)
+                        unnest $$J <- scan-collection($$49) project: [$$50, $$J]
                         -- UNNEST  |LOCAL|
-                          assign [$$50] <- [$$I.getField(0)]
+                          assign [$$50] <- [$$I.getField(0)] project: [$$49, $$50]
                           -- ASSIGN  |LOCAL|
-                            unnest $$I <- scan-collection($$48)
+                            unnest $$I <- scan-collection($$48) project: [$$49, $$I]
                             -- UNNEST  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
-                 } [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                              project ([$$49, $$48])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                 }
           -- SUBPLAN  |PARTITIONED|
-            assign [$$49, $$48] <- [$$D1.getField("other_items"), $$D1.getField(1)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+            assign [$$49, $$48] <- [$$D1.getField("other_items"), $$D1.getField(1)]
             -- ASSIGN  |PARTITIONED|
-              project ([$$D1]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+              project ([$$D1])
               -- STREAM_PROJECT  |PARTITIONED|
-                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                exchange
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  data-scan []<-[$$47, $$D1] <- TestDataverse.Dataset1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                  data-scan []<-[$$47, $$D1] <- TestDataverse.Dataset1
                   -- DATASOURCE_SCAN  |PARTITIONED|
                     exchange
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-1/query1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-1/query1.plan
index f7afed9..d7aeb01 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-1/query1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-1/query1.plan
@@ -1,31 +1,33 @@
-distribute result [$$20] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+distribute result [$$20]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$20] <- [{"business_id": $$23}] project: [$$20] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+    assign [$$20] <- [{"business_id": $$23}] project: [$$20]
     -- ASSIGN  |PARTITIONED|
-      select ($$17) project: [$$23] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+      select ($$17) project: [$$23]
       -- STREAM_SELECT  |PARTITIONED|
-        project ([$$23, $$17]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+        project ([$$23, $$17])
         -- STREAM_PROJECT  |PARTITIONED|
           subplan {
                     aggregate [$$17] <- [non-empty-stream()]
                     -- AGGREGATE  |LOCAL|
                       select (eq("2016-04-26 19:49:16", $#1))
                       -- STREAM_SELECT  |LOCAL|
-                        unnest $#1 <- scan-collection($$22)
+                        unnest $#1 <- scan-collection($$22) project: [$#1]
                         -- UNNEST  |LOCAL|
-                          nested tuple source
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
-                 } [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                          project ([$$22])
+                          -- STREAM_PROJECT  |LOCAL|
+                            nested tuple source
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                 }
           -- SUBPLAN  |PARTITIONED|
-            assign [$$23, $$22] <- [$$C.getField(1), $$C.getField(2)] project: [$$23, $$22] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+            assign [$$23, $$22] <- [$$C.getField(1), $$C.getField(2)] project: [$$23, $$22]
             -- ASSIGN  |PARTITIONED|
-              project ([$$C]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+              project ([$$C])
               -- STREAM_PROJECT  |PARTITIONED|
-                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                exchange
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  data-scan []<-[$$21, $$C] <- TestYelp.YelpCheckin [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                  data-scan []<-[$$21, $$C] <- TestYelp.YelpCheckin
                   -- DATASOURCE_SCAN  |PARTITIONED|
                     exchange
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-1/query2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-1/query2.plan
index a169f12..95bc1ec 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-1/query2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-1/query2.plan
@@ -1,37 +1,39 @@
-distribute result [$$50] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+distribute result [$$50]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    assign [$$50] <- [{"$1": $$52}] project: [$$50] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+    assign [$$50] <- [{"$1": $$52}] project: [$$50]
     -- ASSIGN  |UNPARTITIONED|
-      aggregate [$$52] <- [agg-sql-sum($$54)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+      aggregate [$$52] <- [agg-sql-sum($$54)]
       -- AGGREGATE  |UNPARTITIONED|
-        exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+        exchange
         -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-          aggregate [$$54] <- [agg-sql-count(1)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+          aggregate [$$54] <- [agg-sql-count(1)]
           -- AGGREGATE  |PARTITIONED|
-            select ($$43) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+            select ($$43)
             -- STREAM_SELECT  |PARTITIONED|
-              project ([$$43]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+              project ([$$43])
               -- STREAM_PROJECT  |PARTITIONED|
                 subplan {
                           aggregate [$$43] <- [non-empty-stream()]
                           -- AGGREGATE  |LOCAL|
                             select (and(gt($$D, "2016"), lt($$D, "2017")))
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$D <- scan-collection($$53)
+                              unnest $$D <- scan-collection($$53) project: [$$D]
                               -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                       } [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                project ([$$53])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                       }
                 -- SUBPLAN  |PARTITIONED|
-                  assign [$$53] <- [$$C.getField(2)] project: [$$53] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                  assign [$$53] <- [$$C.getField(2)] project: [$$53]
                   -- ASSIGN  |PARTITIONED|
-                    project ([$$C]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                    project ([$$C])
                     -- STREAM_PROJECT  |PARTITIONED|
-                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                      exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$51, $$C] <- TestYelp.YelpCheckin [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                        data-scan []<-[$$51, $$C] <- TestYelp.YelpCheckin
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-1/query4.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-1/query4.plan
index ebc5e72..a002e0c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-1/query4.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-1/query4.plan
@@ -1,35 +1,37 @@
-distribute result [$$52] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+distribute result [$$52]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    assign [$$52] <- [{"$1": $$54}] project: [$$52] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+    assign [$$52] <- [{"$1": $$54}] project: [$$52]
     -- ASSIGN  |UNPARTITIONED|
-      aggregate [$$54] <- [agg-sql-sum($$56)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+      aggregate [$$54] <- [agg-sql-sum($$56)]
       -- AGGREGATE  |UNPARTITIONED|
-        exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+        exchange
         -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-          aggregate [$$56] <- [agg-sql-count(1)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+          aggregate [$$56] <- [agg-sql-count(1)]
           -- AGGREGATE  |PARTITIONED|
-            select (and($$43, eq($$44, 0))) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+            select (and($$43, eq($$44, 0)))
             -- STREAM_SELECT  |PARTITIONED|
-              project ([$$43, $$44]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+              project ([$$43, $$44])
               -- STREAM_PROJECT  |PARTITIONED|
                 subplan {
                           aggregate [$$43, $$44] <- [non-empty-stream(), agg-sql-count(switch-case(and(gt($$D, "2016"), lt($$D, "2017")), true, null, true))]
                           -- AGGREGATE  |LOCAL|
                             unnest $$D <- scan-collection($$55)
                             -- UNNEST  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
-                       } [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                              project ([$$55])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                       }
                 -- SUBPLAN  |PARTITIONED|
-                  assign [$$55] <- [$$C.getField(2)] project: [$$55] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                  assign [$$55] <- [$$C.getField(2)] project: [$$55]
                   -- ASSIGN  |PARTITIONED|
-                    project ([$$C]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                    project ([$$C])
                     -- STREAM_PROJECT  |PARTITIONED|
-                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                      exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$53, $$C] <- TestYelp.YelpCheckin [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                        data-scan []<-[$$53, $$C] <- TestYelp.YelpCheckin
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-2/query1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-2/query1.plan
index 6525e37..ea8a651 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-2/query1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-2/query1.plan
@@ -1,31 +1,33 @@
-distribute result [$$21] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+distribute result [$$21]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$21] <- [{"business_id": $$24}] project: [$$21] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+    assign [$$21] <- [{"business_id": $$24}] project: [$$21]
     -- ASSIGN  |PARTITIONED|
-      select ($$18) project: [$$24] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+      select ($$18) project: [$$24]
       -- STREAM_SELECT  |PARTITIONED|
-        project ([$$24, $$18]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+        project ([$$24, $$18])
         -- STREAM_PROJECT  |PARTITIONED|
           subplan {
                     aggregate [$$18] <- [non-empty-stream()]
                     -- AGGREGATE  |LOCAL|
                       select (eq("2016-04-26", $#1))
                       -- STREAM_SELECT  |LOCAL|
-                        unnest $#1 <- scan-collection($$23)
+                        unnest $#1 <- scan-collection($$23) project: [$#1]
                         -- UNNEST  |LOCAL|
-                          nested tuple source
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
-                 } [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                          project ([$$23])
+                          -- STREAM_PROJECT  |LOCAL|
+                            nested tuple source
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                 }
           -- SUBPLAN  |PARTITIONED|
-            assign [$$23, $$24] <- [$$C.getField(2).getField(0), $$C.getField(1)] project: [$$24, $$23] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+            assign [$$23, $$24] <- [$$C.getField(2).getField(0), $$C.getField(1)] project: [$$24, $$23]
             -- ASSIGN  |PARTITIONED|
-              project ([$$C]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+              project ([$$C])
               -- STREAM_PROJECT  |PARTITIONED|
-                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                exchange
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  data-scan []<-[$$22, $$C] <- TestYelp.YelpCheckin [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                  data-scan []<-[$$22, $$C] <- TestYelp.YelpCheckin
                   -- DATASOURCE_SCAN  |PARTITIONED|
                     exchange
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-2/query2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-2/query2.plan
index b0c8711..ed1b8a2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-2/query2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-2/query2.plan
@@ -1,37 +1,39 @@
-distribute result [$$51] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+distribute result [$$51]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    assign [$$51] <- [{"$1": $$53}] project: [$$51] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+    assign [$$51] <- [{"$1": $$53}] project: [$$51]
     -- ASSIGN  |UNPARTITIONED|
-      aggregate [$$53] <- [agg-sql-sum($$56)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+      aggregate [$$53] <- [agg-sql-sum($$56)]
       -- AGGREGATE  |UNPARTITIONED|
-        exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+        exchange
         -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-          aggregate [$$56] <- [agg-sql-count(1)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+          aggregate [$$56] <- [agg-sql-count(1)]
           -- AGGREGATE  |PARTITIONED|
-            select ($$44) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+            select ($$44)
             -- STREAM_SELECT  |PARTITIONED|
-              project ([$$44]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+              project ([$$44])
               -- STREAM_PROJECT  |PARTITIONED|
                 subplan {
                           aggregate [$$44] <- [non-empty-stream()]
                           -- AGGREGATE  |LOCAL|
                             select (and(gt($$D, "2016"), lt($$D, "2017")))
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$D <- scan-collection($$54)
+                              unnest $$D <- scan-collection($$54) project: [$$D]
                               -- UNNEST  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                       } [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                project ([$$54])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                       }
                 -- SUBPLAN  |PARTITIONED|
-                  assign [$$54] <- [$$C.getField(2).getField(0)] project: [$$54] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                  assign [$$54] <- [$$C.getField(2).getField(0)] project: [$$54]
                   -- ASSIGN  |PARTITIONED|
-                    project ([$$C]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                    project ([$$C])
                     -- STREAM_PROJECT  |PARTITIONED|
-                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                      exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$52, $$C] <- TestYelp.YelpCheckin [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                        data-scan []<-[$$52, $$C] <- TestYelp.YelpCheckin
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-2/query3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-2/query3.plan
index ab2e263..d366926 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-2/query3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-2/query3.plan
@@ -1,35 +1,37 @@
-distribute result [$$53] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+distribute result [$$53]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    assign [$$53] <- [{"$1": $$55}] project: [$$53] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+    assign [$$53] <- [{"$1": $$55}] project: [$$53]
     -- ASSIGN  |UNPARTITIONED|
-      aggregate [$$55] <- [agg-sql-sum($$58)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+      aggregate [$$55] <- [agg-sql-sum($$58)]
       -- AGGREGATE  |UNPARTITIONED|
-        exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+        exchange
         -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-          aggregate [$$58] <- [agg-sql-count(1)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+          aggregate [$$58] <- [agg-sql-count(1)]
           -- AGGREGATE  |PARTITIONED|
-            select (and($$44, eq($$45, 0))) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+            select (and($$44, eq($$45, 0)))
             -- STREAM_SELECT  |PARTITIONED|
-              project ([$$44, $$45]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+              project ([$$44, $$45])
               -- STREAM_PROJECT  |PARTITIONED|
                 subplan {
                           aggregate [$$44, $$45] <- [non-empty-stream(), agg-sql-count(switch-case(and(gt($$D, "2016"), lt($$D, "2017")), true, null, true))]
                           -- AGGREGATE  |LOCAL|
                             unnest $$D <- scan-collection($$56)
                             -- UNNEST  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
-                       } [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                              project ([$$56])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                       }
                 -- SUBPLAN  |PARTITIONED|
-                  assign [$$56] <- [$$C.getField(2).getField(0)] project: [$$56] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                  assign [$$56] <- [$$C.getField(2).getField(0)] project: [$$56]
                   -- ASSIGN  |PARTITIONED|
-                    project ([$$C]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                    project ([$$C])
                     -- STREAM_PROJECT  |PARTITIONED|
-                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                      exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$54, $$C] <- TestYelp.YelpCheckin [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                        data-scan []<-[$$54, $$C] <- TestYelp.YelpCheckin
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-3/query1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-3/query1.plan
index c804302..1336230 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-3/query1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-3/query1.plan
@@ -1,33 +1,35 @@
-distribute result [$$30] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+distribute result [$$30]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$30] <- [{"business_id": $$34}] project: [$$30] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+    assign [$$30] <- [{"business_id": $$34}] project: [$$30]
     -- ASSIGN  |PARTITIONED|
-      select ($$27) project: [$$34] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+      select ($$27) project: [$$34]
       -- STREAM_SELECT  |PARTITIONED|
-        project ([$$34, $$27]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+        project ([$$34, $$27])
         -- STREAM_PROJECT  |PARTITIONED|
           subplan {
                     aggregate [$$27] <- [non-empty-stream()]
                     -- AGGREGATE  |LOCAL|
                       select (eq("2016-04-26", $$33))
                       -- STREAM_SELECT  |LOCAL|
-                        assign [$$33] <- [$$D.getField(0)]
+                        assign [$$33] <- [$$D.getField(0)] project: [$$33]
                         -- ASSIGN  |LOCAL|
-                          unnest $$D <- scan-collection($$32)
+                          unnest $$D <- scan-collection($$32) project: [$$D]
                           -- UNNEST  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                 } [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            project ([$$32])
+                            -- STREAM_PROJECT  |LOCAL|
+                              nested tuple source
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                 }
           -- SUBPLAN  |PARTITIONED|
-            assign [$$34, $$32] <- [$$C.getField(1), $$C.getField(2)] project: [$$34, $$32] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+            assign [$$34, $$32] <- [$$C.getField(1), $$C.getField(2)] project: [$$34, $$32]
             -- ASSIGN  |PARTITIONED|
-              project ([$$C]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+              project ([$$C])
               -- STREAM_PROJECT  |PARTITIONED|
-                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                exchange
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  data-scan []<-[$$31, $$C] <- TestYelp.YelpCheckin [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                  data-scan []<-[$$31, $$C] <- TestYelp.YelpCheckin
                   -- DATASOURCE_SCAN  |PARTITIONED|
                     exchange
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-3/query2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-3/query2.plan
index 576d034..d9c28df 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-3/query2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-3/query2.plan
@@ -1,33 +1,35 @@
-distribute result [$$33] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+distribute result [$$33]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$33] <- [{"business_id": $$38}] project: [$$33] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+    assign [$$33] <- [{"business_id": $$38}] project: [$$33]
     -- ASSIGN  |PARTITIONED|
-      select ($$30) project: [$$38] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+      select ($$30) project: [$$38]
       -- STREAM_SELECT  |PARTITIONED|
-        project ([$$38, $$30]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+        project ([$$38, $$30])
         -- STREAM_PROJECT  |PARTITIONED|
           subplan {
                     aggregate [$$30] <- [non-empty-stream()]
                     -- AGGREGATE  |LOCAL|
                       select (and(eq($$37, "2016-04-26"), eq($$36, "19:49:16")))
                       -- STREAM_SELECT  |LOCAL|
-                        assign [$$37, $$36] <- [$$D.getField(0), $$D.getField(1)]
+                        assign [$$37, $$36] <- [$$D.getField(0), $$D.getField(1)] project: [$$37, $$36]
                         -- ASSIGN  |LOCAL|
-                          unnest $$D <- scan-collection($$35)
+                          unnest $$D <- scan-collection($$35) project: [$$D]
                           -- UNNEST  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                 } [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            project ([$$35])
+                            -- STREAM_PROJECT  |LOCAL|
+                              nested tuple source
+                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                 }
           -- SUBPLAN  |PARTITIONED|
-            assign [$$38, $$35] <- [$$C.getField(1), $$C.getField(2)] project: [$$38, $$35] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+            assign [$$38, $$35] <- [$$C.getField(1), $$C.getField(2)] project: [$$38, $$35]
             -- ASSIGN  |PARTITIONED|
-              project ([$$C]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+              project ([$$C])
               -- STREAM_PROJECT  |PARTITIONED|
-                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                exchange
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  data-scan []<-[$$34, $$C] <- TestYelp.YelpCheckin [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                  data-scan []<-[$$34, $$C] <- TestYelp.YelpCheckin
                   -- DATASOURCE_SCAN  |PARTITIONED|
                     exchange
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-3/query3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-3/query3.plan
index 61d3a04..8d07192 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-3/query3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/array-index/select-quantified-queries/use-case-3/query3.plan
@@ -1,31 +1,33 @@
-distribute result [$$35] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+distribute result [$$35]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$35] <- [{"business_id": $$40}] project: [$$35] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+    assign [$$35] <- [{"business_id": $$40}] project: [$$35]
     -- ASSIGN  |PARTITIONED|
-      select (and($$30, eq($$31, 0))) project: [$$40] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+      select (and($$30, eq($$31, 0))) project: [$$40]
       -- STREAM_SELECT  |PARTITIONED|
-        project ([$$40, $$30, $$31]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+        project ([$$40, $$30, $$31])
         -- STREAM_PROJECT  |PARTITIONED|
           subplan {
                     aggregate [$$30, $$31] <- [non-empty-stream(), agg-sql-count(switch-case(and(ge($$38, "2016"), le($$38, "2017")), true, null, true))]
                     -- AGGREGATE  |LOCAL|
                       assign [$$38] <- [$$D.getField(0)]
                       -- ASSIGN  |LOCAL|
-                        unnest $$D <- scan-collection($$37)
+                        unnest $$D <- scan-collection($$37) project: [$$D]
                         -- UNNEST  |LOCAL|
-                          nested tuple source
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
-                 } [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                          project ([$$37])
+                          -- STREAM_PROJECT  |LOCAL|
+                            nested tuple source
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                 }
           -- SUBPLAN  |PARTITIONED|
-            assign [$$40, $$37] <- [$$C.getField(1), $$C.getField(2)] project: [$$40, $$37] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+            assign [$$40, $$37] <- [$$C.getField(1), $$C.getField(2)] project: [$$40, $$37]
             -- ASSIGN  |PARTITIONED|
-              project ([$$C]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+              project ([$$C])
               -- STREAM_PROJECT  |PARTITIONED|
-                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                exchange
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  data-scan []<-[$$36, $$C] <- TestYelp.YelpCheckin [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                  data-scan []<-[$$36, $$C] <- TestYelp.YelpCheckin
                   -- DATASOURCE_SCAN  |PARTITIONED|
                     exchange
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/btree-index-selection/intersection-misc/intersection-misc-01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/btree-index-selection/intersection-misc/intersection-misc-01.plan
index cf06553..9fc45a0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/btree-index-selection/intersection-misc/intersection-misc-01.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/btree-index-selection/intersection-misc/intersection-misc-01.plan
@@ -26,50 +26,52 @@
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           join (eq($$142, $$136))
                           -- HYBRID_HASH_JOIN [$$142][$$136]  |PARTITIONED|
-                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            exchange
                             -- HASH_PARTITION_EXCHANGE [$$142]  |PARTITIONED|
-                              assign [$$95] <- [{"c3": $$142}] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                              assign [$$95] <- [{"c3": $$142}]
                               -- ASSIGN  |PARTITIONED|
                                 select ($$89) project: [$$142]
                                 -- STREAM_SELECT  |PARTITIONED|
-                                  project ([$$89, $$142]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                  project ([$$89, $$142])
                                   -- STREAM_PROJECT  |PARTITIONED|
-                                    exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                    exchange
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       group by ([$$149 := $$130]) decor ([$$142]) {
                                                 aggregate [$$89] <- [non-empty-stream()]
                                                 -- AGGREGATE  |LOCAL|
                                                   select (not(is-missing($$148)))
                                                   -- STREAM_SELECT  |LOCAL|
-                                                    nested tuple source
-                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                             } [cardinality: 0.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                    project ([$$148])
+                                                    -- STREAM_PROJECT  |LOCAL|
+                                                      nested tuple source
+                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                             }
                                       -- PRE_CLUSTERED_GROUP_BY[$$130]  |PARTITIONED|
-                                        exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                        exchange
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          order (ASC, $$130) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                          order (ASC, $$130)
                                           -- STABLE_SORT [$$130(ASC)]  |PARTITIONED|
-                                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                            exchange
                                             -- HASH_PARTITION_EXCHANGE [$$130]  |PARTITIONED|
-                                              project ([$$142, $$148, $$130]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                              project ([$$142, $$148, $$130])
                                               -- STREAM_PROJECT  |PARTITIONED|
-                                                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                exchange
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  left outer join (eq($$139, $$85)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                  left outer join (eq($$139, $$85))
                                                   -- HYBRID_HASH_JOIN [$$139][$$85]  |PARTITIONED|
-                                                    exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                    exchange
                                                     -- HASH_PARTITION_EXCHANGE [$$139]  |PARTITIONED|
-                                                      select (eq($$d.getField("c5"), 1)) project: [$$142, $$130, $$139] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                      select (eq($$d.getField("c5"), 1)) project: [$$142, $$130, $$139]
                                                       -- STREAM_SELECT  |PARTITIONED|
-                                                        assign [$$142, $$139] <- [$$d.getField("c3"), $$d.getField("c1")] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                        assign [$$142, $$139] <- [$$d.getField("c3"), $$d.getField("c1")]
                                                         -- ASSIGN  |PARTITIONED|
-                                                          exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                          exchange
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                            replicate
                                                             -- REPLICATE  |PARTITIONED|
-                                                              exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                              exchange
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                data-scan []<-[$$130, $$d] <- test.d [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                data-scan []<-[$$130, $$d] <- test.d
                                                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                                                   exchange
                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -87,76 +89,78 @@
                                                             -- STREAM_PROJECT  |PARTITIONED|
                                                               exchange
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                data-scan []<-[$$131, $$c] <- test.c [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                data-scan []<-[$$131, $$c] <- test.c
                                                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                                                   exchange
                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                     empty-tuple-source
                                                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            exchange
                             -- HASH_PARTITION_EXCHANGE [$$136]  |PARTITIONED|
-                              assign [$$137, $$136] <- [$$t2.getField("c4"), $$t2.getField("c2")] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                              assign [$$137, $$136] <- [$$t2.getField("c4"), $$t2.getField("c2")]
                               -- ASSIGN  |PARTITIONED|
-                                assign [$$132, $$t2] <- [$$130, $$d] project: [$$132, $$t2] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                assign [$$132, $$t2] <- [$$130, $$d] project: [$$132, $$t2]
                                 -- ASSIGN  |PARTITIONED|
-                                  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                  exchange
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                    replicate
                                     -- REPLICATE  |PARTITIONED|
-                                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                      exchange
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        data-scan []<-[$$130, $$d] <- test.d [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                        data-scan []<-[$$130, $$d] <- test.d
                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                           exchange
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                             empty-tuple-source
                                             -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                    exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                    exchange
                     -- HASH_PARTITION_EXCHANGE [$$144]  |PARTITIONED|
-                      assign [$$119] <- [{"c4": $$144}] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                      assign [$$119] <- [{"c4": $$144}]
                       -- ASSIGN  |PARTITIONED|
                         select ($$108) project: [$$144]
                         -- STREAM_SELECT  |PARTITIONED|
-                          project ([$$108, $$144]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                          project ([$$108, $$144])
                           -- STREAM_PROJECT  |PARTITIONED|
-                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            exchange
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                               group by ([$$151 := $$133]) decor ([$$144]) {
                                         aggregate [$$108] <- [non-empty-stream()]
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$150)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                     } [cardinality: 0.0, op-cost: 0.0, total-cost: 1000000.0]
+                                            project ([$$150])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                     }
                               -- PRE_CLUSTERED_GROUP_BY[$$133]  |PARTITIONED|
-                                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  order (ASC, $$133) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                  order (ASC, $$133)
                                   -- STABLE_SORT [$$133(ASC)]  |PARTITIONED|
-                                    exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                    exchange
                                     -- HASH_PARTITION_EXCHANGE [$$133]  |PARTITIONED|
-                                      project ([$$144, $$150, $$133]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                      project ([$$144, $$150, $$133])
                                       -- STREAM_PROJECT  |PARTITIONED|
-                                        exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                        exchange
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          left outer join (eq($$140, $$104)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                          left outer join (eq($$140, $$104))
                                           -- HYBRID_HASH_JOIN [$$140][$$104]  |PARTITIONED|
-                                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                            exchange
                                             -- HASH_PARTITION_EXCHANGE [$$140]  |PARTITIONED|
-                                              select (and(eq($$d.getField("c5"), 1), ge($$129, "2019-01-01"), le($$129, "2019-02-01"))) project: [$$144, $$133, $$140] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                              select (and(eq($$d.getField("c5"), 1), ge($$129, "2019-01-01"), le($$129, "2019-02-01"))) project: [$$144, $$133, $$140]
                                               -- STREAM_SELECT  |PARTITIONED|
-                                                assign [$$144, $$129, $$140] <- [$$d.getField("c4"), $$d.getField("c6"), $$d.getField("c1")] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                assign [$$144, $$129, $$140] <- [$$d.getField("c4"), $$d.getField("c6"), $$d.getField("c1")]
                                                 -- ASSIGN  |PARTITIONED|
-                                                  assign [$$133, $$d] <- [$$130, $$d] project: [$$133, $$d] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                  assign [$$133, $$d] <- [$$130, $$d] project: [$$133, $$d]
                                                   -- ASSIGN  |PARTITIONED|
-                                                    exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                    exchange
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                      replicate
                                                       -- REPLICATE  |PARTITIONED|
-                                                        exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                        exchange
                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          data-scan []<-[$$130, $$d] <- test.d [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                          data-scan []<-[$$130, $$d] <- test.d
                                                           -- DATASOURCE_SCAN  |PARTITIONED|
                                                             exchange
                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -178,7 +182,7 @@
                                                         -- STREAM_PROJECT  |PARTITIONED|
                                                           exchange
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            data-scan []<-[$$131, $$c] <- test.c [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                            data-scan []<-[$$131, $$c] <- test.c
                                                             -- DATASOURCE_SCAN  |PARTITIONED|
                                                               exchange
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/btree-index-selection/intersection-misc/intersection-misc-02.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/btree-index-selection/intersection-misc/intersection-misc-02.plan
index cf06553..9fc45a0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/btree-index-selection/intersection-misc/intersection-misc-02.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/btree-index-selection/intersection-misc/intersection-misc-02.plan
@@ -26,50 +26,52 @@
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           join (eq($$142, $$136))
                           -- HYBRID_HASH_JOIN [$$142][$$136]  |PARTITIONED|
-                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            exchange
                             -- HASH_PARTITION_EXCHANGE [$$142]  |PARTITIONED|
-                              assign [$$95] <- [{"c3": $$142}] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                              assign [$$95] <- [{"c3": $$142}]
                               -- ASSIGN  |PARTITIONED|
                                 select ($$89) project: [$$142]
                                 -- STREAM_SELECT  |PARTITIONED|
-                                  project ([$$89, $$142]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                  project ([$$89, $$142])
                                   -- STREAM_PROJECT  |PARTITIONED|
-                                    exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                    exchange
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       group by ([$$149 := $$130]) decor ([$$142]) {
                                                 aggregate [$$89] <- [non-empty-stream()]
                                                 -- AGGREGATE  |LOCAL|
                                                   select (not(is-missing($$148)))
                                                   -- STREAM_SELECT  |LOCAL|
-                                                    nested tuple source
-                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                             } [cardinality: 0.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                    project ([$$148])
+                                                    -- STREAM_PROJECT  |LOCAL|
+                                                      nested tuple source
+                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                             }
                                       -- PRE_CLUSTERED_GROUP_BY[$$130]  |PARTITIONED|
-                                        exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                        exchange
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          order (ASC, $$130) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                          order (ASC, $$130)
                                           -- STABLE_SORT [$$130(ASC)]  |PARTITIONED|
-                                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                            exchange
                                             -- HASH_PARTITION_EXCHANGE [$$130]  |PARTITIONED|
-                                              project ([$$142, $$148, $$130]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                              project ([$$142, $$148, $$130])
                                               -- STREAM_PROJECT  |PARTITIONED|
-                                                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                exchange
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  left outer join (eq($$139, $$85)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                  left outer join (eq($$139, $$85))
                                                   -- HYBRID_HASH_JOIN [$$139][$$85]  |PARTITIONED|
-                                                    exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                    exchange
                                                     -- HASH_PARTITION_EXCHANGE [$$139]  |PARTITIONED|
-                                                      select (eq($$d.getField("c5"), 1)) project: [$$142, $$130, $$139] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                      select (eq($$d.getField("c5"), 1)) project: [$$142, $$130, $$139]
                                                       -- STREAM_SELECT  |PARTITIONED|
-                                                        assign [$$142, $$139] <- [$$d.getField("c3"), $$d.getField("c1")] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                        assign [$$142, $$139] <- [$$d.getField("c3"), $$d.getField("c1")]
                                                         -- ASSIGN  |PARTITIONED|
-                                                          exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                          exchange
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                            replicate
                                                             -- REPLICATE  |PARTITIONED|
-                                                              exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                              exchange
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                data-scan []<-[$$130, $$d] <- test.d [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                data-scan []<-[$$130, $$d] <- test.d
                                                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                                                   exchange
                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -87,76 +89,78 @@
                                                             -- STREAM_PROJECT  |PARTITIONED|
                                                               exchange
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                data-scan []<-[$$131, $$c] <- test.c [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                data-scan []<-[$$131, $$c] <- test.c
                                                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                                                   exchange
                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                     empty-tuple-source
                                                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            exchange
                             -- HASH_PARTITION_EXCHANGE [$$136]  |PARTITIONED|
-                              assign [$$137, $$136] <- [$$t2.getField("c4"), $$t2.getField("c2")] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                              assign [$$137, $$136] <- [$$t2.getField("c4"), $$t2.getField("c2")]
                               -- ASSIGN  |PARTITIONED|
-                                assign [$$132, $$t2] <- [$$130, $$d] project: [$$132, $$t2] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                assign [$$132, $$t2] <- [$$130, $$d] project: [$$132, $$t2]
                                 -- ASSIGN  |PARTITIONED|
-                                  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                  exchange
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                    replicate
                                     -- REPLICATE  |PARTITIONED|
-                                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                      exchange
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        data-scan []<-[$$130, $$d] <- test.d [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                        data-scan []<-[$$130, $$d] <- test.d
                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                           exchange
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                             empty-tuple-source
                                             -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                    exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                    exchange
                     -- HASH_PARTITION_EXCHANGE [$$144]  |PARTITIONED|
-                      assign [$$119] <- [{"c4": $$144}] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                      assign [$$119] <- [{"c4": $$144}]
                       -- ASSIGN  |PARTITIONED|
                         select ($$108) project: [$$144]
                         -- STREAM_SELECT  |PARTITIONED|
-                          project ([$$108, $$144]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                          project ([$$108, $$144])
                           -- STREAM_PROJECT  |PARTITIONED|
-                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            exchange
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                               group by ([$$151 := $$133]) decor ([$$144]) {
                                         aggregate [$$108] <- [non-empty-stream()]
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$150)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                     } [cardinality: 0.0, op-cost: 0.0, total-cost: 1000000.0]
+                                            project ([$$150])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                     }
                               -- PRE_CLUSTERED_GROUP_BY[$$133]  |PARTITIONED|
-                                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  order (ASC, $$133) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                  order (ASC, $$133)
                                   -- STABLE_SORT [$$133(ASC)]  |PARTITIONED|
-                                    exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                    exchange
                                     -- HASH_PARTITION_EXCHANGE [$$133]  |PARTITIONED|
-                                      project ([$$144, $$150, $$133]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                      project ([$$144, $$150, $$133])
                                       -- STREAM_PROJECT  |PARTITIONED|
-                                        exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                        exchange
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          left outer join (eq($$140, $$104)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                          left outer join (eq($$140, $$104))
                                           -- HYBRID_HASH_JOIN [$$140][$$104]  |PARTITIONED|
-                                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                            exchange
                                             -- HASH_PARTITION_EXCHANGE [$$140]  |PARTITIONED|
-                                              select (and(eq($$d.getField("c5"), 1), ge($$129, "2019-01-01"), le($$129, "2019-02-01"))) project: [$$144, $$133, $$140] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                              select (and(eq($$d.getField("c5"), 1), ge($$129, "2019-01-01"), le($$129, "2019-02-01"))) project: [$$144, $$133, $$140]
                                               -- STREAM_SELECT  |PARTITIONED|
-                                                assign [$$144, $$129, $$140] <- [$$d.getField("c4"), $$d.getField("c6"), $$d.getField("c1")] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                assign [$$144, $$129, $$140] <- [$$d.getField("c4"), $$d.getField("c6"), $$d.getField("c1")]
                                                 -- ASSIGN  |PARTITIONED|
-                                                  assign [$$133, $$d] <- [$$130, $$d] project: [$$133, $$d] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                  assign [$$133, $$d] <- [$$130, $$d] project: [$$133, $$d]
                                                   -- ASSIGN  |PARTITIONED|
-                                                    exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                    exchange
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                      replicate
                                                       -- REPLICATE  |PARTITIONED|
-                                                        exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                        exchange
                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          data-scan []<-[$$130, $$d] <- test.d [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                          data-scan []<-[$$130, $$d] <- test.d
                                                           -- DATASOURCE_SCAN  |PARTITIONED|
                                                             exchange
                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -178,7 +182,7 @@
                                                         -- STREAM_PROJECT  |PARTITIONED|
                                                           exchange
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            data-scan []<-[$$131, $$c] <- test.c [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                            data-scan []<-[$$131, $$c] <- test.c
                                                             -- DATASOURCE_SCAN  |PARTITIONED|
                                                               exchange
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/btree-index-selection/intersection-misc/intersection-misc-03.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/btree-index-selection/intersection-misc/intersection-misc-03.plan
index cf06553..9fc45a0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/btree-index-selection/intersection-misc/intersection-misc-03.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/btree-index-selection/intersection-misc/intersection-misc-03.plan
@@ -26,50 +26,52 @@
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           join (eq($$142, $$136))
                           -- HYBRID_HASH_JOIN [$$142][$$136]  |PARTITIONED|
-                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            exchange
                             -- HASH_PARTITION_EXCHANGE [$$142]  |PARTITIONED|
-                              assign [$$95] <- [{"c3": $$142}] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                              assign [$$95] <- [{"c3": $$142}]
                               -- ASSIGN  |PARTITIONED|
                                 select ($$89) project: [$$142]
                                 -- STREAM_SELECT  |PARTITIONED|
-                                  project ([$$89, $$142]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                  project ([$$89, $$142])
                                   -- STREAM_PROJECT  |PARTITIONED|
-                                    exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                    exchange
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       group by ([$$149 := $$130]) decor ([$$142]) {
                                                 aggregate [$$89] <- [non-empty-stream()]
                                                 -- AGGREGATE  |LOCAL|
                                                   select (not(is-missing($$148)))
                                                   -- STREAM_SELECT  |LOCAL|
-                                                    nested tuple source
-                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                             } [cardinality: 0.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                    project ([$$148])
+                                                    -- STREAM_PROJECT  |LOCAL|
+                                                      nested tuple source
+                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                             }
                                       -- PRE_CLUSTERED_GROUP_BY[$$130]  |PARTITIONED|
-                                        exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                        exchange
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          order (ASC, $$130) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                          order (ASC, $$130)
                                           -- STABLE_SORT [$$130(ASC)]  |PARTITIONED|
-                                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                            exchange
                                             -- HASH_PARTITION_EXCHANGE [$$130]  |PARTITIONED|
-                                              project ([$$142, $$148, $$130]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                              project ([$$142, $$148, $$130])
                                               -- STREAM_PROJECT  |PARTITIONED|
-                                                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                exchange
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  left outer join (eq($$139, $$85)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                  left outer join (eq($$139, $$85))
                                                   -- HYBRID_HASH_JOIN [$$139][$$85]  |PARTITIONED|
-                                                    exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                    exchange
                                                     -- HASH_PARTITION_EXCHANGE [$$139]  |PARTITIONED|
-                                                      select (eq($$d.getField("c5"), 1)) project: [$$142, $$130, $$139] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                      select (eq($$d.getField("c5"), 1)) project: [$$142, $$130, $$139]
                                                       -- STREAM_SELECT  |PARTITIONED|
-                                                        assign [$$142, $$139] <- [$$d.getField("c3"), $$d.getField("c1")] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                        assign [$$142, $$139] <- [$$d.getField("c3"), $$d.getField("c1")]
                                                         -- ASSIGN  |PARTITIONED|
-                                                          exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                          exchange
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                            replicate
                                                             -- REPLICATE  |PARTITIONED|
-                                                              exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                              exchange
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                data-scan []<-[$$130, $$d] <- test.d [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                data-scan []<-[$$130, $$d] <- test.d
                                                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                                                   exchange
                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -87,76 +89,78 @@
                                                             -- STREAM_PROJECT  |PARTITIONED|
                                                               exchange
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                data-scan []<-[$$131, $$c] <- test.c [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                data-scan []<-[$$131, $$c] <- test.c
                                                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                                                   exchange
                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                     empty-tuple-source
                                                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            exchange
                             -- HASH_PARTITION_EXCHANGE [$$136]  |PARTITIONED|
-                              assign [$$137, $$136] <- [$$t2.getField("c4"), $$t2.getField("c2")] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                              assign [$$137, $$136] <- [$$t2.getField("c4"), $$t2.getField("c2")]
                               -- ASSIGN  |PARTITIONED|
-                                assign [$$132, $$t2] <- [$$130, $$d] project: [$$132, $$t2] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                assign [$$132, $$t2] <- [$$130, $$d] project: [$$132, $$t2]
                                 -- ASSIGN  |PARTITIONED|
-                                  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                  exchange
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                    replicate
                                     -- REPLICATE  |PARTITIONED|
-                                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                      exchange
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        data-scan []<-[$$130, $$d] <- test.d [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                        data-scan []<-[$$130, $$d] <- test.d
                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                           exchange
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                             empty-tuple-source
                                             -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                    exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                    exchange
                     -- HASH_PARTITION_EXCHANGE [$$144]  |PARTITIONED|
-                      assign [$$119] <- [{"c4": $$144}] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                      assign [$$119] <- [{"c4": $$144}]
                       -- ASSIGN  |PARTITIONED|
                         select ($$108) project: [$$144]
                         -- STREAM_SELECT  |PARTITIONED|
-                          project ([$$108, $$144]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                          project ([$$108, $$144])
                           -- STREAM_PROJECT  |PARTITIONED|
-                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            exchange
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                               group by ([$$151 := $$133]) decor ([$$144]) {
                                         aggregate [$$108] <- [non-empty-stream()]
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$150)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                     } [cardinality: 0.0, op-cost: 0.0, total-cost: 1000000.0]
+                                            project ([$$150])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                     }
                               -- PRE_CLUSTERED_GROUP_BY[$$133]  |PARTITIONED|
-                                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  order (ASC, $$133) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                  order (ASC, $$133)
                                   -- STABLE_SORT [$$133(ASC)]  |PARTITIONED|
-                                    exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                    exchange
                                     -- HASH_PARTITION_EXCHANGE [$$133]  |PARTITIONED|
-                                      project ([$$144, $$150, $$133]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                      project ([$$144, $$150, $$133])
                                       -- STREAM_PROJECT  |PARTITIONED|
-                                        exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                        exchange
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          left outer join (eq($$140, $$104)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                          left outer join (eq($$140, $$104))
                                           -- HYBRID_HASH_JOIN [$$140][$$104]  |PARTITIONED|
-                                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                            exchange
                                             -- HASH_PARTITION_EXCHANGE [$$140]  |PARTITIONED|
-                                              select (and(eq($$d.getField("c5"), 1), ge($$129, "2019-01-01"), le($$129, "2019-02-01"))) project: [$$144, $$133, $$140] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                              select (and(eq($$d.getField("c5"), 1), ge($$129, "2019-01-01"), le($$129, "2019-02-01"))) project: [$$144, $$133, $$140]
                                               -- STREAM_SELECT  |PARTITIONED|
-                                                assign [$$144, $$129, $$140] <- [$$d.getField("c4"), $$d.getField("c6"), $$d.getField("c1")] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                assign [$$144, $$129, $$140] <- [$$d.getField("c4"), $$d.getField("c6"), $$d.getField("c1")]
                                                 -- ASSIGN  |PARTITIONED|
-                                                  assign [$$133, $$d] <- [$$130, $$d] project: [$$133, $$d] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                  assign [$$133, $$d] <- [$$130, $$d] project: [$$133, $$d]
                                                   -- ASSIGN  |PARTITIONED|
-                                                    exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                    exchange
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                      replicate
                                                       -- REPLICATE  |PARTITIONED|
-                                                        exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                        exchange
                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          data-scan []<-[$$130, $$d] <- test.d [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                          data-scan []<-[$$130, $$d] <- test.d
                                                           -- DATASOURCE_SCAN  |PARTITIONED|
                                                             exchange
                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -178,7 +182,7 @@
                                                         -- STREAM_PROJECT  |PARTITIONED|
                                                           exchange
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            data-scan []<-[$$131, $$c] <- test.c [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                            data-scan []<-[$$131, $$c] <- test.c
                                                             -- DATASOURCE_SCAN  |PARTITIONED|
                                                               exchange
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
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 3d9f362..65df91a 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
@@ -1,14 +1,14 @@
-distribute result [$$128] [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 2.000015E12]
+distribute result [$$128]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 2.000015E12]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$128] <- [{"i_name": $$i_name, "brand": $#1, "i_price": $$i_price, "supplier_cnt": $$139}] project: [$$128] [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 2.000015E12]
+    assign [$$128] <- [{"i_name": $$i_name, "brand": $#1, "i_price": $$i_price, "supplier_cnt": $$139}] project: [$$128]
     -- ASSIGN  |PARTITIONED|
-      exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 2.000015E12]
+      exchange
       -- SORT_MERGE_EXCHANGE [$$139(DESC) ]  |PARTITIONED|
-        order (DESC, $$139) [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 2.000015E12]
+        order (DESC, $$139)
         -- STABLE_SORT [$$139(DESC)]  |PARTITIONED|
-          exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 2.000015E12]
+          exchange
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
             group by ([$$i_name := $$129; $#1 := $$130; $$i_price := $$131]) decor ([]) {
                       aggregate [$$139] <- [agg-sql-count($$150)]
@@ -17,62 +17,66 @@
                         -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
                           order (ASC, $$150)
                           -- MICRO_STABLE_SORT [$$150(ASC)]  |LOCAL|
-                            assign [$$150] <- [numeric-mod(numeric-multiply($$143, $$144), 10000)]
+                            assign [$$150] <- [numeric-mod(numeric-multiply($$143, $$144), 10000)] project: [$$150]
                             -- ASSIGN  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   } [cardinality: 0.0, op-cost: 0.0, total-cost: 2.000015E12]
+                              project ([$$143, $$144])
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                   }
             -- PRE_CLUSTERED_GROUP_BY[$$129, $$130, $$131]  |PARTITIONED|
-              exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 2.000015E12]
+              exchange
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                order (ASC, $$129) (ASC, $$130) (ASC, $$131) [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 2.000015E12]
+                order (ASC, $$129) (ASC, $$130) (ASC, $$131)
                 -- STABLE_SORT [$$129(ASC), $$130(ASC), $$131(ASC)]  |PARTITIONED|
-                  exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 2.000015E12]
+                  exchange
                   -- HASH_PARTITION_EXCHANGE [$$129, $$130, $$131]  |PARTITIONED|
-                    assign [$$130] <- [substring1($$132, 1, 3)] project: [$$143, $$144, $$129, $$130, $$131] [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 2.000015E12]
+                    assign [$$130] <- [substring1($$132, 1, 3)] project: [$$143, $$144, $$129, $$130, $$131]
                     -- ASSIGN  |PARTITIONED|
                       select ($$111) project: [$$129, $$131, $$132, $$144, $$143]
                       -- STREAM_SELECT  |PARTITIONED|
-                        project ([$$111, $$129, $$131, $$132, $$144, $$143]) [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 2.000015E12]
+                        project ([$$111, $$129, $$131, $$132, $$144, $$143])
                         -- STREAM_PROJECT  |PARTITIONED|
-                          exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 2.000015E12]
+                          exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             group by ([$$146 := $$133; $$147 := $$134]) decor ([$$129; $$131; $$132; $$144 := $$138; $$143 := $$141]) {
                                       aggregate [$$111] <- [empty-stream()]
                                       -- AGGREGATE  |LOCAL|
                                         select (not(is-missing($$145)))
                                         -- STREAM_SELECT  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                   } [cardinality: 0.0, op-cost: 0.0, total-cost: 2.000015E12]
+                                          project ([$$145])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                   }
                             -- PRE_CLUSTERED_GROUP_BY[$$133, $$134]  |PARTITIONED|
-                              exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 2.000015E12]
+                              exchange
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                order (ASC, $$133) (ASC, $$134) [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 2.000015E12]
+                                order (ASC, $$133) (ASC, $$134)
                                 -- STABLE_SORT [$$133(ASC), $$134(ASC)]  |PARTITIONED|
-                                  exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 2.000015E12]
+                                  exchange
                                   -- HASH_PARTITION_EXCHANGE [$$133, $$134]  |PARTITIONED|
-                                    project ([$$129, $$131, $$132, $$145, $$133, $$134, $$138, $$141]) [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 2.000015E12]
+                                    project ([$$129, $$131, $$132, $$145, $$133, $$134, $$138, $$141])
                                     -- STREAM_PROJECT  |PARTITIONED|
-                                      exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 2.000015E12]
+                                      exchange
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        join (eq($$137, $$138)) [cardinality: 9.223372036854776E16, op-cost: 1.000004E12, total-cost: 2.000015E12]
+                                        join (eq($$137, $$138))
                                         -- HYBRID_HASH_JOIN [$$138][$$137]  |PARTITIONED|
-                                          exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                          exchange
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            project ([$$145, $$133, $$138, $$141]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                            project ([$$145, $$133, $$138, $$141])
                                             -- STREAM_PROJECT  |PARTITIONED|
-                                              exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                              exchange
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                left outer join (not(if-missing-or-null(neq(numeric-mod(numeric-multiply($$141, $$138), 10000), $$105), false))) [cardinality: 1.0E12, op-cost: 1.0E12, total-cost: 1.000006E12]
+                                                left outer join (not(if-missing-or-null(neq(numeric-mod(numeric-multiply($$141, $$138), 10000), $$105), false)))
                                                 -- NESTED_LOOP  |PARTITIONED|
-                                                  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                  exchange
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    assign [$$138, $$141] <- [$$s.getField("s_i_id"), $$s.getField("s_w_id")] project: [$$133, $$138, $$141] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                    assign [$$138, $$141] <- [$$s.getField("s_i_id"), $$s.getField("s_w_id")] project: [$$133, $$138, $$141]
                                                     -- ASSIGN  |PARTITIONED|
-                                                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                      exchange
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        data-scan []<-[$$133, $$s] <- test.stock [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                        data-scan []<-[$$133, $$s] <- test.stock
                                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                           exchange
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -82,7 +86,7 @@
                                                   -- BROADCAST_EXCHANGE  |PARTITIONED|
                                                     assign [$$145] <- [true]
                                                     -- ASSIGN  |PARTITIONED|
-                                                      select (like($$su.getField("su_comment"), "%Customer%Complaints%")) project: [$$105] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                      select (like($$su.getField("su_comment"), "%Customer%Complaints%")) project: [$$105]
                                                       -- STREAM_SELECT  |PARTITIONED|
                                                         assign [$$105] <- [$$su.getField("su_suppkey")]
                                                         -- ASSIGN  |PARTITIONED|
@@ -90,21 +94,21 @@
                                                           -- STREAM_PROJECT  |PARTITIONED|
                                                             exchange
                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                              data-scan []<-[$$135, $$su] <- test.supplier [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                              data-scan []<-[$$135, $$su] <- test.supplier
                                                               -- DATASOURCE_SCAN  |PARTITIONED|
                                                                 exchange
                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                   empty-tuple-source
                                                                   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                          exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                                          exchange
                                           -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                            select (not(like($$132, "zz%"))) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                            select (not(like($$132, "zz%")))
                                             -- STREAM_SELECT  |PARTITIONED|
-                                              assign [$$131, $$129, $$132, $$137] <- [$$i.getField("i_price"), $$i.getField("i_name"), $$i.getField("i_data"), $$i.getField("i_id")] project: [$$134, $$131, $$129, $$132, $$137] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                              assign [$$131, $$129, $$132, $$137] <- [$$i.getField("i_price"), $$i.getField("i_name"), $$i.getField("i_data"), $$i.getField("i_id")] project: [$$134, $$131, $$129, $$132, $$137]
                                               -- ASSIGN  |PARTITIONED|
-                                                exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                                                exchange
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  data-scan []<-[$$134, $$i] <- test.item [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                  data-scan []<-[$$134, $$i] <- test.item
                                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                                     exchange
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/joins/inner_right_corr.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/joins/inner_right_corr.plan
index 3b990cd..2057829 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/joins/inner_right_corr.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/joins/inner_right_corr.plan
@@ -15,8 +15,10 @@
                       -- AGGREGATE  |LOCAL|
                         select (not(is-missing($$93)))
                         -- STREAM_SELECT  |LOCAL|
-                          nested tuple source
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          project ([$$93])
+                          -- STREAM_PROJECT  |LOCAL|
+                            nested tuple source
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
           -- PRE_CLUSTERED_GROUP_BY[$$76]  |PARTITIONED|
             exchange
@@ -58,15 +60,17 @@
                                             -- STREAM_SELECT  |LOCAL|
                                               assign [$$88] <- [$$85.getField("b")]
                                               -- ASSIGN  |LOCAL|
-                                                unnest $$85 <- scan-collection($$90)
+                                                unnest $$85 <- scan-collection($$90) project: [$$87, $$85]
                                                 -- UNNEST  |LOCAL|
-                                                  nested tuple source
-                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                  project ([$$90, $$87])
+                                                  -- STREAM_PROJECT  |LOCAL|
+                                                    nested tuple source
+                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                                        }
                                 -- SUBPLAN  |PARTITIONED|
                                   exchange
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    join (true) [cardinality: 1.0E12, op-cost: 1.0E12, total-cost: 1.000006E12]
+                                    join (true)
                                     -- NESTED_LOOP  |PARTITIONED|
                                       exchange
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -74,7 +78,7 @@
                                         -- ASSIGN  |PARTITIONED|
                                           exchange
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            data-scan []<-[$$92, $$91] <- test.t1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                            data-scan []<-[$$92, $$91] <- test.t1
                                             -- DATASOURCE_SCAN  |PARTITIONED|
                                               exchange
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -88,7 +92,7 @@
                                           -- STREAM_PROJECT  |PARTITIONED|
                                             exchange
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                              data-scan []<-[$$84, $$81] <- test.t2 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                              data-scan []<-[$$84, $$81] <- test.t2
                                               -- DATASOURCE_SCAN  |PARTITIONED|
                                                 exchange
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/nested_loj2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/nested_loj2.plan
index cb92f5a..0a4e088 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/nested_loj2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/nested_loj2.plan
@@ -1,12 +1,12 @@
-distribute result [$$70] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+distribute result [$$70]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$70] <- [{"cust": $$c, "orders": $$68}] project: [$$70] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+    assign [$$70] <- [{"cust": $$c, "orders": $$68}] project: [$$70]
     -- ASSIGN  |PARTITIONED|
-      project ([$$68, $$c]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+      project ([$$68, $$c])
       -- STREAM_PROJECT  |PARTITIONED|
-        exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+        exchange
         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
           group by ([$$82 := $$71]) decor ([$$c]) {
                     aggregate [$$68] <- [listify({"order": $$o, "items": $$62})]
@@ -16,35 +16,37 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (not(is-missing($$79)))
                                   -- STREAM_SELECT  |LOCAL|
-                                    nested tuple source
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$l, $$79])
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
                       -- MICRO_PRE_CLUSTERED_GROUP_BY[$$72]  |LOCAL|
                         select (not(is-missing($$81)))
                         -- STREAM_SELECT  |LOCAL|
                           nested tuple source
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
-                 } [cardinality: 0.0, op-cost: 0.0, total-cost: 1000000.0]
+                 }
           -- PRE_CLUSTERED_GROUP_BY[$$71]  |PARTITIONED|
-            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+            exchange
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              order (ASC, $$71) (ASC, $$72) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+              order (ASC, $$71) (ASC, $$72)
               -- STABLE_SORT [$$71(ASC), $$72(ASC)]  |PARTITIONED|
-                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                exchange
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  project ([$$c, $$o, $$l, $$79, $$72, $$71, $$75, $$81]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                  project ([$$c, $$o, $$l, $$79, $$72, $$71, $$75, $$81])
                   -- STREAM_PROJECT  |PARTITIONED|
-                    exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                    exchange
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      left outer join (eq($$73, $$72)) [cardinality: 9.223372036854776E16, op-cost: 5.00004E11, total-cost: 5.00015E11]
+                      left outer join (eq($$73, $$72))
                       -- HYBRID_HASH_JOIN [$$72][$$73]  |PARTITIONED|
-                        exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                        exchange
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          left outer join (eq($$75, $$71)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                          left outer join (eq($$75, $$71))
                           -- HYBRID_HASH_JOIN [$$71][$$75]  |PARTITIONED|
-                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                            exchange
                             -- HASH_PARTITION_EXCHANGE [$$71]  |PARTITIONED|
-                              data-scan []<-[$$71, $$c] <- tpch.Customers [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                              data-scan []<-[$$71, $$c] <- tpch.Customers
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -56,7 +58,7 @@
                               -- ASSIGN  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan []<-[$$72, $$o] <- tpch.Orders [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                  data-scan []<-[$$72, $$o] <- tpch.Orders
                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                     exchange
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -70,7 +72,7 @@
                             -- STREAM_PROJECT  |PARTITIONED|
                               exchange
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                data-scan []<-[$$73, $$74, $$l] <- tpch.LineItems [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                data-scan []<-[$$73, $$74, $$l] <- tpch.LineItems
                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                   exchange
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/query_issue3316.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/query_issue3316.plan
index 6b739e2..317fb34 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/query_issue3316.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/query_issue3316.plan
@@ -21,8 +21,10 @@
                             -- AGGREGATE  |LOCAL|
                               select (not(is-missing($$317)))
                               -- STREAM_SELECT  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$190, $$317])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                          }
                   -- PRE_CLUSTERED_GROUP_BY[$$227]  |PARTITIONED|
                     exchange
@@ -40,8 +42,10 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$226)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                            project ([$$155, $$226])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                      }
                               -- PRE_CLUSTERED_GROUP_BY[$$193]  |PARTITIONED|
                                 exchange
@@ -91,8 +95,10 @@
                                                                         -- AGGREGATE  |LOCAL|
                                                                           select (not(is-missing($$239)))
                                                                           -- STREAM_SELECT  |LOCAL|
-                                                                            nested tuple source
-                                                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                            project ([$$239])
+                                                                            -- STREAM_PROJECT  |LOCAL|
+                                                                              nested tuple source
+                                                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                      }
                                                               -- PRE_CLUSTERED_GROUP_BY[$$225, $$194]  |PARTITIONED|
                                                                 exchange
@@ -113,7 +119,7 @@
                                                                               -- STREAM_PROJECT  |PARTITIONED|
                                                                                 exchange
                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                  join (eq($$207, $$223)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                                                  join (eq($$207, $$223))
                                                                                   -- HYBRID_HASH_JOIN [$$223][$$207]  |PARTITIONED|
                                                                                     exchange
                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -145,7 +151,7 @@
                                                                                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                                                     exchange
                                                                                     -- HASH_PARTITION_EXCHANGE [$$207]  |PARTITIONED|
-                                                                                      select (eq($$H.getField("to_u"), "aaaaa")) project: [$$213, $$126, $$194, $$207] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                      select (eq($$H.getField("to_u"), "aaaaa")) project: [$$213, $$126, $$194, $$207]
                                                                                       -- STREAM_SELECT  |PARTITIONED|
                                                                                         assign [$$213, $$126, $$207] <- [$$H.getField("u"), $$H.getField("a"), $$H.getField("y_id")]
                                                                                         -- ASSIGN  |PARTITIONED|
@@ -157,7 +163,7 @@
                                                                                               -- REPLICATE  |PARTITIONED|
                                                                                                 exchange
                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                  data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                  data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                     exchange
                                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -180,8 +186,10 @@
                                                                                                   -- AGGREGATE  |LOCAL|
                                                                                                     select (not(is-missing($$253)))
                                                                                                     -- STREAM_SELECT  |LOCAL|
-                                                                                                      nested tuple source
-                                                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                      project ([$$145, $$253])
+                                                                                                      -- STREAM_PROJECT  |LOCAL|
+                                                                                                        nested tuple source
+                                                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                              }
                                                                                       -- PRE_CLUSTERED_GROUP_BY[$$238, $$235]  |PARTITIONED|
                                                                                         exchange
@@ -210,7 +218,7 @@
                                                                                                               -- STREAM_PROJECT  |PARTITIONED|
                                                                                                                 exchange
                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                  join (eq($$427, $$428)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                                                                                  join (eq($$427, $$428))
                                                                                                                   -- HYBRID_HASH_JOIN [$$428][$$427]  |PARTITIONED|
                                                                                                                     exchange
                                                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -242,7 +250,7 @@
                                                                                                                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                                                                                     exchange
                                                                                                                     -- HASH_PARTITION_EXCHANGE [$$427]  |PARTITIONED|
-                                                                                                                      select (eq($$430.getField("to_u"), "aaaaa")) project: [$$422, $$426, $$427] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                                                      select (eq($$430.getField("to_u"), "aaaaa")) project: [$$422, $$426, $$427]
                                                                                                                       -- STREAM_SELECT  |PARTITIONED|
                                                                                                                         exchange
                                                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -260,7 +268,7 @@
                                                                                                                                     -- REPLICATE  |PARTITIONED|
                                                                                                                                       exchange
                                                                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                        data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                                                        data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                                           exchange
                                                                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -282,7 +290,7 @@
                                                                                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                                                                                   exchange
                                                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                    join (eq($$210, $$243)) [cardinality: 9.223372036854776E16, op-cost: 5.00004E11, total-cost: 5.00015E11]
+                                                                                                                    join (eq($$210, $$243))
                                                                                                                     -- HYBRID_HASH_JOIN [$$243][$$210]  |PARTITIONED|
                                                                                                                       exchange
                                                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -298,7 +306,7 @@
                                                                                                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                                                                                                   exchange
                                                                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                    join (eq($$448, $$445)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                                                                                                    join (eq($$448, $$445))
                                                                                                                                     -- HYBRID_HASH_JOIN [$$445][$$448]  |PARTITIONED|
                                                                                                                                       exchange
                                                                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -330,7 +338,7 @@
                                                                                                                                                                 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                                                                                                       exchange
                                                                                                                                       -- HASH_PARTITION_EXCHANGE [$$448]  |PARTITIONED|
-                                                                                                                                        select (eq($$450.getField("to_u"), "aaaaa")) project: [$$436, $$448] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                                                                        select (eq($$450.getField("to_u"), "aaaaa")) project: [$$436, $$448]
                                                                                                                                         -- STREAM_SELECT  |PARTITIONED|
                                                                                                                                           exchange
                                                                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -348,7 +356,7 @@
                                                                                                                                                       -- REPLICATE  |PARTITIONED|
                                                                                                                                                         exchange
                                                                                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                          data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                                                                          data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                                                                           -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                                                             exchange
                                                                                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -356,7 +364,7 @@
                                                                                                                                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                                                                                       exchange
                                                                                                                       -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                                                                        select (eq($$L.getField("to_u"), "aaaaa")) project: [$$145, $$135, $$210] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                                                        select (eq($$L.getField("to_u"), "aaaaa")) project: [$$145, $$135, $$210]
                                                                                                                         -- STREAM_SELECT  |PARTITIONED|
                                                                                                                           assign [$$135, $$210, $$145] <- [$$L.getField("a"), $$L.getField("y_id"), $$L.getField("b")]
                                                                                                                           -- ASSIGN  |PARTITIONED|
@@ -376,7 +384,7 @@
                                                                                                                                         -- REPLICATE  |PARTITIONED|
                                                                                                                                           exchange
                                                                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                            data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                                                            data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                                                             -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                                               exchange
                                                                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -425,8 +433,10 @@
                                                                 -- AGGREGATE  |LOCAL|
                                                                   select (not(is-missing($$387)))
                                                                   -- STREAM_SELECT  |LOCAL|
-                                                                    nested tuple source
-                                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                    project ([$$387])
+                                                                    -- STREAM_PROJECT  |LOCAL|
+                                                                      nested tuple source
+                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                              }
                                                       -- PRE_CLUSTERED_GROUP_BY[$$256, $$196]  |PARTITIONED|
                                                         exchange
@@ -456,8 +466,10 @@
                                                                                         -- AGGREGATE  |LOCAL|
                                                                                           select (not(is-missing($$262)))
                                                                                           -- STREAM_SELECT  |LOCAL|
-                                                                                            nested tuple source
-                                                                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                            project ([$$262])
+                                                                                            -- STREAM_PROJECT  |LOCAL|
+                                                                                              nested tuple source
+                                                                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                      }
                                                                               -- PRE_CLUSTERED_GROUP_BY[$$257]  |PARTITIONED|
                                                                                 exchange
@@ -519,8 +531,10 @@
                                                                                                                         -- AGGREGATE  |LOCAL|
                                                                                                                           select (not(is-missing($$280)))
                                                                                                                           -- STREAM_SELECT  |LOCAL|
-                                                                                                                            nested tuple source
-                                                                                                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                            project ([$$280])
+                                                                                                                            -- STREAM_PROJECT  |LOCAL|
+                                                                                                                              nested tuple source
+                                                                                                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                                      }
                                                                                                               -- PRE_CLUSTERED_GROUP_BY[$$268, $$270]  |PARTITIONED|
                                                                                                                 exchange
@@ -549,7 +563,7 @@
                                                                                                                                       -- STREAM_PROJECT  |PARTITIONED|
                                                                                                                                         exchange
                                                                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                          join (eq($$418, $$417)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                                                                                                          join (eq($$418, $$417))
                                                                                                                                           -- HYBRID_HASH_JOIN [$$417][$$418]  |PARTITIONED|
                                                                                                                                             exchange
                                                                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -577,7 +591,7 @@
                                                                                                                                                                   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                                                                                                             exchange
                                                                                                                                             -- HASH_PARTITION_EXCHANGE [$$418]  |PARTITIONED|
-                                                                                                                                              select (eq($$413.getField("to_u"), "aaaaa")) project: [$$407, $$411, $$418] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                                                                              select (eq($$413.getField("to_u"), "aaaaa")) project: [$$407, $$411, $$418]
                                                                                                                                               -- STREAM_SELECT  |PARTITIONED|
                                                                                                                                                 assign [$$418, $$407] <- [$$413.getField("y_id"), $$413.getField("a")]
                                                                                                                                                 -- ASSIGN  |PARTITIONED|
@@ -587,7 +601,7 @@
                                                                                                                                                     -- REPLICATE  |PARTITIONED|
                                                                                                                                                       exchange
                                                                                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                        data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                                                                        data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                                                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                                                           exchange
                                                                                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -610,8 +624,10 @@
                                                                                                                                                   -- AGGREGATE  |LOCAL|
                                                                                                                                                     select (not(is-missing($$296)))
                                                                                                                                                     -- STREAM_SELECT  |LOCAL|
-                                                                                                                                                      nested tuple source
-                                                                                                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                                                      project ([$$297, $$296])
+                                                                                                                                                      -- STREAM_PROJECT  |LOCAL|
+                                                                                                                                                        nested tuple source
+                                                                                                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                                                              }
                                                                                                                                       -- PRE_CLUSTERED_GROUP_BY[$$284, $$285]  |PARTITIONED|
                                                                                                                                         exchange
@@ -640,7 +656,7 @@
                                                                                                                                                               -- STREAM_PROJECT  |PARTITIONED|
                                                                                                                                                                 exchange
                                                                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                  join (eq($$427, $$428)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                                                                                                                                  join (eq($$427, $$428))
                                                                                                                                                                   -- HYBRID_HASH_JOIN [$$428][$$427]  |PARTITIONED|
                                                                                                                                                                     exchange
                                                                                                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -672,7 +688,7 @@
                                                                                                                                                                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                                                                                                                                     exchange
                                                                                                                                                                     -- HASH_PARTITION_EXCHANGE [$$427]  |PARTITIONED|
-                                                                                                                                                                      select (eq($$430.getField("to_u"), "aaaaa")) project: [$$422, $$426, $$427] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                                                                                                      select (eq($$430.getField("to_u"), "aaaaa")) project: [$$422, $$426, $$427]
                                                                                                                                                                       -- STREAM_SELECT  |PARTITIONED|
                                                                                                                                                                         exchange
                                                                                                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -690,7 +706,7 @@
                                                                                                                                                                                     -- REPLICATE  |PARTITIONED|
                                                                                                                                                                                       exchange
                                                                                                                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                        data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                                                                                                        data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                                                                                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                                                                                           exchange
                                                                                                                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -712,7 +728,7 @@
                                                                                                                                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                                                                                                                                   exchange
                                                                                                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                    join (eq($$303, $$304)) [cardinality: 9.223372036854776E16, op-cost: 5.00004E11, total-cost: 5.00015E11]
+                                                                                                                                                                    join (eq($$303, $$304))
                                                                                                                                                                     -- HYBRID_HASH_JOIN [$$304][$$303]  |PARTITIONED|
                                                                                                                                                                       exchange
                                                                                                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -728,7 +744,7 @@
                                                                                                                                                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                                                                                                                                                   exchange
                                                                                                                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                    join (eq($$448, $$445)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                                                                                                                                                    join (eq($$448, $$445))
                                                                                                                                                                                     -- HYBRID_HASH_JOIN [$$445][$$448]  |PARTITIONED|
                                                                                                                                                                                       exchange
                                                                                                                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -760,7 +776,7 @@
                                                                                                                                                                                                                 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                                                                                                                                                       exchange
                                                                                                                                                                                       -- HASH_PARTITION_EXCHANGE [$$448]  |PARTITIONED|
-                                                                                                                                                                                        select (eq($$450.getField("to_u"), "aaaaa")) project: [$$436, $$448] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                                                                                                                        select (eq($$450.getField("to_u"), "aaaaa")) project: [$$436, $$448]
                                                                                                                                                                                         -- STREAM_SELECT  |PARTITIONED|
                                                                                                                                                                                           exchange
                                                                                                                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -778,7 +794,7 @@
                                                                                                                                                                                                       -- REPLICATE  |PARTITIONED|
                                                                                                                                                                                                         exchange
                                                                                                                                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                                          data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                                                                                                                          data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                                                                                                                           -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                                                                                                             exchange
                                                                                                                                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -794,7 +810,7 @@
                                                                                                                                                                             -- REPLICATE  |PARTITIONED|
                                                                                                                                                                               exchange
                                                                                                                                                                               -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                select (eq($$441.getField("to_u"), "aaaaa")) project: [$$438, $$443, $$444] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                                                                                                                select (eq($$441.getField("to_u"), "aaaaa")) project: [$$438, $$443, $$444]
                                                                                                                                                                                 -- STREAM_SELECT  |PARTITIONED|
                                                                                                                                                                                   assign [$$444, $$443, $$438] <- [$$441.getField("y_id"), $$441.getField("a"), $$441.getField("b")]
                                                                                                                                                                                   -- ASSIGN  |PARTITIONED|
@@ -812,7 +828,7 @@
                                                                                                                                                                                               -- REPLICATE  |PARTITIONED|
                                                                                                                                                                                                 exchange
                                                                                                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                                  data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                                                                                                                  data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                                                                                                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                                                                                                     exchange
                                                                                                                                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -842,7 +858,7 @@
                                                                                     -- REPLICATE  |PARTITIONED|
                                                                                       exchange
                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                        data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                        data-scan []<-[$$411, $$413] <- test.collection1
                                                                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                           exchange
                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -865,8 +881,10 @@
                                                                                           -- AGGREGATE  |LOCAL|
                                                                                             select (not(is-missing($$458)))
                                                                                             -- STREAM_SELECT  |LOCAL|
-                                                                                              nested tuple source
-                                                                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                              project ([$$180, $$458])
+                                                                                              -- STREAM_PROJECT  |LOCAL|
+                                                                                                nested tuple source
+                                                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                      }
                                                                               -- PRE_CLUSTERED_GROUP_BY[$$327, $$326]  |PARTITIONED|
                                                                                 exchange
@@ -896,8 +914,10 @@
                                                                                                                 -- AGGREGATE  |LOCAL|
                                                                                                                   select (not(is-missing($$332)))
                                                                                                                   -- STREAM_SELECT  |LOCAL|
-                                                                                                                    nested tuple source
-                                                                                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                    project ([$$332])
+                                                                                                                    -- STREAM_PROJECT  |LOCAL|
+                                                                                                                      nested tuple source
+                                                                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                              }
                                                                                                       -- PRE_CLUSTERED_GROUP_BY[$$328]  |PARTITIONED|
                                                                                                         exchange
@@ -959,8 +979,10 @@
                                                                                                                                                 -- AGGREGATE  |LOCAL|
                                                                                                                                                   select (not(is-missing($$350)))
                                                                                                                                                   -- STREAM_SELECT  |LOCAL|
-                                                                                                                                                    nested tuple source
-                                                                                                                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                                                    project ([$$350])
+                                                                                                                                                    -- STREAM_PROJECT  |LOCAL|
+                                                                                                                                                      nested tuple source
+                                                                                                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                                                              }
                                                                                                                                       -- PRE_CLUSTERED_GROUP_BY[$$338, $$340]  |PARTITIONED|
                                                                                                                                         exchange
@@ -989,7 +1011,7 @@
                                                                                                                                                               -- STREAM_PROJECT  |PARTITIONED|
                                                                                                                                                                 exchange
                                                                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                  join (eq($$418, $$417)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                                                                                                                                  join (eq($$418, $$417))
                                                                                                                                                                   -- HYBRID_HASH_JOIN [$$417][$$418]  |PARTITIONED|
                                                                                                                                                                     exchange
                                                                                                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1017,7 +1039,7 @@
                                                                                                                                                                                           -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                                                                                                                                     exchange
                                                                                                                                                                     -- HASH_PARTITION_EXCHANGE [$$418]  |PARTITIONED|
-                                                                                                                                                                      select (eq($$413.getField("to_u"), "aaaaa")) project: [$$407, $$411, $$418] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                                                                                                      select (eq($$413.getField("to_u"), "aaaaa")) project: [$$407, $$411, $$418]
                                                                                                                                                                       -- STREAM_SELECT  |PARTITIONED|
                                                                                                                                                                         assign [$$418, $$407] <- [$$413.getField("y_id"), $$413.getField("a")]
                                                                                                                                                                         -- ASSIGN  |PARTITIONED|
@@ -1027,7 +1049,7 @@
                                                                                                                                                                             -- REPLICATE  |PARTITIONED|
                                                                                                                                                                               exchange
                                                                                                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                                                                                                data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                                                                                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                                                                                   exchange
                                                                                                                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1050,8 +1072,10 @@
                                                                                                                                                                           -- AGGREGATE  |LOCAL|
                                                                                                                                                                             select (not(is-missing($$366)))
                                                                                                                                                                             -- STREAM_SELECT  |LOCAL|
-                                                                                                                                                                              nested tuple source
-                                                                                                                                                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                                                                              project ([$$367, $$366])
+                                                                                                                                                                              -- STREAM_PROJECT  |LOCAL|
+                                                                                                                                                                                nested tuple source
+                                                                                                                                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                                                                                      }
                                                                                                                                                               -- PRE_CLUSTERED_GROUP_BY[$$354, $$355]  |PARTITIONED|
                                                                                                                                                                 exchange
@@ -1080,7 +1104,7 @@
                                                                                                                                                                                       -- STREAM_PROJECT  |PARTITIONED|
                                                                                                                                                                                         exchange
                                                                                                                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                          join (eq($$427, $$428)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                                                                                                                                                          join (eq($$427, $$428))
                                                                                                                                                                                           -- HYBRID_HASH_JOIN [$$428][$$427]  |PARTITIONED|
                                                                                                                                                                                             exchange
                                                                                                                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1112,7 +1136,7 @@
                                                                                                                                                                                                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                                                                                                                                                             exchange
                                                                                                                                                                                             -- HASH_PARTITION_EXCHANGE [$$427]  |PARTITIONED|
-                                                                                                                                                                                              select (eq($$430.getField("to_u"), "aaaaa")) project: [$$422, $$426, $$427] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                                                                                                                              select (eq($$430.getField("to_u"), "aaaaa")) project: [$$422, $$426, $$427]
                                                                                                                                                                                               -- STREAM_SELECT  |PARTITIONED|
                                                                                                                                                                                                 exchange
                                                                                                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1130,7 +1154,7 @@
                                                                                                                                                                                                             -- REPLICATE  |PARTITIONED|
                                                                                                                                                                                                               exchange
                                                                                                                                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                                                data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                                                                                                                                data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                                                                                                                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                                                                                                                   exchange
                                                                                                                                                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1152,7 +1176,7 @@
                                                                                                                                                                                         -- STREAM_PROJECT  |PARTITIONED|
                                                                                                                                                                                           exchange
                                                                                                                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                            join (eq($$373, $$374)) [cardinality: 9.223372036854776E16, op-cost: 5.00004E11, total-cost: 5.00015E11]
+                                                                                                                                                                                            join (eq($$373, $$374))
                                                                                                                                                                                             -- HYBRID_HASH_JOIN [$$374][$$373]  |PARTITIONED|
                                                                                                                                                                                               exchange
                                                                                                                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1168,7 +1192,7 @@
                                                                                                                                                                                                         -- STREAM_PROJECT  |PARTITIONED|
                                                                                                                                                                                                           exchange
                                                                                                                                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                                            join (eq($$448, $$445)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                                                                                                                                                                            join (eq($$448, $$445))
                                                                                                                                                                                                             -- HYBRID_HASH_JOIN [$$445][$$448]  |PARTITIONED|
                                                                                                                                                                                                               exchange
                                                                                                                                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1200,7 +1224,7 @@
                                                                                                                                                                                                                                         -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                                                                                                                                                                               exchange
                                                                                                                                                                                                               -- HASH_PARTITION_EXCHANGE [$$448]  |PARTITIONED|
-                                                                                                                                                                                                                select (eq($$450.getField("to_u"), "aaaaa")) project: [$$436, $$448] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                                                                                                                                                select (eq($$450.getField("to_u"), "aaaaa")) project: [$$436, $$448]
                                                                                                                                                                                                                 -- STREAM_SELECT  |PARTITIONED|
                                                                                                                                                                                                                   exchange
                                                                                                                                                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1218,7 +1242,7 @@
                                                                                                                                                                                                                               -- REPLICATE  |PARTITIONED|
                                                                                                                                                                                                                                 exchange
                                                                                                                                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                                                                  data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                                                                                                                                                  data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                                                                                                                                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                                                                                                                                     exchange
                                                                                                                                                                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1234,7 +1258,7 @@
                                                                                                                                                                                                     -- REPLICATE  |PARTITIONED|
                                                                                                                                                                                                       exchange
                                                                                                                                                                                                       -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                                        select (eq($$441.getField("to_u"), "aaaaa")) project: [$$438, $$443, $$444] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                                                                                                                                        select (eq($$441.getField("to_u"), "aaaaa")) project: [$$438, $$443, $$444]
                                                                                                                                                                                                         -- STREAM_SELECT  |PARTITIONED|
                                                                                                                                                                                                           assign [$$444, $$443, $$438] <- [$$441.getField("y_id"), $$441.getField("a"), $$441.getField("b")]
                                                                                                                                                                                                           -- ASSIGN  |PARTITIONED|
@@ -1252,7 +1276,7 @@
                                                                                                                                                                                                                       -- REPLICATE  |PARTITIONED|
                                                                                                                                                                                                                         exchange
                                                                                                                                                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                                                          data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                                                                                                                                          data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                                                                                                                                           -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                                                                                                                             exchange
                                                                                                                                                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1290,7 +1314,7 @@
                                                                                                                     -- REPLICATE  |PARTITIONED|
                                                                                                                       exchange
                                                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                        data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                                        data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                           exchange
                                                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1329,8 +1353,10 @@
                                                                                                                                   -- AGGREGATE  |LOCAL|
                                                                                                                                     select (not(is-missing($$403)))
                                                                                                                                     -- STREAM_SELECT  |LOCAL|
-                                                                                                                                      nested tuple source
-                                                                                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                                      project ([$$403])
+                                                                                                                                      -- STREAM_PROJECT  |LOCAL|
+                                                                                                                                        nested tuple source
+                                                                                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                                                }
                                                                                                                         -- PRE_CLUSTERED_GROUP_BY[$$399]  |PARTITIONED|
                                                                                                                           exchange
@@ -1388,8 +1414,10 @@
                                                                                                                                                                   -- AGGREGATE  |LOCAL|
                                                                                                                                                                     select (not(is-missing($$421)))
                                                                                                                                                                     -- STREAM_SELECT  |LOCAL|
-                                                                                                                                                                      nested tuple source
-                                                                                                                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                                                                      project ([$$421])
+                                                                                                                                                                      -- STREAM_PROJECT  |LOCAL|
+                                                                                                                                                                        nested tuple source
+                                                                                                                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                                                                                }
                                                                                                                                                         -- PRE_CLUSTERED_GROUP_BY[$$409, $$411]  |PARTITIONED|
                                                                                                                                                           exchange
@@ -1414,7 +1442,7 @@
                                                                                                                                                                             -- STREAM_PROJECT  |PARTITIONED|
                                                                                                                                                                               exchange
                                                                                                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                join (eq($$418, $$417)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                                                                                                                                                join (eq($$418, $$417))
                                                                                                                                                                                 -- HYBRID_HASH_JOIN [$$417][$$418]  |PARTITIONED|
                                                                                                                                                                                   exchange
                                                                                                                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1442,7 +1470,7 @@
                                                                                                                                                                                                         -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                                                                                                                                                   exchange
                                                                                                                                                                                   -- HASH_PARTITION_EXCHANGE [$$418]  |PARTITIONED|
-                                                                                                                                                                                    select (eq($$413.getField("to_u"), "aaaaa")) project: [$$407, $$411, $$418] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                                                                                                                    select (eq($$413.getField("to_u"), "aaaaa")) project: [$$407, $$411, $$418]
                                                                                                                                                                                     -- STREAM_SELECT  |PARTITIONED|
                                                                                                                                                                                       assign [$$418, $$407] <- [$$413.getField("y_id"), $$413.getField("a")]
                                                                                                                                                                                       -- ASSIGN  |PARTITIONED|
@@ -1452,7 +1480,7 @@
                                                                                                                                                                                           -- REPLICATE  |PARTITIONED|
                                                                                                                                                                                             exchange
                                                                                                                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                              data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                                                                                                              data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                                                                                                               -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                                                                                                 exchange
                                                                                                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1475,8 +1503,10 @@
                                                                                                                                                                                             -- AGGREGATE  |LOCAL|
                                                                                                                                                                                               select (not(is-missing($$437)))
                                                                                                                                                                                               -- STREAM_SELECT  |LOCAL|
-                                                                                                                                                                                                nested tuple source
-                                                                                                                                                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                                                                                                                                project ([$$438, $$437])
+                                                                                                                                                                                                -- STREAM_PROJECT  |LOCAL|
+                                                                                                                                                                                                  nested tuple source
+                                                                                                                                                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                                                                                                                        }
                                                                                                                                                                                 -- PRE_CLUSTERED_GROUP_BY[$$425, $$426]  |PARTITIONED|
                                                                                                                                                                                   exchange
@@ -1501,7 +1531,7 @@
                                                                                                                                                                                                     -- STREAM_PROJECT  |PARTITIONED|
                                                                                                                                                                                                       exchange
                                                                                                                                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                                        join (eq($$427, $$428)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                                                                                                                                                                        join (eq($$427, $$428))
                                                                                                                                                                                                         -- HYBRID_HASH_JOIN [$$428][$$427]  |PARTITIONED|
                                                                                                                                                                                                           exchange
                                                                                                                                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1533,7 +1563,7 @@
                                                                                                                                                                                                                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                                                                                                                                                                           exchange
                                                                                                                                                                                                           -- HASH_PARTITION_EXCHANGE [$$427]  |PARTITIONED|
-                                                                                                                                                                                                            select (eq($$430.getField("to_u"), "aaaaa")) project: [$$422, $$426, $$427] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                                                                                                                                            select (eq($$430.getField("to_u"), "aaaaa")) project: [$$422, $$426, $$427]
                                                                                                                                                                                                             -- STREAM_SELECT  |PARTITIONED|
                                                                                                                                                                                                               exchange
                                                                                                                                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1551,7 +1581,7 @@
                                                                                                                                                                                                                           -- REPLICATE  |PARTITIONED|
                                                                                                                                                                                                                             exchange
                                                                                                                                                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                                                              data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                                                                                                                                              data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                                                                                                                                               -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                                                                                                                                 exchange
                                                                                                                                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1573,7 +1603,7 @@
                                                                                                                                                                                                           -- STREAM_PROJECT  |PARTITIONED|
                                                                                                                                                                                                             exchange
                                                                                                                                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                                              join (eq($$444, $$445)) [cardinality: 9.223372036854776E16, op-cost: 5.00004E11, total-cost: 5.00015E11]
+                                                                                                                                                                                                              join (eq($$444, $$445))
                                                                                                                                                                                                               -- HYBRID_HASH_JOIN [$$445][$$444]  |PARTITIONED|
                                                                                                                                                                                                                 exchange
                                                                                                                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1585,7 +1615,7 @@
                                                                                                                                                                                                                       -- STREAM_PROJECT  |PARTITIONED|
                                                                                                                                                                                                                         exchange
                                                                                                                                                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                                                          join (eq($$448, $$445)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                                                                                                                                                                                          join (eq($$448, $$445))
                                                                                                                                                                                                                           -- HYBRID_HASH_JOIN [$$445][$$448]  |PARTITIONED|
                                                                                                                                                                                                                             exchange
                                                                                                                                                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1617,7 +1647,7 @@
                                                                                                                                                                                                                                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                                                                                                                                                                                                             exchange
                                                                                                                                                                                                                             -- HASH_PARTITION_EXCHANGE [$$448]  |PARTITIONED|
-                                                                                                                                                                                                                              select (eq($$450.getField("to_u"), "aaaaa")) project: [$$436, $$448] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                                                                                                                                                              select (eq($$450.getField("to_u"), "aaaaa")) project: [$$436, $$448]
                                                                                                                                                                                                                               -- STREAM_SELECT  |PARTITIONED|
                                                                                                                                                                                                                                 exchange
                                                                                                                                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1635,7 +1665,7 @@
                                                                                                                                                                                                                                             -- REPLICATE  |PARTITIONED|
                                                                                                                                                                                                                                               exchange
                                                                                                                                                                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                                                                                data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                                                                                                                                                                data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                                                                                                                                                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                                                                                                                                                   exchange
                                                                                                                                                                                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1647,7 +1677,7 @@
                                                                                                                                                                                                                   -- REPLICATE  |PARTITIONED|
                                                                                                                                                                                                                     exchange
                                                                                                                                                                                                                     -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                                                      select (eq($$441.getField("to_u"), "aaaaa")) project: [$$438, $$443, $$444] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                                                                                                                                                      select (eq($$441.getField("to_u"), "aaaaa")) project: [$$438, $$443, $$444]
                                                                                                                                                                                                                       -- STREAM_SELECT  |PARTITIONED|
                                                                                                                                                                                                                         assign [$$444, $$443, $$438] <- [$$441.getField("y_id"), $$441.getField("a"), $$441.getField("b")]
                                                                                                                                                                                                                         -- ASSIGN  |PARTITIONED|
@@ -1665,7 +1695,7 @@
                                                                                                                                                                                                                                     -- REPLICATE  |PARTITIONED|
                                                                                                                                                                                                                                       exchange
                                                                                                                                                                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                                                                                                                        data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                                                                                                                                                        data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                                                                                                                                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                                                                                                                                           exchange
                                                                                                                                                                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1703,7 +1733,7 @@
                                                                                                                                       -- REPLICATE  |PARTITIONED|
                                                                                                                                         exchange
                                                                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                          data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                                                          data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                                                           -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                                             exchange
                                                                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -1729,7 +1759,7 @@
                                                                                                                               -- REPLICATE  |PARTITIONED|
                                                                                                                                 exchange
                                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                  data-scan []<-[$$411, $$413] <- test.collection1 [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                                                  data-scan []<-[$$411, $$413] <- test.collection1
                                                                                                                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                                     exchange
                                                                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
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 7869a45..fddb1fa 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
@@ -11,8 +11,10 @@
                   -- AGGREGATE  |LOCAL|
                     select (not(is-missing($$25)))
                     -- STREAM_SELECT  |LOCAL|
-                      nested tuple source
-                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                      project ([$$25])
+                      -- STREAM_PROJECT  |LOCAL|
+                        nested tuple source
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
           exchange
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 22cc503..ca7311c 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
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$25)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$25])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
                       exchange
@@ -82,8 +84,10 @@
                                       -- AGGREGATE  |LOCAL|
                                         select (not(is-missing($$25)))
                                         -- STREAM_SELECT  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$25])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                             -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
                               exchange
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 a4e3699..aa852ea 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
@@ -11,8 +11,10 @@
                   -- AGGREGATE  |LOCAL|
                     select (not(is-missing($$24)))
                     -- STREAM_SELECT  |LOCAL|
-                      nested tuple source
-                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                      project ([$$24])
+                      -- STREAM_PROJECT  |LOCAL|
+                        nested tuple source
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$21]  |PARTITIONED|
           exchange
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 6c20d83..b97aa3e 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
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$24)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$24])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$21]  |PARTITIONED|
                       exchange
@@ -82,8 +84,10 @@
                                       -- AGGREGATE  |LOCAL|
                                         select (not(is-missing($$24)))
                                         -- STREAM_SELECT  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$24])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                             -- PRE_CLUSTERED_GROUP_BY[$$21]  |PARTITIONED|
                               exchange
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 7869a45..fddb1fa 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
@@ -11,8 +11,10 @@
                   -- AGGREGATE  |LOCAL|
                     select (not(is-missing($$25)))
                     -- STREAM_SELECT  |LOCAL|
-                      nested tuple source
-                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                      project ([$$25])
+                      -- STREAM_PROJECT  |LOCAL|
+                        nested tuple source
+                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
         -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
           exchange
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 22cc503..ca7311c 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
@@ -23,8 +23,10 @@
                               -- AGGREGATE  |LOCAL|
                                 select (not(is-missing($$25)))
                                 -- STREAM_SELECT  |LOCAL|
-                                  nested tuple source
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$25])
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
                     -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
                       exchange
@@ -82,8 +84,10 @@
                                       -- AGGREGATE  |LOCAL|
                                         select (not(is-missing($$25)))
                                         -- STREAM_SELECT  |LOCAL|
-                                          nested tuple source
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$25])
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                                    }
                             -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
                               exchange
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpcds/query-ASTERIXDB-1581.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpcds/query-ASTERIXDB-1581.plan
index 41884c8..813b13b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpcds/query-ASTERIXDB-1581.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpcds/query-ASTERIXDB-1581.plan
@@ -18,15 +18,15 @@
                 -- ASSIGN  |PARTITIONED|
                   empty-tuple-source
                   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+      exchange
       -- BROADCAST_EXCHANGE  |LOCAL|
-        assign [$$149] <- [{"bucket1": $$147}] project: [$$149] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+        assign [$$149] <- [{"bucket1": $$147}] project: [$$149]
         -- ASSIGN  |LOCAL|
-          unnest $$147 <- scan-collection($$146) project: [$$147] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+          unnest $$147 <- scan-collection($$146) project: [$$147]
           -- UNNEST  |LOCAL|
-            assign [$$146] <- [switch-case(true, lt(get-item($$200, 0), 25437), cast($$128), cast($$145))] project: [$$146] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+            assign [$$146] <- [switch-case(true, lt(get-item($$200, 0), 25437), cast($$128), cast($$145))] project: [$$146]
             -- ASSIGN  |LOCAL|
-              exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+              exchange
               -- ONE_TO_ONE_EXCHANGE  |LOCAL|
                 group by ([$$200 := $$173]) decor ([$$128]) {
                           aggregate [$$145] <- [listify($$144)]
@@ -35,19 +35,21 @@
                             -- AGGREGATE  |LOCAL|
                               select (not(is-missing($$199)))
                               -- STREAM_SELECT  |LOCAL|
-                                nested tuple source
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                       } [cardinality: 0.0, op-cost: 0.0, total-cost: 1000000.0]
+                                project ([$$143, $$199])
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                       }
                 -- PRE_CLUSTERED_GROUP_BY[$$173]  |LOCAL|
-                  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                  exchange
                   -- ONE_TO_ONE_EXCHANGE  |LOCAL|
-                    project ([$$128, $$143, $$199, $$173]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                    project ([$$128, $$143, $$199, $$173])
                     -- STREAM_PROJECT  |LOCAL|
-                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                      exchange
                       -- ONE_TO_ONE_EXCHANGE  |LOCAL|
                         left outer join (eq($$173, $$174))
                         -- HYBRID_HASH_JOIN [$$173][$$174]  |LOCAL|
-                          exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                          exchange
                           -- ONE_TO_ONE_EXCHANGE  |LOCAL|
                             group by ([$$173 := $$109]) decor ([]) {
                                       aggregate [$$128] <- [listify($$127)]
@@ -56,63 +58,65 @@
                                         -- AGGREGATE  |LOCAL|
                                           select (not(is-missing($$172)))
                                           -- STREAM_SELECT  |LOCAL|
-                                            nested tuple source
-                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                   } [cardinality: 0.0, op-cost: 0.0, total-cost: 1000000.0]
+                                            project ([$$126, $$172])
+                                            -- STREAM_PROJECT  |LOCAL|
+                                              nested tuple source
+                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                   }
                             -- PRE_CLUSTERED_GROUP_BY[$$109]  |LOCAL|
-                              exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                              exchange
                               -- ONE_TO_ONE_EXCHANGE  |LOCAL|
-                                order (ASC, $$109) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                order (ASC, $$109)
                                 -- STABLE_SORT [$$109(ASC)]  |LOCAL|
-                                  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                  exchange
                                   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                    project ([$$126, $$172, $$109]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                    project ([$$126, $$172, $$109])
                                     -- STREAM_PROJECT  |UNPARTITIONED|
-                                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                      exchange
                                       -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                        left outer join (eq($$109, $$166)) [cardinality: 9.223372036854776E16, op-cost: 1.000001E12, total-cost: 3.000009E12]
+                                        left outer join (eq($$109, $$166))
                                         -- HYBRID_HASH_JOIN [$$109][$$166]  |UNPARTITIONED|
-                                          exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                          exchange
                                           -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                            assign [$$109] <- [$$175] project: [$$109] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                            assign [$$109] <- [$$175] project: [$$109]
                                             -- ASSIGN  |UNPARTITIONED|
-                                              exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                              exchange
                                               -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                replicate
                                                 -- REPLICATE  |UNPARTITIONED|
-                                                  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                  exchange
                                                   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                    assign [$$175] <- [$$176] project: [$$175] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                    assign [$$175] <- [$$176] project: [$$175]
                                                     -- ASSIGN  |UNPARTITIONED|
-                                                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                      exchange
                                                       -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                        replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                        replicate
                                                         -- REPLICATE  |UNPARTITIONED|
-                                                          exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                          exchange
                                                           -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                            aggregate [$$176] <- [listify($$183)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                            aggregate [$$176] <- [listify($$183)]
                                                             -- AGGREGATE  |UNPARTITIONED|
-                                                              aggregate [$$183] <- [agg-sql-sum($$206)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                              aggregate [$$183] <- [agg-sql-sum($$206)]
                                                               -- AGGREGATE  |UNPARTITIONED|
-                                                                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                exchange
                                                                 -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-                                                                  aggregate [$$206] <- [agg-sql-count(1)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                  aggregate [$$206] <- [agg-sql-count(1)]
                                                                   -- AGGREGATE  |PARTITIONED|
                                                                     select (and(ge($$185, 1), le($$185, 20)))
                                                                     -- STREAM_SELECT  |PARTITIONED|
-                                                                      assign [$$185] <- [$$184.getField(10)] project: [$$185] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                      assign [$$185] <- [$$184.getField(10)] project: [$$185]
                                                                       -- ASSIGN  |PARTITIONED|
-                                                                        exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                        exchange
                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                          replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                          replicate
                                                                           -- REPLICATE  |PARTITIONED|
-                                                                            exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                            exchange
                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                              project ([$$184]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                              project ([$$184])
                                                                               -- STREAM_PROJECT  |PARTITIONED|
-                                                                                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                exchange
                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                  data-scan []<-[$$186, $$187, $$184] <- tpcds.store_sales [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                  data-scan []<-[$$186, $$187, $$184] <- tpcds.store_sales
                                                                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                     exchange
                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -120,7 +124,7 @@
                                                                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                           exchange
                                           -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                            join (true) [cardinality: 1.0E12, op-cost: 1.0E12, total-cost: 1.000006E12]
+                                            join (true)
                                             -- NESTED_LOOP  |UNPARTITIONED|
                                               exchange
                                               -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
@@ -134,37 +138,37 @@
                                                       -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
                                                         assign [$$182] <- [true]
                                                         -- ASSIGN  |UNPARTITIONED|
-                                                          select (lt(get-item($$176, 0), 25437)) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                          select (lt(get-item($$176, 0), 25437))
                                                           -- STREAM_SELECT  |UNPARTITIONED|
                                                             exchange
                                                             -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                              replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                              replicate
                                                               -- REPLICATE  |UNPARTITIONED|
-                                                                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                exchange
                                                                 -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                                  aggregate [$$176] <- [listify($$183)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                  aggregate [$$176] <- [listify($$183)]
                                                                   -- AGGREGATE  |UNPARTITIONED|
-                                                                    aggregate [$$183] <- [agg-sql-sum($$206)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                    aggregate [$$183] <- [agg-sql-sum($$206)]
                                                                     -- AGGREGATE  |UNPARTITIONED|
-                                                                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                      exchange
                                                                       -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-                                                                        aggregate [$$206] <- [agg-sql-count(1)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                        aggregate [$$206] <- [agg-sql-count(1)]
                                                                         -- AGGREGATE  |PARTITIONED|
                                                                           select (and(ge($$185, 1), le($$185, 20)))
                                                                           -- STREAM_SELECT  |PARTITIONED|
-                                                                            assign [$$185] <- [$$184.getField(10)] project: [$$185] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                            assign [$$185] <- [$$184.getField(10)] project: [$$185]
                                                                             -- ASSIGN  |PARTITIONED|
-                                                                              exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                              exchange
                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                replicate
                                                                                 -- REPLICATE  |PARTITIONED|
-                                                                                  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                  exchange
                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                    project ([$$184]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                    project ([$$184])
                                                                                     -- STREAM_PROJECT  |PARTITIONED|
-                                                                                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                      exchange
                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                        data-scan []<-[$$186, $$187, $$184] <- tpcds.store_sales [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                        data-scan []<-[$$186, $$187, $$184] <- tpcds.store_sales
                                                                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                           exchange
                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -180,7 +184,7 @@
                                                     -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
                                                       aggregate [$$204] <- [agg-local-sql-avg($$124)]
                                                       -- AGGREGATE  |PARTITIONED|
-                                                        select (and(ge($$151, 1), le($$151, 20))) project: [$$124] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                        select (and(ge($$151, 1), le($$151, 20))) project: [$$124]
                                                         -- STREAM_SELECT  |PARTITIONED|
                                                           assign [$$124, $$151] <- [$$store_sales.getField(14), $$store_sales.getField(10)] project: [$$124, $$151]
                                                           -- ASSIGN  |PARTITIONED|
@@ -188,15 +192,15 @@
                                                             -- ASSIGN  |PARTITIONED|
                                                               exchange
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                replicate
                                                                 -- REPLICATE  |PARTITIONED|
-                                                                  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                  exchange
                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                    project ([$$184]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                    project ([$$184])
                                                                     -- STREAM_PROJECT  |PARTITIONED|
-                                                                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                      exchange
                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        data-scan []<-[$$186, $$187, $$184] <- tpcds.store_sales [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                        data-scan []<-[$$186, $$187, $$184] <- tpcds.store_sales
                                                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                                           exchange
                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -223,8 +227,10 @@
                                                     -- AGGREGATE  |LOCAL|
                                                       select (not(is-missing($$182)))
                                                       -- STREAM_SELECT  |LOCAL|
-                                                        nested tuple source
-                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                        project ([$$182])
+                                                        -- STREAM_PROJECT  |LOCAL|
+                                                          nested tuple source
+                                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                }
                                         -- PRE_CLUSTERED_GROUP_BY[$$175]  |LOCAL|
                                           exchange
@@ -237,45 +243,45 @@
                                                 -- STREAM_PROJECT  |UNPARTITIONED|
                                                   exchange
                                                   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                    left outer join (eq($$175, $$176)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                    left outer join (eq($$175, $$176))
                                                     -- HYBRID_HASH_JOIN [$$175][$$176]  |UNPARTITIONED|
                                                       exchange
                                                       -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                        replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                        replicate
                                                         -- REPLICATE  |UNPARTITIONED|
-                                                          exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                          exchange
                                                           -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                            assign [$$175] <- [$$176] project: [$$175] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                            assign [$$175] <- [$$176] project: [$$175]
                                                             -- ASSIGN  |UNPARTITIONED|
-                                                              exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                              exchange
                                                               -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                                replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                replicate
                                                                 -- REPLICATE  |UNPARTITIONED|
-                                                                  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                  exchange
                                                                   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                                    aggregate [$$176] <- [listify($$183)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                    aggregate [$$176] <- [listify($$183)]
                                                                     -- AGGREGATE  |UNPARTITIONED|
-                                                                      aggregate [$$183] <- [agg-sql-sum($$206)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                      aggregate [$$183] <- [agg-sql-sum($$206)]
                                                                       -- AGGREGATE  |UNPARTITIONED|
-                                                                        exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                        exchange
                                                                         -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-                                                                          aggregate [$$206] <- [agg-sql-count(1)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                          aggregate [$$206] <- [agg-sql-count(1)]
                                                                           -- AGGREGATE  |PARTITIONED|
                                                                             select (and(ge($$185, 1), le($$185, 20)))
                                                                             -- STREAM_SELECT  |PARTITIONED|
-                                                                              assign [$$185] <- [$$184.getField(10)] project: [$$185] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                              assign [$$185] <- [$$184.getField(10)] project: [$$185]
                                                                               -- ASSIGN  |PARTITIONED|
-                                                                                exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                exchange
                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                  replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                  replicate
                                                                                   -- REPLICATE  |PARTITIONED|
-                                                                                    exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                    exchange
                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                      project ([$$184]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                      project ([$$184])
                                                                                       -- STREAM_PROJECT  |PARTITIONED|
-                                                                                        exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                        exchange
                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                          data-scan []<-[$$186, $$187, $$184] <- tpcds.store_sales [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                          data-scan []<-[$$186, $$187, $$184] <- tpcds.store_sales
                                                                                           -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                             exchange
                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -289,37 +295,37 @@
                                                           -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
                                                             assign [$$182] <- [true]
                                                             -- ASSIGN  |UNPARTITIONED|
-                                                              select (lt(get-item($$176, 0), 25437)) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                              select (lt(get-item($$176, 0), 25437))
                                                               -- STREAM_SELECT  |UNPARTITIONED|
                                                                 exchange
                                                                 -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                                  replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                  replicate
                                                                   -- REPLICATE  |UNPARTITIONED|
-                                                                    exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                    exchange
                                                                     -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                                      aggregate [$$176] <- [listify($$183)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                      aggregate [$$176] <- [listify($$183)]
                                                                       -- AGGREGATE  |UNPARTITIONED|
-                                                                        aggregate [$$183] <- [agg-sql-sum($$206)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                        aggregate [$$183] <- [agg-sql-sum($$206)]
                                                                         -- AGGREGATE  |UNPARTITIONED|
-                                                                          exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                          exchange
                                                                           -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-                                                                            aggregate [$$206] <- [agg-sql-count(1)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                            aggregate [$$206] <- [agg-sql-count(1)]
                                                                             -- AGGREGATE  |PARTITIONED|
                                                                               select (and(ge($$185, 1), le($$185, 20)))
                                                                               -- STREAM_SELECT  |PARTITIONED|
-                                                                                assign [$$185] <- [$$184.getField(10)] project: [$$185] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                assign [$$185] <- [$$184.getField(10)] project: [$$185]
                                                                                 -- ASSIGN  |PARTITIONED|
-                                                                                  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                  exchange
                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                    replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                    replicate
                                                                                     -- REPLICATE  |PARTITIONED|
-                                                                                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                      exchange
                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                        project ([$$184]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                        project ([$$184])
                                                                                         -- STREAM_PROJECT  |PARTITIONED|
-                                                                                          exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                          exchange
                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                            data-scan []<-[$$186, $$187, $$184] <- tpcds.store_sales [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                            data-scan []<-[$$186, $$187, $$184] <- tpcds.store_sales
                                                                                             -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                               exchange
                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -343,15 +349,15 @@
                                             -- ASSIGN  |PARTITIONED|
                                               exchange
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                replicate [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                replicate
                                                 -- REPLICATE  |PARTITIONED|
-                                                  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                  exchange
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    project ([$$184]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                    project ([$$184])
                                                     -- STREAM_PROJECT  |PARTITIONED|
-                                                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                      exchange
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        data-scan []<-[$$186, $$187, $$184] <- tpcds.store_sales [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                        data-scan []<-[$$186, $$187, $$184] <- tpcds.store_sales
                                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                           exchange
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpcds/query-ASTERIXDB-1591.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpcds/query-ASTERIXDB-1591.plan
index 2323d7c..8ff870e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpcds/query-ASTERIXDB-1591.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/tpcds/query-ASTERIXDB-1591.plan
@@ -1,136 +1,142 @@
-distribute result [$$148] [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+distribute result [$$148]
 -- DISTRIBUTE_RESULT  |UNPARTITIONED|
-  exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+  exchange
   -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-    limit 100 [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+    limit 100
     -- STREAM_LIMIT  |UNPARTITIONED|
-      assign [$$148] <- [{"c": $$c, "ca": $$ca}] project: [$$148] [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+      assign [$$148] <- [{"c": $$c, "ca": $$ca}] project: [$$148]
       -- ASSIGN  |PARTITIONED|
-        project ([$$c, $$ca]) [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+        project ([$$c, $$ca])
         -- STREAM_PROJECT  |PARTITIONED|
-          exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+          exchange
           -- SORT_MERGE_EXCHANGE [$$192(ASC) ]  |PARTITIONED|
-            limit 100 [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+            limit 100
             -- STREAM_LIMIT  |PARTITIONED|
               select (or(neq($$163, 0), neq($$164, 0))) project: [$$192, $$c, $$ca]
               -- STREAM_SELECT  |PARTITIONED|
-                project ([$$164, $$192, $$c, $$ca, $$163]) [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                project ([$$164, $$192, $$c, $$ca, $$163])
                 -- STREAM_PROJECT  |PARTITIONED|
-                  exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                  exchange
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                     group by ([$$192 := $$201; $$193 := $$202]) decor ([$$c; $$ca; $$163]) {
                               aggregate [$$164] <- [agg-sum($$200)]
                               -- AGGREGATE  |LOCAL|
                                 nested tuple source
                                 -- NESTED_TUPLE_SOURCE  |LOCAL|
-                           } [cardinality: 0.0, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                           }
                     -- SORT_GROUP_BY[$$201, $$202]  |PARTITIONED|
-                      exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                      exchange
                       -- HASH_PARTITION_EXCHANGE [$$201, $$202]  |PARTITIONED|
                         group by ([$$201 := $$189; $$202 := $$190]) decor ([$$c; $$ca; $$163]) {
                                   aggregate [$$200] <- [agg-count({"cs1": $$cs1, "dd1": $$dd1})]
                                   -- AGGREGATE  |LOCAL|
                                     select (not(is-missing($$191)))
                                     -- STREAM_SELECT  |LOCAL|
-                                      nested tuple source
-                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
-                               } [cardinality: 0.0, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                      project ([$$cs1, $$dd1, $$191])
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                               }
                         -- PRE_CLUSTERED_GROUP_BY[$$189, $$190]  |PARTITIONED|
-                          exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                          exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            order (ASC, $$189) (ASC, $$190) [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                            order (ASC, $$189) (ASC, $$190)
                             -- STABLE_SORT [$$189(ASC), $$190(ASC)]  |PARTITIONED|
-                              exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                              exchange
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                project ([$$c, $$ca, $$163, $$cs1, $$dd1, $$191, $$189, $$190]) [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                project ([$$c, $$ca, $$163, $$cs1, $$dd1, $$191, $$189, $$190])
                                 -- STREAM_PROJECT  |PARTITIONED|
-                                  exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                  exchange
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     left outer join (eq($$189, $$171))
                                     -- HYBRID_HASH_JOIN [$$189][$$171]  |PARTITIONED|
-                                      exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                      exchange
                                       -- HASH_PARTITION_EXCHANGE [$$189]  |PARTITIONED|
                                         group by ([$$189 := $$198; $$190 := $$199]) decor ([$$c; $$ca]) {
                                                   aggregate [$$163] <- [agg-sum($$197)]
                                                   -- AGGREGATE  |LOCAL|
                                                     nested tuple source
                                                     -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                               } [cardinality: 0.0, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                               }
                                         -- SORT_GROUP_BY[$$198, $$199]  |PARTITIONED|
-                                          exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                          exchange
                                           -- HASH_PARTITION_EXCHANGE [$$198, $$199]  |PARTITIONED|
                                             group by ([$$198 := $$186; $$199 := $$187]) decor ([$$c; $$ca]) {
                                                       aggregate [$$197] <- [agg-count({"ws1": $$ws1, "dd1": $$dd1})]
                                                       -- AGGREGATE  |LOCAL|
                                                         select (not(is-missing($$188)))
                                                         -- STREAM_SELECT  |LOCAL|
-                                                          nested tuple source
-                                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                   } [cardinality: 0.0, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                                          project ([$$ws1, $$dd1, $$188])
+                                                          -- STREAM_PROJECT  |LOCAL|
+                                                            nested tuple source
+                                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                   }
                                             -- PRE_CLUSTERED_GROUP_BY[$$186, $$187]  |PARTITIONED|
-                                              exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                              exchange
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                order (ASC, $$186) (ASC, $$187) [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                                order (ASC, $$186) (ASC, $$187)
                                                 -- STABLE_SORT [$$186(ASC), $$187(ASC)]  |PARTITIONED|
-                                                  exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                                  exchange
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    project ([$$c, $$ca, $$ws1, $$dd1, $$188, $$186, $$187]) [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                                    project ([$$c, $$ca, $$ws1, $$dd1, $$188, $$186, $$187])
                                                     -- STREAM_PROJECT  |PARTITIONED|
-                                                      exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                                      exchange
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                         left outer join (eq($$186, $$169))
                                                         -- HYBRID_HASH_JOIN [$$186][$$169]  |PARTITIONED|
-                                                          exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                                          exchange
                                                           -- HASH_PARTITION_EXCHANGE [$$186]  |PARTITIONED|
                                                             select (neq($$165, 0)) project: [$$c, $$ca, $$186, $$187]
                                                             -- STREAM_SELECT  |PARTITIONED|
-                                                              exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                                              exchange
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                 group by ([$$186 := $$195; $$187 := $$196]) decor ([$$c; $$ca]) {
                                                                           aggregate [$$165] <- [agg-sum($$194)]
                                                                           -- AGGREGATE  |LOCAL|
                                                                             nested tuple source
                                                                             -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                                       } [cardinality: 0.0, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                                                       }
                                                                 -- SORT_GROUP_BY[$$195, $$196]  |PARTITIONED|
-                                                                  exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                                                  exchange
                                                                   -- HASH_PARTITION_EXCHANGE [$$195, $$196]  |PARTITIONED|
                                                                     group by ([$$195 := $$150; $$196 := $$151]) decor ([$$c; $$ca]) {
                                                                               aggregate [$$194] <- [agg-count({"ss1": $$ss1, "dd1": $$dd1})]
                                                                               -- AGGREGATE  |LOCAL|
                                                                                 select (not(is-missing($$185)))
                                                                                 -- STREAM_SELECT  |LOCAL|
-                                                                                  nested tuple source
-                                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                                           } [cardinality: 0.0, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                                                                  project ([$$ss1, $$dd1, $$185])
+                                                                                  -- STREAM_PROJECT  |LOCAL|
+                                                                                    nested tuple source
+                                                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                           }
                                                                     -- PRE_CLUSTERED_GROUP_BY[$$150, $$151]  |PARTITIONED|
-                                                                      exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                                                      exchange
                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        order (ASC, $$150) (ASC, $$151) [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                                                        order (ASC, $$150) (ASC, $$151)
                                                                         -- STABLE_SORT [$$150(ASC), $$151(ASC)]  |PARTITIONED|
-                                                                          exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                                                          exchange
                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                            project ([$$c, $$ca, $$ss1, $$dd1, $$185, $$150, $$151]) [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                                                            project ([$$c, $$ca, $$ss1, $$dd1, $$185, $$150, $$151])
                                                                             -- STREAM_PROJECT  |PARTITIONED|
-                                                                              exchange [cardinality: 9.223372036854776E16, op-cost: 0.0, total-cost: 9.223372036854776E16]
+                                                                              exchange
                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                join (eq($$161, $$151)) [cardinality: 9.223372036854776E16, op-cost: 9.223372036854776E16, total-cost: 9.223372036854776E16]
+                                                                                join (eq($$161, $$151))
                                                                                 -- HYBRID_HASH_JOIN [$$161][$$151]  |PARTITIONED|
-                                                                                  exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                  exchange
                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                    project ([$$c, $$ss1, $$dd1, $$185, $$150, $$161]) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                    project ([$$c, $$ss1, $$dd1, $$185, $$150, $$161])
                                                                                     -- STREAM_PROJECT  |PARTITIONED|
-                                                                                      exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                      exchange
                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                        left outer join (eq($$150, $$167)) [cardinality: 9.223372036854776E16, op-cost: 5.00001E11, total-cost: 1.000009E12]
+                                                                                        left outer join (eq($$150, $$167))
                                                                                         -- HYBRID_HASH_JOIN [$$150][$$167]  |PARTITIONED|
-                                                                                          exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                          exchange
                                                                                           -- HASH_PARTITION_EXCHANGE [$$150]  |PARTITIONED|
-                                                                                            assign [$$161] <- [$$c.getField(4)] [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                            assign [$$161] <- [$$c.getField(4)]
                                                                                             -- ASSIGN  |PARTITIONED|
-                                                                                              exchange [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                              exchange
                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                data-scan []<-[$$150, $$c] <- tpcds.customer [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                data-scan []<-[$$150, $$c] <- tpcds.customer
                                                                                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                   exchange
                                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -144,7 +150,7 @@
                                                                                               -- STREAM_PROJECT  |PARTITIONED|
                                                                                                 exchange
                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                  join (eq($$172, $$154)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                                                                  join (eq($$172, $$154))
                                                                                                   -- HYBRID_HASH_JOIN [$$172][$$154]  |PARTITIONED|
                                                                                                     exchange
                                                                                                     -- HASH_PARTITION_EXCHANGE [$$172]  |PARTITIONED|
@@ -154,7 +160,7 @@
                                                                                                         -- STREAM_PROJECT  |PARTITIONED|
                                                                                                           exchange
                                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                            data-scan []<-[$$152, $$153, $$ss1] <- tpcds.store_sales [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                            data-scan []<-[$$152, $$153, $$ss1] <- tpcds.store_sales
                                                                                                             -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                               exchange
                                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -166,19 +172,19 @@
                                                                                                       -- REPLICATE  |PARTITIONED|
                                                                                                         exchange
                                                                                                         -- HASH_PARTITION_EXCHANGE [$$154]  |PARTITIONED|
-                                                                                                          select (and(lt($$dd1.getField(10), 4), eq($$dd1.getField(6), 1900))) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                                                          select (and(lt($$dd1.getField(10), 4), eq($$dd1.getField(6), 1900)))
                                                                                                           -- STREAM_SELECT  |PARTITIONED|
                                                                                                             exchange
                                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                              data-scan []<-[$$154, $$dd1] <- tpcds.date_dim [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                                              data-scan []<-[$$154, $$dd1] <- tpcds.date_dim
                                                                                                               -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                 exchange
                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                                   empty-tuple-source
                                                                                                                   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                                  exchange [cardinality: 1000000.0, op-cost: 4000000.0, total-cost: 5000000.0]
+                                                                                  exchange
                                                                                   -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                                    data-scan []<-[$$151, $$ca] <- tpcds.customer_address [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                    data-scan []<-[$$151, $$ca] <- tpcds.customer_address
                                                                                     -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                       exchange
                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -192,7 +198,7 @@
                                                               -- STREAM_PROJECT  |PARTITIONED|
                                                                 exchange
                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  join (eq($$174, $$157)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                                                  join (eq($$174, $$157))
                                                                   -- HYBRID_HASH_JOIN [$$174][$$157]  |PARTITIONED|
                                                                     exchange
                                                                     -- HASH_PARTITION_EXCHANGE [$$174]  |PARTITIONED|
@@ -202,7 +208,7 @@
                                                                         -- STREAM_PROJECT  |PARTITIONED|
                                                                           exchange
                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                            data-scan []<-[$$155, $$156, $$ws1] <- tpcds.web_sales [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                            data-scan []<-[$$155, $$156, $$ws1] <- tpcds.web_sales
                                                                             -- DATASOURCE_SCAN  |PARTITIONED|
                                                                               exchange
                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -218,11 +224,11 @@
                                                                           -- REPLICATE  |PARTITIONED|
                                                                             exchange
                                                                             -- HASH_PARTITION_EXCHANGE [$$154]  |PARTITIONED|
-                                                                              select (and(lt($$dd1.getField(10), 4), eq($$dd1.getField(6), 1900))) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                                              select (and(lt($$dd1.getField(10), 4), eq($$dd1.getField(6), 1900)))
                                                                               -- STREAM_SELECT  |PARTITIONED|
                                                                                 exchange
                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                  data-scan []<-[$$154, $$dd1] <- tpcds.date_dim [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                                                  data-scan []<-[$$154, $$dd1] <- tpcds.date_dim
                                                                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                     exchange
                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -236,7 +242,7 @@
                                           -- STREAM_PROJECT  |PARTITIONED|
                                             exchange
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                              join (eq($$176, $$160)) [cardinality: 5.0E11, op-cost: 2000000.0, total-cost: 6000000.0]
+                                              join (eq($$176, $$160))
                                               -- HYBRID_HASH_JOIN [$$176][$$160]  |PARTITIONED|
                                                 exchange
                                                 -- HASH_PARTITION_EXCHANGE [$$176]  |PARTITIONED|
@@ -246,7 +252,7 @@
                                                     -- STREAM_PROJECT  |PARTITIONED|
                                                       exchange
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        data-scan []<-[$$158, $$159, $$cs1] <- tpcds.catalog_sales [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                        data-scan []<-[$$158, $$159, $$cs1] <- tpcds.catalog_sales
                                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                           exchange
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -262,11 +268,11 @@
                                                       -- REPLICATE  |PARTITIONED|
                                                         exchange
                                                         -- HASH_PARTITION_EXCHANGE [$$154]  |PARTITIONED|
-                                                          select (and(lt($$dd1.getField(10), 4), eq($$dd1.getField(6), 1900))) [cardinality: 1000000.0, op-cost: 0.0, total-cost: 1000000.0]
+                                                          select (and(lt($$dd1.getField(10), 4), eq($$dd1.getField(6), 1900)))
                                                           -- STREAM_SELECT  |PARTITIONED|
                                                             exchange
                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                              data-scan []<-[$$154, $$dd1] <- tpcds.date_dim [cardinality: 1000000.0, op-cost: 1000000.0, total-cost: 1000000.0]
+                                                              data-scan []<-[$$154, $$dd1] <- tpcds.date_dim
                                                               -- DATASOURCE_SCAN  |PARTITIONED|
                                                                 exchange
                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.011.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.011.plan
index eb6e7b4..e27d3a5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.011.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.011.plan
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (lt($$a, "100")) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$a <- scan-collection($$29) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              unnest $$a <- scan-collection($$29) project: [$$a] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- UNNEST  |LOCAL|
-                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$29]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$29] <- [$$d.getField("array")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.013.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.013.plan
index fb9d50f..b2a604a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.013.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.013.plan
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (lt($$a, 100)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$a <- scan-collection($$29) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              unnest $$a <- scan-collection($$29) project: [$$a] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- UNNEST  |LOCAL|
-                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$29]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$29] <- [$$d.getField("array")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.015.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.015.plan
index bec5abf..29ad8e7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.015.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.015.plan
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$a, 100)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$a <- scan-collection($$29) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              unnest $$a <- scan-collection($$29) project: [$$a] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- UNNEST  |LOCAL|
-                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$29]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$29] <- [$$d.getField("array")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.017.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.017.plan
index c215b86..91f4067 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.017.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.017.plan
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (lt($$a, 100.1)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$a <- scan-collection($$29) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              unnest $$a <- scan-collection($$29) project: [$$a] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- UNNEST  |LOCAL|
-                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$29]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$29] <- [$$d.getField("array")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.108.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.108.plan
index 7a24223..4dd0fe7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.108.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.108.plan
@@ -19,12 +19,14 @@
                           -- AGGREGATE  |LOCAL|
                             select (or(eq($$59, "2011"), eq($$59, "2016"))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              assign [$$59] <- [substring($$D, 0, 4)] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              assign [$$59] <- [substring($$D, 0, 4)] project: [$$59] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ASSIGN  |LOCAL|
-                                unnest $$D <- scan-collection($$56) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                unnest $$D <- scan-collection($$56) project: [$$D] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- UNNEST  |LOCAL|
-                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$56]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$56] <- [$$C.getField("dates")] project: [$$56] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/006/006.010.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/006/006.010.plan
index 1fb271e..a3be0bd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/006/006.010.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/006/006.010.plan
@@ -19,12 +19,14 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$55, array: [ 5.1 ])) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              assign [$$55] <- [$$point.getField("lon")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              assign [$$55] <- [$$point.getField("lon")] project: [$$55] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ASSIGN  |LOCAL|
-                                unnest $$point <- scan-collection($$54) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                unnest $$point <- scan-collection($$54) project: [$$point] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- UNNEST  |LOCAL|
-                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$54]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$54] <- [$$c.getField("geo").getField("coordinates")] project: [$$54] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.101.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.101.plan
index 52fae76e..90fee83 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.101.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.101.plan
@@ -19,8 +19,10 @@
                           -- AGGREGATE  |LOCAL|
                             select (not(if-missing-or-null(neq($$21, "1"), false))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$21]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$21] <- [$$d.getField("a")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.201.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.201.plan
index f45042a..a69153a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.201.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.201.plan
@@ -15,8 +15,10 @@
                       -- AGGREGATE  |LOCAL|
                         select (not(is-missing($$23))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- STREAM_SELECT  |LOCAL|
-                          nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          project ([$$23]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                          -- STREAM_PROJECT  |LOCAL|
+                            nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                    } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
             -- PRE_CLUSTERED_GROUP_BY[$$20]  |PARTITIONED|
               exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.301.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.301.plan
index 1b4a5f1..bb1e997 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.301.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/not-in_every/not-in_every.301.plan
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (not(if-missing-or-null(ge($$x, 100), false))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$x <- scan-collection($$29) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              unnest $$x <- scan-collection($$29) project: [$$x] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- UNNEST  |LOCAL|
-                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$29]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$29] <- [$$d.getField("array")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/sql-compat/sql-compat.013.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/sql-compat/sql-compat.013.plan
index 505049f..f27743f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/sql-compat/sql-compat.013.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/sql-compat/sql-compat.013.plan
@@ -35,8 +35,10 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (eq(string-default-null($$210), "sixteen")) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- STREAM_SELECT  |LOCAL|
-                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$210]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                              } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- SUBPLAN  |PARTITIONED|
                         assign [$$231] <- [string-default-null($$210)] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/subplan/subplan.012.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/subplan/subplan.012.plan
index 7faaee2..b5c338b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/subplan/subplan.012.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/subplan/subplan.012.plan
@@ -15,12 +15,14 @@
                       -- AGGREGATE  |LOCAL|
                         select (eq($$55, "1")) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- STREAM_SELECT  |LOCAL|
-                          assign [$$55] <- [$$ao.getField("text")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                          assign [$$55] <- [$$ao.getField("text")] project: [$$55] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ASSIGN  |LOCAL|
-                            unnest $$ao <- scan-collection($$57) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            unnest $$ao <- scan-collection($$57) project: [$$ao] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- UNNEST  |LOCAL|
-                              nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$57]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                    } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
             -- SUBPLAN  |PARTITIONED|
               assign [$$57] <- [$$p.getField("arrayOrObject")] project: [$$57] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/subplan/subplan.022.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/subplan/subplan.022.plan
index 91517a3..48ff0a80 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/subplan/subplan.022.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/subplan/subplan.022.plan
@@ -15,12 +15,14 @@
                       -- AGGREGATE  |LOCAL|
                         select (not(if-missing-or-null(le($$55, "2"), false))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- STREAM_SELECT  |LOCAL|
-                          assign [$$55] <- [$$ao.getField("text")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                          assign [$$55] <- [$$ao.getField("text")] project: [$$55] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ASSIGN  |LOCAL|
-                            unnest $$ao <- scan-collection($$57) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            unnest $$ao <- scan-collection($$57) project: [$$ao] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- UNNEST  |LOCAL|
-                              nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$57]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                    } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
             -- SUBPLAN  |PARTITIONED|
               assign [$$57] <- [$$p.getField("arrayOrObject")] project: [$$57] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/subplan/subplan.052.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/subplan/subplan.052.plan
index fc7e087..00a8545 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/subplan/subplan.052.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/subplan/subplan.052.plan
@@ -15,9 +15,9 @@
                       -- AGGREGATE  |LOCAL|
                         select (and(ge($$65, "1"), le($$65, "2"))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- STREAM_SELECT  |LOCAL|
-                          assign [$$65] <- [$$ao.getField("text")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                          assign [$$65] <- [$$ao.getField("text")] project: [$$65] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ASSIGN  |LOCAL|
-                            unnest $$ao <- scan-collection($$68) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            unnest $$ao <- scan-collection($$68) project: [$$ao] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- UNNEST  |LOCAL|
                               nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- NESTED_TUPLE_SOURCE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/array-access-pushdown/array-access-pushdown.010.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/array-access-pushdown/array-access-pushdown.010.plan
index 6b9f696..79b009f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/array-access-pushdown/array-access-pushdown.010.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/array-access-pushdown/array-access-pushdown.010.plan
@@ -17,12 +17,14 @@
                         -- AGGREGATE  |LOCAL|
                           select (not(if-missing-or-null(eq($$52, "string"), false))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- STREAM_SELECT  |LOCAL|
-                            assign [$$52] <- [$$ht.getField("display_url")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            assign [$$52] <- [$$ht.getField("display_url")] project: [$$52] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- ASSIGN  |LOCAL|
-                              unnest $$ht <- scan-collection($$51) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              unnest $$ht <- scan-collection($$51) project: [$$ht] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- UNNEST  |LOCAL|
-                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$51]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                      } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
               -- SUBPLAN  |PARTITIONED|
                 assign [$$51] <- [$$p.getField("entities").getField("urls")] project: [$$51] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.014.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.014.plan
index 6aa477e..0115e9c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.014.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.014.plan
@@ -39,8 +39,10 @@
                                     -- AGGREGATE  |LOCAL|
                                       select (not(is-missing($$113))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                       -- STREAM_SELECT  |LOCAL|
-                                        nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                        project ([$$113]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        -- STREAM_PROJECT  |LOCAL|
+                                          nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                                  } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- PRE_CLUSTERED_GROUP_BY[$$112]  |PARTITIONED|
                             exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.016.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.016.plan
index a545ec1..dcf0094 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.016.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.016.plan
@@ -19,12 +19,14 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$71, 2)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              assign [$$71] <- [$$e.getField("x")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              assign [$$71] <- [$$e.getField("x")] project: [$$71] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ASSIGN  |LOCAL|
-                                unnest $$e <- scan-collection($$68) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                unnest $$e <- scan-collection($$68) project: [$$e] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- UNNEST  |LOCAL|
-                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$68]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- SUBPLAN  |PARTITIONED|
                   subplan {
@@ -32,12 +34,14 @@
                             -- AGGREGATE  |LOCAL|
                               select (eq($$69, 1)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- STREAM_SELECT  |LOCAL|
-                                assign [$$69] <- [$$e.getField("x")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                assign [$$69] <- [$$e.getField("x")] project: [$$69] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- ASSIGN  |LOCAL|
-                                  unnest $$e <- scan-collection($$68) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  unnest $$e <- scan-collection($$68) project: [$$e] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- UNNEST  |LOCAL|
-                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$68]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                          } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                   -- SUBPLAN  |PARTITIONED|
                     assign [$$68] <- [$$c.getField("val1")] project: [$$68] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.017.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.017.plan
index 51b9bde..53dd4cc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.017.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.017.plan
@@ -19,12 +19,14 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$71, 2)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              assign [$$71] <- [$$e.getField("y")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              assign [$$71] <- [$$e.getField("y")] project: [$$71] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ASSIGN  |LOCAL|
-                                unnest $$e <- scan-collection($$68) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                unnest $$e <- scan-collection($$68) project: [$$e] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- UNNEST  |LOCAL|
-                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$68]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- SUBPLAN  |PARTITIONED|
                   subplan {
@@ -32,12 +34,14 @@
                             -- AGGREGATE  |LOCAL|
                               select (eq($$69, 1)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- STREAM_SELECT  |LOCAL|
-                                assign [$$69] <- [$$e.getField("x")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                assign [$$69] <- [$$e.getField("x")] project: [$$69] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- ASSIGN  |LOCAL|
-                                  unnest $$e <- scan-collection($$68) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  unnest $$e <- scan-collection($$68) project: [$$e] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- UNNEST  |LOCAL|
-                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$68]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                          } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                   -- SUBPLAN  |PARTITIONED|
                     assign [$$68] <- [$$c.getField("val1")] project: [$$68] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.018.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.018.plan
index 855a17a..2f4e3ce 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.018.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.018.plan
@@ -19,12 +19,14 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$71, 2)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              assign [$$71] <- [$$e.getField("y")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              assign [$$71] <- [$$e.getField("y")] project: [$$71] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ASSIGN  |LOCAL|
-                                unnest $$e <- scan-collection($$70) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                unnest $$e <- scan-collection($$70) project: [$$e] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- UNNEST  |LOCAL|
-                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$70]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- SUBPLAN  |PARTITIONED|
                   project ([$$70, $$53]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
@@ -34,12 +36,14 @@
                               -- AGGREGATE  |LOCAL|
                                 select (eq($$69, 1)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- STREAM_SELECT  |LOCAL|
-                                  assign [$$69] <- [$$e.getField("x")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  assign [$$69] <- [$$e.getField("x")] project: [$$69] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- ASSIGN  |LOCAL|
-                                    unnest $$e <- scan-collection($$68) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    unnest $$e <- scan-collection($$68) project: [$$e] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- UNNEST  |LOCAL|
-                                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      project ([$$68]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                            } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                     -- SUBPLAN  |PARTITIONED|
                       assign [$$70, $$68] <- [$$c.getField("val2"), $$c.getField("val1")] project: [$$70, $$68] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.020.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.020.plan
index 832fd10..f9e72f4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.020.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.020.plan
@@ -25,10 +25,12 @@
                                 -- AGGREGATE  |LOCAL|
                                   assign [$$52] <- [$$i.getField("count")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- ASSIGN  |LOCAL|
-                                    unnest $$i <- scan-collection($$70) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    unnest $$i <- scan-collection($$70) project: [$$i] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- UNNEST  |LOCAL|
-                                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      project ([$$70]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                              } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- SUBPLAN  |PARTITIONED|
                         assign [$$64, $$70] <- [to-object-var-str($$t).getField(0), $$t.getField("a1")] project: [$$64, $$70] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.021.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.021.plan
index 832fd10..f9e72f4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.021.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.021.plan
@@ -25,10 +25,12 @@
                                 -- AGGREGATE  |LOCAL|
                                   assign [$$52] <- [$$i.getField("count")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- ASSIGN  |LOCAL|
-                                    unnest $$i <- scan-collection($$70) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    unnest $$i <- scan-collection($$70) project: [$$i] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- UNNEST  |LOCAL|
-                                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      project ([$$70]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                              } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- SUBPLAN  |PARTITIONED|
                         assign [$$64, $$70] <- [to-object-var-str($$t).getField(0), $$t.getField("a1")] project: [$$64, $$70] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.022.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.022.plan
index e0ad5d5..4e424a0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.022.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.022.plan
@@ -21,12 +21,14 @@
                             -- AGGREGATE  |LOCAL|
                               assign [$$82] <- [$$98.getField("Overall")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ASSIGN  |LOCAL|
-                                assign [$$98] <- [$$reviews.getField("ratings")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                assign [$$98] <- [$$reviews.getField("ratings")] project: [$$98] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- ASSIGN  |LOCAL|
-                                  unnest $$reviews <- scan-collection($$91) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  unnest $$reviews <- scan-collection($$91) project: [$$reviews] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- UNNEST  |LOCAL|
-                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$91]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                          } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                   -- SUBPLAN  |PARTITIONED|
                     assign [$#2] <- [get-item($$72, 0)] project: [$$93, $$94, $$91, $#2] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
@@ -38,12 +40,14 @@
                                   -- AGGREGATE  |LOCAL|
                                     assign [$$69] <- [$$97.getField("Overall")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- ASSIGN  |LOCAL|
-                                      assign [$$97] <- [$$89.getField("ratings")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      assign [$$97] <- [$$89.getField("ratings")] project: [$$97] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                       -- ASSIGN  |LOCAL|
-                                        unnest $$89 <- scan-collection($$91) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        unnest $$89 <- scan-collection($$91) project: [$$89] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                         -- UNNEST  |LOCAL|
-                                          nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$91]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                              } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- SUBPLAN  |PARTITIONED|
                         select (eq($$ht.getField("city"), "Los Angeles")) project: [$$93, $$94, $$91] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/replicate/replicate.021.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/replicate/replicate.021.plan
index 0289366..1fe19d7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/replicate/replicate.021.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/replicate/replicate.021.plan
@@ -49,12 +49,14 @@
                                 -- AGGREGATE  |LOCAL|
                                   select (eq($$76, "x")) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- STREAM_SELECT  |LOCAL|
-                                    assign [$$76] <- [$$ol.getField("ol_dist_info")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    assign [$$76] <- [$$ol.getField("ol_dist_info")] project: [$$76] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- ASSIGN  |LOCAL|
-                                      unnest $$ol <- scan-collection($$75) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      unnest $$ol <- scan-collection($$75) project: [$$ol] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                       -- UNNEST  |LOCAL|
-                                        nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                        project ([$$75]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        -- STREAM_PROJECT  |LOCAL|
+                                          nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                              } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- SUBPLAN  |PARTITIONED|
                         assign [$$73, $$75] <- [$$o2.getField("o_carrier_id"), $$o2.getField("o_orderline")] project: [$$73, $$75] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/dynamic-prefixes/not-in/not-in.011.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/dynamic-prefixes/not-in/not-in.011.plan
index 737dea4..22404f7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/dynamic-prefixes/not-in/not-in.011.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/dynamic-prefixes/not-in/not-in.011.plan
@@ -19,8 +19,10 @@
                           -- AGGREGATE  |LOCAL|
                             select (not(if-missing-or-null(neq(lowercase($$21), "engineering"), false))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$21]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$22, $$21] <- [$$d.getField("id"), $$d.getField("department")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/dynamic-prefixes/not-in/not-in.111.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/dynamic-prefixes/not-in/not-in.111.plan
index cabb210..ab615fb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/dynamic-prefixes/not-in/not-in.111.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/dynamic-prefixes/not-in/not-in.111.plan
@@ -21,8 +21,10 @@
                             -- AGGREGATE  |LOCAL|
                               select (not(is-missing($$24))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- STREAM_SELECT  |LOCAL|
-                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$24]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                          } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                   -- PRE_CLUSTERED_GROUP_BY[$$23]  |PARTITIONED|
                     exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/array-access-pushdown/array-access-pushdown.15.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/array-access-pushdown/array-access-pushdown.15.plan
index 6630e31..7cc4274 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/array-access-pushdown/array-access-pushdown.15.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/array-access-pushdown/array-access-pushdown.15.plan
@@ -17,12 +17,14 @@
                         -- AGGREGATE  |LOCAL|
                           select (not(if-missing-or-null(eq($$51, "string"), false))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- STREAM_SELECT  |LOCAL|
-                            assign [$$51] <- [$$ht.getField("display_url")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            assign [$$51] <- [$$ht.getField("display_url")] project: [$$51] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- ASSIGN  |LOCAL|
-                              unnest $$ht <- scan-collection($$50) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              unnest $$ht <- scan-collection($$50) project: [$$ht] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- UNNEST  |LOCAL|
-                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$50]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                      } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
               -- SUBPLAN  |PARTITIONED|
                 assign [$$50] <- [$$p.getField("entities").getField("urls")] project: [$$50] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/array-access-pushdown/array-access-pushdown.17.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/array-access-pushdown/array-access-pushdown.17.plan
index 9b556b6..5185cdf 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/array-access-pushdown/array-access-pushdown.17.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/array-access-pushdown/array-access-pushdown.17.plan
@@ -17,12 +17,14 @@
                         -- AGGREGATE  |LOCAL|
                           select (not(if-missing-or-null(eq($$51, "string"), false))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- STREAM_SELECT  |LOCAL|
-                            assign [$$51] <- [$$ht.getField("display_url")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            assign [$$51] <- [$$ht.getField("display_url")] project: [$$51] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- ASSIGN  |LOCAL|
-                              unnest $$ht <- scan-collection($$50) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              unnest $$ht <- scan-collection($$50) project: [$$ht] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- UNNEST  |LOCAL|
-                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$50]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                      } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
               -- SUBPLAN  |PARTITIONED|
                 assign [$$50] <- [$$p.getField("entities").getField("urls")] project: [$$50] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/pushdown-plans/pushdown-plans.07.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/pushdown-plans/pushdown-plans.07.plan
index 2d4c313..478a00b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/pushdown-plans/pushdown-plans.07.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/pushdown-plans/pushdown-plans.07.plan
@@ -45,8 +45,10 @@
                                           -- AGGREGATE  |LOCAL|
                                             select (not(is-missing($$111))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                             -- STREAM_SELECT  |LOCAL|
-                                              nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                              project ([$$111]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                              -- STREAM_PROJECT  |LOCAL|
+                                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                        } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- PRE_CLUSTERED_GROUP_BY[$$110]  |PARTITIONED|
                                   exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/pushdown-plans/pushdown-plans.08.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/pushdown-plans/pushdown-plans.08.plan
index 2f9da11..efe3c69 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/pushdown-plans/pushdown-plans.08.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/pushdown-plans/pushdown-plans.08.plan
@@ -19,12 +19,14 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$70, 2)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              assign [$$70] <- [$$e.getField("x")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              assign [$$70] <- [$$e.getField("x")] project: [$$70] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ASSIGN  |LOCAL|
-                                unnest $$e <- scan-collection($$67) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                unnest $$e <- scan-collection($$67) project: [$$e] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- UNNEST  |LOCAL|
-                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$67]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- SUBPLAN  |PARTITIONED|
                   subplan {
@@ -32,12 +34,14 @@
                             -- AGGREGATE  |LOCAL|
                               select (eq($$68, 1)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- STREAM_SELECT  |LOCAL|
-                                assign [$$68] <- [$$e.getField("x")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                assign [$$68] <- [$$e.getField("x")] project: [$$68] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- ASSIGN  |LOCAL|
-                                  unnest $$e <- scan-collection($$67) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  unnest $$e <- scan-collection($$67) project: [$$e] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- UNNEST  |LOCAL|
-                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$67]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                          } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                   -- SUBPLAN  |PARTITIONED|
                     assign [$$67] <- [$$p.getField("val1")] project: [$$67] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/pushdown-plans/pushdown-plans.09.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/pushdown-plans/pushdown-plans.09.plan
index afa0968..0fd3265 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/pushdown-plans/pushdown-plans.09.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/pushdown-plans/pushdown-plans.09.plan
@@ -19,12 +19,14 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$70, 2)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              assign [$$70] <- [$$e.getField("y")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              assign [$$70] <- [$$e.getField("y")] project: [$$70] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ASSIGN  |LOCAL|
-                                unnest $$e <- scan-collection($$67) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                unnest $$e <- scan-collection($$67) project: [$$e] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- UNNEST  |LOCAL|
-                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$67]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- SUBPLAN  |PARTITIONED|
                   subplan {
@@ -32,12 +34,14 @@
                             -- AGGREGATE  |LOCAL|
                               select (eq($$68, 1)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- STREAM_SELECT  |LOCAL|
-                                assign [$$68] <- [$$e.getField("x")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                assign [$$68] <- [$$e.getField("x")] project: [$$68] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- ASSIGN  |LOCAL|
-                                  unnest $$e <- scan-collection($$67) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  unnest $$e <- scan-collection($$67) project: [$$e] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- UNNEST  |LOCAL|
-                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$67]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                          } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                   -- SUBPLAN  |PARTITIONED|
                     assign [$$67] <- [$$p.getField("val1")] project: [$$67] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/pushdown-plans/pushdown-plans.10.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/pushdown-plans/pushdown-plans.10.plan
index 188c138..34a5eb7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/pushdown-plans/pushdown-plans.10.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-dataset/common/parquet/pushdown-plans/pushdown-plans.10.plan
@@ -19,12 +19,14 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$70, 2)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              assign [$$70] <- [$$e.getField("y")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              assign [$$70] <- [$$e.getField("y")] project: [$$70] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ASSIGN  |LOCAL|
-                                unnest $$e <- scan-collection($$69) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                unnest $$e <- scan-collection($$69) project: [$$e] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- UNNEST  |LOCAL|
-                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$69]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                 -- SUBPLAN  |PARTITIONED|
                   project ([$$69, $$53]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
@@ -34,12 +36,14 @@
                               -- AGGREGATE  |LOCAL|
                                 select (eq($$68, 1)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- STREAM_SELECT  |LOCAL|
-                                  assign [$$68] <- [$$e.getField("x")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  assign [$$68] <- [$$e.getField("x")] project: [$$68] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- ASSIGN  |LOCAL|
-                                    unnest $$e <- scan-collection($$67) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    unnest $$e <- scan-collection($$67) project: [$$e] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- UNNEST  |LOCAL|
-                                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      project ([$$67]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                            } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                     -- SUBPLAN  |PARTITIONED|
                       assign [$$69, $$67] <- [$$p.getField("val2"), $$p.getField("val1")] project: [$$69, $$67] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.8.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.8.plan
index c02c07e..9e112b3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.8.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.8.plan
@@ -25,10 +25,12 @@
                                 -- AGGREGATE  |LOCAL|
                                   assign [$$77] <- [object-remove(object-remove(object-remove($$t0, "title"), "authors"), "misc")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- ASSIGN  |LOCAL|
-                                    unnest $$t0 <- scan-collection(to-array($$paper)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    unnest $$t0 <- scan-collection(to-array($$paper)) project: [$$t0] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- UNNEST  |LOCAL|
-                                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      project ([$$paper]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                              } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- SUBPLAN  |PARTITIONED|
                         exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3562/query-ASTERIXDB-3562.4.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3562/query-ASTERIXDB-3562.4.plan
index 57a946d..c9f34a3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3562/query-ASTERIXDB-3562.4.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3562/query-ASTERIXDB-3562.4.plan
@@ -9,8 +9,10 @@
         subplan {
                   assign [$$17] <- [array-slice($$20, 0, 2)] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                   -- ASSIGN  |LOCAL|
-                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    project ([$$20]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                    -- STREAM_PROJECT  |LOCAL|
+                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
         -- SUBPLAN  |PARTITIONED|
           subplan {
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/subquery/query-ASTERIXDB-3538/query-ASTERIXDB-3538.5.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/subquery/query-ASTERIXDB-3538/query-ASTERIXDB-3538.5.plan
index f16bcce..b170d58 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/subquery/query-ASTERIXDB-3538/query-ASTERIXDB-3538.5.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/subquery/query-ASTERIXDB-3538/query-ASTERIXDB-3538.5.plan
@@ -15,8 +15,10 @@
                       -- AGGREGATE  |LOCAL|
                         unnest $$333 <- scan-collection($$343) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- UNNEST  |LOCAL|
-                          nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          project ([$$343]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                          -- STREAM_PROJECT  |LOCAL|
+                            nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                  } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
           -- SUBPLAN  |PARTITIONED|
             select (not(is-null($$351))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/tpch/query-plans/query-plans.04.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/tpch/query-plans/query-plans.04.plan
index 0bc5602..72787e1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/tpch/query-plans/query-plans.04.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/tpch/query-plans/query-plans.04.plan
@@ -51,8 +51,10 @@
                                                           -- AGGREGATE  |LOCAL|
                                                             select (not(is-missing($$249))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                             -- STREAM_SELECT  |LOCAL|
-                                                              nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                              project ([$$208, $$249]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                                              -- STREAM_PROJECT  |LOCAL|
+                                                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                      } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                               -- PRE_CLUSTERED_GROUP_BY[$$200]  |PARTITIONED|
                                                 exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/tpch/query-plans/query-plans.06.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/tpch/query-plans/query-plans.06.plan
index 1ccaaec..486e988 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/tpch/query-plans/query-plans.06.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/tpch/query-plans/query-plans.06.plan
@@ -44,8 +44,10 @@
                                     -- AGGREGATE  |LOCAL|
                                       select (not(is-missing($$86))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                       -- STREAM_SELECT  |LOCAL|
-                                        nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                        project ([$$l, $$86]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        -- STREAM_PROJECT  |LOCAL|
+                                          nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                                  } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- PRE_CLUSTERED_GROUP_BY[$$77]  |PARTITIONED|
                             exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
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 3cf9c6a..c587725 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
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (lt($$a, "100")) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$a <- scan-collection($$29) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              unnest $$a <- scan-collection($$29) project: [$$a] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- UNNEST  |LOCAL|
-                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$29]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 6.0, doc-size: 106.0, op-cost: 0.0, total-cost: 6.0]
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$29] <- [$$d.getField("array")] [cardinality: 6.0, doc-size: 106.0, op-cost: 0.0, total-cost: 6.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.013.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.013.plan
index 7a1e8b3..b67c66d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.013.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.013.plan
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (lt($$a, 100)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$a <- scan-collection($$29) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              unnest $$a <- scan-collection($$29) project: [$$a] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- UNNEST  |LOCAL|
-                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$29]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 6.0, doc-size: 106.0, op-cost: 0.0, total-cost: 6.0]
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$29] <- [$$d.getField("array")] [cardinality: 6.0, doc-size: 106.0, op-cost: 0.0, total-cost: 6.0]
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 aae4438..b43c031 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
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$a, 100)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$a <- scan-collection($$29) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              unnest $$a <- scan-collection($$29) project: [$$a] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- UNNEST  |LOCAL|
-                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$29]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 6.0, doc-size: 106.0, op-cost: 0.0, total-cost: 6.0]
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$29] <- [$$d.getField("array")] [cardinality: 6.0, doc-size: 106.0, op-cost: 0.0, total-cost: 6.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.017.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.017.plan
index afc236a..9ba3c76 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.017.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.017.plan
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (lt($$a, 100.1)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$a <- scan-collection($$29) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              unnest $$a <- scan-collection($$29) project: [$$a] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- UNNEST  |LOCAL|
-                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$29]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 6.0, doc-size: 106.0, op-cost: 0.0, total-cost: 6.0]
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$29] <- [$$d.getField("array")] [cardinality: 6.0, doc-size: 106.0, op-cost: 0.0, total-cost: 6.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.108.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.108.plan
index 42ef238..5f28cc3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.108.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.108.plan
@@ -19,12 +19,14 @@
                           -- AGGREGATE  |LOCAL|
                             select (or(eq($$59, "2011"), eq($$59, "2016"))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              assign [$$59] <- [substring($$D, 0, 4)] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              assign [$$59] <- [substring($$D, 0, 4)] project: [$$59] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ASSIGN  |LOCAL|
-                                unnest $$D <- scan-collection($$56) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                unnest $$D <- scan-collection($$56) project: [$$D] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- UNNEST  |LOCAL|
-                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$56]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 30.0, doc-size: 0.0, op-cost: 0.0, total-cost: 30.0]
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$56] <- [$$C.getField("dates")] project: [$$56] [cardinality: 30.0, doc-size: 0.0, op-cost: 0.0, total-cost: 30.0]
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 ed14662..7f67d58 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
@@ -19,12 +19,14 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$55, array: [ 5.1 ])) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              assign [$$55] <- [$$point.getField("lon")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              assign [$$55] <- [$$point.getField("lon")] project: [$$55] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ASSIGN  |LOCAL|
-                                unnest $$point <- scan-collection($$54) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                unnest $$point <- scan-collection($$54) project: [$$point] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- UNNEST  |LOCAL|
-                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$54]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 8.0, doc-size: 0.0, op-cost: 0.0, total-cost: 8.0]
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$54] <- [$$c.getField("geo").getField("coordinates")] project: [$$54] [cardinality: 8.0, doc-size: 0.0, op-cost: 0.0, total-cost: 8.0]
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 a92924d..b156b59 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
@@ -19,8 +19,10 @@
                           -- AGGREGATE  |LOCAL|
                             select (not(if-missing-or-null(neq($$21, "1"), false))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$21]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 6.0, doc-size: 106.0, op-cost: 0.0, total-cost: 6.0]
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$21] <- [$$d.getField("a")] [cardinality: 6.0, doc-size: 106.0, op-cost: 0.0, total-cost: 6.0]
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 09dfdfb..0c888f9 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
@@ -19,10 +19,12 @@
                           -- AGGREGATE  |LOCAL|
                             select (not(if-missing-or-null(ge($$x, 100), false))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              unnest $$x <- scan-collection($$29) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              unnest $$x <- scan-collection($$29) project: [$$x] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- UNNEST  |LOCAL|
-                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$29]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 6.0, doc-size: 106.0, op-cost: 0.0, total-cost: 6.0]
                 -- SUBPLAN  |PARTITIONED|
                   assign [$$29] <- [$$d.getField("array")] [cardinality: 6.0, doc-size: 106.0, op-cost: 0.0, total-cost: 6.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/subplan/subplan.012.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/subplan/subplan.012.plan
index a6ca76b..239e5a8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/subplan/subplan.012.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/subplan/subplan.012.plan
@@ -15,12 +15,14 @@
                       -- AGGREGATE  |LOCAL|
                         select (eq($$55, "1")) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- STREAM_SELECT  |LOCAL|
-                          assign [$$55] <- [$$ao.getField("text")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                          assign [$$55] <- [$$ao.getField("text")] project: [$$55] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ASSIGN  |LOCAL|
-                            unnest $$ao <- scan-collection($$57) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            unnest $$ao <- scan-collection($$57) project: [$$ao] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- UNNEST  |LOCAL|
-                              nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$57]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                    } [cardinality: 6.0, doc-size: 0.0, op-cost: 0.0, total-cost: 6.0]
             -- SUBPLAN  |PARTITIONED|
               assign [$$57] <- [$$p.getField("arrayOrObject")] project: [$$57] [cardinality: 6.0, doc-size: 0.0, op-cost: 0.0, total-cost: 6.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/subplan/subplan.022.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/subplan/subplan.022.plan
index 94070f1..9cbda26 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/subplan/subplan.022.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/subplan/subplan.022.plan
@@ -15,12 +15,14 @@
                       -- AGGREGATE  |LOCAL|
                         select (not(if-missing-or-null(le($$55, "2"), false))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- STREAM_SELECT  |LOCAL|
-                          assign [$$55] <- [$$ao.getField("text")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                          assign [$$55] <- [$$ao.getField("text")] project: [$$55] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ASSIGN  |LOCAL|
-                            unnest $$ao <- scan-collection($$57) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            unnest $$ao <- scan-collection($$57) project: [$$ao] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- UNNEST  |LOCAL|
-                              nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                              project ([$$57]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              -- STREAM_PROJECT  |LOCAL|
+                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                    } [cardinality: 6.0, doc-size: 0.0, op-cost: 0.0, total-cost: 6.0]
             -- SUBPLAN  |PARTITIONED|
               assign [$$57] <- [$$p.getField("arrayOrObject")] project: [$$57] [cardinality: 6.0, doc-size: 0.0, op-cost: 0.0, total-cost: 6.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/subplan/subplan.052.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/subplan/subplan.052.plan
index b2620f3..239159f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/subplan/subplan.052.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/subplan/subplan.052.plan
@@ -15,9 +15,9 @@
                       -- AGGREGATE  |LOCAL|
                         select (and(ge($$65, "1"), le($$65, "2"))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- STREAM_SELECT  |LOCAL|
-                          assign [$$65] <- [$$ao.getField("text")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                          assign [$$65] <- [$$ao.getField("text")] project: [$$65] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ASSIGN  |LOCAL|
-                            unnest $$ao <- scan-collection($$68) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            unnest $$ao <- scan-collection($$68) project: [$$ao] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- UNNEST  |LOCAL|
                               nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- NESTED_TUPLE_SOURCE  |LOCAL|
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 bcac67e..58ba035 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
@@ -17,12 +17,14 @@
                         -- AGGREGATE  |LOCAL|
                           select (not(if-missing-or-null(eq($$52, "string"), false))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- STREAM_SELECT  |LOCAL|
-                            assign [$$52] <- [$$ht.getField("display_url")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            assign [$$52] <- [$$ht.getField("display_url")] project: [$$52] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- ASSIGN  |LOCAL|
-                              unnest $$ht <- scan-collection($$51) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              unnest $$ht <- scan-collection($$51) project: [$$ht] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- UNNEST  |LOCAL|
-                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                project ([$$51]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                -- STREAM_PROJECT  |LOCAL|
+                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
                      } [cardinality: 2.0, doc-size: 0.0, op-cost: 0.0, total-cost: 2.0]
               -- SUBPLAN  |PARTITIONED|
                 assign [$$51] <- [$$p.getField("entities").getField("urls")] project: [$$51] [cardinality: 2.0, doc-size: 0.0, op-cost: 0.0, total-cost: 2.0]
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 1725335..d6f127c 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
@@ -39,8 +39,10 @@
                                     -- AGGREGATE  |LOCAL|
                                       select (not(is-missing($$113))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                       -- STREAM_SELECT  |LOCAL|
-                                        nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                        project ([$$113]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        -- STREAM_PROJECT  |LOCAL|
+                                          nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                                  } [cardinality: 0.0, doc-size: 8.0, op-cost: 0.0, total-cost: 6.5]
                           -- PRE_CLUSTERED_GROUP_BY[$$112]  |PARTITIONED|
                             exchange [cardinality: 2.0, doc-size: 8.0, op-cost: 0.0, total-cost: 4.25]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.016.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.016.plan
index 1b7d5d5..051e0b1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.016.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.016.plan
@@ -19,12 +19,14 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$71, 2)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              assign [$$71] <- [$$e.getField("x")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              assign [$$71] <- [$$e.getField("x")] project: [$$71] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ASSIGN  |LOCAL|
-                                unnest $$e <- scan-collection($$68) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                unnest $$e <- scan-collection($$68) project: [$$e] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- UNNEST  |LOCAL|
-                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$68]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 2.0, doc-size: 0.0, op-cost: 0.0, total-cost: 2.0]
                 -- SUBPLAN  |PARTITIONED|
                   subplan {
@@ -32,12 +34,14 @@
                             -- AGGREGATE  |LOCAL|
                               select (eq($$69, 1)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- STREAM_SELECT  |LOCAL|
-                                assign [$$69] <- [$$e.getField("x")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                assign [$$69] <- [$$e.getField("x")] project: [$$69] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- ASSIGN  |LOCAL|
-                                  unnest $$e <- scan-collection($$68) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  unnest $$e <- scan-collection($$68) project: [$$e] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- UNNEST  |LOCAL|
-                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$68]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                          } [cardinality: 2.0, doc-size: 0.0, op-cost: 0.0, total-cost: 2.0]
                   -- SUBPLAN  |PARTITIONED|
                     assign [$$68] <- [$$c.getField("val1")] project: [$$68] [cardinality: 2.0, doc-size: 0.0, op-cost: 0.0, total-cost: 2.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.017.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.017.plan
index 3525321..bd918b6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.017.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.017.plan
@@ -19,12 +19,14 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$71, 2)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              assign [$$71] <- [$$e.getField("y")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              assign [$$71] <- [$$e.getField("y")] project: [$$71] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ASSIGN  |LOCAL|
-                                unnest $$e <- scan-collection($$68) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                unnest $$e <- scan-collection($$68) project: [$$e] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- UNNEST  |LOCAL|
-                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$68]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 2.0, doc-size: 0.0, op-cost: 0.0, total-cost: 2.0]
                 -- SUBPLAN  |PARTITIONED|
                   subplan {
@@ -32,12 +34,14 @@
                             -- AGGREGATE  |LOCAL|
                               select (eq($$69, 1)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- STREAM_SELECT  |LOCAL|
-                                assign [$$69] <- [$$e.getField("x")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                assign [$$69] <- [$$e.getField("x")] project: [$$69] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- ASSIGN  |LOCAL|
-                                  unnest $$e <- scan-collection($$68) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  unnest $$e <- scan-collection($$68) project: [$$e] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- UNNEST  |LOCAL|
-                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$68]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                          } [cardinality: 2.0, doc-size: 0.0, op-cost: 0.0, total-cost: 2.0]
                   -- SUBPLAN  |PARTITIONED|
                     assign [$$68] <- [$$c.getField("val1")] project: [$$68] [cardinality: 2.0, doc-size: 0.0, op-cost: 0.0, total-cost: 2.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.018.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.018.plan
index 2999a9c..44a1697 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.018.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.018.plan
@@ -19,12 +19,14 @@
                           -- AGGREGATE  |LOCAL|
                             select (eq($$71, 2)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- STREAM_SELECT  |LOCAL|
-                              assign [$$71] <- [$$e.getField("y")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              assign [$$71] <- [$$e.getField("y")] project: [$$71] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ASSIGN  |LOCAL|
-                                unnest $$e <- scan-collection($$70) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                unnest $$e <- scan-collection($$70) project: [$$e] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- UNNEST  |LOCAL|
-                                  nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                  project ([$$70]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  -- STREAM_PROJECT  |LOCAL|
+                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
                        } [cardinality: 2.0, doc-size: 0.0, op-cost: 0.0, total-cost: 2.0]
                 -- SUBPLAN  |PARTITIONED|
                   project ([$$70, $$53]) [cardinality: 2.0, doc-size: 0.0, op-cost: 0.0, total-cost: 2.0]
@@ -34,12 +36,14 @@
                               -- AGGREGATE  |LOCAL|
                                 select (eq($$69, 1)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- STREAM_SELECT  |LOCAL|
-                                  assign [$$69] <- [$$e.getField("x")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  assign [$$69] <- [$$e.getField("x")] project: [$$69] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- ASSIGN  |LOCAL|
-                                    unnest $$e <- scan-collection($$68) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    unnest $$e <- scan-collection($$68) project: [$$e] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- UNNEST  |LOCAL|
-                                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      project ([$$68]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                            } [cardinality: 2.0, doc-size: 0.0, op-cost: 0.0, total-cost: 2.0]
                     -- SUBPLAN  |PARTITIONED|
                       assign [$$70, $$68] <- [$$c.getField("val2"), $$c.getField("val1")] project: [$$70, $$68] [cardinality: 2.0, doc-size: 0.0, op-cost: 0.0, total-cost: 2.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.020.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.020.plan
index 9eb4496..67fe451 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.020.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.020.plan
@@ -25,10 +25,12 @@
                                 -- AGGREGATE  |LOCAL|
                                   assign [$$52] <- [$$i.getField("count")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- ASSIGN  |LOCAL|
-                                    unnest $$i <- scan-collection($$70) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    unnest $$i <- scan-collection($$70) project: [$$i] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- UNNEST  |LOCAL|
-                                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      project ([$$70]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                              } [cardinality: 2.0, doc-size: 0.0, op-cost: 0.0, total-cost: 2.0]
                       -- SUBPLAN  |PARTITIONED|
                         assign [$$64, $$70] <- [to-object-var-str($$t).getField(0), $$t.getField("a1")] project: [$$64, $$70] [cardinality: 2.0, doc-size: 0.0, op-cost: 0.0, total-cost: 2.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.021.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.021.plan
index 9eb4496..67fe451 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.021.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.021.plan
@@ -25,10 +25,12 @@
                                 -- AGGREGATE  |LOCAL|
                                   assign [$$52] <- [$$i.getField("count")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- ASSIGN  |LOCAL|
-                                    unnest $$i <- scan-collection($$70) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    unnest $$i <- scan-collection($$70) project: [$$i] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- UNNEST  |LOCAL|
-                                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      project ([$$70]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                              } [cardinality: 2.0, doc-size: 0.0, op-cost: 0.0, total-cost: 2.0]
                       -- SUBPLAN  |PARTITIONED|
                         assign [$$64, $$70] <- [to-object-var-str($$t).getField(0), $$t.getField("a1")] project: [$$64, $$70] [cardinality: 2.0, doc-size: 0.0, op-cost: 0.0, total-cost: 2.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.022.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.022.plan
index 721bacb..d3149ec 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.022.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.022.plan
@@ -21,12 +21,14 @@
                             -- AGGREGATE  |LOCAL|
                               assign [$$82] <- [$$98.getField("Overall")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ASSIGN  |LOCAL|
-                                assign [$$98] <- [$$reviews.getField("ratings")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                assign [$$98] <- [$$reviews.getField("ratings")] project: [$$98] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- ASSIGN  |LOCAL|
-                                  unnest $$reviews <- scan-collection($$91) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  unnest $$reviews <- scan-collection($$91) project: [$$reviews] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- UNNEST  |LOCAL|
-                                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                    project ([$$91]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    -- STREAM_PROJECT  |LOCAL|
+                                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                          } [cardinality: 0.0, doc-size: 3.0, op-cost: 0.0, total-cost: 2.0]
                   -- SUBPLAN  |PARTITIONED|
                     assign [$#2] <- [get-item($$72, 0)] project: [$$93, $$94, $$91, $#2] [cardinality: 0.0, doc-size: 3.0, op-cost: 0.0, total-cost: 2.0]
@@ -38,12 +40,14 @@
                                   -- AGGREGATE  |LOCAL|
                                     assign [$$69] <- [$$97.getField("Overall")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- ASSIGN  |LOCAL|
-                                      assign [$$97] <- [$$89.getField("ratings")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      assign [$$97] <- [$$89.getField("ratings")] project: [$$97] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                       -- ASSIGN  |LOCAL|
-                                        unnest $$89 <- scan-collection($$91) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        unnest $$89 <- scan-collection($$91) project: [$$89] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                         -- UNNEST  |LOCAL|
-                                          nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          project ([$$91]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                          -- STREAM_PROJECT  |LOCAL|
+                                            nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                              } [cardinality: 0.0, doc-size: 3.0, op-cost: 0.0, total-cost: 2.0]
                       -- SUBPLAN  |PARTITIONED|
                         select (eq($$ht.getField("city"), "Los Angeles")) project: [$$93, $$94, $$91] [cardinality: 0.0, doc-size: 3.0, op-cost: 0.0, total-cost: 2.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.8.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.8.plan
index ddabf90..4005031 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.8.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.8.plan
@@ -25,10 +25,12 @@
                                 -- AGGREGATE  |LOCAL|
                                   assign [$$77] <- [object-remove(object-remove(object-remove($$t0, "title"), "authors"), "misc")] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- ASSIGN  |LOCAL|
-                                    unnest $$t0 <- scan-collection(to-array($$paper)) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                    unnest $$t0 <- scan-collection(to-array($$paper)) project: [$$t0] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- UNNEST  |LOCAL|
-                                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                      project ([$$paper]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- STREAM_PROJECT  |LOCAL|
+                                        nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
                              } [cardinality: 100.0, doc-size: 0.0, op-cost: 0.0, total-cost: 100.0]
                       -- SUBPLAN  |PARTITIONED|
                         exchange [cardinality: 100.0, doc-size: 0.0, op-cost: 0.0, total-cost: 100.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/misc/query-ASTERIXDB-3562/query-ASTERIXDB-3562.4.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/misc/query-ASTERIXDB-3562/query-ASTERIXDB-3562.4.plan
index 03418cb..1beaf1a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/misc/query-ASTERIXDB-3562/query-ASTERIXDB-3562.4.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/misc/query-ASTERIXDB-3562/query-ASTERIXDB-3562.4.plan
@@ -9,8 +9,10 @@
         subplan {
                   assign [$$17] <- [array-slice($$20, 0, 2)] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                   -- ASSIGN  |LOCAL|
-                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    project ([$$20]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                    -- STREAM_PROJECT  |LOCAL|
+                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                } [cardinality: 1.0, doc-size: 0.0, op-cost: 0.0, total-cost: 1.0]
         -- SUBPLAN  |PARTITIONED|
           subplan {
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/subquery/query-ASTERIXDB-3538/query-ASTERIXDB-3538.5.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/subquery/query-ASTERIXDB-3538/query-ASTERIXDB-3538.5.plan
index 26d4afc..6dc028f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/subquery/query-ASTERIXDB-3538/query-ASTERIXDB-3538.5.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/subquery/query-ASTERIXDB-3538/query-ASTERIXDB-3538.5.plan
@@ -15,8 +15,10 @@
                       -- AGGREGATE  |LOCAL|
                         unnest $$333 <- scan-collection($$343) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- UNNEST  |LOCAL|
-                          nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          project ([$$343]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                          -- STREAM_PROJECT  |LOCAL|
+                            nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                  } [cardinality: 8.0, doc-size: 0.0, op-cost: 0.0, total-cost: 8.0]
           -- SUBPLAN  |PARTITIONED|
             select (not(is-null($$351))) [cardinality: 8.0, doc-size: 0.0, op-cost: 0.0, total-cost: 8.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/tpch/query-plans/query-plans.06.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/tpch/query-plans/query-plans.06.plan
index c246478..0b29c0a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/tpch/query-plans/query-plans.06.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/tpch/query-plans/query-plans.06.plan
@@ -44,8 +44,10 @@
                                     -- AGGREGATE  |LOCAL|
                                       select (not(is-missing($$86))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                       -- STREAM_SELECT  |LOCAL|
-                                        nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                        project ([$$l, $$86]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        -- STREAM_PROJECT  |LOCAL|
+                                          nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                                  } [cardinality: 997.0, doc-size: 5.0, op-cost: 0.0, total-cost: 594714.46]
                           -- PRE_CLUSTERED_GROUP_BY[$$77]  |PARTITIONED|
                             exchange [cardinality: 6349.95, doc-size: 5.0, op-cost: 0.0, total-cost: 372357.23]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_column/misc/query-ASTERIXDB-3562/query-ASTERIXDB-3562.4.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_column/misc/query-ASTERIXDB-3562/query-ASTERIXDB-3562.4.plan
index 33681de..2ca75e0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_column/misc/query-ASTERIXDB-3562/query-ASTERIXDB-3562.4.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_column/misc/query-ASTERIXDB-3562/query-ASTERIXDB-3562.4.plan
@@ -9,8 +9,10 @@
         subplan {
                   assign [$$17] <- [array-slice($$20, 0, 2)] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                   -- ASSIGN  |LOCAL|
-                    nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    project ([$$20]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                    -- STREAM_PROJECT  |LOCAL|
+                      nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                      -- NESTED_TUPLE_SOURCE  |LOCAL|
                } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
         -- SUBPLAN  |PARTITIONED|
           subplan {
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_column/subquery/query-ASTERIXDB-3538/query-ASTERIXDB-3538.5.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_column/subquery/query-ASTERIXDB-3538/query-ASTERIXDB-3538.5.plan
index 0386308..486f9de 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_column/subquery/query-ASTERIXDB-3538/query-ASTERIXDB-3538.5.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_column/subquery/query-ASTERIXDB-3538/query-ASTERIXDB-3538.5.plan
@@ -15,8 +15,10 @@
                       -- AGGREGATE  |LOCAL|
                         unnest $$333 <- scan-collection($$343) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- UNNEST  |LOCAL|
-                          nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                          project ([$$343]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                          -- STREAM_PROJECT  |LOCAL|
+                            nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            -- NESTED_TUPLE_SOURCE  |LOCAL|
                  } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
           -- SUBPLAN  |PARTITIONED|
             select (not(is-null($$351))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_column/tpch/query-plans/query-plans.04.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_column/tpch/query-plans/query-plans.04.plan
index 112e012..8e96f49 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_column/tpch/query-plans/query-plans.04.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_column/tpch/query-plans/query-plans.04.plan
@@ -51,8 +51,10 @@
                                                           -- AGGREGATE  |LOCAL|
                                                             select (not(is-missing($$249))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                                             -- STREAM_SELECT  |LOCAL|
-                                                              nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                              project ([$$208, $$249]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                                              -- STREAM_PROJECT  |LOCAL|
+                                                                nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                      } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                               -- PRE_CLUSTERED_GROUP_BY[$$200]  |PARTITIONED|
                                                 exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_column/tpch/query-plans/query-plans.06.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_column/tpch/query-plans/query-plans.06.plan
index 5cbaef2..64e1691 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_column/tpch/query-plans/query-plans.06.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_column/tpch/query-plans/query-plans.06.plan
@@ -44,8 +44,10 @@
                                     -- AGGREGATE  |LOCAL|
                                       select (not(is-missing($$86))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                                       -- STREAM_SELECT  |LOCAL|
-                                        nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                        project ([$$l, $$86]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        -- STREAM_PROJECT  |LOCAL|
+                                          nested tuple source [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
                                  } [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- PRE_CLUSTERED_GROUP_BY[$$77]  |PARTITIONED|
                             exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/IntroduceProjectsRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/IntroduceProjectsRule.java
index ca92331..a787b07 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/IntroduceProjectsRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/IntroduceProjectsRule.java
@@ -30,10 +30,12 @@
 import org.apache.commons.lang3.mutable.MutableObject;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalPlan;
 import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
 import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag;
 import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
 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.ProjectOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.VariableUtilities;
 import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
@@ -131,6 +133,17 @@
             }
         }
 
+        if (op.hasNestedPlans()) {
+            AbstractOperatorWithNestedPlans nestedPlansOp = (AbstractOperatorWithNestedPlans) op;
+            for (ILogicalPlan nestedPlanOp : nestedPlansOp.getNestedPlans()) {
+                for (Mutable<ILogicalOperator> rootOpRef : nestedPlanOp.getRoots()) {
+                    if (introduceProjects(null, -1, rootOpRef, Collections.<LogicalVariable> emptySet(), context)) {
+                        modified = true;
+                    }
+                }
+            }
+        }
+
         if (modified) {
             context.computeAndSetTypeEnvironmentForOperator(op);
         }
@@ -175,7 +188,8 @@
             VariableUtilities.getLiveVariables(op.getInputs().get(0).getValue(), liveVars);
             ProjectOperator projectOp = (ProjectOperator) op;
             List<LogicalVariable> projectVarsTemp = projectOp.getVariables();
-            if (liveVars.size() == projectVarsTemp.size() && liveVars.containsAll(projectVarsTemp)) {
+            if (liveVars.size() == projectVarsTemp.size() && liveVars.containsAll(projectVarsTemp)
+                    && parentOp != null) {
                 // The existing project has become useless. Remove it.
                 parentOp.getInputs().get(parentInputIndex).setValue(op.getInputs().get(0).getValue());
                 modified = true;