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

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


The following commit(s) were added to refs/heads/master by this push:
     new bfc06d9220 [ASTERIXDB-3665]: Follow up - Compute RangeMap at Compile 
time
bfc06d9220 is described below

commit bfc06d9220e31df918967c939d7c71812fa6cdeb
Author: Janhavi Tripurwar <[email protected]>
AuthorDate: Mon Dec 15 15:50:57 2025 +0530

    [ASTERIXDB-3665]: Follow up - Compute RangeMap at Compile time
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    - Fix test issue
    - code cleanup
    
    Ext-ref: MB-68941
    
    Change-Id: Id85ab39b9d6b84db18a73eb3977b38e5516c045d
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20663
    Integration-Tests: Jenkins <[email protected]>
    Tested-by: Jenkins <[email protected]>
    Tested-by: Janhavi Tripurwar <[email protected]>
    Reviewed-by: Ali Alsuliman <[email protected]>
---
 .../asterix/optimizer/rules/cbo/RangeMapUtil.java  |   1 -
 .../apache/asterix/api/java/AsterixJavaClient.java |  20 ++-
 .../asterix/drivers/AsterixClientDriver.java       |   2 +-
 .../java/org/apache/asterix/test/dml/DmlTest.java  |   4 +-
 .../asterix/test/jsonplan/JsonLogicalPlanTest.java |   4 +-
 .../asterix/test/optimizer/OptimizerTest.java      |   2 +-
 .../src/test/resources/optimizerts/ignore.txt      |   9 +-
 .../distinct_mixed/distinct_mixed.10.plan          | 100 ++++++------
 .../distinct_mixed/distinct_mixed.11.plan          | 130 ++++++++--------
 .../distinct_mixed/distinct_mixed.12.plan          | 112 +++++++-------
 .../distinct_mixed/distinct_mixed.13.plan          | 148 +++++++++---------
 .../distinct_mixed/distinct_mixed.14.plan          | 172 ++++++++++-----------
 .../distinct_mixed/distinct_mixed.9.plan           | 100 ++++++------
 13 files changed, 388 insertions(+), 416 deletions(-)

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/RangeMapUtil.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/RangeMapUtil.java
index 5b44375ad1..e31636ae4b 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/RangeMapUtil.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/RangeMapUtil.java
@@ -230,7 +230,6 @@ public final class RangeMapUtil {
             List<OrderColumn> partitionFields) throws AlgebricksException {
 
         IOptimizationContext newCtx = 
ctx.getOptimizationContextFactory().cloneOptimizationContext(ctx);
-        // copySchema is false because we will re-compute schema later
         ILogicalOperator newRoot = 
OperatorManipulationUtil.bottomUpCopyOperators(logicalOperator);
         replaceAllScansWithSamples(newRoot, newCtx);
         OperatorPropertiesUtil.typeOpRec(new MutableObject<>(newRoot), newCtx);
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/java/AsterixJavaClient.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/java/AsterixJavaClient.java
index 6f224640d0..d6fb8d3141 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/java/AsterixJavaClient.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/java/AsterixJavaClient.java
@@ -70,12 +70,10 @@ public class AsterixJavaClient {
     private ICcApplicationContext appCtx;
     private Map<String, IAObject> statementParams;
     private ExecutionPlans executionPlans;
-    private final boolean addAnalyzeForOptimizerTests;
 
     public AsterixJavaClient(ICcApplicationContext appCtx, 
IHyracksClientConnection hcc, Reader queryText,
             PrintWriter writer, ILangCompilationProvider compilationProvider,
-            IStatementExecutorFactory statementExecutorFactory, 
IStorageComponentProvider storageComponentProvider,
-            boolean addAnalyzeForOptimizerTests) {
+            IStatementExecutorFactory statementExecutorFactory, 
IStorageComponentProvider storageComponentProvider) {
         this.appCtx = appCtx;
         this.hcc = hcc;
         this.queryText = queryText;
@@ -85,7 +83,6 @@ public class AsterixJavaClient {
         this.storageComponentProvider = storageComponentProvider;
         apiFramework = new APIFramework(compilationProvider);
         parserFactory = compilationProvider.getParserFactory();
-        this.addAnalyzeForOptimizerTests = addAnalyzeForOptimizerTests;
     }
 
     public AsterixJavaClient(ICcApplicationContext appCtx, 
IHyracksClientConnection hcc, Reader queryText,
@@ -94,7 +91,7 @@ public class AsterixJavaClient {
         this(appCtx, hcc, queryText,
                 // This is a commandline client and so System.out is 
appropriate
                 new PrintWriter(System.out, true), // NOSONAR
-                compilationProvider, statementExecutorFactory, 
storageComponentProvider, false);
+                compilationProvider, statementExecutorFactory, 
storageComponentProvider);
     }
 
     public void setStatementParameters(Map<String, IAObject> statementParams) {
@@ -102,14 +99,21 @@ public class AsterixJavaClient {
     }
 
     public void compile() throws Exception {
-        compile(true, false, true, false, false, false, false, 
addAnalyzeForOptimizerTests);
+        compile(true, false, true, false, false, false, false);
     }
 
     public void compile(boolean optimize, boolean printRewrittenExpressions, 
boolean printLogicalPlan,
             boolean printOptimizedPlan, boolean printPhysicalOpsOnly, boolean 
generateBinaryRuntime, boolean printJob,
-            boolean addAnalyzeForOptimizerTests) throws Exception {
+            PlanFormat pformat) throws Exception {
         compile(optimize, printRewrittenExpressions, printLogicalPlan, 
printOptimizedPlan, printPhysicalOpsOnly,
-                generateBinaryRuntime, printJob, PlanFormat.STRING, 
addAnalyzeForOptimizerTests);
+                generateBinaryRuntime, printJob, pformat, false);
+    }
+
+    public void compile(boolean optimize, boolean printRewrittenExpressions, 
boolean printLogicalPlan,
+            boolean printOptimizedPlan, boolean printPhysicalOpsOnly, boolean 
generateBinaryRuntime, boolean printJob)
+            throws Exception {
+        compile(optimize, printRewrittenExpressions, printLogicalPlan, 
printOptimizedPlan, printPhysicalOpsOnly,
+                generateBinaryRuntime, printJob, PlanFormat.STRING, false);
     }
 
     public void compile(boolean optimize, boolean printRewrittenExpressions, 
boolean printLogicalPlan,
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/drivers/AsterixClientDriver.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/drivers/AsterixClientDriver.java
index 07f1d3d23c..4b5261b374 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/drivers/AsterixClientDriver.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/drivers/AsterixClientDriver.java
@@ -67,7 +67,7 @@ public class AsterixClientDriver {
         FileReader reader = new FileReader(filename);
         AsterixJavaClient q = new AsterixJavaClient(null, hcc, reader, 
compilationProvider,
                 new DefaultStatementExecutorFactory(), new 
StorageComponentProvider());
-        q.compile(optimize, true, true, true, onlyPhysical, 
createBinaryRuntime, createBinaryRuntime, false);
+        q.compile(optimize, true, true, true, onlyPhysical, 
createBinaryRuntime, createBinaryRuntime);
         return q;
     }
 
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dml/DmlTest.java 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dml/DmlTest.java
index 5556a85119..c7bf3b4a14 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dml/DmlTest.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dml/DmlTest.java
@@ -69,9 +69,9 @@ public class DmlTest {
                 new AsterixJavaClient((ICcApplicationContext) 
integrationUtil.cc.getApplicationContext(),
                         integrationUtil.getHyracksClientConnection(), 
loadReader, ERR,
                         new SqlppCompilationProvider(new 
NamespaceResolver(false)),
-                        new DefaultStatementExecutorFactory(), new 
StorageComponentProvider(), false);
+                        new DefaultStatementExecutorFactory(), new 
StorageComponentProvider());
         try {
-            asterixLoad.compile(true, false, false, false, false, true, false, 
false);
+            asterixLoad.compile(true, false, false, false, false, true, false);
         } catch (AsterixException e) {
             throw new Exception("Compile ERROR for " + LOAD_FOR_ENLIST_FILE + 
": " + e.getMessage(), e);
         } finally {
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonLogicalPlanTest.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonLogicalPlanTest.java
index 37f3cfaa73..d68586a7ba 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonLogicalPlanTest.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonLogicalPlanTest.java
@@ -86,9 +86,9 @@ public class JsonLogicalPlanTest extends 
AbstractOptimizerTest {
         try (PrintWriter plan = new PrintWriter(actualFile)) {
             AsterixJavaClient asterix = new AsterixJavaClient(
                     (ICcApplicationContext) 
integrationUtil.cc.getApplicationContext(), hcc, new StringReader(query),
-                    plan, provider, statementExecutorFactory, 
storageComponentProvider, false);
+                    plan, provider, statementExecutorFactory, 
storageComponentProvider);
             asterix.setStatementParameters(queryParams);
-            asterix.compile(true, false, !optimized, optimized, false, false, 
false, PlanFormat.JSON, false);
+            asterix.compile(true, false, !optimized, optimized, false, false, 
false, PlanFormat.JSON);
             ExecutionPlans executionPlans = asterix.getExecutionPlans();
             planStr = optimized ? executionPlans.getOptimizedLogicalPlan() : 
executionPlans.getLogicalPlan();
             plan.write(planStr);
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/OptimizerTest.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/OptimizerTest.java
index cfe5445c23..32bb651f61 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/OptimizerTest.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/OptimizerTest.java
@@ -83,7 +83,7 @@ public class OptimizerTest extends AbstractOptimizerTest {
         try (PrintWriter plan = new PrintWriter(actualFile)) {
             AsterixJavaClient asterix = new AsterixJavaClient(
                     (ICcApplicationContext) 
integrationUtil.cc.getApplicationContext(), hcc, new StringReader(query),
-                    plan, provider, statementExecutorFactory, 
storageComponentProvider, true);
+                    plan, provider, statementExecutorFactory, 
storageComponentProvider);
             asterix.setStatementParameters(queryParams);
             asterix.compile(true, false, true, true, false, false, false, 
SessionConfig.PlanFormat.STRING, false);
             ExecutionPlans executionPlans = asterix.getExecutionPlans();
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/ignore.txt 
b/asterixdb/asterix-app/src/test/resources/optimizerts/ignore.txt
index 7e6fde4af6..efc2e39427 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/ignore.txt
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/ignore.txt
@@ -18,11 +18,4 @@
 #
 distinct_aggregate.aql
 unnest_list_in_subplan.aql
-fj-phase2-with-hints.aql
-//TODO(janhavi): enable tests later
-aggregate-sql-sugar/distinct_mixed/distinct_mixed.9.sqlpp
-aggregate-sql-sugar/distinct_mixed/distinct_mixed.10.sqlpp
-aggregate-sql-sugar/distinct_mixed/distinct_mixed.11.sqlpp
-aggregate-sql-sugar/distinct_mixed/distinct_mixed.12.sqlpp
-aggregate-sql-sugar/distinct_mixed/distinct_mixed.13.sqlpp
-aggregate-sql-sugar/distinct_mixed/distinct_mixed.14.sqlpp
\ No newline at end of file
+fj-phase2-with-hints.aql
\ No newline at end of file
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 29ceba9d0f..6d59cf8b10 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
@@ -1,69 +1,65 @@
-distribute result [$$79]
+distribute result [$$89]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$79] <- [{"g": $$g, "count_distinct_x": $$82, "sum_distinct_x": 
$$83}] project: [$$79]
+    assign [$$89] <- [{"g": $$g, "count_distinct_x": $$92, "sum_distinct_x": 
$$93}] project: [$$89]
     -- ASSIGN  |PARTITIONED|
       exchange
-      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-        order (ASC, $$g)
-        -- STABLE_SORT [$$g(ASC)]  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$g(ASC) ]  |PARTITIONED|
+        group by ([$$g := $$g]) decor ([]) {
+                  aggregate [$$92, $$93] <- [agg-sql-count($$82), 
agg-sql-sum($$82)]
+                  -- AGGREGATE  |LOCAL|
+                    distinct ([$$82])
+                    -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
+                      order (ASC, $$82)
+                      -- MICRO_STABLE_SORT [$$82(ASC)]  |LOCAL|
+                        project ([$$82])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+               }
+        -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
-          -- RANGE_PARTITION_EXCHANGE [$$g(ASC)] RANGE_MAP:{SPLIT:1}  
|PARTITIONED|
-            group by ([$$g := $$g]) decor ([]) {
-                      aggregate [$$82, $$83] <- [agg-sql-count($$72), 
agg-sql-sum($$72)]
-                      -- AGGREGATE  |LOCAL|
-                        distinct ([$$72])
-                        -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
-                          order (ASC, $$72)
-                          -- MICRO_STABLE_SORT [$$72(ASC)]  |LOCAL|
-                            project ([$$72])
-                            -- STREAM_PROJECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   }
-            -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            order (ASC, $$g)
+            -- STABLE_SORT [$$g(ASC)]  |PARTITIONED|
               exchange
-              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                order (ASC, $$g)
-                -- STABLE_SORT [$$g(ASC)]  |PARTITIONED|
+              -- HASH_PARTITION_EXCHANGE [$$g]  |PARTITIONED|
+                join (true)
+                -- NESTED_LOOP  |PARTITIONED|
                   exchange
-                  -- HASH_PARTITION_EXCHANGE [$$g]  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                     join (true)
                     -- NESTED_LOOP  |PARTITIONED|
                       exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        join (true)
-                        -- NESTED_LOOP  |PARTITIONED|
-                          exchange
-                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            assign [$$72] <- [$$x.getField(1)] project: [$$72]
-                            -- ASSIGN  |PARTITIONED|
-                              project ([$$x])
-                              -- STREAM_PROJECT  |PARTITIONED|
+                        assign [$$82] <- [$$x.getField(1)] project: [$$82]
+                        -- ASSIGN  |PARTITIONED|
+                          project ([$$x])
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            exchange
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              data-scan []<-[$$90, $$x] <- test.d1
+                              -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan []<-[$$80, $$x] <- test.d1
-                                  -- DATASOURCE_SCAN  |PARTITIONED|
-                                    exchange
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      empty-tuple-source
-                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                  empty-tuple-source
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                      exchange
+                      -- BROADCAST_EXCHANGE  |PARTITIONED|
+                        project ([])
+                        -- STREAM_PROJECT  |PARTITIONED|
                           exchange
-                          -- BROADCAST_EXCHANGE  |PARTITIONED|
-                            project ([])
-                            -- STREAM_PROJECT  |PARTITIONED|
+                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            data-scan []<-[$$91, $$y] <- test.d2
+                            -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                data-scan []<-[$$81, $$y] <- test.d2
-                                -- DATASOURCE_SCAN  |PARTITIONED|
-                                  exchange
-                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    empty-tuple-source
-                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                      exchange
-                      -- BROADCAST_EXCHANGE  |PARTITIONED|
-                        unnest $$g <- range(1, 3)
-                        -- UNNEST  |UNPARTITIONED|
-                          empty-tuple-source
-                          -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                                empty-tuple-source
+                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                  exchange
+                  -- BROADCAST_EXCHANGE  |PARTITIONED|
+                    unnest $$g <- range(1, 3)
+                    -- UNNEST  |UNPARTITIONED|
+                      empty-tuple-source
+                      -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
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 6af79fa52b..da59da4adb 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
@@ -1,83 +1,79 @@
-distribute result [$$79]
+distribute result [$$89]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$79] <- [{"g": $$g, "sum_distinct_x": $$82, "sum_distinct_y": 
$$83}] project: [$$79]
+    assign [$$89] <- [{"g": $$g, "sum_distinct_x": $$92, "sum_distinct_y": 
$$93}] project: [$$89]
     -- ASSIGN  |PARTITIONED|
       exchange
-      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-        order (ASC, $$g)
-        -- STABLE_SORT [$$g(ASC)]  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$g(ASC) ]  |PARTITIONED|
+        group by ([$$g := $$g]) decor ([]) {
+                  aggregate [$$92] <- [agg-sql-sum($$82)]
+                  -- AGGREGATE  |LOCAL|
+                    distinct ([$$82])
+                    -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
+                      order (ASC, $$82)
+                      -- MICRO_STABLE_SORT [$$82(ASC)]  |LOCAL|
+                        project ([$$82])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+               }
+               {
+                  aggregate [$$93] <- [agg-sql-sum($$87)]
+                  -- AGGREGATE  |LOCAL|
+                    distinct ([$$87])
+                    -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
+                      order (ASC, $$87)
+                      -- MICRO_STABLE_SORT [$$87(ASC)]  |LOCAL|
+                        project ([$$87])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+               }
+        -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
-          -- RANGE_PARTITION_EXCHANGE [$$g(ASC)] RANGE_MAP:{SPLIT:1}  
|PARTITIONED|
-            group by ([$$g := $$g]) decor ([]) {
-                      aggregate [$$82] <- [agg-sql-sum($$72)]
-                      -- AGGREGATE  |LOCAL|
-                        distinct ([$$72])
-                        -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
-                          order (ASC, $$72)
-                          -- MICRO_STABLE_SORT [$$72(ASC)]  |LOCAL|
-                            project ([$$72])
-                            -- STREAM_PROJECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   }
-                   {
-                      aggregate [$$83] <- [agg-sql-sum($$77)]
-                      -- AGGREGATE  |LOCAL|
-                        distinct ([$$77])
-                        -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
-                          order (ASC, $$77)
-                          -- MICRO_STABLE_SORT [$$77(ASC)]  |LOCAL|
-                            project ([$$77])
-                            -- STREAM_PROJECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   }
-            -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            order (ASC, $$g)
+            -- STABLE_SORT [$$g(ASC)]  |PARTITIONED|
               exchange
-              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                order (ASC, $$g)
-                -- STABLE_SORT [$$g(ASC)]  |PARTITIONED|
+              -- HASH_PARTITION_EXCHANGE [$$g]  |PARTITIONED|
+                join (true)
+                -- NESTED_LOOP  |PARTITIONED|
                   exchange
-                  -- HASH_PARTITION_EXCHANGE [$$g]  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                     join (true)
                     -- NESTED_LOOP  |PARTITIONED|
                       exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        join (true)
-                        -- NESTED_LOOP  |PARTITIONED|
-                          exchange
-                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            assign [$$72] <- [$$x.getField(1)] project: [$$72]
-                            -- ASSIGN  |PARTITIONED|
-                              project ([$$x])
-                              -- STREAM_PROJECT  |PARTITIONED|
+                        assign [$$82] <- [$$x.getField(1)] project: [$$82]
+                        -- ASSIGN  |PARTITIONED|
+                          project ([$$x])
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            exchange
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              data-scan []<-[$$90, $$x] <- test.d1
+                              -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan []<-[$$80, $$x] <- test.d1
-                                  -- DATASOURCE_SCAN  |PARTITIONED|
-                                    exchange
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      empty-tuple-source
-                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                          exchange
-                          -- BROADCAST_EXCHANGE  |PARTITIONED|
-                            assign [$$77] <- [$$y.getField(1)] project: [$$77]
-                            -- ASSIGN  |PARTITIONED|
-                              project ([$$y])
-                              -- STREAM_PROJECT  |PARTITIONED|
-                                exchange
-                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan []<-[$$81, $$y] <- test.d2
-                                  -- DATASOURCE_SCAN  |PARTITIONED|
-                                    exchange
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      empty-tuple-source
-                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                  empty-tuple-source
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                       exchange
                       -- BROADCAST_EXCHANGE  |PARTITIONED|
-                        unnest $$g <- range(1, 3)
-                        -- UNNEST  |UNPARTITIONED|
-                          empty-tuple-source
-                          -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                        assign [$$87] <- [$$y.getField(1)] project: [$$87]
+                        -- ASSIGN  |PARTITIONED|
+                          project ([$$y])
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            exchange
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              data-scan []<-[$$91, $$y] <- test.d2
+                              -- DATASOURCE_SCAN  |PARTITIONED|
+                                exchange
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  empty-tuple-source
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                  exchange
+                  -- BROADCAST_EXCHANGE  |PARTITIONED|
+                    unnest $$g <- range(1, 3)
+                    -- UNNEST  |UNPARTITIONED|
+                      empty-tuple-source
+                      -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
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 8eff992fca..32f1965c4a 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
@@ -1,75 +1,71 @@
-distribute result [$$88]
+distribute result [$$98]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$88] <- [{"g": $$g, "sum_x": $$91, "sum_distinct_x": $$92, 
"sum_distinct_y": $$93}] project: [$$88]
+    assign [$$98] <- [{"g": $$g, "sum_x": $$101, "sum_distinct_x": $$102, 
"sum_distinct_y": $$103}] project: [$$98]
     -- ASSIGN  |PARTITIONED|
       exchange
-      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-        order (ASC, $$g)
-        -- STABLE_SORT [$$g(ASC)]  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$g(ASC) ]  |PARTITIONED|
+        group by ([$$g := $$g]) decor ([]) {
+                  aggregate [$$101] <- [agg-sql-sum($$86)]
+                  -- AGGREGATE  |LOCAL|
+                    nested tuple source
+                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+               }
+               {
+                  aggregate [$$102, $$103] <- [agg-sql-sum($$86), 
agg-sql-sum($$86)]
+                  -- AGGREGATE  |LOCAL|
+                    distinct ([$$86])
+                    -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
+                      order (ASC, $$86)
+                      -- MICRO_STABLE_SORT [$$86(ASC)]  |LOCAL|
+                        project ([$$86])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+               }
+        -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
-          -- RANGE_PARTITION_EXCHANGE [$$g(ASC)] RANGE_MAP:{SPLIT:1}  
|PARTITIONED|
-            group by ([$$g := $$g]) decor ([]) {
-                      aggregate [$$91] <- [agg-sql-sum($$76)]
-                      -- AGGREGATE  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   }
-                   {
-                      aggregate [$$92, $$93] <- [agg-sql-sum($$76), 
agg-sql-sum($$76)]
-                      -- AGGREGATE  |LOCAL|
-                        distinct ([$$76])
-                        -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
-                          order (ASC, $$76)
-                          -- MICRO_STABLE_SORT [$$76(ASC)]  |LOCAL|
-                            project ([$$76])
-                            -- STREAM_PROJECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   }
-            -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            order (ASC, $$g)
+            -- STABLE_SORT [$$g(ASC)]  |PARTITIONED|
               exchange
-              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                order (ASC, $$g)
-                -- STABLE_SORT [$$g(ASC)]  |PARTITIONED|
+              -- HASH_PARTITION_EXCHANGE [$$g]  |PARTITIONED|
+                join (true)
+                -- NESTED_LOOP  |PARTITIONED|
                   exchange
-                  -- HASH_PARTITION_EXCHANGE [$$g]  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                     join (true)
                     -- NESTED_LOOP  |PARTITIONED|
                       exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        join (true)
-                        -- NESTED_LOOP  |PARTITIONED|
-                          exchange
-                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            assign [$$76] <- [$$x.getField(1)] project: [$$76]
-                            -- ASSIGN  |PARTITIONED|
-                              project ([$$x])
-                              -- STREAM_PROJECT  |PARTITIONED|
+                        assign [$$86] <- [$$x.getField(1)] project: [$$86]
+                        -- ASSIGN  |PARTITIONED|
+                          project ([$$x])
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            exchange
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              data-scan []<-[$$99, $$x] <- test.d1
+                              -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan []<-[$$89, $$x] <- test.d1
-                                  -- DATASOURCE_SCAN  |PARTITIONED|
-                                    exchange
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      empty-tuple-source
-                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                  empty-tuple-source
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                      exchange
+                      -- BROADCAST_EXCHANGE  |PARTITIONED|
+                        project ([])
+                        -- STREAM_PROJECT  |PARTITIONED|
                           exchange
-                          -- BROADCAST_EXCHANGE  |PARTITIONED|
-                            project ([])
-                            -- STREAM_PROJECT  |PARTITIONED|
+                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            data-scan []<-[$$100, $$y] <- test.d2
+                            -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                data-scan []<-[$$90, $$y] <- test.d2
-                                -- DATASOURCE_SCAN  |PARTITIONED|
-                                  exchange
-                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    empty-tuple-source
-                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                      exchange
-                      -- BROADCAST_EXCHANGE  |PARTITIONED|
-                        unnest $$g <- range(1, 3)
-                        -- UNNEST  |UNPARTITIONED|
-                          empty-tuple-source
-                          -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                                empty-tuple-source
+                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                  exchange
+                  -- BROADCAST_EXCHANGE  |PARTITIONED|
+                    unnest $$g <- range(1, 3)
+                    -- UNNEST  |UNPARTITIONED|
+                      empty-tuple-source
+                      -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
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 486c0ecd11..af7c8343de 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
@@ -1,52 +1,52 @@
-distribute result [$$100]
+distribute result [$$112]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$100] <- [{"g": $$g, "sum_distinct_x": $$104, "sum_y": $$105, 
"sum_distinct_z": $$106}] project: [$$100]
+    assign [$$112] <- [{"g": $$g, "sum_distinct_x": $$116, "sum_y": $$117, 
"sum_distinct_z": $$118}] project: [$$112]
     -- ASSIGN  |PARTITIONED|
       exchange
