Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/dope 243 load dope query tree on to dope query #45

Merged
merged 13 commits into from
Aug 15, 2024
jansigi marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -21,43 +21,75 @@ private enum class JoinType(val type: String) {
}

sealed class SelectJoinClause : ISelectJoinClause {
private val dopeQuery: DopeQuery
private val joinType: JoinType
private val bucket: Bucket
private var onCondition: TypeExpression<BooleanType>? = null
private var onKeys: Field<out ValidType>? = null
private var onKey: Field<out ValidType>? = null
private var forBucket: Bucket? = null
jansigi marked this conversation as resolved.
Show resolved Hide resolved
private val parentClause: ISelectFromClause

constructor(joinType: JoinType, bucket: Bucket, onCondition: TypeExpression<BooleanType>, parentClause: ISelectFromClause) {
val parentDopeQuery = parentClause.toDopeQuery()
val bucketDopeQuery = bucket.toDopeQuery()
val onConditionDopeQuery = onCondition.toDopeQuery()
dopeQuery = DopeQuery(
queryString = "${parentDopeQuery.queryString} ${joinType.type} ${bucketDopeQuery.queryString} " +
"ON ${onConditionDopeQuery.queryString}",
parameters = parentDopeQuery.parameters + bucketDopeQuery.parameters + onConditionDopeQuery.parameters,
)
this.joinType = joinType
this.bucket = bucket
this.onCondition = onCondition
this.parentClause = parentClause
}

constructor(joinType: JoinType, bucket: Bucket, onKeys: Field<out ValidType>, parentClause: ISelectFromClause) {
val parentDopeQuery = parentClause.toDopeQuery()
val bucketDopeQuery = bucket.toDopeQuery()
val keyDopeQuery = onKeys.toDopeQuery()
dopeQuery = DopeQuery(
queryString = "${parentDopeQuery.queryString} ${joinType.type} ${bucketDopeQuery.queryString} " +
"ON KEYS ${keyDopeQuery.queryString}",
parameters = parentDopeQuery.parameters + bucketDopeQuery.parameters + keyDopeQuery.parameters,
)
this.joinType = joinType
this.bucket = bucket
this.onKeys = onKeys
this.parentClause = parentClause
}

constructor(joinType: JoinType, bucket: Bucket, onKey: Field<out ValidType>, forBucket: Bucket, parentClause: ISelectFromClause) {
val parentDopeQuery = parentClause.toDopeQuery()
val bucketDopeQuery = bucket.toDopeQuery()
val keyDopeQuery = onKey.toDopeQuery()
val forBucketDopeQuery = forBucket.toDopeQuery()
dopeQuery = DopeQuery(
queryString = "${parentDopeQuery.queryString} ${joinType.type} ${bucketDopeQuery.queryString} " +
"ON KEY ${keyDopeQuery.queryString} FOR ${forBucketDopeQuery.queryString}",
parameters = parentDopeQuery.parameters + bucketDopeQuery.parameters + keyDopeQuery.parameters + forBucketDopeQuery.parameters,
)
this.joinType = joinType
this.bucket = bucket
this.onKey = onKey
this.forBucket = forBucket
this.parentClause = parentClause
}

override fun toDopeQuery() = dopeQuery
override fun toDopeQuery(): DopeQuery =
when {
onCondition != null -> {
val parentDopeQuery = parentClause.toDopeQuery()
val bucketDopeQuery = bucket.toDopeQuery()
jansigi marked this conversation as resolved.
Show resolved Hide resolved
val onConditionDopeQuery = onCondition!!.toDopeQuery()
DopeQuery(
queryString = "${parentDopeQuery.queryString} ${joinType.type} ${bucketDopeQuery.queryString} " +
"ON ${onConditionDopeQuery.queryString}",
parameters = parentDopeQuery.parameters + bucketDopeQuery.parameters + onConditionDopeQuery.parameters,
)
}

onKeys != null -> {
val parentDopeQuery = parentClause.toDopeQuery()
val bucketDopeQuery = bucket.toDopeQuery()
val keyDopeQuery = onKeys!!.toDopeQuery()
jansigi marked this conversation as resolved.
Show resolved Hide resolved
DopeQuery(
queryString = "${parentDopeQuery.queryString} ${joinType.type} ${bucketDopeQuery.queryString} " +
"ON KEYS ${keyDopeQuery.queryString}",
parameters = parentDopeQuery.parameters + bucketDopeQuery.parameters + keyDopeQuery.parameters,
)
}

onKey != null && forBucket != null -> {
val parentDopeQuery = parentClause.toDopeQuery()
val bucketDopeQuery = bucket.toDopeQuery()
val keyDopeQuery = onKey!!.toDopeQuery()
val forBucketDopeQuery = forBucket!!.toDopeQuery()
DopeQuery(
queryString = "${parentDopeQuery.queryString} ${joinType.type} ${bucketDopeQuery.queryString} " +
"ON KEY ${keyDopeQuery.queryString} FOR ${forBucketDopeQuery.queryString}",
parameters = parentDopeQuery.parameters + bucketDopeQuery.parameters + keyDopeQuery.parameters +
forBucketDopeQuery.parameters,
)
}

else -> throw IllegalStateException("Unable to construct join clause")
jansigi marked this conversation as resolved.
Show resolved Hide resolved
}
}

