Skip to content

Commit 1233616

Browse files
authored
Merge f8205e3 into ea779ee
2 parents ea779ee + f8205e3 commit 1233616

File tree

25 files changed

+2222
-132
lines changed

25 files changed

+2222
-132
lines changed

partiql-ast/src/main/java/org/partiql/ast/DataType.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public static class StructField extends AstNode {
3434

3535
public final boolean isOptional;
3636

37-
@Nullable
37+
@NotNull
3838
public final List<AttributeConstraint> constraints;
3939
@Nullable
4040
public final String comment;
@@ -43,7 +43,7 @@ public StructField(
4343
@NotNull Identifier name,
4444
@NotNull DataType type,
4545
boolean isOptional,
46-
@Nullable List<AttributeConstraint> constraints,
46+
@NotNull List<AttributeConstraint> constraints,
4747
@Nullable String comment) {
4848
this.name = name;
4949
this.type = type;

partiql-plan/api/partiql-plan.api

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
public abstract interface class org/partiql/plan/Action {
22
}
33

4+
public abstract interface class org/partiql/plan/Action$CreateTable : org/partiql/plan/Action {
5+
public abstract fun getTable ()Lorg/partiql/spi/catalog/Table;
6+
}
7+
48
public abstract interface class org/partiql/plan/Action$Query : org/partiql/plan/Action {
59
public abstract fun getRex ()Lorg/partiql/plan/rex/Rex;
610
}

partiql-plan/src/main/java/org/partiql/plan/Action.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.jetbrains.annotations.NotNull;
44
import org.partiql.plan.rex.Rex;
5+
import org.partiql.spi.catalog.Table;
56

67
/**
78
* A PartiQL statement action within a plan.
@@ -19,4 +20,10 @@ public interface Query extends Action {
1920
@NotNull
2021
public Rex getRex();
2122
}
23+
24+
// A better way to segment is to have an object interface in SPI
25+
public interface CreateTable extends Action {
26+
@NotNull
27+
public Table getTable();
28+
}
2229
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package org.partiql.planner.internal
2+
3+
import org.partiql.planner.internal.ir.Statement
4+
import org.partiql.planner.internal.ir.statementDDLAttribute
5+
import org.partiql.spi.catalog.Identifier
6+
import org.partiql.types.Field
7+
import org.partiql.types.PType
8+
import org.partiql.types.shape.PShape
9+
10+
/**
11+
* An implementation for [Field] that is used by DDL
12+
* to hold additional information in the struct field.
13+
* It is identical to [Statement.DDL.Attribute]
14+
*/
15+
internal data class DdlField(
16+
val name: Identifier,
17+
val type: PShape,
18+
val isNullable: Boolean,
19+
val isOptional: Boolean,
20+
val constraints: List<Statement.DDL.Constraint>,
21+
val isPrimaryKey: Boolean,
22+
val isUnique: Boolean,
23+
val comment: String?
24+
) : Field {
25+
26+
override fun getName(): String {
27+
return name.getIdentifier().getText()
28+
}
29+
30+
override fun getType(): PType {
31+
return type
32+
}
33+
34+
fun toAttr() =
35+
statementDDLAttribute(
36+
this.name,
37+
this.type,
38+
this.isNullable,
39+
this.isOptional,
40+
this.isPrimaryKey,
41+
this.isUnique,
42+
this.constraints,
43+
this.comment
44+
)
45+
46+
companion object {
47+
fun fromAttr(attr: Statement.DDL.Attribute): DdlField =
48+
DdlField(attr.name, attr.type, attr.isNullable, attr.isOptional, attr.constraints, attr.isPrimaryKey, attr.isUnique, attr.comment)
49+
}
50+
}

partiql-planner/src/main/kotlin/org/partiql/planner/internal/ir/Nodes.kt

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ import org.partiql.planner.internal.ir.builder.RexOpTupleUnionBuilder
6262
import org.partiql.planner.internal.ir.builder.RexOpVarGlobalBuilder
6363
import org.partiql.planner.internal.ir.builder.RexOpVarLocalBuilder
6464
import org.partiql.planner.internal.ir.builder.RexOpVarUnresolvedBuilder
65+
import org.partiql.planner.internal.ir.builder.StatementDdlAttributeBuilder
66+
import org.partiql.planner.internal.ir.builder.StatementDdlBuilder
67+
import org.partiql.planner.internal.ir.builder.StatementDdlCommandCreateTableBuilder
68+
import org.partiql.planner.internal.ir.builder.StatementDdlConstraintCheckBuilder
69+
import org.partiql.planner.internal.ir.builder.StatementDdlPartitionByAttrListBuilder
70+
import org.partiql.planner.internal.ir.builder.StatementDdlTablePropertyBuilder
6571
import org.partiql.planner.internal.ir.builder.StatementQueryBuilder
6672
import org.partiql.planner.internal.ir.visitor.PlanVisitor
6773
import org.partiql.planner.internal.typer.CompilerType
@@ -73,6 +79,7 @@ import org.partiql.spi.function.Function
7379
import org.partiql.value.PartiQLValue
7480
import org.partiql.value.PartiQLValueExperimental
7581
import kotlin.random.Random
82+
import org.partiql.types.shape.PShape
7683

7784
internal abstract class PlanNode {
7885
@JvmField
@@ -177,6 +184,7 @@ internal sealed class Ref : PlanNode() {
177184
internal sealed class Statement : PlanNode() {
178185
public override fun <R, C> accept(visitor: PlanVisitor<R, C>, ctx: C): R = when (this) {
179186
is Query -> visitor.visitStatementQuery(this, ctx)
187+
is DDL -> visitor.visitStatementDDL(this, ctx)
180188
}
181189

182190
internal data class Query(
@@ -195,6 +203,169 @@ internal sealed class Statement : PlanNode() {
195203
internal fun builder(): StatementQueryBuilder = StatementQueryBuilder()
196204
}
197205
}
206+
207+
internal data class DDL(
208+
@JvmField
209+
internal val command: Command,
210+
) : Statement() {
211+
override val children: List<PlanNode> by lazy {
212+
val kids = mutableListOf<PlanNode?>()
213+
kids.add(command)
214+
kids.filterNotNull()
215+
}
216+
217+
218+
override fun <R, C> accept(visitor: PlanVisitor<R, C>, ctx: C): R =
219+
visitor.visitStatementDDL(this, ctx)
220+
221+
sealed class Command : PlanNode() {
222+
override fun <R, C> accept(visitor: PlanVisitor<R, C>, ctx: C): R = when (this) {
223+
is CreateTable -> visitor.visitStatementDDLCommandCreateTable(this, ctx)
224+
}
225+
226+
internal data class CreateTable(
227+
@JvmField
228+
internal val name: Identifier,
229+
@JvmField
230+
internal val attributes: List<Attribute>,
231+
@JvmField
232+
internal val tblConstraints: List<Constraint>,
233+
@JvmField
234+
internal val partitionBy: PartitionBy?,
235+
@JvmField
236+
internal val tableProperties: List<TableProperty>,
237+
@JvmField
238+
internal val primaryKey: List<Identifier>,
239+
@JvmField
240+
internal val unique: List<Identifier>,
241+
) : Command() {
242+
override val children: List<PlanNode> by lazy {
243+
val kids = mutableListOf<PlanNode?>()
244+
kids.addAll(attributes)
245+
kids.addAll(tblConstraints)
246+
partitionBy?.let { kids.add(it) }
247+
kids.addAll(tableProperties)
248+
kids.filterNotNull()
249+
}
250+
251+
252+
override fun <R, C> accept(visitor: PlanVisitor<R, C>, ctx: C): R =
253+
visitor.visitStatementDDLCommandCreateTable(this, ctx)
254+
255+
internal companion object {
256+
@JvmStatic
257+
internal fun builder(): StatementDdlCommandCreateTableBuilder =
258+
StatementDdlCommandCreateTableBuilder()
259+
}
260+
}
261+
}
262+
263+
internal data class Attribute(
264+
@JvmField
265+
internal val name: Identifier,
266+
@JvmField
267+
internal val type: PShape,
268+
@JvmField
269+
internal val isNullable: Boolean,
270+
@JvmField
271+
internal val isOptional: Boolean,
272+
@JvmField
273+
internal val isPrimaryKey: Boolean,
274+
@JvmField
275+
internal val isUnique: Boolean,
276+
@JvmField
277+
internal val constraints: List<Constraint>,
278+
@JvmField
279+
val comment: String?
280+
) : PlanNode() {
281+
override val children: List<PlanNode> by lazy {
282+
val kids = mutableListOf<PlanNode?>()
283+
kids.addAll(constraints)
284+
kids.filterNotNull()
285+
}
286+
287+
override fun <R, C> accept(visitor: PlanVisitor<R, C>, ctx: C): R =
288+
visitor.visitStatementDDLAttribute(this, ctx)
289+
290+
internal companion object {
291+
@JvmStatic
292+
internal fun builder(): StatementDdlAttributeBuilder = StatementDdlAttributeBuilder()
293+
}
294+
}
295+
296+
internal sealed class Constraint : PlanNode() {
297+
override fun <R, C> accept(visitor: PlanVisitor<R, C>, ctx: C): R = when (this) {
298+
is Check -> visitor.visitStatementDDLConstraintCheck(this, ctx)
299+
}
300+
301+
internal data class Check(
302+
@JvmField
303+
internal val expression: Rex,
304+
@JvmField
305+
val sql: String
306+
) : Constraint() {
307+
override val children: List<PlanNode> by lazy {
308+
val kids = mutableListOf<PlanNode?>()
309+
kids.add(expression)
310+
kids.filterNotNull()
311+
}
312+
313+
314+
override fun <R, C> accept(visitor: PlanVisitor<R, C>, ctx: C): R =
315+
visitor.visitStatementDDLConstraintCheck(this, ctx)
316+
317+
internal companion object {
318+
@JvmStatic
319+
internal fun builder(): StatementDdlConstraintCheckBuilder =
320+
StatementDdlConstraintCheckBuilder()
321+
}
322+
}
323+
}
324+
325+
internal sealed class PartitionBy : PlanNode() {
326+
override fun <R, C> accept(visitor: PlanVisitor<R, C>, ctx: C): R = when (this) {
327+
is AttrList -> visitor.visitStatementDDLPartitionByAttrList(this, ctx)
328+
}
329+
330+
internal data class AttrList(
331+
@JvmField
332+
internal val attrs: List<Identifier>,
333+
) : PartitionBy() {
334+
override val children: List<PlanNode> = emptyList()
335+
336+
override fun <R, C> accept(visitor: PlanVisitor<R, C>, ctx: C): R =
337+
visitor.visitStatementDDLPartitionByAttrList(this, ctx)
338+
339+
internal companion object {
340+
@JvmStatic
341+
internal fun builder(): StatementDdlPartitionByAttrListBuilder =
342+
StatementDdlPartitionByAttrListBuilder()
343+
}
344+
}
345+
}
346+
347+
internal data class TableProperty(
348+
@JvmField
349+
internal val name: String,
350+
@JvmField
351+
internal val `value`: String,
352+
) : PlanNode() {
353+
override val children: List<PlanNode> = emptyList()
354+
355+
override fun <R, C> accept(visitor: PlanVisitor<R, C>, ctx: C): R =
356+
visitor.visitStatementDDLTableProperty(this, ctx)
357+
358+
internal companion object {
359+
@JvmStatic
360+
internal fun builder(): StatementDdlTablePropertyBuilder = StatementDdlTablePropertyBuilder()
361+
}
362+
}
363+
364+
internal companion object {
365+
@JvmStatic
366+
internal fun builder(): StatementDdlBuilder = StatementDdlBuilder()
367+
}
368+
}
198369
}
199370

200371
internal data class Rex(

partiql-planner/src/main/kotlin/org/partiql/planner/internal/normalize/NormalizeFromSource.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import org.partiql.ast.FromExpr
2323
import org.partiql.ast.FromJoin
2424
import org.partiql.ast.FromTableRef
2525
import org.partiql.ast.FromType
26+
import org.partiql.ast.Query
2627
import org.partiql.ast.QueryBody
2728
import org.partiql.ast.Statement
2829
import org.partiql.ast.expr.Expr
@@ -33,7 +34,10 @@ import org.partiql.planner.internal.helpers.toBinder
3334
*/
3435
internal object NormalizeFromSource : AstPass {
3536

36-
override fun apply(statement: Statement): Statement = statement.accept(Visitor, 0) as Statement
37+
override fun apply(statement: Statement): Statement = when (statement) {
38+
is Query -> statement.accept(Visitor, 0) as Statement
39+
else -> statement
40+
}
3741

3842
private object Visitor : AstRewriter<Int>() {
3943

partiql-planner/src/main/kotlin/org/partiql/planner/internal/normalize/NormalizeGroupBy.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import org.partiql.ast.Ast.groupByKey
1919
import org.partiql.ast.AstNode
2020
import org.partiql.ast.AstRewriter
2121
import org.partiql.ast.GroupBy
22+
import org.partiql.ast.Query
2223
import org.partiql.ast.Statement
2324
import org.partiql.ast.expr.Expr
2425
import org.partiql.planner.internal.helpers.toBinder
@@ -28,7 +29,10 @@ import org.partiql.planner.internal.helpers.toBinder
2829
*/
2930
internal object NormalizeGroupBy : AstPass {
3031

31-
override fun apply(statement: Statement) = Visitor.visitStatement(statement, 0) as Statement
32+
override fun apply(statement: Statement) = when (statement) {
33+
is Query -> Visitor.visitStatement(statement, 0) as Statement
34+
else -> statement
35+
}
3236

3337
private object Visitor : AstRewriter<Int>() {
3438

0 commit comments

Comments
 (0)