-      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-        order (ASC, $$g)
-        -- STABLE_SORT [$$g(ASC)]  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$g(ASC) ]  |PARTITIONED|
+        group by ([$$g := $$g]) decor ([]) {
+                  aggregate [$$116] <- [agg-sql-sum($$100)]
+                  -- AGGREGATE  |LOCAL|
+                    distinct ([$$100])
+                    -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
+                      order (ASC, $$100)
+                      -- MICRO_STABLE_SORT [$$100(ASC)]  |LOCAL|
+                        project ([$$100])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+               }
+               {
+                  aggregate [$$117] <- [agg-sql-sum($$105)]
+                  -- AGGREGATE  |LOCAL|
+                    nested tuple source
+                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+               }
+               {
+                  aggregate [$$118] <- [agg-sql-sum($$110)]
+                  -- AGGREGATE  |LOCAL|
+                    distinct ([$$110])
+                    -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
+                      order (ASC, $$110)
+                      -- MICRO_STABLE_SORT [$$110(ASC)]  |LOCAL|
+                        project ([$$110])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+               }
+        -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
-          -- RANGE_PARTITION_EXCHANGE [$$g(ASC)] RANGE_MAP:{SPLIT:1}  
|PARTITIONED|
-            group by ([$$g := $$g]) decor ([]) {
-                      aggregate [$$104] <- [agg-sql-sum($$88)]
-                      -- AGGREGATE  |LOCAL|
-                        distinct ([$$88])
-                        -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
-                          order (ASC, $$88)
-                          -- MICRO_STABLE_SORT [$$88(ASC)]  |LOCAL|
-                            project ([$$88])
-                            -- STREAM_PROJECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   }
-                   {
-                      aggregate [$$105] <- [agg-sql-sum($$93)]
-                      -- AGGREGATE  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   }
-                   {
-                      aggregate [$$106] <- [agg-sql-sum($$98)]
-                      -- AGGREGATE  |LOCAL|
-                        distinct ([$$98])
-                        -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
-                          order (ASC, $$98)
-                          -- MICRO_STABLE_SORT [$$98(ASC)]  |LOCAL|
-                            project ([$$98])
-                            -- STREAM_PROJECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   }
-            -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            order (ASC, $$g)
+            -- STABLE_SORT [$$g(ASC)]  |PARTITIONED|
               exchange
