Skip to content

Commit 0d0c953

Browse files
committed
Append a final aggregation to merge OTHER categories
Signed-off-by: Yuanchun Shen <yuanchu@amazon.com>
1 parent 2c586da commit 0d0c953

1 file changed

Lines changed: 34 additions & 25 deletions

File tree

core/src/main/java/org/opensearch/sql/calcite/CalciteRelNodeVisitor.java

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)