Skip to content

Commit

Permalink
Merge pull request #37 from hasura/rel-ordering-fix
Browse files Browse the repository at this point in the history
added joins, selects and order bys for ordering by a related table
  • Loading branch information
GavinRay97 authored Dec 11, 2024
2 parents ab66004 + 75cc0ea commit 902b24d
Showing 1 changed file with 33 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,12 @@ package io.hasura.mysql

import io.hasura.ndc.common.ConnectorConfiguration
import io.hasura.ndc.common.NDCScalar
import io.hasura.ndc.common.NativeQueryInfo
import io.hasura.ndc.common.NativeQueryPart
import io.hasura.ndc.ir.*
import io.hasura.ndc.ir.Field.ColumnField
import io.hasura.ndc.ir.Field as IRField
import io.hasura.ndc.sqlgen.BaseQueryGenerator
import org.jooq.*
import org.jooq.Field
import org.jooq.impl.CustomField
import org.jooq.impl.DSL
import org.jooq.impl.SQLDataType

Expand All @@ -21,7 +18,7 @@ object JsonQueryGenerator : BaseQueryGenerator() {
return DSL
.with(buildVarsCTE(request))
.select(
jsonArrayAgg(
DSL.jsonArrayAgg(
buildJSONSelectionForQueryRequest(request)
)
)
Expand All @@ -34,12 +31,12 @@ object JsonQueryGenerator : BaseQueryGenerator() {
return queryRequestToSQLInternal(request)
}

fun queryRequestToSQLInternal(
private fun queryRequestToSQLInternal(
request: QueryRequest,
): SelectSelectStep<*> {
// JOOQ is smart enough to not generate CTEs if there are no native queries
return mkNativeQueryCTEs(request).select(
jsonArrayAgg(
DSL.jsonArrayAgg(
buildJSONSelectionForQueryRequest(request)
)
)
Expand All @@ -53,7 +50,8 @@ object JsonQueryGenerator : BaseQueryGenerator() {

val baseSelection = DSL.select(
DSL.table(DSL.name(request.collection)).asterisk()
).from(
).select(getSelectOrderFields(request))
.from(
if (request.query.predicate == null) {
DSL.table(DSL.name(request.collection))
} else {
Expand All @@ -77,8 +75,12 @@ object JsonQueryGenerator : BaseQueryGenerator() {
)
)
}

}
).apply {
addJoinsRequiredForOrderByFields(this, request)
}
.apply {
if (request.query.predicate != null) {
where(getWhereConditions(request))
}
Expand Down Expand Up @@ -116,7 +118,7 @@ object JsonQueryGenerator : BaseQueryGenerator() {
DSL.jsonEntry(
"rows",
DSL.select(
jsonArrayAgg(
DSL.jsonArrayAgg(
DSL.jsonObject(
(request.query.fields ?: emptyMap()).map { (alias, field) ->
when (field) {
Expand Down Expand Up @@ -163,6 +165,8 @@ object JsonQueryGenerator : BaseQueryGenerator() {
}
}
)
).orderBy(
getConcatOrderFields(request)
)
).from(
baseSelection
Expand Down Expand Up @@ -193,11 +197,7 @@ object JsonQueryGenerator : BaseQueryGenerator() {
)
}

fun jsonArrayAgg(field: JSONObjectNullStep<*>) = CustomField.of("mysql_json_arrayagg", SQLDataType.JSON) {
it.visit(DSL.field("json_arrayagg({0})", field))
}

fun collectRequiredJoinTablesForWhereClause(
private fun collectRequiredJoinTablesForWhereClause(
where: Expression,
collectionRelationships: Map<String, Relationship>,
previousTableName: String? = null
Expand Down Expand Up @@ -230,7 +230,7 @@ object JsonQueryGenerator : BaseQueryGenerator() {
}
}

fun ndcScalarTypeToSQLDataType(scalarType: NDCScalar): DataType<out Any> = when (scalarType) {
private fun ndcScalarTypeToSQLDataType(scalarType: NDCScalar): DataType<out Any> = when (scalarType) {
NDCScalar.BOOLEAN -> SQLDataType.BOOLEAN
NDCScalar.INT -> SQLDataType.INTEGER
NDCScalar.FLOAT -> SQLDataType.FLOAT
Expand Down Expand Up @@ -292,4 +292,23 @@ object JsonQueryGenerator : BaseQueryGenerator() {
return collection.split('.').last()
}

private const val ORDER_FIELD_SUFFIX = "_order_field"

private fun getSelectOrderFields(request: QueryRequest) : List<Field<*>>{
val sortFields = translateIROrderByField(request, request.collection)
return sortFields.map { it.`$field`().`as`(it.name + ORDER_FIELD_SUFFIX) }
}

private fun getConcatOrderFields(request: QueryRequest) : List<SortField<*>>{
val sortFields = translateIROrderByField(request, request.collection)
return sortFields.map {
val field = DSL.field(DSL.name(it.name + ORDER_FIELD_SUFFIX))
when(it.order) {
SortOrder.ASC -> field.asc().nullsLast()
SortOrder.DESC -> field.desc().nullsFirst()
else -> field.asc().nullsLast()
}
}
}

}

0 comments on commit 902b24d

Please sign in to comment.