-              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                order (ASC, $$g)
-                -- STABLE_SORT [$$g(ASC)]  |PARTITIONED|
+              -- HASH_PARTITION_EXCHANGE [$$g]  |PARTITIONED|
+                join (true)
+                -- NESTED_LOOP  |PARTITIONED|
                   exchange
-                  -- HASH_PARTITION_EXCHANGE [$$g]  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                     join (true)
                     -- NESTED_LOOP  |PARTITIONED|
                       exchange
@@ -55,45 +55,27 @@ distribute result [$$100]
                         -- NESTED_LOOP  |PARTITIONED|
                           exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            join (true)
-                            -- NESTED_LOOP  |PARTITIONED|
-                              exchange
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                assign [$$88] <- [$$x.getField(1)] project: 
[$$88]
-                                -- ASSIGN  |PARTITIONED|
-                                  project ([$$x])
-                                  -- STREAM_PROJECT  |PARTITIONED|
-                                    exchange
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      data-scan []<-[$$101, $$x] <- test.d1
-                                      -- DATASOURCE_SCAN  |PARTITIONED|
-                                        exchange
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          empty-tuple-source
-                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                              exchange
-                              -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                assign [$$93] <- [$$y.getField(1)] project: 
[$$93]
-                                -- ASSIGN  |PARTITIONED|
-                                  project ([$$y])
-                                  -- STREAM_PROJECT  |PARTITIONED|
+                            assign [$$100] <- [$$x.getField(1)] project: 
[$$100]
+                            -- ASSIGN  |PARTITIONED|
+                              project ([$$x])
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                exchange
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  data-scan []<-[$$113, $$x] <- test.d1
+                                  -- DATASOURCE_SCAN  |PARTITIONED|
                                     exchange
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      data-scan []<-[$$102, $$y] <- test.d2
-                                      -- DATASOURCE_SCAN  |PARTITIONED|
-                                        exchange
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          empty-tuple-source
-                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                      empty-tuple-source
+                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                           exchange
                           -- BROADCAST_EXCHANGE  |PARTITIONED|
