-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #43 from ergon/feature/dope-224-update-clause
DOPE-224: added update clause, CM functions and tests
- Loading branch information
Showing
31 changed files
with
2,039 additions
and
80 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
53 changes: 53 additions & 0 deletions
53
core/src/main/kotlin/ch/ergon/dope/resolvable/clause/IUpdateClause.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
package ch.ergon.dope.resolvable.clause | ||
|
||
import ch.ergon.dope.resolvable.clause.model.SetClause | ||
import ch.ergon.dope.resolvable.clause.model.UnsetClause | ||
import ch.ergon.dope.resolvable.clause.model.UpdateLimitClause | ||
import ch.ergon.dope.resolvable.clause.model.UpdateReturningClause | ||
import ch.ergon.dope.resolvable.clause.model.UpdateUseKeys.Companion.UpdateUseKeysClause | ||
import ch.ergon.dope.resolvable.clause.model.UpdateWhereClause | ||
import ch.ergon.dope.resolvable.clause.model.to | ||
import ch.ergon.dope.resolvable.expression.TypeExpression | ||
import ch.ergon.dope.resolvable.expression.unaliased.type.Field | ||
import ch.ergon.dope.resolvable.expression.unaliased.type.toDopeType | ||
import ch.ergon.dope.validtype.ArrayType | ||
import ch.ergon.dope.validtype.BooleanType | ||
import ch.ergon.dope.validtype.NumberType | ||
import ch.ergon.dope.validtype.StringType | ||
import ch.ergon.dope.validtype.ValidType | ||
|
||
interface IUpdateReturningClause : Clause | ||
|
||
interface IUpdateLimitClause : IUpdateReturningClause { | ||
fun returning(field: Field<out ValidType>, vararg fields: Field<out ValidType>) = | ||
UpdateReturningClause(field, *fields, parentClause = this) | ||
} | ||
|
||
interface IUpdateWhereClause : IUpdateLimitClause { | ||
fun limit(numberExpression: TypeExpression<NumberType>) = UpdateLimitClause(numberExpression, this) | ||
fun limit(numberExpression: Number) = UpdateLimitClause(numberExpression.toDopeType(), this) | ||
} | ||
|
||
interface IUpdateUnsetClause : IUpdateWhereClause { | ||
fun where(booleanExpression: TypeExpression<BooleanType>) = UpdateWhereClause(booleanExpression, this) | ||
} | ||
|
||
interface IUpdateSetClause : IUpdateUnsetClause { | ||
fun unset(field: Field<out ValidType>) = UnsetClause(field, parentClause = this) | ||
} | ||
|
||
interface IUpdateUseKeysClause : IUpdateSetClause { | ||
fun <T : ValidType> set(field: Field<T>, value: TypeExpression<T>) = SetClause(field.to(value), parentClause = this) | ||
fun set(field: Field<NumberType>, value: Number) = SetClause(field.to(value.toDopeType()), parentClause = this) | ||
fun set(field: Field<StringType>, value: String) = SetClause(field.to(value.toDopeType()), parentClause = this) | ||
fun set(field: Field<BooleanType>, value: Boolean) = SetClause(field.to(value.toDopeType()), parentClause = this) | ||
} | ||
|
||
interface IUpdateClause : IUpdateUseKeysClause { | ||
fun useKeys(key: TypeExpression<StringType>) = UpdateUseKeysClause(key, this) | ||
|
||
// JvmName annotation in interfaces is currently not supported. https://youtrack.jetbrains.com/issue/KT-20068 | ||
@Suppress("INAPPLICABLE_JVM_NAME") | ||
@JvmName("useKeysArray") | ||
fun useKeys(key: TypeExpression<ArrayType<StringType>>) = UpdateUseKeysClause(key, this) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
34 changes: 16 additions & 18 deletions
34
core/src/main/kotlin/ch/ergon/dope/resolvable/clause/model/LimitClause.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,38 +1,36 @@ | ||
package ch.ergon.dope.resolvable.clause.model | ||
|
||
import ch.ergon.dope.DopeQuery | ||
import ch.ergon.dope.resolvable.clause.Clause | ||
import ch.ergon.dope.resolvable.clause.IDeleteLimitClause | ||
import ch.ergon.dope.resolvable.clause.IDeleteWhereClause | ||
import ch.ergon.dope.resolvable.clause.ISelectLimitClause | ||
import ch.ergon.dope.resolvable.clause.ISelectOrderByClause | ||
import ch.ergon.dope.resolvable.clause.IUpdateLimitClause | ||
import ch.ergon.dope.resolvable.clause.IUpdateWhereClause | ||
import ch.ergon.dope.resolvable.expression.TypeExpression | ||
import ch.ergon.dope.resolvable.formatToQueryStringWithSymbol | ||
import ch.ergon.dope.validtype.NumberType | ||
|
||
private const val LIMIT = "LIMIT" | ||
|
||
class SelectLimitClause(private val numberExpression: TypeExpression<NumberType>, private val parentClause: ISelectOrderByClause) : | ||
ISelectLimitClause { | ||
|
||
override fun toDopeQuery(): DopeQuery { | ||
sealed class LimitClause( | ||
private val numberExpression: TypeExpression<NumberType>, | ||
private val parentClause: Clause, | ||
) { | ||
fun toDopeQuery(): DopeQuery { | ||
val parentDopeQuery = parentClause.toDopeQuery() | ||
val numberDopeQuery = numberExpression.toDopeQuery() | ||
return DopeQuery( | ||
queryString = formatToQueryStringWithSymbol(parentDopeQuery.queryString, LIMIT, numberDopeQuery.queryString), | ||
queryString = formatToQueryStringWithSymbol(parentDopeQuery.queryString, "LIMIT", numberDopeQuery.queryString), | ||
parameters = numberDopeQuery.parameters + parentDopeQuery.parameters, | ||
) | ||
} | ||
} | ||
|
||
class DeleteLimitClause(private val numberExpression: TypeExpression<NumberType>, private val parentClause: IDeleteWhereClause) : | ||
IDeleteLimitClause { | ||
class SelectLimitClause(numberExpression: TypeExpression<NumberType>, parentClause: ISelectOrderByClause) : | ||
ISelectLimitClause, LimitClause(numberExpression, parentClause) | ||
|
||
override fun toDopeQuery(): DopeQuery { | ||
val parentDopeQuery = parentClause.toDopeQuery() | ||
val numberDopeQuery = numberExpression.toDopeQuery() | ||
return DopeQuery( | ||
queryString = formatToQueryStringWithSymbol(parentDopeQuery.queryString, LIMIT, numberDopeQuery.queryString), | ||
parameters = numberDopeQuery.parameters + parentDopeQuery.parameters, | ||
) | ||
} | ||
} | ||
class DeleteLimitClause(numberExpression: TypeExpression<NumberType>, parentClause: IDeleteWhereClause) : | ||
IDeleteLimitClause, LimitClause(numberExpression, parentClause) | ||
|
||
class UpdateLimitClause(numberExpression: TypeExpression<NumberType>, parentClause: IUpdateWhereClause) : | ||
IUpdateLimitClause, LimitClause(numberExpression, parentClause) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
78 changes: 78 additions & 0 deletions
78
core/src/main/kotlin/ch/ergon/dope/resolvable/clause/model/SetClause.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
package ch.ergon.dope.resolvable.clause.model | ||
|
||
import ch.ergon.dope.DopeQuery | ||
import ch.ergon.dope.resolvable.clause.IUpdateSetClause | ||
import ch.ergon.dope.resolvable.expression.TypeExpression | ||
import ch.ergon.dope.resolvable.expression.unaliased.type.Field | ||
import ch.ergon.dope.resolvable.expression.unaliased.type.toDopeType | ||
import ch.ergon.dope.resolvable.formatToQueryString | ||
import ch.ergon.dope.validtype.BooleanType | ||
import ch.ergon.dope.validtype.NumberType | ||
import ch.ergon.dope.validtype.StringType | ||
import ch.ergon.dope.validtype.ValidType | ||
|
||
class SetClause( | ||
private val fieldAssignment: SetAssignment<out ValidType>, | ||
private vararg val fieldAssignments: SetAssignment<out ValidType>, | ||
private val parentClause: IUpdateSetClause, | ||
) : IUpdateSetClause { | ||
override fun toDopeQuery(): DopeQuery { | ||
val fieldAssignmentDopeQuery = fieldAssignment.toDopeQuery() | ||
val fieldAssignmentsDopeQuery = fieldAssignments.map { it.toDopeQuery() } | ||
val parentClauseDopeQuery = parentClause.toDopeQuery() | ||
return DopeQuery( | ||
queryString = formatToQueryString( | ||
"${parentClauseDopeQuery.queryString} SET", | ||
fieldAssignmentDopeQuery.queryString, | ||
*fieldAssignmentsDopeQuery.map { it.queryString }.toTypedArray(), | ||
), | ||
parameters = fieldAssignmentsDopeQuery.fold(fieldAssignmentDopeQuery.parameters) { | ||
setAssignmentsParameters, field -> | ||
setAssignmentsParameters + field.parameters | ||
} + parentClauseDopeQuery.parameters, | ||
) | ||
} | ||
|
||
fun <T : ValidType> set(field: Field<T>, value: TypeExpression<T>) = | ||
SetClause(this.fieldAssignment, *this.fieldAssignments, field.to(value), parentClause = this.parentClause) | ||
|
||
fun set(field: Field<NumberType>, value: Number) = | ||
SetClause( | ||
this.fieldAssignment, | ||
*this.fieldAssignments, | ||
field.to(value.toDopeType()), | ||
parentClause = this.parentClause, | ||
) | ||
|
||
fun set(field: Field<StringType>, value: String) = | ||
SetClause( | ||
this.fieldAssignment, | ||
*this.fieldAssignments, | ||
field.to(value.toDopeType()), | ||
parentClause = this.parentClause, | ||
) | ||
|
||
fun set(field: Field<BooleanType>, value: Boolean) = | ||
SetClause( | ||
this.fieldAssignment, | ||
*this.fieldAssignments, | ||
field.to(value.toDopeType()), | ||
parentClause = this.parentClause, | ||
) | ||
} | ||
|
||
class SetAssignment<T : ValidType>( | ||
private val field: Field<T>, | ||
private val value: TypeExpression<T>, | ||
) { | ||
fun toDopeQuery(): DopeQuery { | ||
val fieldDopeQuery = field.toDopeQuery() | ||
val valueDopeQuery = value.toDopeQuery() | ||
return DopeQuery( | ||
queryString = "${fieldDopeQuery.queryString} = ${valueDopeQuery.queryString}", | ||
parameters = fieldDopeQuery.parameters + valueDopeQuery.parameters, | ||
) | ||
} | ||
} | ||
|
||
fun <T : ValidType> Field<T>.to(value: TypeExpression<T>) = SetAssignment(this, value) |
30 changes: 30 additions & 0 deletions
30
core/src/main/kotlin/ch/ergon/dope/resolvable/clause/model/UnsetClause.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
package ch.ergon.dope.resolvable.clause.model | ||
|
||
import ch.ergon.dope.DopeQuery | ||
import ch.ergon.dope.resolvable.clause.IUpdateUnsetClause | ||
import ch.ergon.dope.resolvable.expression.unaliased.type.Field | ||
import ch.ergon.dope.resolvable.formatToQueryString | ||
import ch.ergon.dope.validtype.ValidType | ||
|
||
class UnsetClause( | ||
private val field: Field<out ValidType>, | ||
private vararg val fields: Field<out ValidType>, | ||
private val parentClause: IUpdateUnsetClause, | ||
) : IUpdateUnsetClause { | ||
override fun toDopeQuery(): DopeQuery { | ||
val fieldDopeQuery = field.toDopeQuery() | ||
val fieldsDopeQuery = fields.map { it.toDopeQuery() } | ||
val parentClauseDopeQuery = parentClause.toDopeQuery() | ||
return DopeQuery( | ||
queryString = formatToQueryString( | ||
"${parentClauseDopeQuery.queryString} UNSET", | ||
fieldDopeQuery.queryString, | ||
*fieldsDopeQuery.map { it.queryString }.toTypedArray(), | ||
), | ||
parameters = parentClauseDopeQuery.parameters, | ||
) | ||
} | ||
|
||
fun unset(field: Field<out ValidType>) = | ||
UnsetClause(this.field, *this.fields, field, parentClause = this.parentClause) | ||
} |
15 changes: 15 additions & 0 deletions
15
core/src/main/kotlin/ch/ergon/dope/resolvable/clause/model/UpdateClause.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package ch.ergon.dope.resolvable.clause.model | ||
|
||
import ch.ergon.dope.DopeQuery | ||
import ch.ergon.dope.resolvable.clause.IUpdateClause | ||
import ch.ergon.dope.resolvable.fromable.Bucket | ||
|
||
class UpdateClause(private val bucket: Bucket) : IUpdateClause { | ||
override fun toDopeQuery(): DopeQuery { | ||
val bucketDopeQuery = bucket.toDopeQuery() | ||
return DopeQuery( | ||
queryString = "UPDATE ${bucketDopeQuery.queryString}", | ||
parameters = bucketDopeQuery.parameters, | ||
) | ||
} | ||
} |
Oops, something went wrong.