Skip to content

Commit bb4a2e2

Browse files
committed
Refactor modeling of EXCLUDE in partiql-ast and partiql-plan
1 parent 5c1240c commit bb4a2e2

File tree

19 files changed

+238
-190
lines changed

19 files changed

+238
-190
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ Thank you to all who have contributed!
4949
- Changes the return type of `filter_distinct` to a list if input collection is list
5050
- Changes the `PartiQLValue` collections to implement Iterable rather than Sequence, allowing for multiple consumption.
5151
- **BREAKING** Moves PartiQLParserBuilder.standard().build() to be PartiQLParser.default().
52+
- **BREAKING** Changed modeling of `EXCLUDE` in `partiql-ast`
5253

5354
### Deprecated
5455

@@ -71,6 +72,7 @@ Thank you to all who have contributed!
7172
Thank you to all who have contributed!
7273
- @rchowell
7374
- @johnedquinn
75+
- @alancai98
7476

7577
## [0.13.2-alpha] - 2023-09-29
7678

partiql-ast/src/main/kotlin/org/partiql/ast/helpers/ToLegacyAst.kt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -756,42 +756,42 @@ private class AstTranslator(val metas: Map<String, MetaContainer>) : AstBaseVisi
756756
}
757757

758758
override fun visitExclude(node: Exclude, ctx: Ctx): PartiqlAst.ExcludeOp = translate(node) { metas ->
759-
val excludeExprs = node.exprs.translate<PartiqlAst.ExcludeExpr>(ctx)
759+
val excludeExprs = node.items.translate<PartiqlAst.ExcludeExpr>(ctx)
760760
excludeOp(excludeExprs, metas)
761761
}
762762