-                            assign [$$98] <- [$$z.getField(1)] project: [$$98]
+                            assign [$$105] <- [$$y.getField(1)] project: 
[$$105]
                             -- ASSIGN  |PARTITIONED|
-                              project ([$$z])
+                              project ([$$y])
                               -- STREAM_PROJECT  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan []<-[$$103, $$z] <- test.d3
+                                  data-scan []<-[$$114, $$y] <- test.d2
                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                     exchange
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -101,7 +83,21 @@ distribute result [$$100]
                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                       exchange
                       -- BROADCAST_EXCHANGE  |PARTITIONED|
-                        unnest $$g <- range(1, 3)
-                        -- UNNEST  |UNPARTITIONED|
-                          empty-tuple-source
-                          -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                        assign [$$110] <- [$$z.getField(1)] project: [$$110]
+                        -- ASSIGN  |PARTITIONED|
+                          project ([$$z])
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            exchange
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              data-scan []<-[$$115, $$z] <- test.d3
+                              -- DATASOURCE_SCAN  |PARTITIONED|
+                                exchange
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  empty-tuple-source
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                  exchange
+                  -- BROADCAST_EXCHANGE  |PARTITIONED|
+                    unnest $$g <- range(1, 3)
+                    -- UNNEST  |UNPARTITIONED|
+                      empty-tuple-source
+                      -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
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 8ff30293ad..21e98f45d6 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
@@ -1,64 +1,64 @@
-distribute result [$$154]
+distribute result [$$166]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$154] <- [{"g": $$g, "sum_distinct_x": $$158, "sum_y": $$159, 
"sum_distinct_z": $$160, "avg_distinct_x": $$161, "avg_distinct_y": $$162, 
"count_x": $$163, "count_distinct_y": $$164, "avg_z": $$165, 
"count_distinct_z": $$166}] project: [$$154]
+    assign [$$166] <- [{"g": $$g, "sum_distinct_x": $$170, "sum_y": $$171, 
"sum_distinct_z": $$172, "avg_distinct_x": $$173, "avg_distinct_y": $$174, 
"count_x": $$175, "count_distinct_y": $$176, "avg_z": $$177, 
"count_distinct_z": $$178}] project: [$$166]
     -- ASSIGN  |PARTITIONED|
       exchange
