From ea4dac5d970c58ce9d740043396f9d90af860538 Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Mon, 15 Jul 2019 22:32:41 +0200 Subject: [PATCH] refactoring: symplify generics --- .../fr/postgresjson/connexion/Connection.kt | 60 ++++++------------- .../fr/postgresjson/connexion/Requester.kt | 40 ++++++------- .../fr/postgresjson/migration/Function.kt | 2 +- .../fr/postgresjson/migration/Migrations.kt | 4 +- .../kotlin/fr/postgresjson/migration/Query.kt | 2 +- .../fr/postgresjson/serializer/Serializer.kt | 4 +- .../kotlin/fr/postgresjson/ConnectionTest.kt | 4 +- 7 files changed, 45 insertions(+), 71 deletions(-) diff --git a/src/main/kotlin/fr/postgresjson/connexion/Connection.kt b/src/main/kotlin/fr/postgresjson/connexion/Connection.kt index a7ac1bf..17eb952 100644 --- a/src/main/kotlin/fr/postgresjson/connexion/Connection.kt +++ b/src/main/kotlin/fr/postgresjson/connexion/Connection.kt @@ -12,10 +12,10 @@ import java.util.concurrent.CompletableFuture interface Executable { - fun ?> select(sql: String, typeReference: TypeReference, values: List = emptyList()): R? - fun ?> select(sql: String, typeReference: TypeReference, values: Map): R? - fun ?>> select(sql: String, typeReference: TypeReference, values: List = emptyList()): R? - fun ?>> select(sql: String, typeReference: TypeReference, values: Map): R + fun > select(sql: String, typeReference: TypeReference, values: List = emptyList()): R? + fun > select(sql: String, typeReference: TypeReference, values: Map): R? + fun >> select(sql: String, typeReference: TypeReference, values: List = emptyList()): R? + fun >> select(sql: String, typeReference: TypeReference, values: Map): R fun exec(sql: String, values: List = emptyList()): CompletableFuture fun exec(sql: String, values: Map): CompletableFuture } @@ -41,7 +41,7 @@ class Connection( fun inTransaction(f: (Connection) -> CompletableFuture) = connect().inTransaction(f) - override fun ?> select(sql: String, typeReference: TypeReference, values: List): R? { + override fun > select(sql: String, typeReference: TypeReference, values: List): R? { val future = connect().sendPreparedStatement(sql, compileArgs(values)) val json = future.get().rows[0].getString(0) return if (json === null) { @@ -50,44 +50,30 @@ class Connection( serializer.deserialize(json, typeReference) } } - inline fun ?> selectOne(sql: String, values: List = emptyList()): R? = select(sql, object: TypeReference() {}, values) + inline fun > selectOne(sql: String, values: List = emptyList()): R? = select(sql, object: TypeReference() {}, values) - override fun ?> select(sql: String, typeReference: TypeReference, values: Map): R? { - val args = compileArgs(values) - val replacedQuery = replaceArgs(sql, args) - val future = connect().sendPreparedStatement(replacedQuery.sql, replacedQuery.parameters) - val json = future.get().rows[0].getString(0) - return if (json === null) { - null - } else { - serializer.deserialize(json, typeReference) - } + override fun > select(sql: String, typeReference: TypeReference, values: Map): R? { + val replacedQuery = replaceArgs(sql, values) + return select(replacedQuery.sql, typeReference, replacedQuery.parameters) } - inline fun ?> selectOne(sql: String, values: Map): R? = select(sql, object: TypeReference() {}, values) + inline fun > selectOne(sql: String, values: Map): R? = select(sql, object: TypeReference() {}, values) - override fun ?>> select(sql: String, typeReference: TypeReference, values: List): R { + override fun >> select(sql: String, typeReference: TypeReference, values: List): R { val future = connect().sendPreparedStatement(sql, compileArgs(values)) val json = future.get().rows[0].getString(0) return if (json === null) { - listOf?>() as R + listOf>() as R } else { serializer.deserializeList(json, typeReference) } } - inline fun ?>> select(sql: String, values: List = emptyList()): R = select(sql, object : TypeReference() {}, values) + inline fun >> select(sql: String, values: List = emptyList()): R = select(sql, object : TypeReference() {}, values) - override fun ?>> select(sql: String, typeReference: TypeReference, values: Map): R { - val args = compileArgs(values) - val replacedQuery = replaceArgs(sql, args) - val future = connect().sendPreparedStatement(replacedQuery.sql, replacedQuery.parameters) - val json = future.get().rows[0].getString(0) - return if (json === null) { - listOf?>() as R - } else { - serializer.deserializeList(json, typeReference) - } + override fun >> select(sql: String, typeReference: TypeReference, values: Map): R { + val replacedQuery = replaceArgs(sql, values) + return select(replacedQuery.sql, typeReference, replacedQuery.parameters) } - inline fun ?>> select(sql: String, values: Map): R = select(sql, object : TypeReference() {}, values) + inline fun >> select(sql: String, values: Map): R = select(sql, object : TypeReference() {}, values) override fun exec(sql: String, values: List): CompletableFuture { return connect().sendPreparedStatement(sql, compileArgs(values)) @@ -110,18 +96,6 @@ class Connection( } } - private fun compileArgs(values: Map): Map { - return values.map {(key, value) -> - if (value is EntityI<*>) { - val json = serializer.serialize(value) - serializer.collection.set>(value as EntityI) - key to json - } else { - key to value - } - }.toMap() - } - private fun replaceArgs(sql: String, values: Map): ParametersQuery { val paramRegex = "(? diff --git a/src/main/kotlin/fr/postgresjson/connexion/Requester.kt b/src/main/kotlin/fr/postgresjson/connexion/Requester.kt index 64907a3..7ec5fc7 100644 --- a/src/main/kotlin/fr/postgresjson/connexion/Requester.kt +++ b/src/main/kotlin/fr/postgresjson/connexion/Requester.kt @@ -79,25 +79,25 @@ class Requester ( return sql } - override fun ?> select(typeReference: TypeReference, values: List): R? { + override fun > select(typeReference: TypeReference, values: List): R? { return connection.select(this.toString(), typeReference, values) } - inline fun ?> selectOne(values: List = emptyList()): R? = select(object: TypeReference() {}, values) + inline fun > selectOne(values: List = emptyList()): R? = select(object: TypeReference() {}, values) - override fun ?> select(typeReference: TypeReference, values: Map): R? { + override fun > select(typeReference: TypeReference, values: Map): R? { return connection.select(this.toString(), typeReference, values) } - inline fun ?> selectOne(values: Map): R? = select(object: TypeReference() {}, values) + inline fun > selectOne(values: Map): R? = select(object: TypeReference() {}, values) - override fun ?>> select(typeReference: TypeReference, values: List): R? { + override fun >> select(typeReference: TypeReference, values: List): R { return connection.select(this.toString(), typeReference, values) } - inline fun ?>> select(values: List = emptyList()): R? = select(object: TypeReference() {}, values) + inline fun >> select(values: List = emptyList()): R = select(object: TypeReference() {}, values) - override fun ?>> select(typeReference: TypeReference, values: Map): R { + override fun >> select(typeReference: TypeReference, values: Map): R { return connection.select(this.toString(), typeReference, values) } - inline fun ?>> select(values: Map): R? = select(object: TypeReference() {}, values) + inline fun >> select(values: Map): R = select(object: TypeReference() {}, values) override fun exec(values: List): CompletableFuture { return connection.exec(sql, values) @@ -116,46 +116,46 @@ class Requester ( /** * Select One entity with list of parameters */ - override fun ?> select(typeReference: TypeReference, values: List): R? { + override fun > select(typeReference: TypeReference, values: List): R? { val args = compileArgs(values) val sql = "SELECT * FROM ${definition.name} ($args)" return connection.select(sql, typeReference, values) } - inline fun ?> selectOne(values: List = emptyList()): R? = select(object: TypeReference() {}, values) + inline fun > selectOne(values: List = emptyList()): R? = select(object: TypeReference() {}, values) /** * Select One entity with named parameters */ - override fun ?> select(typeReference: TypeReference, values: Map): R? { + override fun > select(typeReference: TypeReference, values: Map): R? { val args = compileArgs(values) val sql = "SELECT * FROM ${definition.name} ($args)" return connection.select(sql, typeReference, values) } - inline fun ?> selectOne(values: Map): R? = select(object: TypeReference() {}, values) + inline fun > selectOne(values: Map): R? = select(object: TypeReference() {}, values) /** * Select list of entities with list of parameters */ - override fun ?>> select(typeReference: TypeReference, values: List): R? { + override fun >> select(typeReference: TypeReference, values: List): R { val args = compileArgs(values) val sql = "SELECT * FROM ${definition.name} ($args)" return connection.select(sql, typeReference, values) } - inline fun ?>> select(values: List = emptyList()): R? = select(object: TypeReference() {}, values) + inline fun >> select(values: List = emptyList()): R = select(object: TypeReference() {}, values) /** * Select list of entities with named parameters */ - override fun ?>> select(typeReference: TypeReference, values: Map): R { + override fun >> select(typeReference: TypeReference, values: Map): R { val args = compileArgs(values) val sql = "SELECT * FROM ${definition.name} ($args)" return connection.select(sql, typeReference, values) } - inline fun ?>> select(values: Map): R? = select(object: TypeReference() {}, values) + inline fun >> select(values: Map): R = select(object: TypeReference() {}, values) override fun exec(values: List): CompletableFuture { val args = compileArgs(values) @@ -203,11 +203,11 @@ class Requester ( val connection : Connection override fun toString(): String - fun ?> select(typeReference: TypeReference, values: List = emptyList()): R? - fun ?> select(typeReference: TypeReference, values: Map): R? + fun > select(typeReference: TypeReference, values: List = emptyList()): R? + fun > select(typeReference: TypeReference, values: Map): R? - fun ?>> select(typeReference: TypeReference, values: List = emptyList()): R? - fun ?>> select(typeReference: TypeReference, values: Map): R + fun >> select(typeReference: TypeReference, values: List = emptyList()): R + fun >> select(typeReference: TypeReference, values: Map): R fun exec(values: List = emptyList()): CompletableFuture fun exec(values: Map): CompletableFuture diff --git a/src/main/kotlin/fr/postgresjson/migration/Function.kt b/src/main/kotlin/fr/postgresjson/migration/Function.kt index 3f35da3..bfca5da 100644 --- a/src/main/kotlin/fr/postgresjson/migration/Function.kt +++ b/src/main/kotlin/fr/postgresjson/migration/Function.kt @@ -38,7 +38,7 @@ data class Function( connection.exec(up.script) File(this::class.java.getResource("/sql/migration/insertFunction.sql").toURI()).let { - connection.selectOne(it.readText(), listOf(up))?.let { function -> + connection.selectOne(it.readText(), listOf(up))?.let { function -> executedAt = function.executedAt doExecute = Action.OK } diff --git a/src/main/kotlin/fr/postgresjson/migration/Migrations.kt b/src/main/kotlin/fr/postgresjson/migration/Migrations.kt index a10efef..1b3fe56 100644 --- a/src/main/kotlin/fr/postgresjson/migration/Migrations.kt +++ b/src/main/kotlin/fr/postgresjson/migration/Migrations.kt @@ -59,14 +59,14 @@ data class Migrations private constructor( */ private fun getMigrationFromDB() { File(this::class.java.getResource("/sql/migration/findAllFunction.sql").toURI()).let { - connection.select>(it.readText()) + connection.select>(it.readText()) .filterNotNull().map { function -> functions[function.filename] = Function(function.up, function.down, connection, function.executedAt) } } File(this::class.java.getResource("/sql/migration/findAllHistory.sql").toURI()).let { - connection.select>(it.readText()) + connection.select>(it.readText()) .filterNotNull().map { query -> queries[query.filename] = Query(query.filename, query.up, query.down, connection, query.executedAt) } diff --git a/src/main/kotlin/fr/postgresjson/migration/Query.kt b/src/main/kotlin/fr/postgresjson/migration/Query.kt index 7a16b22..3b13268 100644 --- a/src/main/kotlin/fr/postgresjson/migration/Query.kt +++ b/src/main/kotlin/fr/postgresjson/migration/Query.kt @@ -19,7 +19,7 @@ data class Query( connection.exec(up).join() File(this::class.java.getResource("/sql/migration/insertHistory.sql").toURI()).let { - connection.selectOne(it.readText(), listOf(name, up, down))?.let { query -> + connection.selectOne(it.readText(), listOf(name, up, down))?.let { query -> executedAt = query.executedAt doExecute = Action.OK } diff --git a/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt b/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt index 5f25a50..75ef5a9 100644 --- a/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt +++ b/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt @@ -35,7 +35,7 @@ class Serializer(val mapper: ObjectMapper = jacksonObjectMapper()) { return mapper.writeValueAsString(source) } - fun ?> deserialize(json: String, valueTypeRef: TypeReference): E { + fun > deserialize(json: String, valueTypeRef: TypeReference): E { return this.mapper.readValue(json, valueTypeRef) } @@ -51,7 +51,7 @@ class Serializer(val mapper: ObjectMapper = jacksonObjectMapper()) { return deserializeList(json, object: TypeReference() {}) } - fun > deserialize(json: String, target: E): E { + fun > deserialize(json: String, target: E): E { return mapper.readerForUpdating(target).readValue(json) } } diff --git a/src/test/kotlin/fr/postgresjson/ConnectionTest.kt b/src/test/kotlin/fr/postgresjson/ConnectionTest.kt index a089e47..ca1caf5 100644 --- a/src/test/kotlin/fr/postgresjson/ConnectionTest.kt +++ b/src/test/kotlin/fr/postgresjson/ConnectionTest.kt @@ -23,7 +23,7 @@ class ConnectionTest(): TestAbstract() { @Test fun getObject() { - val obj: ObjTest? = connection.selectOne("select to_json(a) from test a limit 1") + val obj: ObjTest? = connection.selectOne("select to_json(a) from test a limit 1") assertTrue(obj is ObjTest) assertTrue(obj!!.id == 1) } @@ -97,7 +97,7 @@ class ConnectionTest(): TestAbstract() { "third" to 123, "seconde" to "sec" ) - val result: List = connection.select( + val result: List = connection.select( """ SELECT json_build_array( json_build_object('first', :first::text, 'seconde', :seconde::text, 'third', :third::int),