763-
override fun visitExcludeExcludeExpr(node: Exclude.ExcludeExpr, ctx: Ctx) = translate(node) { metas ->
764-
val root = visitIdentifierSymbol(node.root, ctx)
763+
override fun visitExcludeItem(node: Exclude.Item, ctx: Ctx) = translate(node) { metas ->
764+
val root = visitExprVar(node.root, ctx)
765765
val steps = node.steps.translate<PartiqlAst.ExcludeStep>(ctx)
766-
excludeExpr(root = root, steps = steps, metas)
766+
excludeExpr(root = identifier_(root.name, root.case), steps = steps, metas)
767767
}
768768

769769
override fun visitExcludeStep(node: Exclude.Step, ctx: Ctx) =
770770
super.visitExcludeStep(node, ctx) as PartiqlAst.ExcludeStep
771771

772-
override fun visitExcludeStepExcludeTupleAttr(node: Exclude.Step.ExcludeTupleAttr, ctx: Ctx) = translate(node) { metas ->
772+
override fun visitExcludeStepStructField(node: Exclude.Step.StructField, ctx: Ctx) = translate(node) { metas ->
773773
val attr = node.symbol.symbol
774774
val case = node.symbol.caseSensitivity.toLegacyCaseSensitivity()
775775
excludeTupleAttr(identifier(attr, case), metas)
776776
}
777777

778-
override fun visitExcludeStepExcludeCollectionIndex(
779-
node: Exclude.Step.ExcludeCollectionIndex,
778+
override fun visitExcludeStepCollIndex(
779+
node: Exclude.Step.CollIndex,
780780
ctx: Ctx
781781
) = translate(node) { metas ->
782782
val index = node.index.toLong()
783783
excludeCollectionIndex(index, metas)
784784
}
785785

786-
override fun visitExcludeStepExcludeTupleWildcard(
787-
node: Exclude.Step.ExcludeTupleWildcard,
786+
override fun visitExcludeStepStructWildcard(
787+
node: Exclude.Step.StructWildcard,
788788
ctx: Ctx
789789
) = translate(node) { metas ->
790790
excludeTupleWildcard(metas)
791791
}
792792

793-
override fun visitExcludeStepExcludeCollectionWildcard(
794-
node: Exclude.Step.ExcludeCollectionWildcard,
793+
override fun visitExcludeStepCollWildcard(
794+
node: Exclude.Step.CollWildcard,
795795
ctx: Ctx
796796
) = translate(node) { metas ->
797797
excludeCollectionWildcard(metas)

partiql-ast/src/main/kotlin/org/partiql/ast/sql/SqlDialect.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,32 +86,32 @@ public abstract class SqlDialect : AstBaseVisitor<SqlBlock, SqlBlock>() {
8686
override fun visitExclude(node: Exclude, head: SqlBlock): SqlBlock {
8787
var h = head
8888
h = h concat " EXCLUDE "
89-
h = h concat list(start = null, end = null) { node.exprs }
89+
h = h concat list(start = null, end = null) { node.items }
9090
return h
9191
}
9292

93-
override fun visitExcludeExcludeExpr(node: Exclude.ExcludeExpr, head: SqlBlock): SqlBlock {
93+
override fun visitExcludeItem(node: Exclude.Item, head: SqlBlock): SqlBlock {
9494
var h = head
95-
h = h concat visitIdentifierSymbol(node.root, SqlBlock.Nil)
95+
h = h concat visitExprVar(node.root, SqlBlock.Nil)
9696
h = h concat list(delimiter = null, start = null, end = null) { node.steps }
9797
return h
9898
}
9999

100-
override fun visitExcludeStepExcludeCollectionIndex(node: Exclude.Step.ExcludeCollectionIndex, head: SqlBlock): SqlBlock {
100+
override fun visitExcludeStepCollIndex(node: Exclude.Step.CollIndex, head: SqlBlock): SqlBlock {
101101
return head concat r("[${node.index}]")
102102
}
103103

104-
override fun visitExcludeStepExcludeTupleWildcard(node: Exclude.Step.ExcludeTupleWildcard, head: SqlBlock): SqlBlock {
104+
override fun visitExcludeStepStructWildcard(node: Exclude.Step.StructWildcard, head: SqlBlock): SqlBlock {
105105
return head concat r(".*")
106106
}
107107

108-
override fun visitExcludeStepExcludeTupleAttr(node: Exclude.Step.ExcludeTupleAttr, head: SqlBlock): SqlBlock {
108+
override fun visitExcludeStepStructField(node: Exclude.Step.StructField, head: SqlBlock): SqlBlock {
109109
var h = head concat r(".")
110110
h = h concat visitIdentifierSymbol(node.symbol, SqlBlock.Nil)
111111
return h
112112
}
113113

114-
override fun visitExcludeStepExcludeCollectionWildcard(node: Exclude.Step.ExcludeCollectionWildcard, head: SqlBlock): SqlBlock {
114+
override fun visitExcludeStepCollWildcard(node: Exclude.Step.CollWildcard, head: SqlBlock): SqlBlock {
115115
return head concat r("[*]")
116116
}
117117

partiql-ast/src/main/resources/partiql_ast.ion

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -563,17 +563,17 @@ select::[
563563
]
564564

565565
exclude::{
566-
exprs: list::[exclude_expr],
566+
items: list::[item],
567567
_: [
568-
exclude_expr::{
569-
root: '.identifier.symbol',
568+
item::{
569+
root: '.expr.var',
570570
steps: list::[step],
571571
},
572572
step::[
573-
exclude_tuple_attr::{ symbol: '.identifier.symbol' },
574-
exclude_collection_index::{ index: int },
575-
exclude_tuple_wildcard::{},
576-
exclude_collection_wildcard::{},
573+
struct_field::{ symbol: '.identifier.symbol' },
574+
coll_index::{ index: int },
575+
struct_wildcard::{},
576+
coll_wildcard::{},
577577
]
578578
]
579579
}

partiql-ast/src/test/kotlin/org/partiql/ast/sql/SqlDialectTest.kt

Lines changed: 32 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,11 +1073,9 @@ class SqlDialectTest {
10731073
type = From.Value.Type.SCAN
10741074
}
10751075
exclude = exclude {
1076-
exprs += excludeExcludeExpr {
1077-
root = id("t", Identifier.CaseSensitivity.INSENSITIVE)
1078-
steps += excludeStepExcludeTupleAttr {
1079-
symbol = id("a", Identifier.CaseSensitivity.INSENSITIVE)
1080-
}
1076+
items += excludeItem {
1077+
root = v("t")
1078+
steps += insensitiveExcludeStructField("a")
10811079
}
10821080
}
10831081
}
@@ -1090,21 +1088,21 @@ class SqlDialectTest {
10901088
type = From.Value.Type.SCAN
10911089
}
10921090
exclude = exclude {
1093-
exprs += excludeExcludeExpr {
1094-
root = id("a", Identifier.CaseSensitivity.INSENSITIVE)
1095-
steps += insensitiveExcludeTupleAttr("b")
1091+
items += excludeItem {
1092+
root = v("a")
1093+
steps += insensitiveExcludeStructField("b")
10961094
}
1097-
exprs += excludeExcludeExpr {
1098-
root = id("c", Identifier.CaseSensitivity.INSENSITIVE)
1099-
steps += insensitiveExcludeTupleAttr("d")
1095+
items += excludeItem {
1096+
root = v("c")
1097+
steps += insensitiveExcludeStructField("d")
11001098
}
1101-
exprs += excludeExcludeExpr {
1102-
root = id("e", Identifier.CaseSensitivity.INSENSITIVE)
1103-
steps += insensitiveExcludeTupleAttr("f")
1099+
items += excludeItem {
1100+
root = v("e")
1101+
steps += insensitiveExcludeStructField("f")
11041102
}
1105-
exprs += excludeExcludeExpr {
1106-
root = id("g", Identifier.CaseSensitivity.INSENSITIVE)
1107-
steps += insensitiveExcludeTupleAttr("h")
1103+
items += excludeItem {
1104+
root = v("g")
1105+
steps += insensitiveExcludeStructField("h")
11081106
}
11091107
}
11101108
}
@@ -1117,37 +1115,37 @@ class SqlDialectTest {
11171115
type = From.Value.Type.SCAN
11181116
}
11191117
exclude = exclude {
1120-
exprs += excludeExcludeExpr {
1121-
root = id("t", Identifier.CaseSensitivity.INSENSITIVE)
1118+
items += excludeItem {
1119+
root = v("t")
11221120
steps += mutableListOf(
1123-
insensitiveExcludeTupleAttr("a"),
1124-
sensitiveExcludeTupleAttr("b"),
1125-
excludeStepExcludeTupleWildcard(),
1126-
excludeStepExcludeCollectionWildcard(),
1127-
insensitiveExcludeTupleAttr("c"),
1121+
insensitiveExcludeStructField("a"),
1122+
sensitiveExcludeStructField("b"),
1123+
excludeStepStructWildcard(),
1124+
excludeStepCollWildcard(),
1125+
insensitiveExcludeStructField("c"),
11281126
)
11291127
}
1130-
exprs += excludeExcludeExpr {
1131-
root = id("s", Identifier.CaseSensitivity.SENSITIVE)
1128+
items += excludeItem {
1129+
root = exprVar(id("s", Identifier.CaseSensitivity.SENSITIVE), Expr.Var.Scope.DEFAULT)
11321130
steps += mutableListOf(
1133-
excludeStepExcludeCollectionIndex(0),
1134-
insensitiveExcludeTupleAttr("d"),
1135-
sensitiveExcludeTupleAttr("e"),
1136-
excludeStepExcludeCollectionWildcard(),
1137-
insensitiveExcludeTupleAttr("f"),
1138-
excludeStepExcludeTupleWildcard(),
1131+
excludeStepCollIndex(0),
1132+
insensitiveExcludeStructField("d"),
1133+
sensitiveExcludeStructField("e"),
1134+
excludeStepCollWildcard(),
1135+
insensitiveExcludeStructField("f"),
1136+
excludeStepStructWildcard(),
11391137
)
11401138
}
11411139
}
11421140
}
11431141
},
11441142
)
11451143

1146-
private fun AstBuilder.insensitiveExcludeTupleAttr(str: String) = excludeStepExcludeTupleAttr {
1144+
private fun AstBuilder.insensitiveExcludeStructField(str: String) = excludeStepStructField {
11471145
symbol = id(str, Identifier.CaseSensitivity.INSENSITIVE)
11481146
}
11491147

1150-
private fun AstBuilder.sensitiveExcludeTupleAttr(str: String) = excludeStepExcludeTupleAttr {
1148+
private fun AstBuilder.sensitiveExcludeStructField(str: String) = excludeStepStructField {
11511149
symbol = id(str, Identifier.CaseSensitivity.SENSITIVE)
11521150
}
11531151

partiql-parser/src/main/kotlin/org/partiql/parser/impl/PartiQLParserDefault.kt

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ import org.partiql.ast.Statement
5252
import org.partiql.ast.TableDefinition
5353
import org.partiql.ast.Type
5454
import org.partiql.ast.exclude
55-
import org.partiql.ast.excludeExcludeExpr
56-
import org.partiql.ast.excludeStepExcludeCollectionIndex
57-
import org.partiql.ast.excludeStepExcludeCollectionWildcard
58-
import org.partiql.ast.excludeStepExcludeTupleAttr
59-
import org.partiql.ast.excludeStepExcludeTupleWildcard
55+
import org.partiql.ast.excludeItem
56+
import org.partiql.ast.excludeStepCollIndex
57+
import org.partiql.ast.excludeStepCollWildcard
58+
import org.partiql.ast.excludeStepStructField
59+
import org.partiql.ast.excludeStepStructWildcard
6060
import org.partiql.ast.exprAgg
6161
import org.partiql.ast.exprBagOp
6262
import org.partiql.ast.exprBetween
@@ -1058,20 +1058,21 @@ internal class PartiQLParserDefault : PartiQLParser {
10581058
}
10591059

10601060
override fun visitExcludeExpr(ctx: GeneratedParser.ExcludeExprContext) = translate(ctx) {
1061-
val root = visitSymbolPrimitive(ctx.symbolPrimitive())
1061+
val rootId = visitSymbolPrimitive(ctx.symbolPrimitive())
1062+
val root = exprVar(rootId, Expr.Var.Scope.DEFAULT)
10621063
val steps = visitOrEmpty<Exclude.Step>(ctx.excludeExprSteps())
1063-
excludeExcludeExpr(root, steps)
1064+
excludeItem(root, steps)
10641065
}
10651066

10661067
override fun visitExcludeExprTupleAttr(ctx: GeneratedParser.ExcludeExprTupleAttrContext) = translate(ctx) {
10671068
val identifier = visitSymbolPrimitive(ctx.symbolPrimitive())
1068-
excludeStepExcludeTupleAttr(identifier)
1069+
excludeStepStructField(identifier)
10691070
}
10701071

10711072
override fun visitExcludeExprCollectionIndex(ctx: GeneratedParser.ExcludeExprCollectionIndexContext) =
10721073
translate(ctx) {
10731074
val index = ctx.index.text.toInt()
1074-
excludeStepExcludeCollectionIndex(index)
1075+
excludeStepCollIndex(index)
10751076
}
10761077

10771078
override fun visitExcludeExprCollectionAttr(ctx: GeneratedParser.ExcludeExprCollectionAttrContext) =
@@ -1081,17 +1082,17 @@ internal class PartiQLParserDefault : PartiQLParser {
10811082
attr,
10821083
Identifier.CaseSensitivity.SENSITIVE,
10831084
)
1084-
excludeStepExcludeTupleAttr(identifier)
1085+
excludeStepStructField(identifier)
10851086
}
10861087

10871088
override fun visitExcludeExprCollectionWildcard(ctx: org.partiql.parser.antlr.PartiQLParser.ExcludeExprCollectionWildcardContext) =
10881089
translate(ctx) {
1089-
excludeStepExcludeCollectionWildcard()
1090+
excludeStepCollWildcard()
10901091
}
10911092

10921093
override fun visitExcludeExprTupleWildcard(ctx: org.partiql.parser.antlr.PartiQLParser.ExcludeExprTupleWildcardContext) =
10931094
translate(ctx) {
1094-
excludeStepExcludeTupleWildcard()
1095+
excludeStepStructWildcard()
10951096
}
10961097

10971098
/**

partiql-plan/src/main/resources/partiql_plan.ion

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -288,18 +288,14 @@ rel::{
288288
items: list::[item],
289289
_: [
290290
item::{
291-
root: '.identifier.symbol',
291+
root: '.rex.op.var',
292292
steps: list::[step],
293293
},
294294
step::[
295-
attr::{
296-
symbol: '.identifier.symbol',
297-
},
298-
pos::{
299-
index: int,
300-
},
295+
struct_field::{ symbol: '.identifier.symbol' },
296+
coll_index::{ index: int },
301297
struct_wildcard::{},
302-
collection_wildcard::{},
298+
coll_wildcard::{},
303299
],
304300
],
305301
},

partiql-planner/src/main/kotlin/org/partiql/planner/internal/Env.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ internal class Env(
281281
/**
282282
* Check locals, else search structs.
283283
*/
284-
private fun resolveLocalBind(path: BindingPath, locals: List<Rel.Binding>): ResolvedVar? {
284+
internal fun resolveLocalBind(path: BindingPath, locals: List<Rel.Binding>): ResolvedVar? {
285285
if (path.steps.isEmpty()) {
286286
return null
287287
}

0 commit comments

Comments
 (0)