-      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-        order (ASC, $$g)
-        -- STABLE_SORT [$$g(ASC)]  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$g(ASC) ]  |PARTITIONED|
+        group by ([$$g := $$g]) decor ([]) {
+                  aggregate [$$170, $$173] <- [agg-sql-sum($$124), 
agg-sql-avg($$124)]
+                  -- AGGREGATE  |LOCAL|
+                    distinct ([$$124])
+                    -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
+                      order (ASC, $$124)
+                      -- MICRO_STABLE_SORT [$$124(ASC)]  |LOCAL|
+                        project ([$$124])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+               }
+               {
+                  aggregate [$$171, $$175, $$177] <- [agg-sql-sum($$129), 
agg-sql-count($$124), agg-sql-avg($$134)]
+                  -- AGGREGATE  |LOCAL|
+                    nested tuple source
+                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+               }
+               {
+                  aggregate [$$172, $$178] <- [agg-sql-sum($$134), 
agg-sql-count($$134)]
+                  -- AGGREGATE  |LOCAL|
+                    distinct ([$$134])
+                    -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
+                      order (ASC, $$134)
+                      -- MICRO_STABLE_SORT [$$134(ASC)]  |LOCAL|
+                        project ([$$134])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+               }
+               {
+                  aggregate [$$174, $$176] <- [agg-sql-avg($$129), 
agg-sql-count($$129)]
+                  -- AGGREGATE  |LOCAL|
+                    distinct ([$$129])
+                    -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
+                      order (ASC, $$129)
+                      -- MICRO_STABLE_SORT [$$129(ASC)]  |LOCAL|
+                        project ([$$129])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+               }
+        -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
-          -- RANGE_PARTITION_EXCHANGE [$$g(ASC)] RANGE_MAP:{SPLIT:1}  
|PARTITIONED|
-            group by ([$$g := $$g]) decor ([]) {
-                      aggregate [$$158, $$161] <- [agg-sql-sum($$112), 
agg-sql-avg($$112)]
-                      -- AGGREGATE  |LOCAL|
-                        distinct ([$$112])
-                        -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
-                          order (ASC, $$112)
-                          -- MICRO_STABLE_SORT [$$112(ASC)]  |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)]
-                      -- AGGREGATE  |LOCAL|
-                        nested tuple source
-                        -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   }
-                   {
-                      aggregate [$$160, $$166] <- [agg-sql-sum($$122), 
agg-sql-count($$122)]
-                      -- AGGREGATE  |LOCAL|
-                        distinct ([$$122])
-                        -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
-                          order (ASC, $$122)
-                          -- MICRO_STABLE_SORT [$$122(ASC)]  |LOCAL|
-                            project ([$$122])
-                            -- STREAM_PROJECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   }
-                   {
-                      aggregate [$$162, $$164] <- [agg-sql-avg($$117), 
agg-sql-count($$117)]
-                      -- AGGREGATE  |LOCAL|
-                        distinct ([$$117])
-                        -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
-                          order (ASC, $$117)
-                          -- MICRO_STABLE_SORT [$$117(ASC)]  |LOCAL|
-                            project ([$$117])
-                            -- STREAM_PROJECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   }
-            -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            order (ASC, $$g)
+            -- STABLE_SORT [$$g(ASC)]  |PARTITIONED|
               exchange
