diff --git a/src/main/kotlin/fr/postgresjson/connexion/Connection.kt b/src/main/kotlin/fr/postgresjson/connexion/Connection.kt
index 8355ef3..70cd4c5 100644
--- a/src/main/kotlin/fr/postgresjson/connexion/Connection.kt
+++ b/src/main/kotlin/fr/postgresjson/connexion/Connection.kt
@@ -44,7 +44,7 @@ class Connection(
}
fun disconnect() {
- connection?.run { disconnect() }
+ connection?.disconnect()
}
fun inTransaction(f: (Connection) -> CompletableFuture) = connect().inTransaction(f)
@@ -97,7 +97,7 @@ class Connection(
values: List,
block: (QueryResult, List) -> Unit
): List {
- val result = exec(sql, compileArgs(values))
+ val result = exec(sql, values)
val json = result.rows[0].getString(0)
return if (json === null) {
listOf() as List
diff --git a/src/main/kotlin/fr/postgresjson/connexion/EmbedExecutable.kt b/src/main/kotlin/fr/postgresjson/connexion/EmbedExecutable.kt
index ec9f1a9..79ce38b 100644
--- a/src/main/kotlin/fr/postgresjson/connexion/EmbedExecutable.kt
+++ b/src/main/kotlin/fr/postgresjson/connexion/EmbedExecutable.kt
@@ -10,8 +10,19 @@ sealed interface EmbedExecutable {
val name: String
/* Select One */
+
/**
- * Select One entity with list of parameters
+ * Update [EntityI] with one entity as argument
+ */
+ fun update(
+ typeReference: TypeReference,
+ value: R,
+ block: SelectOneCallback = {}
+ ): R? =
+ selectOne(typeReference, listOf(value), block)
+
+ /**
+ * Select One [EntityI] with [List] of parameters
*/
fun selectOne(
typeReference: TypeReference,
@@ -19,26 +30,60 @@ sealed interface EmbedExecutable {
block: SelectOneCallback = {}
): R?
+ /**
+ * Select One [EntityI] with [Map] of parameters
+ */
fun selectOne(
typeReference: TypeReference,
values: Map,
block: SelectOneCallback = {}
): R?
+ /**
+ * Select One [EntityI] with multiple [Pair] of parameters
+ */
+ fun selectOne(
+ typeReference: TypeReference,
+ vararg values: Pair,
+ block: SelectOneCallback = {}
+ ): R? =
+ selectOne(typeReference, values.toMap(), block)
+
/* Select Multiples */
+
+ /**
+ * Select Multiple [EntityI] with [List] of parameters
+ */
fun select(
typeReference: TypeReference>,
values: List = emptyList(),
block: SelectCallback = {}
): List
+ /**
+ * Select Multiple [EntityI] with [Map] of parameters
+ */
fun select(
typeReference: TypeReference>,
values: Map,
block: SelectCallback = {}
): List
+ /**
+ * Select Multiple [EntityI] with multiple [Pair] of parameters
+ */
+ fun select(
+ typeReference: TypeReference>,
+ vararg values: Pair,
+ block: SelectCallback = {}
+ ): List =
+ select(typeReference, values.toMap(), block)
+
/* Select Paginated */
+
+ /**
+ * Select Paginated [EntityI] with [Map] of parameters
+ */
fun select(
page: Int,
limit: Int,
@@ -47,6 +92,18 @@ sealed interface EmbedExecutable {
block: SelectPaginatedCallback = {}
): Paginated
+ /**
+ * Select Paginated [EntityI] with multiple [Pair] of parameters
+ */
+ fun select(
+ page: Int,
+ limit: Int,
+ typeReference: TypeReference>,
+ vararg values: Pair,
+ block: SelectPaginatedCallback = {}
+ ): Paginated =
+ select(page, limit, typeReference, values.toMap(), block)
+
fun exec(values: List = emptyList()): QueryResult
fun exec(values: Map): QueryResult
fun exec(vararg values: Pair): QueryResult = exec(values.toMap())
@@ -57,6 +114,5 @@ sealed interface EmbedExecutable {
fun sendQuery(values: List = emptyList()): Int
fun sendQuery(values: Map): Int
- fun sendQuery(vararg values: Pair): Int =
- sendQuery(values.toMap())
+ fun sendQuery(vararg values: Pair): Int = sendQuery(values.toMap())
}
diff --git a/src/main/kotlin/fr/postgresjson/connexion/EmbedExecutableReified.kt b/src/main/kotlin/fr/postgresjson/connexion/EmbedExecutableReified.kt
new file mode 100644
index 0000000..ce64766
--- /dev/null
+++ b/src/main/kotlin/fr/postgresjson/connexion/EmbedExecutableReified.kt
@@ -0,0 +1,68 @@
+package fr.postgresjson.connexion
+
+import com.fasterxml.jackson.core.type.TypeReference
+import fr.postgresjson.entity.EntityI
+
+/* Select One */
+
+inline fun EmbedExecutable.update(
+ value: R,
+ noinline block: SelectOneCallback = {}
+): R? =
+ update(object : TypeReference() {}, value, block)
+
+inline fun EmbedExecutable.selectOne(
+ values: List = emptyList(),
+ noinline block: SelectOneCallback = {}
+): R? =
+ selectOne(object : TypeReference() {}, values, block)
+
+inline fun EmbedExecutable.selectOne(
+ values: Map,
+ noinline block: SelectOneCallback = {}
+): R? =
+ selectOne(object : TypeReference() {}, values, block)
+
+inline fun EmbedExecutable.selectOne(
+ vararg values: Pair,
+ noinline block: SelectOneCallback = {}
+): R? =
+ selectOne(object : TypeReference() {}, values = values, block)
+
+/* Select Multiples */
+
+inline fun EmbedExecutable.select(
+ values: List = emptyList(),
+ noinline block: SelectCallback = {}
+): List =
+ select(object : TypeReference>() {}, values, block)
+
+inline fun EmbedExecutable.select(
+ values: Map,
+ noinline block: SelectCallback = {}
+): List =
+ select(object : TypeReference>() {}, values, block)
+
+inline fun EmbedExecutable.select(
+ vararg values: Pair,
+ noinline block: SelectCallback = {}
+): List =
+ select(object : TypeReference>() {}, values = values, block)
+
+/* Select Paginated */
+
+inline fun EmbedExecutable.select(
+ page: Int,
+ limit: Int,
+ values: Map = emptyMap(),
+ noinline block: SelectPaginatedCallback = {}
+): Paginated =
+ select(page, limit, object : TypeReference>() {}, values, block)
+
+inline fun EmbedExecutable.select(
+ page: Int,
+ limit: Int,
+ vararg values: Pair,
+ noinline block: SelectPaginatedCallback = {}
+): Paginated =
+ select(page, limit, object : TypeReference>() {}, values = values, block)
diff --git a/src/main/kotlin/fr/postgresjson/connexion/Executable.kt b/src/main/kotlin/fr/postgresjson/connexion/Executable.kt
index 5684ebd..2a7fe5a 100644
--- a/src/main/kotlin/fr/postgresjson/connexion/Executable.kt
+++ b/src/main/kotlin/fr/postgresjson/connexion/Executable.kt
@@ -5,8 +5,23 @@ import com.github.jasync.sql.db.QueryResult
import fr.postgresjson.entity.EntityI
interface Executable {
+
/* Select One */
+ /**
+ * Update [EntityI] with one entity as argument
+ */
+ fun update(
+ sql: String,
+ typeReference: TypeReference,
+ value: R,
+ block: SelectOneCallback = {}
+ ): R? =
+ selectOne(sql, typeReference, listOf(value), block)
+
+ /**
+ * Select One [EntityI] with [List] of parameters
+ */
fun selectOne(
sql: String,
typeReference: TypeReference,
@@ -14,6 +29,9 @@ interface Executable {
block: SelectOneCallback = {}
): R?
+ /**
+ * Select One [EntityI] with [Map] of parameters
+ */
fun selectOne(
sql: String,
typeReference: TypeReference,
@@ -21,8 +39,22 @@ interface Executable {
block: SelectOneCallback = {}
): R?
+ /**
+ * Select One [EntityI] with multiple [Pair] of parameters
+ */
+ fun selectOne(
+ sql: String,
+ typeReference: TypeReference,
+ vararg values: Pair,
+ block: SelectOneCallback = {}
+ ): R? =
+ selectOne(sql, typeReference, values.toMap(), block)
+
/* Select Multiples */
+ /**
+ * Select Multiple [EntityI] with [List] of parameters
+ */
fun select(
sql: String,
typeReference: TypeReference>,
@@ -30,6 +62,9 @@ interface Executable {
block: SelectCallback = {}
): List
+ /**
+ * Select Multiple [EntityI] with [Map] of parameters
+ */
fun select(
sql: String,
typeReference: TypeReference>,
@@ -37,8 +72,22 @@ interface Executable {
block: SelectCallback = {}
): List
+ /**
+ * Select Multiple [EntityI] with multiple [Pair] of parameters
+ */
+ fun select(
+ sql: String,
+ typeReference: TypeReference>,
+ vararg values: Pair,
+ block: SelectCallback = {}
+ ): List =
+ select(sql, typeReference, values.toMap(), block)
+
/* Select Paginated */
+ /**
+ * Select Paginated [EntityI] with [Map] of parameters
+ */
fun select(
sql: String,
page: Int,
@@ -48,8 +97,31 @@ interface Executable {
block: SelectPaginatedCallback = {}
): Paginated
+ /**
+ * Select Paginated [EntityI] with multiple [Pair] of parameters
+ */
+ fun select(
+ sql: String,
+ page: Int,
+ limit: Int,
+ typeReference: TypeReference>,
+ vararg values: Pair,
+ block: SelectPaginatedCallback = {}
+ ): Paginated =
+ select(sql, page, limit, typeReference, values.toMap(), block)
+
+ fun exec(sql: String, value: R): QueryResult = exec(sql, listOf(value))
fun exec(sql: String, values: List = emptyList()): QueryResult
fun exec(sql: String, values: Map): QueryResult
+ fun exec(sql: String, vararg values: Pair): QueryResult = exec(sql, values.toMap())
+
+ fun perform(sql: String, value: R) { perform(sql, listOf(value)) }
+ fun perform(sql: String, values: List) { exec(sql, values) }
+ fun perform(sql: String, values: Map) { exec(sql, values) }
+ fun perform(sql: String, vararg values: Pair) = perform(sql, values.toMap())
+
+ fun sendQuery(sql: String, value: R): Int = sendQuery(sql, listOf(value))
fun sendQuery(sql: String, values: List = emptyList()): Int
fun sendQuery(sql: String, values: Map): Int
+ fun sendQuery(sql: String, vararg values: Pair): Int = sendQuery(sql, values.toMap())
}
diff --git a/src/main/kotlin/fr/postgresjson/connexion/Function.kt b/src/main/kotlin/fr/postgresjson/connexion/Function.kt
index bdd73c0..613d3bf 100644
--- a/src/main/kotlin/fr/postgresjson/connexion/Function.kt
+++ b/src/main/kotlin/fr/postgresjson/connexion/Function.kt
@@ -12,112 +12,64 @@ class Function(val definition: Function, override val connection: Connection) :
override val name: String = definition.name
+ /**
+ * Update [EntityI]
+ */
+ override fun update(
+ typeReference: TypeReference,
+ value: R,
+ block: (QueryResult, R?) -> Unit
+ ): R? =
+ connection.update(compileSql(value), typeReference, value, block)
+
/* Select One */
/**
- * Select One entity with list of parameters
+ * Select One [EntityI] with [List] of parameters
*/
override fun selectOne(
typeReference: TypeReference,
values: List,
block: (QueryResult, R?) -> Unit
- ): R? {
- val args = compileArgs(values)
- val sql = "SELECT * FROM ${definition.name} ($args)"
-
- return connection.selectOne(sql, typeReference, values, block)
- }
-
- inline fun selectOne(
- values: List = emptyList(),
- noinline block: SelectOneCallback = {}
): R? =
- selectOne(object : TypeReference() {}, values, block)
-
- inline fun selectOne(
- value: R,
- noinline block: SelectOneCallback = {}
- ): R? =
- selectOne(object : TypeReference() {}, listOf(value), block)
+ connection.selectOne(compileSql(values), typeReference, values, block)
/**
- * Select One entity with named parameters
+ * Select One [EntityI] with named parameters
*/
override fun selectOne(
typeReference: TypeReference,
values: Map,
block: (QueryResult, R?) -> Unit
- ): R? {
- val args = compileArgs(values)
- val sql = "SELECT * FROM ${definition.name} ($args)"
-
- return connection.selectOne(sql, typeReference, values, block)
- }
-
- inline fun selectOne(
- values: Map,
- noinline block: SelectOneCallback = {}
): R? =
- selectOne(object : TypeReference() {}, values, block)
-
- inline fun selectOne(
- vararg values: Pair,
- noinline block: SelectOneCallback = {}
- ): R? =
- selectOne(values.toMap(), block)
+ connection.selectOne(compileSql(values), typeReference, values, block)
/* Select Multiples */
/**
- * Select list of entities with list of parameters
+ * Select multiple [EntityI] with [List] of parameters
*/
override fun select(
typeReference: TypeReference>,
values: List,
block: (QueryResult, List) -> Unit
- ): List {
- val args = compileArgs(values)
- val sql = "SELECT * FROM ${definition.name} ($args)"
-
- return connection.select(sql, typeReference, values, block)
- }
-
- inline fun select(
- values: List = emptyList(),
- noinline block: SelectCallback = {}
): List =
- select(object : TypeReference>() {}, values, block)
+ connection.select(compileSql(values), typeReference, values, block)
/**
- * Select list of entities with named parameters
+ * Select multiple [EntityI] with named parameters
*/
override fun select(
typeReference: TypeReference>,
values: Map,
block: (QueryResult, List) -> Unit
- ): List {
- val args = compileArgs(values)
- val sql = "SELECT * FROM ${definition.name} ($args)"
-
- return connection.select(sql, typeReference, values, block)
- }
-
- inline fun select(
- values: Map,
- noinline block: SelectCallback = {}
): List =
- select(object : TypeReference>() {}, values, block)
-
- inline fun select(
- vararg values: Pair,
- noinline block: SelectCallback = {}
- ): List =
- select(values.toMap(), block)
+ connection.select(compileSql(values), typeReference, values, block)
/* Select Paginated */
/**
- * Select Multiple with pagination
+ * Select Multiple [EntityI] with pagination
*/
override fun select(
page: Int,
@@ -131,43 +83,14 @@ class Function(val definition: Function, override val connection: Connection) :
.plus("offset" to offset)
.plus("limit" to limit)
- val args = compileArgs(newValues)
- val sql = "SELECT * FROM ${definition.name} ($args)"
-
- return connection.select(sql, page, limit, typeReference, values, block)
+ return connection.select(compileSql(newValues), page, limit, typeReference, values, block)
}
- inline fun select(
- page: Int,
- limit: Int,
- values: Map = emptyMap(),
- noinline block: SelectPaginatedCallback = {}
- ): Paginated =
- select(page, limit, object : TypeReference>() {}, values, block)
+ /* Execute function without treatments */
- inline fun select(
- page: Int,
- limit: Int,
- vararg values: Pair,
- noinline block: SelectPaginatedCallback = {}
- ): Paginated =
- select(page, limit, object : TypeReference>() {}, values.toMap(), block)
+ override fun exec(values: List): QueryResult = connection.exec(compileSql(values), values)
- /* Execute function without traitements */
-
- override fun exec(values: List): QueryResult {
- val args = compileArgs(values)
- val sql = "SELECT * FROM ${definition.name} ($args)"
-
- return connection.exec(sql, values)
- }
-
- override fun exec(values: Map): QueryResult {
- val args = compileArgs(values)
- val sql = "SELECT * FROM ${definition.name} ($args)"
-
- return connection.exec(sql, values)
- }
+ override fun exec(values: Map): QueryResult = connection.exec(compileSql(values), values)
override fun sendQuery(values: List): Int {
exec(values)
@@ -179,6 +102,8 @@ class Function(val definition: Function, override val connection: Connection) :
return 0
}
+ private fun compileArgs(value: R): String = compileArgs(listOf(value))
+
private fun compileArgs(values: List): String {
val placeholders = values
.filterIndexed { index, value ->
@@ -205,4 +130,8 @@ class Function(val definition: Function, override val connection: Connection) :
return placeholders.joinToString(separator = ", ")
}
+
+ private fun compileSql(value: R): String = "SELECT * FROM ${definition.name} (${compileArgs(value)})"
+ private fun compileSql(values: List): String = "SELECT * FROM ${definition.name} (${compileArgs(values)})"
+ private fun compileSql(values: Map): String = "SELECT * FROM ${definition.name} (${compileArgs(values)})"
}
diff --git a/src/main/kotlin/fr/postgresjson/connexion/Query.kt b/src/main/kotlin/fr/postgresjson/connexion/Query.kt
index 620cdff..4567cfd 100644
--- a/src/main/kotlin/fr/postgresjson/connexion/Query.kt
+++ b/src/main/kotlin/fr/postgresjson/connexion/Query.kt
@@ -9,101 +9,78 @@ class Query(override val name: String, private val sql: String, override val con
return sql
}
+ /**
+ * Update [EntityI]
+ */
+ override fun update(
+ typeReference: TypeReference,
+ value: R,
+ block: (QueryResult, R?) -> Unit
+ ): R? =
+ connection.update(sql, typeReference, value, block)
+
/* Select One */
+ /**
+ * Select One [EntityI] with [List] of parameters
+ */
override fun selectOne(
typeReference: TypeReference,
values: List,
block: (QueryResult, R?) -> Unit
- ): R? {
- return connection.selectOne(this.toString(), typeReference, values, block)
- }
-
- inline fun selectOne(
- values: List = emptyList(),
- noinline block: SelectOneCallback = {}
): R? =
- selectOne(object : TypeReference() {}, values, block)
+ connection.selectOne(sql, typeReference, values, block)
+ /**
+ * Select One [EntityI] with named parameters
+ */
override fun selectOne(
typeReference: TypeReference,
values: Map,
block: (QueryResult, R?) -> Unit
- ): R? {
- return connection.selectOne(this.toString(), typeReference, values, block)
- }
-
- inline fun selectOne(
- values: Map,
- noinline block: SelectOneCallback = {}
): R? =
- selectOne(object : TypeReference() {}, values, block)
+ connection.selectOne(sql, typeReference, values, block)
/* Select Multiples */
+ /**
+ * Select multiple [EntityI] with [List] of parameters
+ */
override fun select(
typeReference: TypeReference>,
values: List,
block: (QueryResult, List) -> Unit
- ): List {
- return connection.select(this.toString(), typeReference, values, block)
- }
-
- inline fun select(
- values: List = emptyList(),
- noinline block: SelectCallback = {}
): List =
- select(object : TypeReference>() {}, values, block)
+ connection.select(sql, typeReference, values, block)
override fun select(
typeReference: TypeReference>,
values: Map,
block: (QueryResult, List) -> Unit
- ): List {
- return connection.select(this.toString(), typeReference, values, block)
- }
-
- inline fun select(
- values: Map,
- noinline block: SelectCallback = {}
): List =
- select(object : TypeReference>() {}, values, block)
+ connection.select(sql, typeReference, values, block)
+ /* Select Paginated */
+
+ /**
+ * Select Multiple [EntityI] with pagination
+ */
override fun select(
page: Int,
limit: Int,
typeReference: TypeReference>,
values: Map,
block: (QueryResult, Paginated) -> Unit
- ): Paginated {
- return connection.select(this.toString(), page, limit, typeReference, values, block)
- }
-
- /* Select Paginated */
-
- inline fun select(
- page: Int,
- limit: Int,
- values: Map = emptyMap(),
- noinline block: SelectPaginatedCallback = {}
): Paginated =
- select(page, limit, object : TypeReference>() {}, values, block)
+ connection.select(sql, page, limit, typeReference, values, block)
- /* Execute function without traitements */
+ /* Execute function without treatments */
- override fun exec(values: List): QueryResult {
- return connection.exec(sql, values)
- }
+ override fun exec(values: List): QueryResult = connection.exec(sql, values)
- override fun exec(values: Map): QueryResult {
- return connection.exec(sql, values)
- }
+ override fun exec(values: Map): QueryResult = connection.exec(sql, values)
- override fun sendQuery(values: List): Int {
- return connection.sendQuery(sql, values)
- }
+ override fun sendQuery(values: List