Skip to content

Commit c1546b1

Browse files
LantaoJinpenghuo
authored andcommitted
Make basic aggregation working (part 2) : adding tests (opensearch-project#3355)
* Add more aggregation tests Signed-off-by: Lantao Jin <ltjin@amazon.com> * delete unrelavant code Signed-off-by: Lantao Jin <ltjin@amazon.com> --------- Signed-off-by: Lantao Jin <ltjin@amazon.com>
1 parent 9207154 commit c1546b1

File tree

10 files changed

+605
-103
lines changed

10 files changed

+605
-103
lines changed

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

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55

66
package org.opensearch.sql.calcite;
77

8+
import static org.opensearch.sql.calcite.utils.OpenSearchTypeFactory.TYPE_FACTORY;
9+
810
import java.sql.Connection;
911
import java.util.function.BiFunction;
1012
import lombok.Getter;
11-
import org.apache.calcite.adapter.java.JavaTypeFactory;
1213
import org.apache.calcite.rex.RexNode;
1314
import org.apache.calcite.tools.FrameworkConfig;
1415
import org.apache.calcite.tools.RelBuilder;
@@ -24,10 +25,10 @@ public class CalcitePlanContext {
2425

2526
@Getter private boolean isResolvingJoinCondition = false;
2627

27-
private CalcitePlanContext(FrameworkConfig config, JavaTypeFactory typeFactory) {
28+
private CalcitePlanContext(FrameworkConfig config) {
2829
this.config = config;
29-
this.connection = CalciteToolsHelper.connect(config, typeFactory);
30-
this.relBuilder = CalciteToolsHelper.create(config, typeFactory, connection);
30+
this.connection = CalciteToolsHelper.connect(config, TYPE_FACTORY);
31+
this.relBuilder = CalciteToolsHelper.create(config, TYPE_FACTORY, connection);
3132
this.rexBuilder = new ExtendedRexBuilder(relBuilder.getRexBuilder());
3233
}
3334

@@ -41,10 +42,6 @@ public RexNode resolveJoinCondition(
4142
}
4243

4344
public static CalcitePlanContext create(FrameworkConfig config) {
44-
return new CalcitePlanContext(config, null);
45-
}
46-
47-
public static CalcitePlanContext create(FrameworkConfig config, JavaTypeFactory typeFactory) {
48-
return new CalcitePlanContext(config, typeFactory);
45+
return new CalcitePlanContext(config);
4946
}
5047
}

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -196,12 +196,6 @@ public RelNode visitAggregation(Aggregation node, CalcitePlanContext context) {
196196
groupByList.add(spanRex);
197197
// add span's group alias field (most recent added expression)
198198
}
199-
// List<RexNode> aggList = node.getAggExprList().stream()
200-
// .map(expr -> rexVisitor.analyze(expr, context))
201-
// .collect(Collectors.toList());
202-
// relBuilder.aggregate(relBuilder.groupKey(groupByList),
203-
// aggList.stream().map(rex -> (MyAggregateCall) rex)
204-
// .map(MyAggregateCall::getCall).collect(Collectors.toList()));
205199
context.relBuilder.aggregate(context.relBuilder.groupKey(groupByList), aggList);
206200
return context.relBuilder.peek();
207201
}

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

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import org.apache.calcite.rex.RexNode;
1919
import org.apache.calcite.sql.SqlIntervalQualifier;
2020
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
21-
import org.apache.calcite.sql.parser.SqlParserPos;
21+
import org.apache.calcite.sql.parser.SqlParserUtil;
2222
import org.apache.calcite.sql.type.SqlTypeName;
2323
import org.apache.calcite.util.DateString;
2424
import org.apache.calcite.util.TimeString;
@@ -39,7 +39,6 @@
3939
import org.opensearch.sql.ast.expression.UnresolvedExpression;
4040
import org.opensearch.sql.ast.expression.Xor;
4141
import org.opensearch.sql.calcite.utils.BuiltinFunctionUtils;
42-
import org.opensearch.sql.calcite.utils.DataTypeTransformer;
4342

4443
public class CalciteRexNodeVisitor extends AbstractNodeVisitor<RexNode, CalcitePlanContext> {
4544

@@ -198,13 +197,9 @@ public RexNode visitSpan(Span node, CalcitePlanContext context) {
198197
RelDataTypeFactory typeFactory = context.rexBuilder.getTypeFactory();
199198
SpanUnit unit = node.getUnit();
200199
if (isTimeBased(unit)) {
201-
String datetimeUnitString = DataTypeTransformer.translate(unit);
202-
RexNode interval =
203-
context.rexBuilder.makeIntervalLiteral(
204-
new BigDecimal(value.toString()),
205-
new SqlIntervalQualifier(datetimeUnitString, SqlParserPos.ZERO));
206-
// TODO not supported yet
207-
return interval;
200+
SqlIntervalQualifier intervalQualifier = context.rexBuilder.createIntervalUntil(unit);
201+
long millis = SqlParserUtil.intervalToMillis(value.toString(), intervalQualifier);
202+
return context.rexBuilder.makeIntervalLiteral(new BigDecimal(millis), intervalQualifier);
208203
} else {
209204
// if the unit is not time base - create a math expression to bucket the span partitions
210205
return context.rexBuilder.makeCall(

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

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,13 @@
55

66
package org.opensearch.sql.calcite;
77

8+
import org.apache.calcite.avatica.util.TimeUnit;
89
import org.apache.calcite.rex.RexBuilder;
910
import org.apache.calcite.rex.RexNode;
11+
import org.apache.calcite.sql.SqlIntervalQualifier;
1012
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
13+
import org.apache.calcite.sql.parser.SqlParserPos;
14+
import org.opensearch.sql.ast.expression.SpanUnit;
1115

1216
public class ExtendedRexBuilder extends RexBuilder {
1317

@@ -22,4 +26,49 @@ public RexNode coalesce(RexNode... nodes) {
2226
public RexNode equals(RexNode n1, RexNode n2) {
2327
return this.makeCall(SqlStdOperatorTable.EQUALS, n1, n2);
2428
}
29+
30+
public SqlIntervalQualifier createIntervalUntil(SpanUnit unit) {
31+
TimeUnit timeUnit;
32+
switch (unit) {
33+
case MILLISECOND:
34+
case MS:
35+
timeUnit = TimeUnit.MILLISECOND;
36+
break;
37+
case SECOND:
38+
case S:
39+
timeUnit = TimeUnit.SECOND;
40+
break;
41+
case MINUTE:
42+
case m:
43+
timeUnit = TimeUnit.MINUTE;
44+
break;
45+
case HOUR:
46+
case H:
47+
timeUnit = TimeUnit.HOUR;
48+
break;
49+
case DAY:
50+
case D:
51+
timeUnit = TimeUnit.DAY;
52+
break;
53+
case WEEK:
54+
case W:
55+
timeUnit = TimeUnit.WEEK;
56+
break;
57+
case MONTH:
58+
case M:
59+
timeUnit = TimeUnit.MONTH;
60+
break;
61+
case QUARTER:
62+
case Q:
63+
timeUnit = TimeUnit.QUARTER;
64+
break;
65+
case YEAR:
66+
case Y:
67+
timeUnit = TimeUnit.YEAR;
68+
break;
69+
default:
70+
timeUnit = TimeUnit.EPOCH;
71+
}
72+
return new SqlIntervalQualifier(timeUnit, timeUnit, SqlParserPos.ZERO);
73+
}
2574
}

core/src/main/java/org/opensearch/sql/calcite/utils/DataTypeTransformer.java

Lines changed: 0 additions & 58 deletions
This file was deleted.

core/src/main/java/org/opensearch/sql/calcite/utils/OpenSearchTypeFactory.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import static org.opensearch.sql.data.type.ExprCoreType.DOUBLE;
1313
import static org.opensearch.sql.data.type.ExprCoreType.FLOAT;
1414
import static org.opensearch.sql.data.type.ExprCoreType.INTEGER;
15+
import static org.opensearch.sql.data.type.ExprCoreType.INTERVAL;
1516
import static org.opensearch.sql.data.type.ExprCoreType.IP;
1617
import static org.opensearch.sql.data.type.ExprCoreType.LONG;
1718
import static org.opensearch.sql.data.type.ExprCoreType.SHORT;
@@ -151,6 +152,13 @@ public static ExprType convertRelDataTypeToExprType(RelDataType type) {
151152
return TIMESTAMP;
152153
case GEOMETRY:
153154
return IP;
155+
case INTERVAL_YEAR:
156+
case INTERVAL_MONTH:
157+
case INTERVAL_DAY:
158+
case INTERVAL_HOUR:
159+
case INTERVAL_MINUTE:
160+
case INTERVAL_SECOND:
161+
return INTERVAL;
154162
case ARRAY:
155163
return ARRAY;
156164
case MAP:

core/src/main/java/org/opensearch/sql/executor/QueryService.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88

99
package org.opensearch.sql.executor;
1010

11-
import static org.opensearch.sql.calcite.utils.OpenSearchTypeFactory.TYPE_FACTORY;
12-
1311
import java.security.AccessController;
1412
import java.security.PrivilegedAction;
1513
import java.util.List;
@@ -80,8 +78,7 @@ public void execute(
8078
(PrivilegedAction<Void>)
8179
() -> {
8280
final FrameworkConfig config = buildFrameworkConfig();
83-
final CalcitePlanContext context =
84-
CalcitePlanContext.create(config, TYPE_FACTORY);
81+
final CalcitePlanContext context = CalcitePlanContext.create(config);
8582
executePlanByCalcite(analyze(plan, context), context, listener);
8683
return null;
8784
});

0 commit comments

Comments
 (0)