-              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                order (ASC, $$g)
-                -- STABLE_SORT [$$g(ASC)]  |PARTITIONED|
+              -- HASH_PARTITION_EXCHANGE [$$g]  |PARTITIONED|
+                join (true)
+                -- NESTED_LOOP  |PARTITIONED|
                   exchange
-                  -- HASH_PARTITION_EXCHANGE [$$g]  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                     join (true)
                     -- NESTED_LOOP  |PARTITIONED|
                       exchange
@@ -67,45 +67,27 @@ distribute result [$$154]
                         -- NESTED_LOOP  |PARTITIONED|
                           exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            join (true)
-                            -- NESTED_LOOP  |PARTITIONED|
-                              exchange
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                assign [$$112] <- [$$x.getField(1)] project: 
[$$112]
-                                -- ASSIGN  |PARTITIONED|
-                                  project ([$$x])
-                                  -- STREAM_PROJECT  |PARTITIONED|
-                                    exchange
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      data-scan []<-[$$155, $$x] <- test.d1
-                                      -- DATASOURCE_SCAN  |PARTITIONED|
-                                        exchange
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          empty-tuple-source
-                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                              exchange
-                              -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                assign [$$117] <- [$$y.getField(1)] project: 
[$$117]
-                                -- ASSIGN  |PARTITIONED|
-                                  project ([$$y])
-                                  -- STREAM_PROJECT  |PARTITIONED|
+                            assign [$$124] <- [$$x.getField(1)] project: 
[$$124]
+                            -- ASSIGN  |PARTITIONED|
+                              project ([$$x])
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                exchange
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  data-scan []<-[$$167, $$x] <- test.d1
+                                  -- DATASOURCE_SCAN  |PARTITIONED|
                                     exchange
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      data-scan []<-[$$156, $$y] <- test.d2
-                                      -- DATASOURCE_SCAN  |PARTITIONED|
-                                        exchange
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          empty-tuple-source
-                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                      empty-tuple-source
+                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                           exchange
                           -- BROADCAST_EXCHANGE  |PARTITIONED|
