refactoring: change generics R: List<EntityI<*>> to R: EntityI<*>>, and return List<R>

This commit is contained in:
2019-07-17 09:08:51 +02:00
parent fda41deeb9
commit d4d59f1d06
3 changed files with 25 additions and 25 deletions

View File

@@ -15,8 +15,8 @@ import java.util.concurrent.CompletableFuture
interface Executable { interface Executable {
fun <R: EntityI<*>> select(sql: String, typeReference: TypeReference<R>, values: List<Any?> = emptyList()): R? fun <R: EntityI<*>> select(sql: String, typeReference: TypeReference<R>, values: List<Any?> = emptyList()): R?
fun <R: EntityI<*>> select(sql: String, typeReference: TypeReference<R>, values: Map<String, Any?>): R? fun <R: EntityI<*>> select(sql: String, typeReference: TypeReference<R>, values: Map<String, Any?>): R?
fun <R: List<EntityI<*>>> select(sql: String, typeReference: TypeReference<R>, values: List<Any?> = emptyList()): R? fun <R: EntityI<*>> select(sql: String, typeReference: TypeReference<List<R>>, values: List<Any?> = emptyList()): List<R>
fun <R: List<EntityI<*>>> select(sql: String, typeReference: TypeReference<R>, values: Map<String, Any?>): R fun <R: EntityI<*>> select(sql: String, typeReference: TypeReference<List<R>>, values: Map<String, Any?>): List<R>
fun exec(sql: String, values: List<Any?> = emptyList()): CompletableFuture<QueryResult> fun exec(sql: String, values: List<Any?> = emptyList()): CompletableFuture<QueryResult>
fun exec(sql: String, values: Map<String, Any?>): CompletableFuture<QueryResult> fun exec(sql: String, values: Map<String, Any?>): CompletableFuture<QueryResult>
} }
@@ -64,18 +64,18 @@ class Connection(
inline fun <reified R: EntityI<*>> selectOne(sql: String, values: Map<String, Any?>): R? = inline fun <reified R: EntityI<*>> selectOne(sql: String, values: Map<String, Any?>): R? =
select(sql, object: TypeReference<R>() {}, values) select(sql, object: TypeReference<R>() {}, values)
override fun <R: List<EntityI<*>>> select(sql: String, typeReference: TypeReference<R>, values: List<Any?>): R { override fun <R: EntityI<*>> select(sql: String, typeReference: TypeReference<List<R>>, values: List<Any?>): List<R> {
val future = connect().sendPreparedStatement(sql, compileArgs(values)) val future = connect().sendPreparedStatement(sql, compileArgs(values))
val json = future.get().rows[0].getString(0) val json = future.get().rows[0].getString(0)
return if (json === null) { return if (json === null) {
listOf<EntityI<*>>() as R listOf<EntityI<*>>() as List<R>
} else { } else {
serializer.deserializeList(json, typeReference) serializer.deserializeList(json, typeReference)
} }
} }
inline fun <reified R: List<EntityI<*>>> select(sql: String, values: List<Any?> = emptyList()): R = inline fun <reified R: EntityI<*>> select(sql: String, values: List<Any?> = emptyList()): List<R> =
select(sql, object: TypeReference<R>() {}, values) select(sql, object: TypeReference<List<R>>() {}, values)
fun <R: EntityI<*>> select( fun <R: EntityI<*>> select(
sql: String, sql: String,
@@ -116,18 +116,18 @@ class Connection(
): Paginated<R> = ): Paginated<R> =
select(sql, page, limit, object: TypeReference<List<R>>() {}, values) select(sql, page, limit, object: TypeReference<List<R>>() {}, values)
override fun <R: List<EntityI<*>>> select( override fun <R: EntityI<*>> select(
sql: String, sql: String,
typeReference: TypeReference<R>, typeReference: TypeReference<List<R>>,
values: Map<String, Any?> values: Map<String, Any?>
): R { ): List<R> {
return replaceArgs(sql, values) { return replaceArgs(sql, values) {
select(this.sql, typeReference, this.parameters) select(this.sql, typeReference, this.parameters)
} }
} }
inline fun <reified R: List<EntityI<*>>> select(sql: String, values: Map<String, Any?>): R = inline fun <reified R: EntityI<*>> select(sql: String, values: Map<String, Any?>): List<R> =
select(sql, object: TypeReference<R>() {}, values) select(sql, object: TypeReference<List<R>>() {}, values)
override fun exec(sql: String, values: List<Any?>): CompletableFuture<QueryResult> { override fun exec(sql: String, values: List<Any?>): CompletableFuture<QueryResult> {
return connect().sendPreparedStatement(sql, compileArgs(values)) return connect().sendPreparedStatement(sql, compileArgs(values))

View File

@@ -89,15 +89,15 @@ class Requester (
} }
inline fun <reified R : EntityI<*>> selectOne(values: Map<String, Any?>): R? = select(object: TypeReference<R>() {}, values) inline fun <reified R : EntityI<*>> selectOne(values: Map<String, Any?>): R? = select(object: TypeReference<R>() {}, values)
override fun <R : List<EntityI<*>>> select(typeReference: TypeReference<R>, values: List<Any?>): R { override fun <R : EntityI<*>> select(typeReference: TypeReference<List<R>>, values: List<Any?>): List<R> {
return connection.select(this.toString(), typeReference, values) return connection.select(this.toString(), typeReference, values)
} }
inline fun <reified R : List<EntityI<*>>> select(values: List<Any?> = emptyList()): R = select(object: TypeReference<R>() {}, values) inline fun <reified R : EntityI<*>> select(values: List<Any?> = emptyList()): List<R> = select(object: TypeReference<List<R>>() {}, values)
override fun <R: List<EntityI<*>>> select(typeReference: TypeReference<R>, values: Map<String, Any?>): R { override fun <R: EntityI<*>> select(typeReference: TypeReference<List<R>>, values: Map<String, Any?>): List<R> {
return connection.select(this.toString(), typeReference, values) return connection.select(this.toString(), typeReference, values)
} }
inline fun <reified R : List<EntityI<*>>> select(values: Map<String, Any?>): R = select(object: TypeReference<R>() {}, values) inline fun <reified R : EntityI<*>> select(values: Map<String, Any?>): List<R> = select(object: TypeReference<List<R>>() {}, values)
override fun exec(values: List<Any?>): CompletableFuture<QueryResult> { override fun exec(values: List<Any?>): CompletableFuture<QueryResult> {
return connection.exec(sql, values) return connection.exec(sql, values)
@@ -138,24 +138,24 @@ class Requester (
/** /**
* Select list of entities with list of parameters * Select list of entities with list of parameters
*/ */
override fun <R : List<EntityI<*>>> select(typeReference: TypeReference<R>, values: List<Any?>): R { override fun <R : EntityI<*>> select(typeReference: TypeReference<List<R>>, values: List<Any?>): List<R> {
val args = compileArgs(values) val args = compileArgs(values)
val sql = "SELECT * FROM ${definition.name} ($args)" val sql = "SELECT * FROM ${definition.name} ($args)"
return connection.select(sql, typeReference, values) return connection.select(sql, typeReference, values)
} }
inline fun <reified R: List<EntityI<*>>> select(values: List<Any?> = emptyList()): R = select(object: TypeReference<R>() {}, values) inline fun <reified R: EntityI<*>> select(values: List<Any?> = emptyList()): List<R> = select(object: TypeReference<List<R>>() {}, values)
/** /**
* Select list of entities with named parameters * Select list of entities with named parameters
*/ */
override fun <R: List<EntityI<*>>> select(typeReference: TypeReference<R>, values: Map<String, Any?>): R { override fun <R: EntityI<*>> select(typeReference: TypeReference<List<R>>, values: Map<String, Any?>): List<R> {
val args = compileArgs(values) val args = compileArgs(values)
val sql = "SELECT * FROM ${definition.name} ($args)" val sql = "SELECT * FROM ${definition.name} ($args)"
return connection.select(sql, typeReference, values) return connection.select(sql, typeReference, values)
} }
inline fun <reified R: List<EntityI<*>>> select(values: Map<String, Any?>): R = select(object: TypeReference<R>() {}, values) inline fun <reified R: EntityI<*>> select(values: Map<String, Any?>): List<R> = select(object: TypeReference<List<R>>() {}, values)
override fun exec(values: List<Any?>): CompletableFuture<QueryResult> { override fun exec(values: List<Any?>): CompletableFuture<QueryResult> {
val args = compileArgs(values) val args = compileArgs(values)
@@ -206,8 +206,8 @@ class Requester (
fun <R : EntityI<*>> select(typeReference: TypeReference<R>, values: List<Any?> = emptyList()): R? fun <R : EntityI<*>> select(typeReference: TypeReference<R>, values: List<Any?> = emptyList()): R?
fun <R : EntityI<*>> select(typeReference: TypeReference<R>, values: Map<String, Any?>): R? fun <R : EntityI<*>> select(typeReference: TypeReference<R>, values: Map<String, Any?>): R?
fun <R : List<EntityI<*>>> select(typeReference: TypeReference<R>, values: List<Any?> = emptyList()): R fun <R : EntityI<*>> select(typeReference: TypeReference<List<R>>, values: List<Any?> = emptyList()): List<R>
fun <R : List<EntityI<*>>> select(typeReference: TypeReference<R>, values: Map<String, Any?>): R fun <R : EntityI<*>> select(typeReference: TypeReference<List<R>>, values: Map<String, Any?>): List<R>
fun exec(values: List<Any?> = emptyList()): CompletableFuture<QueryResult> fun exec(values: List<Any?> = emptyList()): CompletableFuture<QueryResult>
fun exec(values: Map<String, Any?>): CompletableFuture<QueryResult> fun exec(values: Map<String, Any?>): CompletableFuture<QueryResult>

View File

@@ -59,15 +59,15 @@ data class Migrations private constructor(
*/ */
private fun getMigrationFromDB() { private fun getMigrationFromDB() {
File(this::class.java.getResource("/sql/migration/findAllFunction.sql").toURI()).let { File(this::class.java.getResource("/sql/migration/findAllFunction.sql").toURI()).let {
connection.select<List<MigrationEntity>>(it.readText()) connection.select<MigrationEntity>(it.readText())
.filterNotNull().map { function -> .map { function ->
functions[function.filename] = Function(function.up, function.down, connection, function.executedAt) functions[function.filename] = Function(function.up, function.down, connection, function.executedAt)
} }
} }
File(this::class.java.getResource("/sql/migration/findAllHistory.sql").toURI()).let { File(this::class.java.getResource("/sql/migration/findAllHistory.sql").toURI()).let {
connection.select<List<MigrationEntity>>(it.readText()) connection.select<MigrationEntity>(it.readText())
.filterNotNull().map { query -> .map { query ->
queries[query.filename] = Query(query.filename, query.up, query.down, connection, query.executedAt) queries[query.filename] = Query(query.filename, query.up, query.down, connection, query.executedAt)
} }
} }