Skip to content

Commit 9d51e11

Browse files
committed
fix(isthmus): implement ddl operatoins sas relnode
1 parent c8430ec commit 9d51e11

29 files changed

Lines changed: 376 additions & 854 deletions

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

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

isthmus/src/main/java/io/substrait/isthmus/operation/SqlKindFromRel.java renamed to isthmus/src/main/java/io/substrait/isthmus/SqlKindFromRel.java

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.substrait.isthmus.operation;
1+
package io.substrait.isthmus;
22

33
import io.substrait.relation.Aggregate;
44
import io.substrait.relation.ConsistentPartitionWindow;
@@ -43,7 +43,7 @@ public class SqlKindFromRel
4343
@Override
4444
public SqlKind visit(Aggregate aggregate, EmptyVisitationContext context)
4545
throws RuntimeException {
46-
// Aggregation is a core part of a query (DQL).
46+
4747
return QUERY_KIND;
4848
}
4949

@@ -56,25 +56,21 @@ public SqlKind visit(EmptyScan emptyScan, EmptyVisitationContext context)
5656

5757
@Override
5858
public SqlKind visit(Fetch fetch, EmptyVisitationContext context) throws RuntimeException {
59-
// Fetch corresponds to LIMIT/OFFSET, a part of a query.
6059
return QUERY_KIND;
6160
}
6261

6362
@Override
6463
public SqlKind visit(Filter filter, EmptyVisitationContext context) throws RuntimeException {
65-
// Filter corresponds to a WHERE clause, a part of a query.
6664
return QUERY_KIND;
6765
}
6866

6967
@Override
7068
public SqlKind visit(Join join, EmptyVisitationContext context) throws RuntimeException {
71-
// A logical join operation.
7269
return SqlKind.JOIN;
7370
}
7471