-                            assign [$$122] <- [$$z.getField(1)] project: 
[$$122]
+                            assign [$$129] <- [$$y.getField(1)] project: 
[$$129]
                             -- ASSIGN  |PARTITIONED|
-                              project ([$$z])
+                              project ([$$y])
                               -- STREAM_PROJECT  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan []<-[$$157, $$z] <- test.d3
+                                  data-scan []<-[$$168, $$y] <- test.d2
                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                     exchange
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -113,7 +95,21 @@ distribute result [$$154]
                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                       exchange
                       -- BROADCAST_EXCHANGE  |PARTITIONED|
-                        unnest $$g <- range(1, 3)
-                        -- UNNEST  |UNPARTITIONED|
-                          empty-tuple-source
-                          -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                        assign [$$134] <- [$$z.getField(1)] project: [$$134]
+                        -- ASSIGN  |PARTITIONED|
+                          project ([$$z])
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            exchange
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              data-scan []<-[$$169, $$z] <- test.d3
+                              -- DATASOURCE_SCAN  |PARTITIONED|
+                                exchange
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  empty-tuple-source
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                  exchange
+                  -- BROADCAST_EXCHANGE  |PARTITIONED|
+                    unnest $$g <- range(1, 3)
+                    -- UNNEST  |UNPARTITIONED|
+                      empty-tuple-source
+                      -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
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 946edcbe67..8b4c22350d 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
@@ -1,69 +1,65 @@
-distribute result [$$70]
+distribute result [$$80]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    assign [$$70] <- [{"g": $$g, "count_distinct_x": $$73}] project: [$$70]
+    assign [$$80] <- [{"g": $$g, "count_distinct_x": $$83}] project: [$$80]
     -- ASSIGN  |PARTITIONED|
       exchange