class StandardJoinClause : SelectJoinClause {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,46 +11,54 @@ import ch.ergon.dope.validtype.StringType
import ch.ergon.dope.validtype.ValidType

sealed class Primitive<T : ValidType>(
private val dopeQuery: DopeQuery,
private val dopeQuery: () -> DopeQuery,
jansigi marked this conversation as resolved.
Show resolved Hide resolved
) : TypeExpression<T> {
override fun toDopeQuery() = dopeQuery
override fun toDopeQuery() = dopeQuery()
}

data object NULL : Primitive<NullType>(DopeQuery("NULL", emptyMap()))
data object MISSING : Primitive<MissingType>(DopeQuery("MISSING", emptyMap()))
data object TRUE : Primitive<BooleanType>(DopeQuery("TRUE", emptyMap()))
data object FALSE : Primitive<BooleanType>(DopeQuery("FALSE", emptyMap()))
data object NULL : Primitive<NullType>({ DopeQuery("NULL", emptyMap()) })
data object MISSING : Primitive<MissingType>({ DopeQuery("MISSING", emptyMap()) })
data object TRUE : Primitive<BooleanType>({ DopeQuery("TRUE", emptyMap()) })
data object FALSE : Primitive<BooleanType>({ DopeQuery("FALSE", emptyMap()) })

class NumberPrimitive(value: Number) : Primitive<NumberType>(
DopeQuery(
queryString = "$value",
parameters = emptyMap(),
),
{
DopeQuery(
queryString = "$value",
parameters = emptyMap(),
)
},
)

class StringPrimitive(value: String) : Primitive<StringType>(
DopeQuery(
queryString = "\"$value\"",
parameters = emptyMap(),
),
{
DopeQuery(
queryString = "\"$value\"",
parameters = emptyMap(),
)
},
)

class BooleanPrimitive(value: Boolean) : Primitive<BooleanType>(
DopeQuery(
queryString = when (value) {
true -> TRUE.toDopeQuery().queryString
false -> FALSE.toDopeQuery().queryString
},
parameters = emptyMap(),
),
{
DopeQuery(
queryString = when (value) {
true -> TRUE.toDopeQuery().queryString
false -> FALSE.toDopeQuery().queryString
},
parameters = emptyMap(),
)
},
)

class ArrayPrimitive<T : ValidType>(collection: Collection<TypeExpression<out T>>) : Primitive<ArrayType<T>>(
collection.map { it.toDopeQuery() }.let { dopeQueries ->
DopeQuery(
queryString = dopeQueries.joinToString(", ", prefix = "[", postfix = "]") { it.queryString },
parameters = dopeQueries.fold(emptyMap()) { parameters, dopeQueryElement -> parameters + dopeQueryElement.parameters },
)
{
collection.map { it.toDopeQuery() }.let { dopeQueries ->
DopeQuery(
queryString = dopeQueries.joinToString(", ", prefix = "[", postfix = "]") { it.queryString },
parameters = dopeQueries.fold(emptyMap()) { parameters, dopeQueryElement -> parameters + dopeQueryElement.parameters },
)
}
},
)

Expand Down
Loading