Skip to content

Commit 72b6f52

Browse files
authored
Merge pull request #35 from hasura/build-comparison-cleanup
cleaned up comparison handling around IN operator
2 parents 902b24d + 41ca23e commit 72b6f52

File tree

1 file changed

+23
-25
lines changed

1 file changed

+23
-25
lines changed

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

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,26 @@ sealed interface BaseGenerator {
2828
fun buildComparison(
2929
col: Field<Any>,
3030
operator: ApplyBinaryComparisonOperator,
31-
value: Field<Any>
31+
listVal: List<Field<Any>>
3232
): Condition {
33+
if (operator != ApplyBinaryComparisonOperator.IN && listVal.size != 1) {
34+
error("Only the IN operator supports multiple values")
35+
}
36+
37+
// unwrap single value for use in all but the IN operator
38+
// OR return falseCondition if listVal is empty
39+
val singleVal = listVal.firstOrNull() ?: return DSL.falseCondition()
40+
3341
return when (operator) {
34-
ApplyBinaryComparisonOperator.EQ -> col.eq(value)
35-
ApplyBinaryComparisonOperator.GT -> col.gt(value)
36-
ApplyBinaryComparisonOperator.GTE -> col.ge(value)
37-
ApplyBinaryComparisonOperator.LT -> col.lt(value)
38-
ApplyBinaryComparisonOperator.LTE -> col.le(value)
39-
ApplyBinaryComparisonOperator.IN -> DSL.nullCondition()
42+
ApplyBinaryComparisonOperator.EQ -> col.eq(singleVal)
43+
ApplyBinaryComparisonOperator.GT -> col.gt(singleVal)
44+
ApplyBinaryComparisonOperator.GTE -> col.ge(singleVal)
45+
ApplyBinaryComparisonOperator.LT -> col.lt(singleVal)
46+
ApplyBinaryComparisonOperator.LTE -> col.le(singleVal)
47+
ApplyBinaryComparisonOperator.IN -> col.`in`(listVal)
4048
ApplyBinaryComparisonOperator.IS_NULL -> col.isNull
41-
ApplyBinaryComparisonOperator.LIKE -> col.like(value as Field<String>)
42-
ApplyBinaryComparisonOperator.CONTAINS -> col.contains(value as Field<String>)
49+
ApplyBinaryComparisonOperator.LIKE -> col.like(singleVal as Field<String>)
50+
ApplyBinaryComparisonOperator.CONTAINS -> col.contains(singleVal as Field<String>)
4351
}
4452
}
4553

@@ -124,15 +132,16 @@ sealed interface BaseGenerator {
124132
val comparisonValue = when (val v = e.value) {
125133
is ComparisonValue.ColumnComp -> {
126134
val col = splitCollectionName(getCollectionForCompCol(v.column, request))
127-
DSL.field(DSL.name(col + v.column.name))
135+
listOf(DSL.field(DSL.name(col + v.column.name)))
128136
}
129137

130138
is ComparisonValue.ScalarComp ->
131-
if(e.operator == ApplyBinaryComparisonOperator.IN)
132-
return handleInComp(column, v)
133-
else DSL.inline(v.value)
139+
when (val scalarValue = v.value) {
140+
is List<*> -> (scalarValue as List<Any>).map { DSL.inline(it) }
141+
else -> listOf(DSL.inline(scalarValue))
142+
}
134143

135-
is ComparisonValue.VariableComp -> DSL.field(DSL.name(listOf("vars", v.name)))
144+
is ComparisonValue.VariableComp -> listOf(DSL.field(DSL.name(listOf("vars", v.name))))
136145
}
137146
return buildComparison(column, e.operator, comparisonValue)
138147
}
@@ -212,17 +221,6 @@ sealed interface BaseGenerator {
212221
}
213222
}
214223

215-
fun handleInComp(column: Field<Any>, value: ComparisonValue.ScalarComp): Condition {
216-
return when (val scalarValue = value.value) {
217-
is List<*> -> {
218-
if (scalarValue.isEmpty()) DSL.falseCondition()
219-
else column.`in`(scalarValue.map { DSL.inline(it) })
220-
}
221-
// Handle non-array scalar value
222-
else -> column.eq(DSL.inline(scalarValue))
223-
}
224-
}
225-
226224
fun splitCollectionName(collectionName: String): List<String> {
227225
return collectionName.split(".")
228226
}

0 commit comments

Comments
 (0)