-      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-        order (ASC, $$g)
-        -- STABLE_SORT [$$g(ASC)]  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$g(ASC) ]  |PARTITIONED|
+        group by ([$$g := $$g]) decor ([]) {
+                  aggregate [$$83] <- [agg-sql-count($$78)]
+                  -- AGGREGATE  |LOCAL|
+                    distinct ([$$78])
+                    -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
+                      order (ASC, $$78)
+                      -- MICRO_STABLE_SORT [$$78(ASC)]  |LOCAL|
+                        project ([$$78])
+                        -- STREAM_PROJECT  |LOCAL|
+                          nested tuple source
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+               }
+        -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
           exchange
-          -- RANGE_PARTITION_EXCHANGE [$$g(ASC)] RANGE_MAP:{SPLIT:1}  
|PARTITIONED|
-            group by ([$$g := $$g]) decor ([]) {
-                      aggregate [$$73] <- [agg-sql-count($$68)]
-                      -- AGGREGATE  |LOCAL|
-                        distinct ([$$68])
-                        -- MICRO_PRE_SORTED_DISTINCT_BY  |LOCAL|
-                          order (ASC, $$68)
-                          -- MICRO_STABLE_SORT [$$68(ASC)]  |LOCAL|
-                            project ([$$68])
-                            -- STREAM_PROJECT  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   }
-            -- PRE_CLUSTERED_GROUP_BY[$$g]  |PARTITIONED|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            order (ASC, $$g)
+            -- STABLE_SORT [$$g(ASC)]  |PARTITIONED|
               exchange
-              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                order (ASC, $$g)
-                -- STABLE_SORT [$$g(ASC)]  |PARTITIONED|
+              -- HASH_PARTITION_EXCHANGE [$$g]  |PARTITIONED|
+                join (true)
+                -- NESTED_LOOP  |PARTITIONED|
                   exchange
-                  -- HASH_PARTITION_EXCHANGE [$$g]  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                     join (true)
                     -- NESTED_LOOP  |PARTITIONED|
                       exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        join (true)
-                        -- NESTED_LOOP  |PARTITIONED|
-                          exchange
-                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            assign [$$68] <- [$$x.getField(1)] project: [$$68]
-                            -- ASSIGN  |PARTITIONED|
-                              project ([$$x])
-                              -- STREAM_PROJECT  |PARTITIONED|
+                        assign [$$78] <- [$$x.getField(1)] project: [$$78]
+                        -- ASSIGN  |PARTITIONED|
+                          project ([$$x])
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            exchange
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              data-scan []<-[$$81, $$x] <- test.d1
+                              -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan []<-[$$71, $$x] <- test.d1
-                                  -- DATASOURCE_SCAN  |PARTITIONED|
-                                    exchange
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      empty-tuple-source
-                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                  empty-tuple-source
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                      exchange
+                      -- BROADCAST_EXCHANGE  |PARTITIONED|
+                        project ([])
+                        -- STREAM_PROJECT  |PARTITIONED|
                           exchange
-                          -- BROADCAST_EXCHANGE  |PARTITIONED|
-                            project ([])
-                            -- STREAM_PROJECT  |PARTITIONED|
+                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            data-scan []<-[$$82, $$y] <- test.d2
+                            -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                data-scan []<-[$$72, $$y] <- test.d2
-                                -- DATASOURCE_SCAN  |PARTITIONED|
-                                  exchange
-                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    empty-tuple-source
-                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                      exchange
-                      -- BROADCAST_EXCHANGE  |PARTITIONED|
-                        unnest $$g <- range(1, 3)
-                        -- UNNEST  |UNPARTITIONED|
-                          empty-tuple-source
-                          -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                                empty-tuple-source
+                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                  exchange
+                  -- BROADCAST_EXCHANGE  |PARTITIONED|
+                    unnest $$g <- range(1, 3)
+                    -- UNNEST  |UNPARTITIONED|
+                      empty-tuple-source
+                      -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|

Reply via email to