@@ -1072,11 +1072,6 @@ private Pair<List<RexNode>, List<AggCall>> resolveAttributesForAggregation(
10721072
10731073 @ Override
10741074 public RelNode visitAggregation (Aggregation node , CalcitePlanContext context ) {
1075- return visitAggregationAndReturnProjection (node , context ).getLeft ();
1076- }
1077-
1078- private Pair <RelNode , List <RexNode >> visitAggregationAndReturnProjection (
1079- Aggregation node , CalcitePlanContext context ) {
10801075 visitChildren (node , context );
10811076
10821077 List <UnresolvedExpression > aggExprList = node .getAggExprList ();
@@ -1161,7 +1156,7 @@ private Pair<RelNode, List<RexNode>> visitAggregationAndReturnProjection(
11611156 reordered .addAll (aliasedGroupByList );
11621157 context .relBuilder .project (reordered );
11631158
1164- return Pair . of ( context .relBuilder .peek (), reordered );
1159+ return context .relBuilder .peek ();
11651160 }
11661161
11671162 private Optional <UnresolvedExpression > getTimeSpanField (UnresolvedExpression expr ) {
@@ -2036,32 +2031,33 @@ public RelNode visitChart(Chart node, CalcitePlanContext context) {
20362031 Stream .of (node .getRowSplit (), node .getColumnSplit ()).filter (Objects ::nonNull ).toList ());
20372032 span = null ;
20382033 }
2034+ Boolean useNull = (Boolean ) argMap .getOrDefault ("usenull" , Chart .DEFAULT_USE_NULL ).getValue ();
20392035 Aggregation aggregation =
2040- new Aggregation (node .getAggregationFunctions (), List .of (), groupExprList , span , List .of ());
2041- Pair <RelNode , List <RexNode >> aggregated =
2042- visitAggregationAndReturnProjection (aggregation , context );
2036+ new Aggregation (
2037+ node .getAggregationFunctions (),
2038+ List .of (),
2039+ groupExprList ,
2040+ span ,
2041+ List .of (new Argument (Argument .BUCKET_NULLABLE , AstDSL .booleanLiteral (useNull ))));
2042+ RelNode aggregated = visitAggregation (aggregation , context );
2043+
20432044 // If row or column split does not present or limit equals 0, this is the same as `stats agg
20442045 // [group by col]`
2045-
20462046 Integer limit = (Integer ) argMap .getOrDefault ("limit" , Chart .DEFAULT_LIMIT ).getValue ();
20472047 if (node .getRowSplit () == null || node .getColumnSplit () == null || Objects .equals (limit , 0 )) {
2048- return aggregated . getLeft () ;
2048+ return aggregated ;
20492049 }
20502050
20512051 Boolean top = (Boolean ) argMap .getOrDefault ("top" , Chart .DEFAULT_TOP ).getValue ();
20522052 Boolean useOther =
20532053 (Boolean ) argMap .getOrDefault ("useother" , Chart .DEFAULT_USE_OTHER ).getValue ();
2054- Boolean useNull = (Boolean ) argMap .getOrDefault ("usenull" , Chart .DEFAULT_USE_NULL ).getValue ();
20552054 String otherStr = (String ) argMap .getOrDefault ("otherstr" , Chart .DEFAULT_OTHER_STR ).getValue ();
20562055 String nullStr = (String ) argMap .getOrDefault ("nullstr" , Chart .DEFAULT_NULL_STR ).getValue ();
20572056
2058- String columSplitName = aggregated .getLeft (). getRowType ().getFieldNames ().getLast ();
2057+ String columSplitName = aggregated .getRowType ().getFieldNames ().getLast ();
20592058 RelBuilder relBuilder = context .relBuilder ;
20602059 // 0: agg; 2: column-split
20612060 relBuilder .project (relBuilder .field (0 ), relBuilder .field (2 ));
2062- if (!useNull ) {
2063- relBuilder .filter (relBuilder .isNotNull (relBuilder .field (1 )));
2064- }
20652061 // 1: column split; 0: agg
20662062 relBuilder .aggregate (
20672063 relBuilder .groupKey (relBuilder .field (1 )),
@@ -2084,7 +2080,7 @@ public RelNode visitChart(Chart node, CalcitePlanContext context) {
20842080 relBuilder .projectPlus (relBuilder .alias (rowNum , "__row_number__" ));
20852081 RelNode ranked = relBuilder .build ();
20862082
2087- relBuilder .push (aggregated . getLeft () );
2083+ relBuilder .push (aggregated );
20882084 relBuilder .push (ranked );
20892085
20902086 // on column-split = group key
@@ -2103,19 +2099,32 @@ public RelNode visitChart(Chart node, CalcitePlanContext context) {
21032099 relBuilder .filter (lteCondition );
21042100 }
21052101
2106- columnSplitExpr =
2107- relBuilder .call (
2108- SqlStdOperatorTable .CASE ,
2109- nullCondition ,
2110- relBuilder .literal (nullStr ),
2111- lteCondition ,
2112- relBuilder .field (2 ),
2113- relBuilder .literal (otherStr ));
2102+ if (useNull ) {
2103+ columnSplitExpr =
2104+ relBuilder .call (
2105+ SqlStdOperatorTable .CASE ,
2106+ nullCondition ,
2107+ relBuilder .literal (nullStr ),
2108+ lteCondition ,
2109+ relBuilder .field (2 ),
2110+ relBuilder .literal (otherStr ));
2111+ } else {
2112+ columnSplitExpr =
2113+ relBuilder .call (
2114+ SqlStdOperatorTable .CASE ,
2115+ lteCondition ,
2116+ relBuilder .field (2 ),
2117+ relBuilder .literal (otherStr ));
2118+ }
21142119
2120+ String aggFieldName = relBuilder .peek ().getRowType ().getFieldNames ().getFirst ();
21152121 relBuilder .project (
21162122 relBuilder .field (0 ),
21172123 relBuilder .field (1 ),
21182124 relBuilder .alias (columnSplitExpr , columSplitName ));
2125+ relBuilder .aggregate (
2126+ relBuilder .groupKey (relBuilder .field (1 ), relBuilder .field (2 )),
2127+ relBuilder .sum (relBuilder .field (0 )).as (aggFieldName ));
21192128 return relBuilder .peek ();
21202129 }
21212130
0 commit comments