Skip to content

Commit 146dd4e

Browse files
authored
Merge pull request #44 from hasura/gavin/unary-comparison-ir
Update UnaryOp IR to use ColumnTarget
2 parents 6556883 + ebcdf96 commit 146dd4e

File tree

5 files changed

+61
-31
lines changed

5 files changed

+61
-31
lines changed

ndc-connector-mysql/src/main/kotlin/io/hasura/mysql/JSONGenerator.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
package io.hasura.mysql
22

3-
import io.hasura.ndc.common.ConnectorConfiguration
4-
import io.hasura.ndc.common.NDCScalar
53
import io.hasura.ndc.ir.*
64
import io.hasura.ndc.ir.Field.ColumnField
75
import io.hasura.ndc.ir.Field as IRField
8-
import io.hasura.ndc.ir.Type
96
import io.hasura.ndc.sqlgen.BaseQueryGenerator
7+
import io.hasura.ndc.sqlgen.DatabaseType
108
import org.jooq.*
119
import org.jooq.Field
1210
import org.jooq.impl.DSL
13-
import org.jooq.impl.SQLDataType
1411

1512

1613
object JsonQueryGenerator : BaseQueryGenerator() {
@@ -130,7 +127,7 @@ object JsonQueryGenerator : BaseQueryGenerator() {
130127
request.collection,
131128
field
132129
)
133-
val castedField = castToSQLDataType(MYSQL, columnField, ndcScalar)
130+
val castedField = castToSQLDataType(DatabaseType.MYSQL, columnField, ndcScalar)
134131
DSL.jsonEntry(
135132
alias,
136133
castedField
@@ -209,7 +206,7 @@ object JsonQueryGenerator : BaseQueryGenerator() {
209206
): Set<Relationship> {
210207
return when (where) {
211208
is ExpressionOnColumn -> when (val column = where.column) {
212-
is ComparisonColumn.Column -> {
209+
is ComparisonTarget.Column -> {
213210
column.path.fold(emptySet()) { acc, path ->
214211
val relationship = collectionRelationships[path.relationship]
215212
?: error("Relationship ${path.relationship} not found")

ndc-connector-oracle/src/main/kotlin/io/hasura/oracle/JSONGenerator.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.hasura.oracle
22

33
import io.hasura.ndc.common.ConnectorConfiguration
4-
import io.hasura.ndc.common.NDCScalar
54
import io.hasura.ndc.ir.*
65
import io.hasura.ndc.ir.Type
76
import io.hasura.ndc.ir.Field.ColumnField
@@ -187,7 +186,7 @@ object JsonQueryGenerator : BaseQueryGenerator() {
187186
): Set<Relationship> {
188187
return when (where) {
189188
is ExpressionOnColumn -> when (val column = where.column) {
190-
is ComparisonColumn.Column -> {
189+
is ComparisonTarget.Column -> {
191190
column.path.fold(emptySet()) { acc, path ->
192191
val relationship = collectionRelationships[path.relationship]
193192
?: error("Relationship ${path.relationship} not found")

ndc-ir/src/main/kotlin/io/hasura/ndc/ir/Query.kt

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,16 @@ data class QueryRequest(
2222
sealed interface Argument {
2323

2424
@JsonTypeName("variable")
25-
data class Variable(val name: String): Argument
25+
data class Variable(val name: String) : Argument
2626

2727
@JsonTypeName("literal")
28-
data class Literal (val value: Any): Argument
28+
data class Literal(val value: Any) : Argument
2929

3030
@JsonTypeName("column")
31-
data class Column (val name: String): Argument
31+
data class Column(val name: String) : Argument
3232
}
3333

34-
data class Relationship (
34+
data class Relationship(
3535
val column_mapping: Map<String, String>,
3636
val relationship_type: RelationshipType,
3737
val target_collection: String,
@@ -72,18 +72,25 @@ sealed interface Aggregate {
7272
enum class SingleColumnAggregateFunction {
7373
@JsonProperty("avg")
7474
AVG,
75+
7576
@JsonProperty("sum")
7677
SUM,
78+
7779
@JsonProperty("min")
7880
MIN,
81+
7982
@JsonProperty("max")
8083
MAX,
84+
8185
@JsonProperty("stddev_pop")
8286
STDDEV_POP,
87+
8388
@JsonProperty("stddev_samp")
8489
STDDEV_SAMP,
90+
8591
@JsonProperty("var_pop")
8692
VAR_POP,
93+
8794
@JsonProperty("var_samp")
8895
VAR_SAMP
8996
}
@@ -106,7 +113,7 @@ sealed interface Field {
106113
sealed interface ComparisonValue {
107114

108115
@JsonTypeName("column")
109-
data class ColumnComp(val column: ComparisonColumn) : ComparisonValue
116+
data class ColumnComp(val column: ComparisonTarget) : ComparisonValue
110117

111118
@JsonTypeName("scalar")
112119
data class ScalarComp(val value: Any) : ComparisonValue
@@ -152,7 +159,7 @@ sealed interface OrderByTarget {
152159
) : OrderByTarget
153160
}
154161

155-
data class PathElement (
162+
data class PathElement(
156163
val relationship: String,
157164
val arguments: Map<String, Argument>,
158165
val predicate: Expression
@@ -164,20 +171,28 @@ data class PathElement (
164171
enum class ApplyBinaryComparisonOperator {
165172
@JsonProperty("_eq")
166173
EQ,
174+
167175
@JsonProperty("_gt")
168176
GT,
177+
169178
@JsonProperty("_lt")
170179
LT,
180+
171181
@JsonProperty("_gte")
172182
GTE,
183+
173184
@JsonProperty("_lte")
174185
LTE,
186+
175187
@JsonProperty("_in")
176188
IN,
189+
177190
@JsonProperty("_is_null")
178191
IS_NULL,
192+
179193
@JsonProperty("_like")
180194
LIKE,
195+
181196
@JsonProperty("_contains")
182197
CONTAINS,
183198
}
@@ -192,7 +207,7 @@ enum class ApplyUnaryComparisonOperator {
192207
// /////////////////////////////////////////////////////////////////////////
193208

194209
interface ExpressionOnColumn {
195-
val column: ComparisonColumn
210+
val column: ComparisonTarget
196211
}
197212

198213
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@@ -210,13 +225,13 @@ sealed interface Expression {
210225
@JsonTypeName("unary_comparison_operator")
211226
data class ApplyUnaryComparison(
212227
val operator: ApplyUnaryComparisonOperator,
213-
val column: String
228+
val column: ComparisonTarget
214229
) : Expression
215230

216231
@JsonTypeName("binary_comparison_operator")
217232
data class ApplyBinaryComparison(
218233
val operator: ApplyBinaryComparisonOperator,
219-
override val column: ComparisonColumn,
234+
override val column: ComparisonTarget,
220235
val value: ComparisonValue
221236
) : Expression, ExpressionOnColumn
222237

@@ -229,15 +244,22 @@ sealed interface Expression {
229244
}
230245

231246
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
232-
sealed interface ComparisonColumn {
247+
sealed interface ComparisonTarget {
233248

234249
val name: String
235250

236251
@JsonTypeName("column")
237-
data class Column(override val name: String, val path: List<PathElement>) : ComparisonColumn
252+
data class Column(
253+
override val name: String,
254+
val path: List<PathElement>,
255+
val field_path: List<String>? = null
256+
) : ComparisonTarget
238257

239258
@JsonTypeName("root_collection_column")
240-
data class RootCollectionColumn(override val name: String) : ComparisonColumn
259+
data class RootCollectionColumn(
260+
override val name: String,
261+
val field_path: List<String>? = null
262+
) : ComparisonTarget
241263
}
242264

243265
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@@ -247,7 +269,7 @@ sealed interface ExistsInCollection {
247269
data class Related(
248270
val relationship: String,
249271
val arguments: Map<String, Argument> = emptyMap()
250-
) : ExistsInCollection
272+
) : ExistsInCollection
251273

252274
@JsonTypeName("unrelated")
253275
data class Unrelated(
@@ -257,7 +279,7 @@ sealed interface ExistsInCollection {
257279
}
258280

259281
@JsonInclude(JsonInclude.Include.NON_NULL)
260-
data class RowSet (
282+
data class RowSet(
261283
val aggregates: Map<String, Any>? = null,
262284
val rows: List<Map<String, Any>>? = null
263285
)

ndc-sqlgen/src/main/kotlin/io/hasura/ndc/sqlgen/BaseGenerator.kt

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,13 @@ sealed interface BaseGenerator {
5252
}
5353

5454
private fun getCollectionForCompCol(
55-
col: ComparisonColumn,
55+
col: ComparisonTarget,
5656
request: QueryRequest
5757
): String {
5858
// Make sure to handle the case when the path references a related table
5959
return when (col) {
60-
is ComparisonColumn.RootCollectionColumn -> request.root_collection
61-
is ComparisonColumn.Column -> {
60+
is ComparisonTarget.RootCollectionColumn -> request.root_collection
61+
is ComparisonTarget.Column -> {
6262
if (col.path.isNotEmpty()) {
6363
// Traverse the relationship path to get to the current collection name
6464
val targetCollection = col.path.fold("") { acc, pathElement ->
@@ -84,11 +84,11 @@ sealed interface BaseGenerator {
8484
val compVal = when (val arg = argument.value) {
8585
is Argument.Variable -> ComparisonValue.VariableComp(arg.name)
8686
is Argument.Literal -> ComparisonValue.ScalarComp(arg.value)
87-
is Argument.Column -> ComparisonValue.ColumnComp(ComparisonColumn.RootCollectionColumn(arg.name))
87+
is Argument.Column -> ComparisonValue.ColumnComp(ComparisonTarget.RootCollectionColumn(arg.name))
8888
}
8989
val e = Expression.ApplyBinaryComparison(
9090
ApplyBinaryComparisonOperator.EQ,
91-
ComparisonColumn.Column(argument.key, emptyList()),
91+
ComparisonTarget.Column(argument.key, emptyList()),
9292
compVal
9393
)
9494
return expressionToCondition(e, request)
@@ -147,9 +147,21 @@ sealed interface BaseGenerator {
147147
}
148148

149149
is Expression.ApplyUnaryComparison -> {
150-
val column = DSL.field(DSL.name(splitCollectionName(request.collection) + e.column))
150+
val field = when (e.column) {
151+
is ComparisonTarget.Column -> DSL.field(
152+
DSL.name(
153+
splitCollectionName(getCollectionForCompCol(e.column, request)) + e.column.name
154+
)
155+
)
156+
157+
is ComparisonTarget.RootCollectionColumn -> DSL.field(
158+
DSL.name(
159+
splitCollectionName(request.collection) + e.column.name
160+
)
161+
)
162+
}
151163
when (e.operator) {
152-
ApplyUnaryComparisonOperator.IS_NULL -> column.isNull
164+
ApplyUnaryComparisonOperator.IS_NULL -> field.isNull
153165
}
154166
}
155167

ndc-sqlgen/src/main/kotlin/io/hasura/ndc/sqlgen/BaseQueryGenerator.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,8 +276,8 @@ abstract class BaseQueryGenerator : BaseGenerator {
276276
expression: Expression? = request.query.predicate,
277277
seenRelations: MutableSet<String> = mutableSetOf()
278278
) {
279-
fun addForColumn(column: ComparisonColumn) {
280-
if (column is ComparisonColumn.Column) {
279+
fun addForColumn(column: ComparisonTarget) {
280+
if (column is ComparisonTarget.Column) {
281281
column.path.forEach {
282282
if (!seenRelations.contains(it.relationship)) {
283283
val r = request.collection_relationships[it.relationship]!!

0 commit comments

Comments
 (0)