Skip to content

Commit a4d6aaa

Browse files
committed
feat: introduce SubstraitSqlDialect
1 parent e2bb71b commit a4d6aaa

File tree

3 files changed

+41
-41
lines changed

3 files changed

+41
-41
lines changed

isthmus/src/main/java/io/substrait/isthmus/SubstraitToSql.java

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,9 @@
22

33
import io.substrait.relation.Rel;
44
import java.util.List;
5-
import java.util.function.UnaryOperator;
65
import org.apache.calcite.prepare.CalciteCatalogReader;
76
import org.apache.calcite.prepare.Prepare;
87
import org.apache.calcite.rel.RelNode;
9-
import org.apache.calcite.rel.rel2sql.RelToSqlConverter;
10-
import org.apache.calcite.sql.SqlDialect;
11-
import org.apache.calcite.sql.SqlNode;
12-
import org.apache.calcite.sql.SqlWriterConfig;
138
import org.apache.calcite.sql.parser.SqlParseException;
149

1510
public class SubstraitToSql extends SqlConverterBase {
@@ -27,39 +22,4 @@ public RelNode substraitRelToCalciteRel(Rel relRoot, List<String> tables)
2722
public RelNode substraitRelToCalciteRel(Rel relRoot, Prepare.CatalogReader catalog) {
2823
return SubstraitRelNodeConverter.convert(relRoot, relOptCluster, catalog, parserConfig);
2924
}
30-
31-
// DEFAULT_SQL_DIALECT uses Calcite's EMPTY_CONTEXT with setting:
32-
// identifierQuoteString : null, identifierEscapeQuoteString : null
33-
// quotedCasing : UNCHANGED, unquotedCasing : TO_UPPER
34-
// caseSensitive: true
35-
// supportsApproxCountDistinct is true
36-
private static final SqlDialect DEFAULT_SQL_DIALECT =
37-
new SqlDialect(SqlDialect.EMPTY_CONTEXT) {
38-
@Override
39-
public boolean supportsApproxCountDistinct() {
40-
return true;
41-
}
42-
};
43-
44-
public static String toSql(RelNode root) {
45-
return toSql(root, DEFAULT_SQL_DIALECT);
46-
}
47-
48-
public static String toSql(RelNode root, SqlDialect dialect) {
49-
return toSql(
50-
root,
51-
dialect,
52-
c ->
53-
c.withAlwaysUseParentheses(false)
54-
.withSelectListItemsOnSeparateLines(false)
55-
.withUpdateSetListNewline(false)
56-
.withIndentation(0));
57-
}
58-
59-
private static String toSql(
60-
RelNode root, SqlDialect dialect, UnaryOperator<SqlWriterConfig> transform) {
61-
final RelToSqlConverter converter = new RelToSqlConverter(dialect);
62-
final SqlNode sqlNode = converter.visitRoot(root).asStatement();
63-
return sqlNode.toSqlString(c -> transform.apply(c.withDialect(dialect))).getSql();
64-
}
6525
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package io.substrait.isthmus.sql;
2+
3+
import org.apache.calcite.rel.RelNode;
4+
import org.apache.calcite.rel.rel2sql.RelToSqlConverter;
5+
import org.apache.calcite.sql.SqlDialect;
6+
import org.apache.calcite.sql.SqlNode;
7+
import org.apache.calcite.sql.util.SqlString;
8+
9+
/**
10+
* {@link SqlDialect} used by Isthmus for parsing
11+
*
12+
* <p>Intended primarily for internal testing
13+
*/
14+
public class SubstraitSqlDialect extends SqlDialect {
15+
16+
public static SqlDialect.Context DEFAULT_CONTEXT = SqlDialect.EMPTY_CONTEXT;
17+
18+
public static SqlDialect DEFAULT = new SubstraitSqlDialect(DEFAULT_CONTEXT);
19+
20+
public static SqlString toSql(RelNode relNode) {
21+
RelToSqlConverter relToSql = new RelToSqlConverter(DEFAULT);
22+
SqlNode sqlNode = relToSql.visitRoot(relNode).asStatement();
23+
return sqlNode.toSqlString(
24+
c ->
25+
c.withAlwaysUseParentheses(false)
26+
.withSelectListItemsOnSeparateLines(false)
27+
.withUpdateSetListNewline(false)
28+
.withIndentation(0));
29+
}
30+
31+
public SubstraitSqlDialect(Context context) {
32+
super(context);
33+
}
34+
35+
@Override
36+
public boolean supportsApproxCountDistinct() {
37+
return true;
38+
}
39+
}

isthmus/src/test/java/io/substrait/isthmus/RelCopyOnWriteVisitorTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import io.substrait.expression.AggregateFunctionInvocation;
88
import io.substrait.expression.Expression;
99
import io.substrait.extension.SimpleExtension;
10+
import io.substrait.isthmus.sql.SubstraitSqlDialect;
1011
import io.substrait.plan.Plan;
1112
import io.substrait.plan.ProtoPlanConverter;
1213
import io.substrait.relation.Aggregate;
@@ -139,7 +140,7 @@ public void approximateCountDistinct() throws IOException, SqlParseException {
139140
.filter(t -> !t.trim().isBlank())
140141
.collect(java.util.stream.Collectors.toList());
141142
RelNode relnodeRoot = new SubstraitToSql().substraitRelToCalciteRel(pojoRel, creates);
142-
String newSql = SubstraitToSql.toSql(relnodeRoot);
143+
String newSql = SubstraitSqlDialect.toSql(relnodeRoot).getSql();
143144
assertTrue(newSql.toUpperCase().contains("APPROX_COUNT_DISTINCT"));
144145
}
145146

0 commit comments

Comments
 (0)