7572
@Override
7673
public SqlKind visit(Set set, EmptyVisitationContext context) throws RuntimeException {
77-
// Maps Substrait's Set operations to their SQL equivalents.
7874
switch (set.getSetOp()) {
7975
case UNION_ALL:
8076
case UNION_DISTINCT:
@@ -96,38 +92,32 @@ public SqlKind visit(Set set, EmptyVisitationContext context) throws RuntimeExce
9692
@Override
9793
public SqlKind visit(NamedScan namedScan, EmptyVisitationContext context)
9894
throws RuntimeException {
99-
// A scan from a named table is the start of a query.
10095
return QUERY_KIND;
10196
}
10297

10398
@Override
10499
public SqlKind visit(LocalFiles localFiles, EmptyVisitationContext context)
105100
throws RuntimeException {
106-
// A scan from local files is a type of query input.
107101
return QUERY_KIND;
108102
}
109103

110104
@Override
111105
public SqlKind visit(Project project, EmptyVisitationContext context) throws RuntimeException {
112-
// Project corresponds to the SELECT clause of a query.
113106
return QUERY_KIND;
114107
}
115108

116109
@Override
117110
public SqlKind visit(Expand expand, EmptyVisitationContext context) throws RuntimeException {
118-
// Expand is a relational operator used in queries (e.g., for grouping sets).
119111
return QUERY_KIND;
120112
}
121113

122114
@Override
123115
public SqlKind visit(Sort sort, EmptyVisitationContext context) throws RuntimeException {
124-
// A sort operation directly maps to ORDER BY.
125116
return SqlKind.ORDER_BY;
126117
}
127118

128119
@Override
129120
public SqlKind visit(Cross cross, EmptyVisitationContext context) throws RuntimeException {
130-
// A cross join is a type of join.
131121
return SqlKind.JOIN;
132122
}
133123

@@ -141,62 +131,53 @@ public SqlKind visit(VirtualTableScan virtualTableScan, EmptyVisitationContext c
141131
@Override
142132
public SqlKind visit(ExtensionLeaf extensionLeaf, EmptyVisitationContext context)
143133
throws RuntimeException {
144-
// Unknown extension node.
145134
return SqlKind.OTHER;
146135
}
147136

148137
@Override
149138
public SqlKind visit(ExtensionSingle extensionSingle, EmptyVisitationContext context)
150139
throws RuntimeException {
151-
// Unknown extension node.
152140
return SqlKind.OTHER;
153141
}
154142

155143
@Override
156144
public SqlKind visit(ExtensionMulti extensionMulti, EmptyVisitationContext context)
157145
throws RuntimeException {
158-
// Unknown extension node.
159146
return SqlKind.OTHER;
160147
}
161148

162149
@Override
163150
public SqlKind visit(ExtensionTable extensionTable, EmptyVisitationContext context)
164151
throws RuntimeException {
165-
// Unknown extension node.
166152
return SqlKind.OTHER;
167153
}
168154

169155
@Override
170156
public SqlKind visit(HashJoin hashJoin, EmptyVisitationContext context) throws RuntimeException {
171-
// A physical hash join is a type of join.
172157
return SqlKind.JOIN;
173158
}
174159

175160
@Override
176161
public SqlKind visit(MergeJoin mergeJoin, EmptyVisitationContext context)
177162
throws RuntimeException {
178-
// A physical merge join is a type of join.
179163
return SqlKind.JOIN;
180164
}
181165

182166
@Override
183167
public SqlKind visit(NestedLoopJoin nestedLoopJoin, EmptyVisitationContext context)
184168
throws RuntimeException {
185-
// A physical nested loop join is a type of join.
186169
return SqlKind.JOIN;
187170
}
188171

189172
@Override
190173
public SqlKind visit(
191174
ConsistentPartitionWindow consistentPartitionWindow, EmptyVisitationContext context)
192175
throws RuntimeException {
193-
// This relation represents a window function operation.
194176
return SqlKind.OVER;
195177
}
196178

197179
@Override
198180
public SqlKind visit(NamedWrite write, EmptyVisitationContext context) throws RuntimeException {
199-
// DML and CTAS write operations.
200181
switch (write.getOperation()) {
201182
case INSERT:
202183
return SqlKind.INSERT;
@@ -214,13 +195,11 @@ public SqlKind visit(NamedWrite write, EmptyVisitationContext context) throws Ru
214195
@Override
215196
public SqlKind visit(ExtensionWrite write, EmptyVisitationContext context)
216197
throws RuntimeException {
217-
// Custom DML/DDL operations are best mapped to OTHER or OTHER_DDL.
218198
return SqlKind.OTHER_DDL;
219199
}
220200

221201
@Override
222202
public SqlKind visit(NamedDdl ddl, EmptyVisitationContext context) throws RuntimeException {
223-
// DDL operations, determined by combining the operation and the object type.
224203
switch (ddl.getOperation()) {
225204
case CREATE:
226205
case CREATE_OR_REPLACE:
@@ -251,14 +230,11 @@ public SqlKind visit(NamedDdl ddl, EmptyVisitationContext context) throws Runtim
251230

252231
@Override
253232
public SqlKind visit(ExtensionDdl ddl, EmptyVisitationContext context) throws RuntimeException {
254-
// A custom DDL operation.
255233
return SqlKind.OTHER_DDL;
256234
}
257235

258236
@Override
259237
public SqlKind visit(NamedUpdate update, EmptyVisitationContext context) throws RuntimeException {
260-
// An update operation is a specific DML type. Note that modern Substrait
261-
// producers should use NamedWrite with WriteOp.UPDATE instead.
262238
return SqlKind.UPDATE;
263239
}
264240
}

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

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package io.substrait.isthmus;
22

3-
import io.substrait.isthmus.operation.CalciteOperation;
43
import io.substrait.isthmus.sql.SubstraitSqlToCalcite;
54
import io.substrait.plan.ImmutablePlan.Builder;
65
import io.substrait.plan.Plan;
76
import io.substrait.plan.Plan.Version;
87
import io.substrait.plan.PlanProtoConverter;
9-
import java.util.List;
108
import org.apache.calcite.prepare.Prepare;
119
import org.apache.calcite.sql.parser.SqlParseException;
1210

@@ -55,13 +53,9 @@ public Plan convert(String sqlStatements, Prepare.CatalogReader catalogReader)
5553
builder.version(Version.builder().from(Version.DEFAULT_VERSION).producer("isthmus").build());
5654

5755
// TODO: consider case in which one sql passes conversion while others don't
58-
List<CalciteOperation> calciteOperations =
59-
SubstraitSqlToCalcite.convertQueries(sqlStatements, catalogReader);
60-
CalciteOperationToSubstrait calciteOperationToSubstrait =
61-
new CalciteOperationToSubstrait(EXTENSION_COLLECTION, featureBoard);
62-
calciteOperations.stream()
63-
.map(operation -> operation.accept(calciteOperationToSubstrait))
64-
.forEach(builder::addRoots);
56+
SubstraitSqlToCalcite.convertQueries(sqlStatements, catalogReader).stream()
57+
.map(root -> SubstraitRelVisitor.convert(root, EXTENSION_COLLECTION, featureBoard))
58+
.forEach(root -> builder.addRoots(root));
6559

6660
return builder.build();
6761
}

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import io.substrait.expression.Expression.SortDirection;
1111
import io.substrait.expression.FunctionArg;
1212
import io.substrait.extension.SimpleExtension;
13+
import io.substrait.isthmus.calcite.rel.CreateTable;
14+
import io.substrait.isthmus.calcite.rel.CreateView;
1315
import io.substrait.isthmus.expression.AggregateFunctionConverter;
1416
import io.substrait.isthmus.expression.ExpressionRexConverter;
1517
import io.substrait.isthmus.expression.ScalarFunctionConverter;
@@ -24,6 +26,7 @@
2426
import io.substrait.relation.Join;
2527
import io.substrait.relation.Join.JoinType;
2628
import io.substrait.relation.LocalFiles;
29+
import io.substrait.relation.NamedDdl;
2730
import io.substrait.relation.NamedScan;
2831
import io.substrait.relation.NamedUpdate;
2932
import io.substrait.relation.NamedWrite;
@@ -53,6 +56,7 @@
5356
import org.apache.calcite.rel.RelCollations;
5457
import org.apache.calcite.rel.RelFieldCollation;
5558
import org.apache.calcite.rel.RelNode;
59+
import org.apache.calcite.rel.RelRoot;
5660
import org.apache.calcite.rel.core.AggregateCall;
5761
import org.apache.calcite.rel.core.CorrelationId;
5862
import org.apache.calcite.rel.core.JoinRelType;
@@ -68,6 +72,7 @@
6872
import org.apache.calcite.rex.RexNode;
6973
import org.apache.calcite.rex.RexSlot;
7074
import org.apache.calcite.sql.SqlAggFunction;
75+
import org.apache.calcite.sql.SqlKind;
7176
import org.apache.calcite.sql.SqlOperator;
7277
import org.apache.calcite.sql.parser.SqlParser;
7378
import org.apache.calcite.tools.Frameworks;
@@ -547,6 +552,17 @@ public RelNode visit(NamedUpdate update, Context context) {
547552
false);
548553
}
549554

555+
@Override
556+
public RelNode visit(NamedDdl namedDdl, Context context) {
557+
if (namedDdl.getViewDefinition().isEmpty()) {
558+
throw new IllegalArgumentException("no view definition found");
559+
}
560+
Rel viewDefinition = namedDdl.getViewDefinition().get();
561+
RelNode relNode = viewDefinition.accept(this, context);
562+
RelRoot relRoot = RelRoot.of(relNode, SqlKind.SELECT);
563+
return new CreateView(namedDdl.getNames(), relRoot);
564+
}
565+
550566
@Override
551567
public RelNode visit(VirtualTableScan virtualTableScan, Context context) {
552568

@@ -584,6 +600,13 @@ public RelNode visit(VirtualTableScan virtualTableScan, Context context) {
584600
relBuilder.getCluster(), rowTypeWithNames, ImmutableList.copyOf(tuples));
585601
}
586602

603+
private RelNode handleCreateTableAs(NamedWrite namedWrite, Context context) {
604+
Rel input = namedWrite.getInput();
605+
RelNode relNode = input.accept(this, context);
606+
RelRoot relRoot = RelRoot.of(relNode, SqlKind.SELECT);
607+
return new CreateTable(namedWrite.getNames(), relRoot);
608+
}
609+
587610
@Override
588611
public RelNode visit(NamedWrite write, Context context) {
589612
RelNode input = write.getInput().accept(this, context);
@@ -599,6 +622,8 @@ public RelNode visit(NamedWrite write, Context context) {
599622
case DELETE:
600623
operation = TableModify.Operation.DELETE;
601624
break;
625+
case CTAS:
626+
return handleCreateTableAs(write, context);
602627
default:
603628
throw new UnsupportedOperationException(
604629
"Write operation '"

0 commit comments

Comments
 (0)