From c4ef2b1d9a798b3ec79960babbd6ef4098256d81 Mon Sep 17 00:00:00 2001 From: "Daniel J. Summers" Date: Sat, 15 Mar 2025 11:53:26 -0400 Subject: [PATCH] Add Query suffix to query classes --- .idea/compiler.xml | 4 +- .idea/encodings.xml | 6 + .idea/kotlinc.xml | 2 +- .idea/modules.xml | 8 -- pom.xml | 123 +----------------- .../src/main/kotlin/extensions/Connection.kt | 13 +- src/jvm/src/main/kotlin/jvm/Count.kt | 10 +- src/jvm/src/main/kotlin/jvm/Definition.kt | 10 +- src/jvm/src/main/kotlin/jvm/Delete.kt | 10 +- src/jvm/src/main/kotlin/jvm/Document.kt | 38 +----- src/jvm/src/main/kotlin/jvm/Exists.kt | 10 +- src/jvm/src/main/kotlin/jvm/Find.kt | 18 +-- src/jvm/src/main/kotlin/jvm/Patch.kt | 10 +- src/jvm/src/main/kotlin/jvm/RemoveFields.kt | 10 +- .../kotlin/query/{Count.kt => CountQuery.kt} | 15 ++- .../{Definition.kt => DefinitionQuery.kt} | 18 ++- .../query/{Delete.kt => DeleteQuery.kt} | 14 +- .../query/{Document.kt => DocumentQuery.kt} | 14 +- .../query/{Exists.kt => ExistsQuery.kt} | 14 +- .../kotlin/query/{Find.kt => FindQuery.kt} | 15 ++- .../kotlin/query/{Patch.kt => PatchQuery.kt} | 22 +++- src/jvm/src/main/kotlin/query/Query.kt | 3 + .../{RemoveFields.kt => RemoveFieldsQuery.kt} | 17 ++- src/jvm/src/main/kotlin/query/Where.kt | 11 ++ .../bitbadger/documents/java/AutoIdTest.java | 2 +- .../documents/java/DocumentIndexTest.java | 2 +- .../documents/java/FieldMatchTest.java | 2 +- .../bitbadger/documents/java/FieldTest.java | 2 +- .../bitbadger/documents/java/OpTest.java | 2 +- .../documents/java/ParameterNameTest.java | 2 +- .../documents/java/ParameterTest.java | 2 +- .../documents/java/jvm/ParametersTest.java | 2 +- .../integration/common/CountFunctions.java | 27 ++-- .../jvm/integration/postgresql/CountIT.java | 11 +- .../java/jvm/integration/sqlite/CountIT.java | 2 +- .../documents/java/support/JsonDocument.java | 2 - src/jvm/src/test/kotlin/AutoIdTest.kt | 9 +- src/jvm/src/test/kotlin/ComparisonTest.kt | 8 +- src/jvm/src/test/kotlin/ConfigurationTest.kt | 2 +- src/jvm/src/test/kotlin/DialectTest.kt | 2 +- src/jvm/src/test/kotlin/DocumentIndexTest.kt | 2 +- src/jvm/src/test/kotlin/FieldMatchTest.kt | 2 +- src/jvm/src/test/kotlin/FieldTest.kt | 2 +- src/jvm/src/test/kotlin/OpTest.kt | 2 +- src/jvm/src/test/kotlin/ParameterNameTest.kt | 2 +- src/jvm/src/test/kotlin/ParameterTest.kt | 2 +- src/jvm/src/test/kotlin/jvm/ParametersTest.kt | 2 +- .../kotlin/jvm/integration/common/Custom.kt | 24 ++-- .../integration/postgresql/DefinitionIT.kt | 2 +- .../jvm/integration/postgresql/DeleteIT.kt | 2 +- .../jvm/integration/postgresql/DocumentIT.kt | 2 +- .../jvm/integration/postgresql/ExistsIT.kt | 2 +- .../jvm/integration/postgresql/FindIT.kt | 2 +- .../jvm/integration/postgresql/PatchIT.kt | 2 +- .../integration/postgresql/RemoveFieldsIT.kt | 2 +- .../jvm/integration/sqlite/DefinitionIT.kt | 2 +- .../kotlin/jvm/integration/sqlite/DeleteIT.kt | 2 +- .../jvm/integration/sqlite/DocumentIT.kt | 2 +- .../kotlin/jvm/integration/sqlite/ExistsIT.kt | 2 +- .../kotlin/jvm/integration/sqlite/FindIT.kt | 2 +- .../kotlin/jvm/integration/sqlite/PatchIT.kt | 2 +- .../jvm/integration/sqlite/RemoveFieldsIT.kt | 2 +- .../query/{CountTest.kt => CountQueryTest.kt} | 18 +-- ...finitionTest.kt => DefinitionQueryTest.kt} | 28 ++-- .../{DeleteTest.kt => DeleteQueryTest.kt} | 20 +-- .../{DocumentTest.kt => DocumentQueryTest.kt} | 26 ++-- .../{ExistsTest.kt => ExistsQueryTest.kt} | 18 +-- .../query/{FindTest.kt => FindQueryTest.kt} | 35 +++-- .../query/{PatchTest.kt => PatchQueryTest.kt} | 20 +-- src/jvm/src/test/kotlin/query/QueryTest.kt | 4 +- ...FieldsTest.kt => RemoveFieldsQueryTest.kt} | 20 +-- src/jvm/src/test/kotlin/query/WhereTest.kt | 2 +- src/jvm/src/test/kotlin/support/Types.kt | 13 +- src/kotlin/pom.xml | 2 - src/kotlin/src/main/kotlin/Count.kt | 10 +- src/kotlin/src/main/kotlin/Delete.kt | 4 +- src/kotlin/src/main/kotlin/Document.kt | 10 +- src/kotlin/src/main/kotlin/Exists.kt | 4 +- src/kotlin/src/main/kotlin/Find.kt | 18 +-- src/kotlin/src/main/kotlin/Patch.kt | 10 +- src/kotlin/src/main/kotlin/RemoveFields.kt | 4 +- src/kotlin/src/test/kotlin/Types.kt | 52 ++++++++ 82 files changed, 450 insertions(+), 428 deletions(-) delete mode 100644 .idea/modules.xml rename src/jvm/src/main/kotlin/query/{Count.kt => CountQuery.kt} (80%) rename src/jvm/src/main/kotlin/query/{Definition.kt => DefinitionQuery.kt} (87%) rename src/jvm/src/main/kotlin/query/{Delete.kt => DeleteQuery.kt} (84%) rename src/jvm/src/main/kotlin/query/{Document.kt => DocumentQuery.kt} (85%) rename src/jvm/src/main/kotlin/query/{Exists.kt => ExistsQuery.kt} (84%) rename src/jvm/src/main/kotlin/query/{Find.kt => FindQuery.kt} (84%) rename src/jvm/src/main/kotlin/query/{Patch.kt => PatchQuery.kt} (79%) rename src/jvm/src/main/kotlin/query/{RemoveFields.kt => RemoveFieldsQuery.kt} (84%) rename src/jvm/src/test/kotlin/query/{CountTest.kt => CountQueryTest.kt} (79%) rename src/jvm/src/test/kotlin/query/{DefinitionTest.kt => DefinitionQueryTest.kt} (80%) rename src/jvm/src/test/kotlin/query/{DeleteTest.kt => DeleteQueryTest.kt} (75%) rename src/jvm/src/test/kotlin/query/{DocumentTest.kt => DocumentQueryTest.kt} (85%) rename src/jvm/src/test/kotlin/query/{ExistsTest.kt => ExistsQueryTest.kt} (82%) rename src/jvm/src/test/kotlin/query/{FindTest.kt => FindQueryTest.kt} (63%) rename src/jvm/src/test/kotlin/query/{PatchTest.kt => PatchQueryTest.kt} (80%) rename src/jvm/src/test/kotlin/query/{RemoveFieldsTest.kt => RemoveFieldsQueryTest.kt} (82%) create mode 100644 src/kotlin/src/test/kotlin/Types.kt diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 1106a32..afb5348 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -6,11 +6,13 @@ - + + + diff --git a/.idea/encodings.xml b/.idea/encodings.xml index e48c513..2afc1f9 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -1,9 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index bb44937..c22b6fa 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 724dd10..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/pom.xml b/pom.xml index 3f86db7..6871788 100644 --- a/pom.xml +++ b/pom.xml @@ -43,125 +43,8 @@ 1.8.0 - - - - src/main/kotlin - src/test/kotlin - - - org.jetbrains.kotlin - kotlin-maven-plugin - ${kotlin.version} - - - compile - process-sources - - compile - - - - test-compile - test-compile - - test-compile - - - - - - kotlinx-serialization - - - - - org.jetbrains.kotlin - kotlin-maven-serialization - ${kotlin.version} - - - - - maven-surefire-plugin - 2.22.2 - - - maven-failsafe-plugin - 2.22.2 - - - - integration-test - verify - - - - - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - MainKt - - - - org.apache.maven.plugins - maven-compiler-plugin - - 9 - 9 - - - - - - - - org.junit.jupiter - junit-jupiter - 5.11.1 - test - - - org.jetbrains.kotlin - kotlin-test-junit5 - ${kotlin.version} - test - - - org.jetbrains.kotlin - kotlin-stdlib - ${kotlin.version} - - - org.jetbrains.kotlin - kotlin-reflect - ${kotlin.version} - - - org.jetbrains.kotlinx - kotlinx-serialization-json - ${serialization.version} - - - org.xerial - sqlite-jdbc - 3.46.1.2 - test - - - org.postgresql - postgresql - 42.7.5 - test - - + + src + \ No newline at end of file diff --git a/src/jvm/src/main/kotlin/extensions/Connection.kt b/src/jvm/src/main/kotlin/extensions/Connection.kt index 97c44ab..8c4267a 100644 --- a/src/jvm/src/main/kotlin/extensions/Connection.kt +++ b/src/jvm/src/main/kotlin/extensions/Connection.kt @@ -24,7 +24,7 @@ fun Connection.customList( clazz: Class, mapFunc: (ResultSet, Class) -> TDoc ) = - solutions.bitbadger.documents.jvm.Custom.list(query, parameters, clazz, this, mapFunc) + Custom.list(query, parameters, clazz, this, mapFunc) /** * Execute a query that returns one or no results @@ -41,7 +41,7 @@ fun Connection.customSingle( clazz: Class, mapFunc: (ResultSet, Class) -> TDoc ) = - solutions.bitbadger.documents.jvm.Custom.single(query, parameters, clazz, this, mapFunc) + Custom.single(query, parameters, clazz, this, mapFunc) /** * Execute a query that returns no results @@ -50,7 +50,7 @@ fun Connection.customSingle( * @param parameters Parameters to use for the query */ fun Connection.customNonQuery(query: String, parameters: Collection> = listOf()) = - solutions.bitbadger.documents.jvm.Custom.nonQuery(query, parameters, this) + Custom.nonQuery(query, parameters, this) /** * Execute a query that returns a scalar result @@ -67,7 +67,7 @@ fun Connection.customScalar( clazz: Class, mapFunc: (ResultSet, Class) -> T ) = - solutions.bitbadger.documents.jvm.Custom.scalar(query, parameters, clazz, this, mapFunc) + Custom.scalar(query, parameters, clazz, this, mapFunc) // ~~~ DEFINITION QUERIES ~~~ @@ -109,7 +109,7 @@ fun Connection.ensureDocumentIndex(tableName: String, indexType: DocumentIndex) * @param document The document to be inserted */ fun Connection.insert(tableName: String, document: TDoc) = - Document.insert(tableName, document, this) + Document.insert(tableName, document, this) /** * Save a document, inserting it if it does not exist and updating it if it does (AKA "upsert") @@ -149,6 +149,7 @@ fun Connection.countAll(tableName: String) = * @param howMatched How the fields should be matched * @return A count of the matching documents in the table */ +@JvmOverloads fun Connection.countByFields(tableName: String, fields: Collection>, howMatched: FieldMatch? = null) = Count.byFields(tableName, fields, howMatched, this) @@ -196,6 +197,7 @@ fun Connection.existsById(tableName: String, docId: TKey) = * @param howMatched How the fields should be matched * @return True if any matching documents exist, false if not */ +@JvmOverloads fun Connection.existsByFields(tableName: String, fields: Collection>, howMatched: FieldMatch? = null) = Exists.byFields(tableName, fields, howMatched, this) @@ -499,6 +501,7 @@ fun Connection.deleteById(tableName: String, docId: TKey) = * @param fields The fields which should be compared * @param howMatched How the fields should be matched */ +@JvmOverloads fun Connection.deleteByFields(tableName: String, fields: Collection>, howMatched: FieldMatch? = null) = Delete.byFields(tableName, fields, howMatched, this) diff --git a/src/jvm/src/main/kotlin/jvm/Count.kt b/src/jvm/src/main/kotlin/jvm/Count.kt index 94ced3a..1127d80 100644 --- a/src/jvm/src/main/kotlin/jvm/Count.kt +++ b/src/jvm/src/main/kotlin/jvm/Count.kt @@ -1,7 +1,7 @@ package solutions.bitbadger.documents.jvm import solutions.bitbadger.documents.* -import solutions.bitbadger.documents.query.Count +import solutions.bitbadger.documents.query.CountQuery import solutions.bitbadger.documents.extensions.customScalar import java.sql.Connection @@ -19,7 +19,7 @@ object Count { */ @JvmStatic fun all(tableName: String, conn: Connection) = - conn.customScalar(Count.all(tableName), listOf(), Long::class.java, Results::toCount) + conn.customScalar(CountQuery.all(tableName), listOf(), Long::class.java, Results::toCount) /** * Count all documents in the table @@ -50,7 +50,7 @@ object Count { ): Long { val named = Parameters.nameFields(fields) return conn.customScalar( - Count.byFields(tableName, named, howMatched), + CountQuery.byFields(tableName, named, howMatched), Parameters.addFields(named), Long::class.java, Results::toCount @@ -82,7 +82,7 @@ object Count { @JvmStatic fun byContains(tableName: String, criteria: TContains, conn: Connection) = conn.customScalar( - Count.byContains(tableName), + CountQuery.byContains(tableName), listOf(Parameters.json(":criteria", criteria)), Long::class.java, Results::toCount @@ -112,7 +112,7 @@ object Count { @JvmStatic fun byJsonPath(tableName: String, path: String, conn: Connection) = conn.customScalar( - Count.byJsonPath(tableName), + CountQuery.byJsonPath(tableName), listOf(Parameter(":path", ParameterType.STRING, path)), Long::class.java, Results::toCount diff --git a/src/jvm/src/main/kotlin/jvm/Definition.kt b/src/jvm/src/main/kotlin/jvm/Definition.kt index 7946838..8e18818 100644 --- a/src/jvm/src/main/kotlin/jvm/Definition.kt +++ b/src/jvm/src/main/kotlin/jvm/Definition.kt @@ -4,7 +4,7 @@ import solutions.bitbadger.documents.Configuration import solutions.bitbadger.documents.DocumentException import solutions.bitbadger.documents.DocumentIndex import solutions.bitbadger.documents.extensions.customNonQuery -import solutions.bitbadger.documents.query.Definition +import solutions.bitbadger.documents.query.DefinitionQuery import java.sql.Connection /** @@ -21,8 +21,8 @@ object Definition { @JvmStatic fun ensureTable(tableName: String, conn: Connection) = Configuration.dialect("ensure $tableName exists").let { - conn.customNonQuery(Definition.ensureTable(tableName, it)) - conn.customNonQuery(Definition.ensureKey(tableName, it)) + conn.customNonQuery(DefinitionQuery.ensureTable(tableName, it)) + conn.customNonQuery(DefinitionQuery.ensureKey(tableName, it)) } /** @@ -44,7 +44,7 @@ object Definition { */ @JvmStatic fun ensureFieldIndex(tableName: String, indexName: String, fields: Collection, conn: Connection) = - conn.customNonQuery(Definition.ensureIndexOn(tableName, indexName, fields)) + conn.customNonQuery(DefinitionQuery.ensureIndexOn(tableName, indexName, fields)) /** * Create an index on field(s) within documents in the specified table if necessary @@ -68,7 +68,7 @@ object Definition { @Throws(DocumentException::class) @JvmStatic fun ensureDocumentIndex(tableName: String, indexType: DocumentIndex, conn: Connection) = - conn.customNonQuery(Definition.ensureDocumentIndexOn(tableName, indexType)) + conn.customNonQuery(DefinitionQuery.ensureDocumentIndexOn(tableName, indexType)) /** * Create a document index on a table (PostgreSQL only) diff --git a/src/jvm/src/main/kotlin/jvm/Delete.kt b/src/jvm/src/main/kotlin/jvm/Delete.kt index 9715698..d442d7f 100644 --- a/src/jvm/src/main/kotlin/jvm/Delete.kt +++ b/src/jvm/src/main/kotlin/jvm/Delete.kt @@ -2,7 +2,7 @@ package solutions.bitbadger.documents.jvm import solutions.bitbadger.documents.* import solutions.bitbadger.documents.extensions.customNonQuery -import solutions.bitbadger.documents.query.Delete +import solutions.bitbadger.documents.query.DeleteQuery import java.sql.Connection /** @@ -20,7 +20,7 @@ object Delete { @JvmStatic fun byId(tableName: String, docId: TKey, conn: Connection) = conn.customNonQuery( - Delete.byId(tableName, docId), + DeleteQuery.byId(tableName, docId), Parameters.addFields(listOf(Field.equal(Configuration.idField, docId, ":id"))) ) @@ -46,7 +46,7 @@ object Delete { @JvmOverloads fun byFields(tableName: String, fields: Collection>, howMatched: FieldMatch? = null, conn: Connection) { val named = Parameters.nameFields(fields) - conn.customNonQuery(Delete.byFields(tableName, named, howMatched), Parameters.addFields(named)) + conn.customNonQuery(DeleteQuery.byFields(tableName, named, howMatched), Parameters.addFields(named)) } /** @@ -72,7 +72,7 @@ object Delete { @Throws(DocumentException::class) @JvmStatic fun byContains(tableName: String, criteria: TContains, conn: Connection) = - conn.customNonQuery(Delete.byContains(tableName), listOf(Parameters.json(":criteria", criteria))) + conn.customNonQuery(DeleteQuery.byContains(tableName), listOf(Parameters.json(":criteria", criteria))) /** * Delete documents using a JSON containment query (PostgreSQL only) @@ -97,7 +97,7 @@ object Delete { @Throws(DocumentException::class) @JvmStatic fun byJsonPath(tableName: String, path: String, conn: Connection) = - conn.customNonQuery(Delete.byJsonPath(tableName), listOf(Parameter(":path", ParameterType.STRING, path))) + conn.customNonQuery(DeleteQuery.byJsonPath(tableName), listOf(Parameter(":path", ParameterType.STRING, path))) /** * Delete documents using a JSON Path match query (PostgreSQL only) diff --git a/src/jvm/src/main/kotlin/jvm/Document.kt b/src/jvm/src/main/kotlin/jvm/Document.kt index ba7faac..7b2e0eb 100644 --- a/src/jvm/src/main/kotlin/jvm/Document.kt +++ b/src/jvm/src/main/kotlin/jvm/Document.kt @@ -2,10 +2,9 @@ package solutions.bitbadger.documents.jvm import solutions.bitbadger.documents.AutoId import solutions.bitbadger.documents.Configuration -import solutions.bitbadger.documents.Dialect import solutions.bitbadger.documents.Field import solutions.bitbadger.documents.extensions.customNonQuery -import solutions.bitbadger.documents.query.Document +import solutions.bitbadger.documents.query.DocumentQuery import solutions.bitbadger.documents.query.Where import solutions.bitbadger.documents.query.statementWhere import java.sql.Connection @@ -25,35 +24,10 @@ object Document { @JvmStatic fun insert(tableName: String, document: TDoc, conn: Connection) { val strategy = Configuration.autoIdStrategy - val query = if (strategy == AutoId.DISABLED) { - Document.insert(tableName) + val query = if (strategy == AutoId.DISABLED || !AutoId.needsAutoId(strategy, document, Configuration.idField)) { + DocumentQuery.insert(tableName) } else { - val idField = Configuration.idField - val dialect = Configuration.dialect("Create auto-ID insert query") - val dataParam = if (AutoId.needsAutoId(strategy, document, idField)) { - when (dialect) { - Dialect.POSTGRESQL -> - when (strategy) { - AutoId.NUMBER -> "' || (SELECT coalesce(max(data->>'$idField')::numeric, 0) + 1 " + - "FROM $tableName) || '" - AutoId.UUID -> "\"${AutoId.generateUUID()}\"" - AutoId.RANDOM_STRING -> "\"${AutoId.generateRandomString()}\"" - else -> "\"' || (:data)->>'$idField' || '\"" - }.let { ":data::jsonb || ('{\"$idField\":$it}')::jsonb" } - - Dialect.SQLITE -> - when (strategy) { - AutoId.NUMBER -> "(SELECT coalesce(max(data->>'$idField'), 0) + 1 FROM $tableName)" - AutoId.UUID -> "'${AutoId.generateUUID()}'" - AutoId.RANDOM_STRING -> "'${AutoId.generateRandomString()}'" - else -> "(:data)->>'$idField'" - }.let { "json_set(:data, '$.$idField', $it)" } - } - } else { - ":data" - } - - Document.insert(tableName).replace(":data", dataParam) + DocumentQuery.insert(tableName, strategy) } conn.customNonQuery(query, listOf(Parameters.json(":data", document))) } @@ -77,7 +51,7 @@ object Document { */ @JvmStatic fun save(tableName: String, document: TDoc, conn: Connection) = - conn.customNonQuery(Document.save(tableName), listOf(Parameters.json(":data", document))) + conn.customNonQuery(DocumentQuery.save(tableName), listOf(Parameters.json(":data", document))) /** * Save a document, inserting it if it does not exist and updating it if it does (AKA "upsert") @@ -100,7 +74,7 @@ object Document { @JvmStatic fun update(tableName: String, docId: TKey, document: TDoc, conn: Connection) = conn.customNonQuery( - statementWhere(Document.update(tableName), Where.byId(":id", docId)), + statementWhere(DocumentQuery.update(tableName), Where.byId(":id", docId)), Parameters.addFields( listOf(Field.equal(Configuration.idField, docId, ":id")), mutableListOf(Parameters.json(":data", document)) diff --git a/src/jvm/src/main/kotlin/jvm/Exists.kt b/src/jvm/src/main/kotlin/jvm/Exists.kt index d69fa88..96d3cfb 100644 --- a/src/jvm/src/main/kotlin/jvm/Exists.kt +++ b/src/jvm/src/main/kotlin/jvm/Exists.kt @@ -2,7 +2,7 @@ package solutions.bitbadger.documents.jvm import solutions.bitbadger.documents.* import solutions.bitbadger.documents.extensions.customScalar -import solutions.bitbadger.documents.query.Exists +import solutions.bitbadger.documents.query.ExistsQuery import java.sql.Connection /** @@ -21,7 +21,7 @@ object Exists { @JvmStatic fun byId(tableName: String, docId: TKey, conn: Connection) = conn.customScalar( - Exists.byId(tableName, docId), + ExistsQuery.byId(tableName, docId), Parameters.addFields(listOf(Field.equal(Configuration.idField, docId, ":id"))), Boolean::class.java, Results::toExists @@ -57,7 +57,7 @@ object Exists { ): Boolean { val named = Parameters.nameFields(fields) return conn.customScalar( - Exists.byFields(tableName, named, howMatched), + ExistsQuery.byFields(tableName, named, howMatched), Parameters.addFields(named), Boolean::class.java, Results::toExists @@ -90,7 +90,7 @@ object Exists { @JvmStatic fun byContains(tableName: String, criteria: TContains, conn: Connection) = conn.customScalar( - Exists.byContains(tableName), + ExistsQuery.byContains(tableName), listOf(Parameters.json(":criteria", criteria)), Boolean::class.java, Results::toExists @@ -122,7 +122,7 @@ object Exists { @JvmStatic fun byJsonPath(tableName: String, path: String, conn: Connection) = conn.customScalar( - Exists.byJsonPath(tableName), + ExistsQuery.byJsonPath(tableName), listOf(Parameter(":path", ParameterType.STRING, path)), Boolean::class.java, Results::toExists diff --git a/src/jvm/src/main/kotlin/jvm/Find.kt b/src/jvm/src/main/kotlin/jvm/Find.kt index ab22a91..59948cc 100644 --- a/src/jvm/src/main/kotlin/jvm/Find.kt +++ b/src/jvm/src/main/kotlin/jvm/Find.kt @@ -3,7 +3,7 @@ package solutions.bitbadger.documents.jvm import solutions.bitbadger.documents.* import solutions.bitbadger.documents.extensions.customList import solutions.bitbadger.documents.extensions.customSingle -import solutions.bitbadger.documents.query.Find +import solutions.bitbadger.documents.query.FindQuery import solutions.bitbadger.documents.query.orderBy import java.sql.Connection @@ -23,7 +23,7 @@ object Find { */ @JvmStatic fun all(tableName: String, clazz: Class, orderBy: Collection>? = null, conn: Connection) = - conn.customList(Find.all(tableName) + (orderBy?.let(::orderBy) ?: ""), listOf(), clazz, Results::fromData) + conn.customList(FindQuery.all(tableName) + (orderBy?.let(::orderBy) ?: ""), listOf(), clazz, Results::fromData) /** * Retrieve all documents in the given table @@ -62,7 +62,7 @@ object Find { @JvmStatic fun byId(tableName: String, docId: TKey, clazz: Class, conn: Connection) = conn.customSingle( - Find.byId(tableName, docId), + FindQuery.byId(tableName, docId), Parameters.addFields(listOf(Field.equal(Configuration.idField, docId, ":id"))), clazz, Results::fromData @@ -102,7 +102,7 @@ object Find { ): List { val named = Parameters.nameFields(fields) return conn.customList( - Find.byFields(tableName, named, howMatched) + (orderBy?.let(::orderBy) ?: ""), + FindQuery.byFields(tableName, named, howMatched) + (orderBy?.let(::orderBy) ?: ""), Parameters.addFields(named), clazz, Results::fromData @@ -171,7 +171,7 @@ object Find { conn: Connection ) = conn.customList( - Find.byContains(tableName) + (orderBy?.let(::orderBy) ?: ""), + FindQuery.byContains(tableName) + (orderBy?.let(::orderBy) ?: ""), listOf(Parameters.json(":criteria", criteria)), clazz, Results::fromData @@ -234,7 +234,7 @@ object Find { conn: Connection ) = conn.customList( - Find.byJsonPath(tableName) + (orderBy?.let(::orderBy) ?: ""), + FindQuery.byJsonPath(tableName) + (orderBy?.let(::orderBy) ?: ""), listOf(Parameter(":path", ParameterType.STRING, path)), clazz, Results::fromData @@ -293,7 +293,7 @@ object Find { ): TDoc? { val named = Parameters.nameFields(fields) return conn.customSingle( - Find.byFields(tableName, named, howMatched) + (orderBy?.let(::orderBy) ?: ""), + FindQuery.byFields(tableName, named, howMatched) + (orderBy?.let(::orderBy) ?: ""), Parameters.addFields(named), clazz, Results::fromData @@ -361,7 +361,7 @@ object Find { conn: Connection ) = conn.customSingle( - Find.byContains(tableName) + (orderBy?.let(::orderBy) ?: ""), + FindQuery.byContains(tableName) + (orderBy?.let(::orderBy) ?: ""), listOf(Parameters.json(":criteria", criteria)), clazz, Results::fromData @@ -429,7 +429,7 @@ object Find { conn: Connection ) = conn.customSingle( - Find.byJsonPath(tableName) + (orderBy?.let(::orderBy) ?: ""), + FindQuery.byJsonPath(tableName) + (orderBy?.let(::orderBy) ?: ""), listOf(Parameter(":path", ParameterType.STRING, path)), clazz, Results::fromData diff --git a/src/jvm/src/main/kotlin/jvm/Patch.kt b/src/jvm/src/main/kotlin/jvm/Patch.kt index 80d265a..1b09991 100644 --- a/src/jvm/src/main/kotlin/jvm/Patch.kt +++ b/src/jvm/src/main/kotlin/jvm/Patch.kt @@ -2,7 +2,7 @@ package solutions.bitbadger.documents.jvm import solutions.bitbadger.documents.* import solutions.bitbadger.documents.extensions.customNonQuery -import solutions.bitbadger.documents.query.Patch +import solutions.bitbadger.documents.query.PatchQuery import java.sql.Connection /** @@ -21,7 +21,7 @@ object Patch { @JvmStatic fun byId(tableName: String, docId: TKey, patch: TPatch, conn: Connection) = conn.customNonQuery( - Patch.byId(tableName, docId), + PatchQuery.byId(tableName, docId), Parameters.addFields( listOf(Field.equal(Configuration.idField, docId, ":id")), mutableListOf(Parameters.json(":data", patch)) @@ -58,7 +58,7 @@ object Patch { ) { val named = Parameters.nameFields(fields) conn.customNonQuery( - Patch.byFields(tableName, named, howMatched), Parameters.addFields( + PatchQuery.byFields(tableName, named, howMatched), Parameters.addFields( named, mutableListOf(Parameters.json(":data", patch)) ) @@ -96,7 +96,7 @@ object Patch { @JvmStatic fun byContains(tableName: String, criteria: TContains, patch: TPatch, conn: Connection) = conn.customNonQuery( - Patch.byContains(tableName), + PatchQuery.byContains(tableName), listOf(Parameters.json(":criteria", criteria), Parameters.json(":data", patch)) ) @@ -126,7 +126,7 @@ object Patch { @JvmStatic fun byJsonPath(tableName: String, path: String, patch: TPatch, conn: Connection) = conn.customNonQuery( - Patch.byJsonPath(tableName), + PatchQuery.byJsonPath(tableName), listOf(Parameter(":path", ParameterType.STRING, path), Parameters.json(":data", patch)) ) diff --git a/src/jvm/src/main/kotlin/jvm/RemoveFields.kt b/src/jvm/src/main/kotlin/jvm/RemoveFields.kt index 22bc308..0484b1e 100644 --- a/src/jvm/src/main/kotlin/jvm/RemoveFields.kt +++ b/src/jvm/src/main/kotlin/jvm/RemoveFields.kt @@ -2,7 +2,7 @@ package solutions.bitbadger.documents.jvm import solutions.bitbadger.documents.* import solutions.bitbadger.documents.extensions.customNonQuery -import solutions.bitbadger.documents.query.RemoveFields +import solutions.bitbadger.documents.query.RemoveFieldsQuery import java.sql.Connection /** @@ -36,7 +36,7 @@ object RemoveFields { fun byId(tableName: String, docId: TKey, toRemove: Collection, conn: Connection) { val nameParams = Parameters.fieldNames(toRemove) conn.customNonQuery( - RemoveFields.byId(tableName, nameParams, docId), + RemoveFieldsQuery.byId(tableName, nameParams, docId), Parameters.addFields( listOf(Field.equal(Configuration.idField, docId, ":id")), translatePath(nameParams) @@ -75,7 +75,7 @@ object RemoveFields { val named = Parameters.nameFields(fields) val nameParams = Parameters.fieldNames(toRemove) conn.customNonQuery( - RemoveFields.byFields(tableName, nameParams, named, howMatched), + RemoveFieldsQuery.byFields(tableName, nameParams, named, howMatched), Parameters.addFields(named, translatePath(nameParams)) ) } @@ -117,7 +117,7 @@ object RemoveFields { ) { val nameParams = Parameters.fieldNames(toRemove) conn.customNonQuery( - RemoveFields.byContains(tableName, nameParams), + RemoveFieldsQuery.byContains(tableName, nameParams), listOf(Parameters.json(":criteria", criteria), *nameParams.toTypedArray()) ) } @@ -149,7 +149,7 @@ object RemoveFields { fun byJsonPath(tableName: String, path: String, toRemove: Collection, conn: Connection) { val nameParams = Parameters.fieldNames(toRemove) conn.customNonQuery( - RemoveFields.byJsonPath(tableName, nameParams), + RemoveFieldsQuery.byJsonPath(tableName, nameParams), listOf(Parameter(":path", ParameterType.STRING, path), *nameParams.toTypedArray()) ) } diff --git a/src/jvm/src/main/kotlin/query/Count.kt b/src/jvm/src/main/kotlin/query/CountQuery.kt similarity index 80% rename from src/jvm/src/main/kotlin/query/Count.kt rename to src/jvm/src/main/kotlin/query/CountQuery.kt index e3db117..82b97b4 100644 --- a/src/jvm/src/main/kotlin/query/Count.kt +++ b/src/jvm/src/main/kotlin/query/CountQuery.kt @@ -1,13 +1,15 @@ package solutions.bitbadger.documents.query +import solutions.bitbadger.documents.DocumentException import solutions.bitbadger.documents.Field import solutions.bitbadger.documents.FieldMatch -import solutions.bitbadger.documents.query.byFields as byFieldsBase; +import kotlin.jvm.Throws +import solutions.bitbadger.documents.query.byFields as byFieldsBase /** * Functions to count documents */ -object Count { +object CountQuery { /** * Query to count all documents in a table @@ -15,6 +17,7 @@ object Count { * @param tableName The table in which to count documents (may include schema) * @return A query to count documents */ + @JvmStatic fun all(tableName: String) = "SELECT COUNT(*) AS it FROM $tableName" @@ -26,6 +29,8 @@ object Count { * @param howMatched How fields should be compared (optional, defaults to ALL) * @return A query to count documents matching the given fields */ + @JvmStatic + @JvmOverloads fun byFields(tableName: String, fields: Collection>, howMatched: FieldMatch? = null) = byFieldsBase(all(tableName), fields, howMatched) @@ -34,7 +39,10 @@ object Count { * * @param tableName The table in which to count documents (may include schema) * @return A query to count documents via JSON containment + * @throws DocumentException If the database dialect is not PostgreSQL */ + @Throws(DocumentException::class) + @JvmStatic fun byContains(tableName: String) = statementWhere(all(tableName), Where.jsonContains()) @@ -43,7 +51,10 @@ object Count { * * @param tableName The table in which to count documents (may include schema) * @return A query to count documents via a JSON path match + * @throws DocumentException If the database dialect is not PostgreSQL */ + @Throws(DocumentException::class) + @JvmStatic fun byJsonPath(tableName: String) = statementWhere(all(tableName), Where.jsonPathMatches()) } diff --git a/src/jvm/src/main/kotlin/query/Definition.kt b/src/jvm/src/main/kotlin/query/DefinitionQuery.kt similarity index 87% rename from src/jvm/src/main/kotlin/query/Definition.kt rename to src/jvm/src/main/kotlin/query/DefinitionQuery.kt index 6187216..24876bb 100644 --- a/src/jvm/src/main/kotlin/query/Definition.kt +++ b/src/jvm/src/main/kotlin/query/DefinitionQuery.kt @@ -1,11 +1,12 @@ package solutions.bitbadger.documents.query import solutions.bitbadger.documents.* +import kotlin.jvm.Throws /** * Functions to create queries to define tables and indexes */ -object Definition { +object DefinitionQuery { /** * SQL statement to create a document table @@ -14,6 +15,7 @@ object Definition { * @param dataType The type of data for the column (`JSON`, `JSONB`, etc.) * @return A query to create a document table */ + @JvmStatic fun ensureTableFor(tableName: String, dataType: String) = "CREATE TABLE IF NOT EXISTS $tableName (data $dataType NOT NULL)" @@ -23,7 +25,11 @@ object Definition { * @param tableName The name of the table to create (may include schema) * @param dialect The dialect to generate (optional, used in place of current) * @return A query to create a document table + * @throws DocumentException If the dialect is neither provided nor configured */ + @Throws(DocumentException::class) + @JvmStatic + @JvmOverloads fun ensureTable(tableName: String, dialect: Dialect? = null) = when (dialect ?: Configuration.dialect("create table creation query")) { Dialect.POSTGRESQL -> ensureTableFor(tableName, "JSONB") @@ -47,7 +53,11 @@ object Definition { * @param fields One or more fields to include in the index * @param dialect The SQL dialect to use when creating this index (optional, used in place of current) * @return A query to create the field index + * @throws DocumentException If the dialect is neither provided nor configured */ + @Throws(DocumentException::class) + @JvmStatic + @JvmOverloads fun ensureIndexOn( tableName: String, indexName: String, @@ -70,7 +80,11 @@ object Definition { * @param tableName The table on which a key index should be created (may include schema) * @param dialect The SQL dialect to use when creating this index (optional, used in place of current) * @return A query to create the key index + * @throws DocumentException If the dialect is neither provided nor configured */ + @Throws(DocumentException::class) + @JvmStatic + @JvmOverloads fun ensureKey(tableName: String, dialect: Dialect? = null) = ensureIndexOn(tableName, "key", listOf(Configuration.idField), dialect).replace("INDEX", "UNIQUE INDEX") @@ -82,6 +96,8 @@ object Definition { * @return The SQL statement to create an index on JSON documents in the specified table * @throws DocumentException If the database mode is not PostgreSQL */ + @Throws(DocumentException::class) + @JvmStatic fun ensureDocumentIndexOn(tableName: String, indexType: DocumentIndex): String { if (Configuration.dialect("create document index query") != Dialect.POSTGRESQL) { throw DocumentException("'Document indexes are only supported on PostgreSQL") diff --git a/src/jvm/src/main/kotlin/query/Delete.kt b/src/jvm/src/main/kotlin/query/DeleteQuery.kt similarity index 84% rename from src/jvm/src/main/kotlin/query/Delete.kt rename to src/jvm/src/main/kotlin/query/DeleteQuery.kt index 0899c8b..8241a6e 100644 --- a/src/jvm/src/main/kotlin/query/Delete.kt +++ b/src/jvm/src/main/kotlin/query/DeleteQuery.kt @@ -1,14 +1,16 @@ package solutions.bitbadger.documents.query +import solutions.bitbadger.documents.DocumentException import solutions.bitbadger.documents.Field import solutions.bitbadger.documents.FieldMatch +import kotlin.jvm.Throws import solutions.bitbadger.documents.query.byFields as byFieldsBase import solutions.bitbadger.documents.query.byId as byIdBase /** * Functions to delete documents */ -object Delete { +object DeleteQuery { /** * Query to delete documents from a table @@ -26,6 +28,8 @@ object Delete { * @param docId The ID of the document (optional, used for type checking) * @return A query to delete a document by its ID */ + @JvmStatic + @JvmOverloads fun byId(tableName: String, docId: TKey? = null) = byIdBase(delete(tableName), docId) @@ -37,6 +41,8 @@ object Delete { * @param howMatched How fields should be compared (optional, defaults to ALL) * @return A query to delete documents matching for the given fields */ + @JvmStatic + @JvmOverloads fun byFields(tableName: String, fields: Collection>, howMatched: FieldMatch? = null) = byFieldsBase(delete(tableName), fields, howMatched) @@ -45,7 +51,10 @@ object Delete { * * @param tableName The table from which documents should be deleted (may include schema) * @return A query to delete documents via JSON containment + * @throws DocumentException If the database dialect is not PostgreSQL */ + @Throws(DocumentException::class) + @JvmStatic fun byContains(tableName: String) = statementWhere(delete(tableName), Where.jsonContains()) @@ -54,7 +63,10 @@ object Delete { * * @param tableName The table from which documents should be deleted (may include schema) * @return A query to delete documents via a JSON path match + * @throws DocumentException If the database dialect is not PostgreSQL */ + @Throws(DocumentException::class) + @JvmStatic fun byJsonPath(tableName: String) = statementWhere(delete(tableName), Where.jsonPathMatches()) } diff --git a/src/jvm/src/main/kotlin/query/Document.kt b/src/jvm/src/main/kotlin/query/DocumentQuery.kt similarity index 85% rename from src/jvm/src/main/kotlin/query/Document.kt rename to src/jvm/src/main/kotlin/query/DocumentQuery.kt index c60c986..34834c6 100644 --- a/src/jvm/src/main/kotlin/query/Document.kt +++ b/src/jvm/src/main/kotlin/query/DocumentQuery.kt @@ -3,20 +3,26 @@ package solutions.bitbadger.documents.query import solutions.bitbadger.documents.AutoId import solutions.bitbadger.documents.Configuration import solutions.bitbadger.documents.Dialect +import solutions.bitbadger.documents.DocumentException +import kotlin.jvm.Throws /** * Functions for document-level operations */ -object Document { +object DocumentQuery { /** * Query to insert a document * * @param tableName The table into which to insert (may include schema) * @return A query to insert a document + * @throws DocumentException If the dialect is not configured */ + @Throws(DocumentException::class) + @JvmStatic + @JvmOverloads fun insert(tableName: String, autoId: AutoId? = null): String { - val id = Configuration.idField + val id = Configuration.idField val values = when (Configuration.dialect("create INSERT statement")) { Dialect.POSTGRESQL -> when (autoId ?: AutoId.DISABLED) { AutoId.DISABLED -> ":data" @@ -42,7 +48,10 @@ object Document { * * @param tableName The table into which to save (may include schema) * @return A query to save a document + * @throws DocumentException If the dialect is not configured */ + @Throws(DocumentException::class) + @JvmStatic fun save(tableName: String) = insert(tableName, AutoId.DISABLED) + " ON CONFLICT ((data->>'${Configuration.idField}')) DO UPDATE SET data = EXCLUDED.data" @@ -53,6 +62,7 @@ object Document { * @param tableName The table in which documents should be replaced (may include schema) * @return A query to update documents */ + @JvmStatic fun update(tableName: String) = "UPDATE $tableName SET data = :data" } diff --git a/src/jvm/src/main/kotlin/query/Exists.kt b/src/jvm/src/main/kotlin/query/ExistsQuery.kt similarity index 84% rename from src/jvm/src/main/kotlin/query/Exists.kt rename to src/jvm/src/main/kotlin/query/ExistsQuery.kt index 54689d0..a77457e 100644 --- a/src/jvm/src/main/kotlin/query/Exists.kt +++ b/src/jvm/src/main/kotlin/query/ExistsQuery.kt @@ -1,12 +1,14 @@ package solutions.bitbadger.documents.query +import solutions.bitbadger.documents.DocumentException import solutions.bitbadger.documents.Field import solutions.bitbadger.documents.FieldMatch +import kotlin.jvm.Throws /** * Functions to check for document existence */ -object Exists { +object ExistsQuery { /** * Query to check for document existence in a table @@ -25,6 +27,8 @@ object Exists { * @param docId The ID of the document (optional, used for type checking) * @return A query to determine document existence by ID */ + @JvmStatic + @JvmOverloads fun byId(tableName: String, docId: TKey? = null) = exists(tableName, Where.byId(docId = docId)) @@ -36,6 +40,8 @@ object Exists { * @param howMatched How fields should be compared (optional, defaults to ALL) * @return A query to determine document existence for the given fields */ + @JvmStatic + @JvmOverloads fun byFields(tableName: String, fields: Collection>, howMatched: FieldMatch? = null) = exists(tableName, Where.byFields(fields, howMatched)) @@ -44,7 +50,10 @@ object Exists { * * @param tableName The table in which existence should be checked (may include schema) * @return A query to determine document existence via JSON containment + * @throws DocumentException If the database dialect is not PostgreSQL */ + @Throws(DocumentException::class) + @JvmStatic fun byContains(tableName: String) = exists(tableName, Where.jsonContains()) @@ -53,7 +62,10 @@ object Exists { * * @param tableName The table in which existence should be checked (may include schema) * @return A query to determine document existence via a JSON path match + * @throws DocumentException If the database dialect is not PostgreSQL */ + @Throws(DocumentException::class) + @JvmStatic fun byJsonPath(tableName: String) = exists(tableName, Where.jsonPathMatches()) } diff --git a/src/jvm/src/main/kotlin/query/Find.kt b/src/jvm/src/main/kotlin/query/FindQuery.kt similarity index 84% rename from src/jvm/src/main/kotlin/query/Find.kt rename to src/jvm/src/main/kotlin/query/FindQuery.kt index 6d57232..3606a2b 100644 --- a/src/jvm/src/main/kotlin/query/Find.kt +++ b/src/jvm/src/main/kotlin/query/FindQuery.kt @@ -1,14 +1,16 @@ package solutions.bitbadger.documents.query +import solutions.bitbadger.documents.DocumentException import solutions.bitbadger.documents.Field import solutions.bitbadger.documents.FieldMatch +import kotlin.jvm.Throws import solutions.bitbadger.documents.query.byId as byIdBase import solutions.bitbadger.documents.query.byFields as byFieldsBase /** * Functions to retrieve documents */ -object Find { +object FindQuery { /** * Query to retrieve all documents from a table @@ -16,6 +18,7 @@ object Find { * @param tableName The table from which documents should be retrieved (may include schema) * @return A query to retrieve documents */ + @JvmStatic fun all(tableName: String) = "SELECT data FROM $tableName" @@ -26,6 +29,8 @@ object Find { * @param docId The ID of the document (optional, used for type checking) * @return A query to retrieve a document by its ID */ + @JvmStatic + @JvmOverloads fun byId(tableName: String, docId: TKey? = null) = byIdBase(all(tableName), docId) @@ -37,6 +42,8 @@ object Find { * @param howMatched How fields should be compared (optional, defaults to ALL) * @return A query to retrieve documents matching the given fields */ + @JvmStatic + @JvmOverloads fun byFields(tableName: String, fields: Collection>, howMatched: FieldMatch? = null) = byFieldsBase(all(tableName), fields, howMatched) @@ -45,7 +52,10 @@ object Find { * * @param tableName The table from which documents should be retrieved (may include schema) * @return A query to retrieve documents via JSON containment + * @throws DocumentException If the database dialect is not PostgreSQL */ + @Throws(DocumentException::class) + @JvmStatic fun byContains(tableName: String) = statementWhere(all(tableName), Where.jsonContains()) @@ -54,7 +64,10 @@ object Find { * * @param tableName The table from which documents should be retrieved (may include schema) * @return A query to retrieve documents via a JSON path match + * @throws DocumentException If the database dialect is not PostgreSQL */ + @Throws(DocumentException::class) + @JvmStatic fun byJsonPath(tableName: String) = statementWhere(all(tableName), Where.jsonPathMatches()) } diff --git a/src/jvm/src/main/kotlin/query/Patch.kt b/src/jvm/src/main/kotlin/query/PatchQuery.kt similarity index 79% rename from src/jvm/src/main/kotlin/query/Patch.kt rename to src/jvm/src/main/kotlin/query/PatchQuery.kt index dc1e699..dbde8fe 100644 --- a/src/jvm/src/main/kotlin/query/Patch.kt +++ b/src/jvm/src/main/kotlin/query/PatchQuery.kt @@ -1,16 +1,14 @@ package solutions.bitbadger.documents.query -import solutions.bitbadger.documents.Configuration -import solutions.bitbadger.documents.Dialect -import solutions.bitbadger.documents.Field -import solutions.bitbadger.documents.FieldMatch +import solutions.bitbadger.documents.* +import kotlin.jvm.Throws import solutions.bitbadger.documents.query.byFields as byFieldsBase import solutions.bitbadger.documents.query.byId as byIdBase /** * Functions to create queries to patch (partially update) JSON documents */ -object Patch { +object PatchQuery { /** * Create an `UPDATE` statement to patch documents @@ -30,7 +28,11 @@ object Patch { * @param tableName The name of the table where the document is stored * @param docId The ID of the document to be updated (optional, used for type checking) * @return A query to patch a JSON document by its ID + * @throws DocumentException If the dialect is not configured */ + @Throws(DocumentException::class) + @JvmStatic + @JvmOverloads fun byId(tableName: String, docId: TKey? = null) = byIdBase(patch(tableName), docId) @@ -41,7 +43,11 @@ object Patch { * @param fields The field criteria * @param howMatched How the fields should be matched (optional, defaults to `ALL`) * @return A query to patch JSON documents by field match criteria + * @throws DocumentException If the dialect is not configured */ + @Throws(DocumentException::class) + @JvmStatic + @JvmOverloads fun byFields(tableName: String, fields: Collection>, howMatched: FieldMatch? = null) = byFieldsBase(patch(tableName), fields, howMatched) @@ -50,7 +56,10 @@ object Patch { * * @param tableName The name of the table where the document is stored * @return A query to patch JSON documents by JSON containment + * @throws DocumentException If the database dialect is not PostgreSQL */ + @Throws(DocumentException::class) + @JvmStatic fun byContains(tableName: String) = statementWhere(patch(tableName), Where.jsonContains()) @@ -59,7 +68,10 @@ object Patch { * * @param tableName The name of the table where the document is stored * @return A query to patch JSON documents by JSON path match + * @throws DocumentException If the database dialect is not PostgreSQL */ + @Throws(DocumentException::class) + @JvmStatic fun byJsonPath(tableName: String) = statementWhere(patch(tableName), Where.jsonPathMatches()) } diff --git a/src/jvm/src/main/kotlin/query/Query.kt b/src/jvm/src/main/kotlin/query/Query.kt index 39784bc..c79203e 100644 --- a/src/jvm/src/main/kotlin/query/Query.kt +++ b/src/jvm/src/main/kotlin/query/Query.kt @@ -1,3 +1,4 @@ +@file:JvmName("QueryUtils") package solutions.bitbadger.documents.query import solutions.bitbadger.documents.Configuration @@ -35,6 +36,7 @@ fun byId(statement: String, docId: TKey) = * @param howMatched Whether to match any or all of the field conditions (optional; default ALL) * @return A query addressing documents by field matching conditions */ +@JvmOverloads fun byFields(statement: String, fields: Collection>, howMatched: FieldMatch? = null) = statementWhere(statement, Where.byFields(fields, howMatched)) @@ -45,6 +47,7 @@ fun byFields(statement: String, fields: Collection>, howMatched: FieldM * @param dialect The SQL dialect for the generated clause * @return An `ORDER BY` clause for the given fields */ +@JvmOverloads fun orderBy(fields: Collection>, dialect: Dialect? = null): String { val mode = dialect ?: Configuration.dialect("generate ORDER BY clause") if (fields.isEmpty()) return "" diff --git a/src/jvm/src/main/kotlin/query/RemoveFields.kt b/src/jvm/src/main/kotlin/query/RemoveFieldsQuery.kt similarity index 84% rename from src/jvm/src/main/kotlin/query/RemoveFields.kt rename to src/jvm/src/main/kotlin/query/RemoveFieldsQuery.kt index b3842c4..fd036ee 100644 --- a/src/jvm/src/main/kotlin/query/RemoveFields.kt +++ b/src/jvm/src/main/kotlin/query/RemoveFieldsQuery.kt @@ -1,13 +1,14 @@ package solutions.bitbadger.documents.query import solutions.bitbadger.documents.* +import kotlin.jvm.Throws import solutions.bitbadger.documents.query.byFields as byFieldsBase import solutions.bitbadger.documents.query.byId as byIdBase /** * Functions to create queries to remove fields from documents */ -object RemoveFields { +object RemoveFieldsQuery { /** * Create a query to remove fields based on the given parameters @@ -31,7 +32,11 @@ object RemoveFields { * @param toRemove The parameters for the fields to be removed * @param docId The ID of the document to be updated (optional, used for type checking) * @return A query to patch a JSON document by its ID + * @throws DocumentException If the dialect is not configured */ + @Throws(DocumentException::class) + @JvmStatic + @JvmOverloads fun byId(tableName: String, toRemove: Collection>, docId: TKey? = null) = byIdBase(removeFields(tableName, toRemove), docId) @@ -43,7 +48,11 @@ object RemoveFields { * @param fields The field criteria * @param howMatched How the fields should be matched (optional, defaults to `ALL`) * @return A query to patch JSON documents by field match criteria + * @throws DocumentException If the dialect is not configured */ + @Throws(DocumentException::class) + @JvmStatic + @JvmOverloads fun byFields( tableName: String, toRemove: Collection>, @@ -58,7 +67,10 @@ object RemoveFields { * @param tableName The name of the table where the document is stored * @param toRemove The parameters for the fields to be removed * @return A query to patch JSON documents by JSON containment + * @throws DocumentException If the database dialect is not PostgreSQL */ + @Throws(DocumentException::class) + @JvmStatic fun byContains(tableName: String, toRemove: Collection>) = statementWhere(removeFields(tableName, toRemove), Where.jsonContains()) @@ -68,7 +80,10 @@ object RemoveFields { * @param tableName The name of the table where the document is stored * @param toRemove The parameters for the fields to be removed * @return A query to patch JSON documents by JSON path match + * @throws DocumentException If the database dialect is not PostgreSQL */ + @Throws(DocumentException::class) + @JvmStatic fun byJsonPath(tableName: String, toRemove: Collection>) = statementWhere(removeFields(tableName, toRemove), Where.jsonPathMatches()) } diff --git a/src/jvm/src/main/kotlin/query/Where.kt b/src/jvm/src/main/kotlin/query/Where.kt index dce4a32..626002e 100644 --- a/src/jvm/src/main/kotlin/query/Where.kt +++ b/src/jvm/src/main/kotlin/query/Where.kt @@ -5,6 +5,7 @@ import solutions.bitbadger.documents.Dialect import solutions.bitbadger.documents.DocumentException import solutions.bitbadger.documents.Field import solutions.bitbadger.documents.FieldMatch +import kotlin.jvm.Throws /** * Functions to create `WHERE` clause fragments @@ -18,6 +19,8 @@ object Where { * @param howMatched How the fields should be matched (optional, defaults to `ALL`) * @return A `WHERE` clause fragment to match the given fields */ + @JvmStatic + @JvmOverloads fun byFields(fields: Collection>, howMatched: FieldMatch? = null) = fields.joinToString(" ${(howMatched ?: FieldMatch.ALL).sql} ") { it.toWhere() } @@ -27,6 +30,8 @@ object Where { * @param parameterName The parameter name to use for the ID placeholder (optional, defaults to ":id") * @param docId The ID value (optional; used for type determinations, string assumed if not provided) */ + @JvmStatic + @JvmOverloads fun byId(parameterName: String = ":id", docId: TKey? = null) = byFields(listOf(Field.equal(Configuration.idField, docId ?: "", parameterName))) @@ -37,6 +42,9 @@ object Where { * @return A `WHERE` clause fragment to implement a JSON containment criterion * @throws DocumentException If called against a SQLite database */ + @Throws(DocumentException::class) + @JvmStatic + @JvmOverloads fun jsonContains(parameterName: String = ":criteria") = when (Configuration.dialect("create containment WHERE clause")) { Dialect.POSTGRESQL -> "data @> $parameterName" @@ -50,6 +58,9 @@ object Where { * @return A `WHERE` clause fragment to implement a JSON path match criterion * @throws DocumentException If called against a SQLite database */ + @Throws(DocumentException::class) + @JvmStatic + @JvmOverloads fun jsonPathMatches(parameterName: String = ":path") = when (Configuration.dialect("create JSON path match WHERE clause")) { Dialect.POSTGRESQL -> "jsonb_path_exists(data, $parameterName::jsonpath)" diff --git a/src/jvm/src/test/java/solutions/bitbadger/documents/java/AutoIdTest.java b/src/jvm/src/test/java/solutions/bitbadger/documents/java/AutoIdTest.java index 511d621..b157359 100644 --- a/src/jvm/src/test/java/solutions/bitbadger/documents/java/AutoIdTest.java +++ b/src/jvm/src/test/java/solutions/bitbadger/documents/java/AutoIdTest.java @@ -11,7 +11,7 @@ import static org.junit.jupiter.api.Assertions.*; /** * Unit tests for the `AutoId` enum */ -@DisplayName("Java | Common | AutoId") +@DisplayName("JVM | Java | AutoId") final public class AutoIdTest { @Test diff --git a/src/jvm/src/test/java/solutions/bitbadger/documents/java/DocumentIndexTest.java b/src/jvm/src/test/java/solutions/bitbadger/documents/java/DocumentIndexTest.java index 47b9543..72b3d79 100644 --- a/src/jvm/src/test/java/solutions/bitbadger/documents/java/DocumentIndexTest.java +++ b/src/jvm/src/test/java/solutions/bitbadger/documents/java/DocumentIndexTest.java @@ -9,7 +9,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; /** * Unit tests for the `DocumentIndex` enum */ -@DisplayName("Java | Common | DocumentIndex") +@DisplayName("JVM | Java | DocumentIndex") final public class DocumentIndexTest { @Test diff --git a/src/jvm/src/test/java/solutions/bitbadger/documents/java/FieldMatchTest.java b/src/jvm/src/test/java/solutions/bitbadger/documents/java/FieldMatchTest.java index 6854747..f9dab5f 100644 --- a/src/jvm/src/test/java/solutions/bitbadger/documents/java/FieldMatchTest.java +++ b/src/jvm/src/test/java/solutions/bitbadger/documents/java/FieldMatchTest.java @@ -9,7 +9,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; /** * Unit tests for the `FieldMatch` enum */ -@DisplayName("Java | Common | FieldMatch") +@DisplayName("JVM | Java | FieldMatch") final public class FieldMatchTest { @Test diff --git a/src/jvm/src/test/java/solutions/bitbadger/documents/java/FieldTest.java b/src/jvm/src/test/java/solutions/bitbadger/documents/java/FieldTest.java index 9af8b6d..2a7572d 100644 --- a/src/jvm/src/test/java/solutions/bitbadger/documents/java/FieldTest.java +++ b/src/jvm/src/test/java/solutions/bitbadger/documents/java/FieldTest.java @@ -14,7 +14,7 @@ import static org.junit.jupiter.api.Assertions.*; /** * Unit tests for the `Field` class */ -@DisplayName("Java | Common | Field") +@DisplayName("JVM | Java | Field") final public class FieldTest { /** diff --git a/src/jvm/src/test/java/solutions/bitbadger/documents/java/OpTest.java b/src/jvm/src/test/java/solutions/bitbadger/documents/java/OpTest.java index 3f800c8..f216ee4 100644 --- a/src/jvm/src/test/java/solutions/bitbadger/documents/java/OpTest.java +++ b/src/jvm/src/test/java/solutions/bitbadger/documents/java/OpTest.java @@ -9,7 +9,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; /** * Unit tests for the `Op` enum */ -@DisplayName("Java | Common | Op") +@DisplayName("JVM | Java | Op") final public class OpTest { @Test diff --git a/src/jvm/src/test/java/solutions/bitbadger/documents/java/ParameterNameTest.java b/src/jvm/src/test/java/solutions/bitbadger/documents/java/ParameterNameTest.java index 4a38121..1c18044 100644 --- a/src/jvm/src/test/java/solutions/bitbadger/documents/java/ParameterNameTest.java +++ b/src/jvm/src/test/java/solutions/bitbadger/documents/java/ParameterNameTest.java @@ -9,7 +9,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; /** * Unit tests for the `ParameterName` class */ -@DisplayName("Java | Common | ParameterName") +@DisplayName("JVM | Java | ParameterName") final public class ParameterNameTest { @Test diff --git a/src/jvm/src/test/java/solutions/bitbadger/documents/java/ParameterTest.java b/src/jvm/src/test/java/solutions/bitbadger/documents/java/ParameterTest.java index acbf0cf..9ca4432 100644 --- a/src/jvm/src/test/java/solutions/bitbadger/documents/java/ParameterTest.java +++ b/src/jvm/src/test/java/solutions/bitbadger/documents/java/ParameterTest.java @@ -11,7 +11,7 @@ import static org.junit.jupiter.api.Assertions.*; /** * Unit tests for the `Parameter` class */ -@DisplayName("Java | Common | Parameter") +@DisplayName("JVM | Java | Parameter") final public class ParameterTest { @Test diff --git a/src/jvm/src/test/java/solutions/bitbadger/documents/java/jvm/ParametersTest.java b/src/jvm/src/test/java/solutions/bitbadger/documents/java/jvm/ParametersTest.java index 59902e7..4c5f39f 100644 --- a/src/jvm/src/test/java/solutions/bitbadger/documents/java/jvm/ParametersTest.java +++ b/src/jvm/src/test/java/solutions/bitbadger/documents/java/jvm/ParametersTest.java @@ -13,7 +13,7 @@ import static org.junit.jupiter.api.Assertions.*; /** * Unit tests for the `Parameters` object */ -@DisplayName("Java | Java | Parameters") +@DisplayName("JVM | Java | Parameters") final public class ParametersTest { /** diff --git a/src/jvm/src/test/java/solutions/bitbadger/documents/java/jvm/integration/common/CountFunctions.java b/src/jvm/src/test/java/solutions/bitbadger/documents/java/jvm/integration/common/CountFunctions.java index f3dfd47..c32598d 100644 --- a/src/jvm/src/test/java/solutions/bitbadger/documents/java/jvm/integration/common/CountFunctions.java +++ b/src/jvm/src/test/java/solutions/bitbadger/documents/java/jvm/integration/common/CountFunctions.java @@ -1,14 +1,15 @@ package solutions.bitbadger.documents.java.jvm.integration.common; +import solutions.bitbadger.documents.DocumentException; import solutions.bitbadger.documents.Field; -import solutions.bitbadger.documents.jvm.Count; -import solutions.bitbadger.documents.support.ThrowawayDatabase; import solutions.bitbadger.documents.java.support.JsonDocument; +import solutions.bitbadger.documents.support.ThrowawayDatabase; import java.util.List; import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; +import static solutions.bitbadger.documents.extensions.ConnExt.*; import static solutions.bitbadger.documents.support.TypesKt.TEST_TABLE; /** @@ -18,42 +19,42 @@ final public class CountFunctions { public static void all(ThrowawayDatabase db) { JsonDocument.load(db); - assertEquals(5L, Count.all(TEST_TABLE, db.getConn()), "There should have been 5 documents in the table"); + assertEquals(5L, countAll(db.getConn(), TEST_TABLE), "There should have been 5 documents in the table"); } public static void byFieldsNumeric(ThrowawayDatabase db) { JsonDocument.load(db); - assertEquals(3L, Count.byFields(TEST_TABLE, List.of(Field.between("numValue", 10, 20)), db.getConn()), + assertEquals(3L, countByFields(db.getConn(), TEST_TABLE, List.of(Field.between("numValue", 10, 20))), "There should have been 3 matching documents"); } public static void byFieldsAlpha(ThrowawayDatabase db) { JsonDocument.load(db); - assertEquals(1L, Count.byFields(TEST_TABLE, List.of(Field.between("value", "aardvark", "apple")), db.getConn()), + assertEquals(1L, countByFields(db.getConn(), TEST_TABLE, List.of(Field.between("value", "aardvark", "apple"))), "There should have been 1 matching document"); } - public static void byContainsMatch(ThrowawayDatabase db) { + public static void byContainsMatch(ThrowawayDatabase db) throws DocumentException { JsonDocument.load(db); - assertEquals(2L, Count.byContains(TEST_TABLE, Map.of("value", "purple"), db.getConn()), + assertEquals(2L, countByContains(db.getConn(), TEST_TABLE, Map.of("value", "purple")), "There should have been 2 matching documents"); } - public static void byContainsNoMatch(ThrowawayDatabase db) { + public static void byContainsNoMatch(ThrowawayDatabase db) throws DocumentException { JsonDocument.load(db); - assertEquals(0L, Count.byContains(TEST_TABLE, Map.of("value", "magenta"), db.getConn()), + assertEquals(0L, countByContains(db.getConn(), TEST_TABLE, Map.of("value", "magenta")), "There should have been no matching documents"); } - public static void byJsonPathMatch(ThrowawayDatabase db) { + public static void byJsonPathMatch(ThrowawayDatabase db) throws DocumentException { JsonDocument.load(db); - assertEquals(2L, Count.byJsonPath(TEST_TABLE, "$.numValue ? (@ < 5)", db.getConn()), + assertEquals(2L, countByJsonPath(db.getConn(), TEST_TABLE, "$.numValue ? (@ < 5)"), "There should have been 2 matching documents"); } - public static void byJsonPathNoMatch(ThrowawayDatabase db) { + public static void byJsonPathNoMatch(ThrowawayDatabase db) throws DocumentException { JsonDocument.load(db); - assertEquals(0L, Count.byJsonPath(TEST_TABLE, "$.numValue ? (@ > 100)", db.getConn()), + assertEquals(0L, countByJsonPath(db.getConn(), TEST_TABLE, "$.numValue ? (@ > 100)"), "There should have been no matching documents"); } diff --git a/src/jvm/src/test/java/solutions/bitbadger/documents/java/jvm/integration/postgresql/CountIT.java b/src/jvm/src/test/java/solutions/bitbadger/documents/java/jvm/integration/postgresql/CountIT.java index eb07bec..97c1d3f 100644 --- a/src/jvm/src/test/java/solutions/bitbadger/documents/java/jvm/integration/postgresql/CountIT.java +++ b/src/jvm/src/test/java/solutions/bitbadger/documents/java/jvm/integration/postgresql/CountIT.java @@ -2,13 +2,14 @@ package solutions.bitbadger.documents.java.jvm.integration.postgresql; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import solutions.bitbadger.documents.DocumentException; import solutions.bitbadger.documents.java.jvm.integration.common.CountFunctions; import solutions.bitbadger.documents.jvm.integration.postgresql.PgDB; /** * PostgreSQL integration tests for the `Count` object / `count*` connection extension functions */ -@DisplayName("Java | Java | PostgreSQL: Count") +@DisplayName("JVM | Java | PostgreSQL: Count") public class CountIT { @Test @@ -37,7 +38,7 @@ public class CountIT { @Test @DisplayName("byContains counts documents when matches are found") - public void byContainsMatch() { + public void byContainsMatch() throws DocumentException { try (PgDB db = new PgDB()) { CountFunctions.byContainsMatch(db); } @@ -45,7 +46,7 @@ public class CountIT { @Test @DisplayName("byContains counts documents when no matches are found") - public void byContainsNoMatch() { + public void byContainsNoMatch() throws DocumentException { try (PgDB db = new PgDB()) { CountFunctions.byContainsNoMatch(db); } @@ -53,7 +54,7 @@ public class CountIT { @Test @DisplayName("byJsonPath counts documents when matches are found") - public void byJsonPathMatch() { + public void byJsonPathMatch() throws DocumentException { try (PgDB db = new PgDB()) { CountFunctions.byJsonPathMatch(db); } @@ -61,7 +62,7 @@ public class CountIT { @Test @DisplayName("byJsonPath counts documents when no matches are found") - public void byJsonPathNoMatch() { + public void byJsonPathNoMatch() throws DocumentException { try (PgDB db = new PgDB()) { CountFunctions.byJsonPathNoMatch(db); } diff --git a/src/jvm/src/test/java/solutions/bitbadger/documents/java/jvm/integration/sqlite/CountIT.java b/src/jvm/src/test/java/solutions/bitbadger/documents/java/jvm/integration/sqlite/CountIT.java index 18a4d70..38fda0b 100644 --- a/src/jvm/src/test/java/solutions/bitbadger/documents/java/jvm/integration/sqlite/CountIT.java +++ b/src/jvm/src/test/java/solutions/bitbadger/documents/java/jvm/integration/sqlite/CountIT.java @@ -11,7 +11,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; /** * SQLite integration tests for the `Count` object / `count*` connection extension functions */ -@DisplayName("Java | Java | SQLite: Count") +@DisplayName("JVM | Java | SQLite: Count") public class CountIT { @Test diff --git a/src/jvm/src/test/java/solutions/bitbadger/documents/java/support/JsonDocument.java b/src/jvm/src/test/java/solutions/bitbadger/documents/java/support/JsonDocument.java index d18acaa..4d5b085 100644 --- a/src/jvm/src/test/java/solutions/bitbadger/documents/java/support/JsonDocument.java +++ b/src/jvm/src/test/java/solutions/bitbadger/documents/java/support/JsonDocument.java @@ -1,6 +1,5 @@ package solutions.bitbadger.documents.java.support; -import kotlinx.serialization.Serializable; import solutions.bitbadger.documents.jvm.Document; import solutions.bitbadger.documents.support.ThrowawayDatabase; @@ -8,7 +7,6 @@ import java.util.List; import static solutions.bitbadger.documents.support.TypesKt.TEST_TABLE; -@Serializable public class JsonDocument { private String id; diff --git a/src/jvm/src/test/kotlin/AutoIdTest.kt b/src/jvm/src/test/kotlin/AutoIdTest.kt index 4a1aeff..87099ae 100644 --- a/src/jvm/src/test/kotlin/AutoIdTest.kt +++ b/src/jvm/src/test/kotlin/AutoIdTest.kt @@ -3,6 +3,7 @@ package solutions.bitbadger.documents import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows +import solutions.bitbadger.documents.support.* import kotlin.test.assertEquals import kotlin.test.assertFalse import kotlin.test.assertNotEquals @@ -11,7 +12,7 @@ import kotlin.test.assertTrue /** * Unit tests for the `AutoId` enum */ -@DisplayName("Kotlin | Common | AutoId") +@DisplayName("JVM | Kotlin | AutoId") class AutoIdTest { @Test @@ -157,9 +158,3 @@ class AutoIdTest { assertThrows { AutoId.needsAutoId(AutoId.RANDOM_STRING, ShortIdClass(55), "id") } } } - -data class ByteIdClass(val id: Byte) -data class ShortIdClass(val id: Short) -data class IntIdClass(val id: Int) -data class LongIdClass(val id: Long) -data class StringIdClass(val id: String) diff --git a/src/jvm/src/test/kotlin/ComparisonTest.kt b/src/jvm/src/test/kotlin/ComparisonTest.kt index 912000b..46c3cae 100644 --- a/src/jvm/src/test/kotlin/ComparisonTest.kt +++ b/src/jvm/src/test/kotlin/ComparisonTest.kt @@ -9,7 +9,7 @@ import kotlin.test.assertTrue /** * Unit tests for the `ComparisonBetween` class */ -@DisplayName("ComparisonBetween") +@DisplayName("JVM | Kotlin | ComparisonBetween") class ComparisonBetweenTest { @Test @@ -50,7 +50,7 @@ class ComparisonBetweenTest { /** * Unit tests for the `ComparisonIn` class */ -@DisplayName("ComparisonIn") +@DisplayName("JVM | Kotlin | ComparisonIn") class ComparisonInTest { @Test @@ -92,7 +92,7 @@ class ComparisonInTest { /** * Unit tests for the `ComparisonInArray` class */ -@DisplayName("ComparisonInArray") +@DisplayName("JVM | Kotlin | ComparisonInArray") class ComparisonInArrayTest { @Test @@ -138,7 +138,7 @@ class ComparisonInArrayTest { /** * Unit tests for the `ComparisonSingle` class */ -@DisplayName("ComparisonSingle") +@DisplayName("JVM | Kotlin | ComparisonSingle") class ComparisonSingleTest { @Test diff --git a/src/jvm/src/test/kotlin/ConfigurationTest.kt b/src/jvm/src/test/kotlin/ConfigurationTest.kt index a9255a5..bdc8e97 100644 --- a/src/jvm/src/test/kotlin/ConfigurationTest.kt +++ b/src/jvm/src/test/kotlin/ConfigurationTest.kt @@ -8,7 +8,7 @@ import kotlin.test.assertEquals /** * Unit tests for the `Configuration` object */ -@DisplayName("Kotlin | Common | Configuration") +@DisplayName("JVM | Kotlin | Configuration") class ConfigurationTest { @Test diff --git a/src/jvm/src/test/kotlin/DialectTest.kt b/src/jvm/src/test/kotlin/DialectTest.kt index 7dbdce0..f6b4025 100644 --- a/src/jvm/src/test/kotlin/DialectTest.kt +++ b/src/jvm/src/test/kotlin/DialectTest.kt @@ -9,7 +9,7 @@ import kotlin.test.assertTrue /** * Unit tests for the `Dialect` enum */ -@DisplayName("Kotlin | Common | Dialect") +@DisplayName("JVM | Kotlin | Dialect") class DialectTest { @Test diff --git a/src/jvm/src/test/kotlin/DocumentIndexTest.kt b/src/jvm/src/test/kotlin/DocumentIndexTest.kt index f23d6a0..fccbb44 100644 --- a/src/jvm/src/test/kotlin/DocumentIndexTest.kt +++ b/src/jvm/src/test/kotlin/DocumentIndexTest.kt @@ -7,7 +7,7 @@ import kotlin.test.assertEquals /** * Unit tests for the `DocumentIndex` enum */ -@DisplayName("Kotlin | Common | DocumentIndex") +@DisplayName("JVM | Kotlin | DocumentIndex") class DocumentIndexTest { @Test diff --git a/src/jvm/src/test/kotlin/FieldMatchTest.kt b/src/jvm/src/test/kotlin/FieldMatchTest.kt index 2ee51d7..3976773 100644 --- a/src/jvm/src/test/kotlin/FieldMatchTest.kt +++ b/src/jvm/src/test/kotlin/FieldMatchTest.kt @@ -7,7 +7,7 @@ import kotlin.test.assertEquals /** * Unit tests for the `FieldMatch` enum */ -@DisplayName("Kotlin | Common | FieldMatch") +@DisplayName("JVM | Kotlin | FieldMatch") class FieldMatchTest { @Test diff --git a/src/jvm/src/test/kotlin/FieldTest.kt b/src/jvm/src/test/kotlin/FieldTest.kt index a48dbf1..12b71e5 100644 --- a/src/jvm/src/test/kotlin/FieldTest.kt +++ b/src/jvm/src/test/kotlin/FieldTest.kt @@ -11,7 +11,7 @@ import kotlin.test.assertNull /** * Unit tests for the `Field` class */ -@DisplayName("Kotlin | Common | Field") +@DisplayName("JVM | Kotlin | Field") class FieldTest { /** diff --git a/src/jvm/src/test/kotlin/OpTest.kt b/src/jvm/src/test/kotlin/OpTest.kt index 095e9a2..19e0d91 100644 --- a/src/jvm/src/test/kotlin/OpTest.kt +++ b/src/jvm/src/test/kotlin/OpTest.kt @@ -7,7 +7,7 @@ import kotlin.test.assertEquals /** * Unit tests for the `Op` enum */ -@DisplayName("Kotlin | Common | Op") +@DisplayName("JVM | Kotlin | Op") class OpTest { @Test diff --git a/src/jvm/src/test/kotlin/ParameterNameTest.kt b/src/jvm/src/test/kotlin/ParameterNameTest.kt index d8f1d6d..4e67e4a 100644 --- a/src/jvm/src/test/kotlin/ParameterNameTest.kt +++ b/src/jvm/src/test/kotlin/ParameterNameTest.kt @@ -7,7 +7,7 @@ import kotlin.test.assertEquals /** * Unit tests for the `ParameterName` class */ -@DisplayName("Kotlin | Common | ParameterName") +@DisplayName("JVM | Kotlin | ParameterName") class ParameterNameTest { @Test diff --git a/src/jvm/src/test/kotlin/ParameterTest.kt b/src/jvm/src/test/kotlin/ParameterTest.kt index 0dadc04..0ec84ae 100644 --- a/src/jvm/src/test/kotlin/ParameterTest.kt +++ b/src/jvm/src/test/kotlin/ParameterTest.kt @@ -9,7 +9,7 @@ import kotlin.test.assertNull /** * Unit tests for the `Parameter` class */ -@DisplayName("Kotlin | Common | Parameter") +@DisplayName("JVM | Kotlin | Parameter") class ParameterTest { @Test diff --git a/src/jvm/src/test/kotlin/jvm/ParametersTest.kt b/src/jvm/src/test/kotlin/jvm/ParametersTest.kt index 30ef568..ec435f0 100644 --- a/src/jvm/src/test/kotlin/jvm/ParametersTest.kt +++ b/src/jvm/src/test/kotlin/jvm/ParametersTest.kt @@ -12,7 +12,7 @@ import kotlin.test.assertSame /** * Unit tests for the `Parameters` object */ -@DisplayName("Kotlin | Java | Parameters") +@DisplayName("JVM | Kotlin | Parameters") class ParametersTest { /** diff --git a/src/jvm/src/test/kotlin/jvm/integration/common/Custom.kt b/src/jvm/src/test/kotlin/jvm/integration/common/Custom.kt index 34a8160..19e0404 100644 --- a/src/jvm/src/test/kotlin/jvm/integration/common/Custom.kt +++ b/src/jvm/src/test/kotlin/jvm/integration/common/Custom.kt @@ -3,9 +3,9 @@ package solutions.bitbadger.documents.jvm.integration.common import solutions.bitbadger.documents.* import solutions.bitbadger.documents.extensions.* import solutions.bitbadger.documents.jvm.Results -import solutions.bitbadger.documents.query.Count -import solutions.bitbadger.documents.query.Delete -import solutions.bitbadger.documents.query.Find +import solutions.bitbadger.documents.query.CountQuery +import solutions.bitbadger.documents.query.DeleteQuery +import solutions.bitbadger.documents.query.FindQuery import solutions.bitbadger.documents.support.* import kotlin.test.assertEquals import kotlin.test.assertNotNull @@ -19,26 +19,26 @@ object Custom { fun listEmpty(db: ThrowawayDatabase) { JsonDocument.load(db) db.conn.deleteByFields(TEST_TABLE, listOf(Field.exists(Configuration.idField))) - val result = db.conn.customList(Find.all(TEST_TABLE), listOf(), JsonDocument::class.java, Results::fromData) + val result = db.conn.customList(FindQuery.all(TEST_TABLE), listOf(), JsonDocument::class.java, Results::fromData) assertEquals(0, result.size, "There should have been no results") } fun listAll(db: ThrowawayDatabase) { JsonDocument.load(db) - val result = db.conn.customList(Find.all(TEST_TABLE), listOf(), JsonDocument::class.java, Results::fromData) + val result = db.conn.customList(FindQuery.all(TEST_TABLE), listOf(), JsonDocument::class.java, Results::fromData) assertEquals(5, result.size, "There should have been 5 results") } fun singleNone(db: ThrowawayDatabase) = assertNull( - db.conn.customSingle(Find.all(TEST_TABLE), listOf(), JsonDocument::class.java, Results::fromData), + db.conn.customSingle(FindQuery.all(TEST_TABLE), listOf(), JsonDocument::class.java, Results::fromData), "There should not have been a document returned" ) fun singleOne(db: ThrowawayDatabase) { JsonDocument.load(db) assertNotNull( - db.conn.customSingle(Find.all(TEST_TABLE), listOf(), JsonDocument::class.java, Results::fromData), + db.conn.customSingle(FindQuery.all(TEST_TABLE), listOf(), JsonDocument::class.java, Results::fromData), "There should not have been a document returned" ) } @@ -46,12 +46,12 @@ object Custom { fun nonQueryChanges(db: ThrowawayDatabase) { JsonDocument.load(db) assertEquals( - 5L, db.conn.customScalar(Count.all(TEST_TABLE), listOf(), Long::class.java, Results::toCount), + 5L, db.conn.customScalar(CountQuery.all(TEST_TABLE), listOf(), Long::class.java, Results::toCount), "There should have been 5 documents in the table" ) db.conn.customNonQuery("DELETE FROM $TEST_TABLE") assertEquals( - 0L, db.conn.customScalar(Count.all(TEST_TABLE), listOf(), Long::class.java, Results::toCount), + 0L, db.conn.customScalar(CountQuery.all(TEST_TABLE), listOf(), Long::class.java, Results::toCount), "There should have been no documents in the table" ) } @@ -59,15 +59,15 @@ object Custom { fun nonQueryNoChanges(db: ThrowawayDatabase) { JsonDocument.load(db) assertEquals( - 5L, db.conn.customScalar(Count.all(TEST_TABLE), listOf(), Long::class.java, Results::toCount), + 5L, db.conn.customScalar(CountQuery.all(TEST_TABLE), listOf(), Long::class.java, Results::toCount), "There should have been 5 documents in the table" ) db.conn.customNonQuery( - Delete.byId(TEST_TABLE, "eighty-two"), + DeleteQuery.byId(TEST_TABLE, "eighty-two"), listOf(Parameter(":id", ParameterType.STRING, "eighty-two")) ) assertEquals( - 5L, db.conn.customScalar(Count.all(TEST_TABLE), listOf(), Long::class.java, Results::toCount), + 5L, db.conn.customScalar(CountQuery.all(TEST_TABLE), listOf(), Long::class.java, Results::toCount), "There should still have been 5 documents in the table" ) } diff --git a/src/jvm/src/test/kotlin/jvm/integration/postgresql/DefinitionIT.kt b/src/jvm/src/test/kotlin/jvm/integration/postgresql/DefinitionIT.kt index 298fb93..bb01c6c 100644 --- a/src/jvm/src/test/kotlin/jvm/integration/postgresql/DefinitionIT.kt +++ b/src/jvm/src/test/kotlin/jvm/integration/postgresql/DefinitionIT.kt @@ -7,7 +7,7 @@ import kotlin.test.Test /** * PostgreSQL integration tests for the `Definition` object / `ensure*` connection extension functions */ -@DisplayName("Java | Kotlin | PostgreSQL: Definition") +@DisplayName("JVM | Kotlin | PostgreSQL: Definition") class DefinitionIT { @Test diff --git a/src/jvm/src/test/kotlin/jvm/integration/postgresql/DeleteIT.kt b/src/jvm/src/test/kotlin/jvm/integration/postgresql/DeleteIT.kt index be56697..8b322d0 100644 --- a/src/jvm/src/test/kotlin/jvm/integration/postgresql/DeleteIT.kt +++ b/src/jvm/src/test/kotlin/jvm/integration/postgresql/DeleteIT.kt @@ -7,7 +7,7 @@ import kotlin.test.Test /** * PostgreSQL integration tests for the `Delete` object / `deleteBy*` connection extension functions */ -@DisplayName("Java | Kotlin | PostgreSQL: Delete") +@DisplayName("JVM | Kotlin | PostgreSQL: Delete") class DeleteIT { @Test diff --git a/src/jvm/src/test/kotlin/jvm/integration/postgresql/DocumentIT.kt b/src/jvm/src/test/kotlin/jvm/integration/postgresql/DocumentIT.kt index 478e9e1..ab3955c 100644 --- a/src/jvm/src/test/kotlin/jvm/integration/postgresql/DocumentIT.kt +++ b/src/jvm/src/test/kotlin/jvm/integration/postgresql/DocumentIT.kt @@ -7,7 +7,7 @@ import kotlin.test.Test /** * PostgreSQL integration tests for the `Document` object / `insert`, `save`, `update` connection extension functions */ -@DisplayName("Java | Kotlin | PostgreSQL: Document") +@DisplayName("JVM | Kotlin | PostgreSQL: Document") class DocumentIT { @Test diff --git a/src/jvm/src/test/kotlin/jvm/integration/postgresql/ExistsIT.kt b/src/jvm/src/test/kotlin/jvm/integration/postgresql/ExistsIT.kt index 848962a..c41b14e 100644 --- a/src/jvm/src/test/kotlin/jvm/integration/postgresql/ExistsIT.kt +++ b/src/jvm/src/test/kotlin/jvm/integration/postgresql/ExistsIT.kt @@ -7,7 +7,7 @@ import kotlin.test.Test /** * PostgreSQL integration tests for the `Exists` object / `existsBy*` connection extension functions */ -@DisplayName("Java | Kotlin | PostgreSQL: Exists") +@DisplayName("JVM | Kotlin | PostgreSQL: Exists") class ExistsIT { @Test diff --git a/src/jvm/src/test/kotlin/jvm/integration/postgresql/FindIT.kt b/src/jvm/src/test/kotlin/jvm/integration/postgresql/FindIT.kt index b6d8e98..32bf564 100644 --- a/src/jvm/src/test/kotlin/jvm/integration/postgresql/FindIT.kt +++ b/src/jvm/src/test/kotlin/jvm/integration/postgresql/FindIT.kt @@ -7,7 +7,7 @@ import kotlin.test.Test /** * PostgreSQL integration tests for the `Find` object / `find*` connection extension functions */ -@DisplayName("Java | Kotlin | PostgreSQL: Find") +@DisplayName("JVM | Kotlin | PostgreSQL: Find") class FindIT { @Test diff --git a/src/jvm/src/test/kotlin/jvm/integration/postgresql/PatchIT.kt b/src/jvm/src/test/kotlin/jvm/integration/postgresql/PatchIT.kt index 7cedf46..4a9c2ee 100644 --- a/src/jvm/src/test/kotlin/jvm/integration/postgresql/PatchIT.kt +++ b/src/jvm/src/test/kotlin/jvm/integration/postgresql/PatchIT.kt @@ -7,7 +7,7 @@ import kotlin.test.Test /** * PostgreSQL integration tests for the `Patch` object / `patchBy*` connection extension functions */ -@DisplayName("Java | Kotlin | PostgreSQL: Patch") +@DisplayName("JVM | Kotlin | PostgreSQL: Patch") class PatchIT { @Test diff --git a/src/jvm/src/test/kotlin/jvm/integration/postgresql/RemoveFieldsIT.kt b/src/jvm/src/test/kotlin/jvm/integration/postgresql/RemoveFieldsIT.kt index 4919ce8..968106f 100644 --- a/src/jvm/src/test/kotlin/jvm/integration/postgresql/RemoveFieldsIT.kt +++ b/src/jvm/src/test/kotlin/jvm/integration/postgresql/RemoveFieldsIT.kt @@ -7,7 +7,7 @@ import kotlin.test.Test /** * PostgreSQL integration tests for the `RemoveFields` object / `removeFieldsBy*` connection extension functions */ -@DisplayName("Java | Kotlin | PostgreSQL: RemoveFields") +@DisplayName("JVM | Kotlin | PostgreSQL: RemoveFields") class RemoveFieldsIT { @Test diff --git a/src/jvm/src/test/kotlin/jvm/integration/sqlite/DefinitionIT.kt b/src/jvm/src/test/kotlin/jvm/integration/sqlite/DefinitionIT.kt index 313eab5..bc47dc0 100644 --- a/src/jvm/src/test/kotlin/jvm/integration/sqlite/DefinitionIT.kt +++ b/src/jvm/src/test/kotlin/jvm/integration/sqlite/DefinitionIT.kt @@ -9,7 +9,7 @@ import kotlin.test.Test /** * SQLite integration tests for the `Definition` object / `ensure*` connection extension functions */ -@DisplayName("Java | Kotlin | SQLite: Definition") +@DisplayName("JVM | Kotlin | SQLite: Definition") class DefinitionIT { @Test diff --git a/src/jvm/src/test/kotlin/jvm/integration/sqlite/DeleteIT.kt b/src/jvm/src/test/kotlin/jvm/integration/sqlite/DeleteIT.kt index 7975e1a..bbdda99 100644 --- a/src/jvm/src/test/kotlin/jvm/integration/sqlite/DeleteIT.kt +++ b/src/jvm/src/test/kotlin/jvm/integration/sqlite/DeleteIT.kt @@ -9,7 +9,7 @@ import kotlin.test.Test /** * SQLite integration tests for the `Delete` object / `deleteBy*` connection extension functions */ -@DisplayName("Java | Kotlin | SQLite: Delete") +@DisplayName("JVM | Kotlin | SQLite: Delete") class DeleteIT { @Test diff --git a/src/jvm/src/test/kotlin/jvm/integration/sqlite/DocumentIT.kt b/src/jvm/src/test/kotlin/jvm/integration/sqlite/DocumentIT.kt index 414dbcd..1531117 100644 --- a/src/jvm/src/test/kotlin/jvm/integration/sqlite/DocumentIT.kt +++ b/src/jvm/src/test/kotlin/jvm/integration/sqlite/DocumentIT.kt @@ -7,7 +7,7 @@ import kotlin.test.Test /** * SQLite integration tests for the `Document` object / `insert`, `save`, `update` connection extension functions */ -@DisplayName("Java | Kotlin | SQLite: Document") +@DisplayName("JVM | Kotlin | SQLite: Document") class DocumentIT { @Test diff --git a/src/jvm/src/test/kotlin/jvm/integration/sqlite/ExistsIT.kt b/src/jvm/src/test/kotlin/jvm/integration/sqlite/ExistsIT.kt index 36b0bd4..b4b65f2 100644 --- a/src/jvm/src/test/kotlin/jvm/integration/sqlite/ExistsIT.kt +++ b/src/jvm/src/test/kotlin/jvm/integration/sqlite/ExistsIT.kt @@ -9,7 +9,7 @@ import kotlin.test.Test /** * SQLite integration tests for the `Exists` object / `existsBy*` connection extension functions */ -@DisplayName("Java | Kotlin | SQLite: Exists") +@DisplayName("JVM | Kotlin | SQLite: Exists") class ExistsIT { @Test diff --git a/src/jvm/src/test/kotlin/jvm/integration/sqlite/FindIT.kt b/src/jvm/src/test/kotlin/jvm/integration/sqlite/FindIT.kt index abe0aaa..8dab546 100644 --- a/src/jvm/src/test/kotlin/jvm/integration/sqlite/FindIT.kt +++ b/src/jvm/src/test/kotlin/jvm/integration/sqlite/FindIT.kt @@ -9,7 +9,7 @@ import kotlin.test.Test /** * SQLite integration tests for the `Find` object / `find*` connection extension functions */ -@DisplayName("Java | Kotlin | SQLite: Find") +@DisplayName("JVM | Kotlin | SQLite: Find") class FindIT { @Test diff --git a/src/jvm/src/test/kotlin/jvm/integration/sqlite/PatchIT.kt b/src/jvm/src/test/kotlin/jvm/integration/sqlite/PatchIT.kt index ac1d2c4..7918bef 100644 --- a/src/jvm/src/test/kotlin/jvm/integration/sqlite/PatchIT.kt +++ b/src/jvm/src/test/kotlin/jvm/integration/sqlite/PatchIT.kt @@ -9,7 +9,7 @@ import kotlin.test.Test /** * SQLite integration tests for the `Patch` object / `patchBy*` connection extension functions */ -@DisplayName("Java | Kotlin | SQLite: Patch") +@DisplayName("JVM | Kotlin | SQLite: Patch") class PatchIT { @Test diff --git a/src/jvm/src/test/kotlin/jvm/integration/sqlite/RemoveFieldsIT.kt b/src/jvm/src/test/kotlin/jvm/integration/sqlite/RemoveFieldsIT.kt index 7518ab4..26e51b6 100644 --- a/src/jvm/src/test/kotlin/jvm/integration/sqlite/RemoveFieldsIT.kt +++ b/src/jvm/src/test/kotlin/jvm/integration/sqlite/RemoveFieldsIT.kt @@ -9,7 +9,7 @@ import kotlin.test.Test /** * SQLite integration tests for the `RemoveFields` object / `removeFieldsBy*` connection extension functions */ -@DisplayName("Java | Kotlin | SQLite: RemoveFields") +@DisplayName("JVM | Kotlin | SQLite: RemoveFields") class RemoveFieldsIT { @Test diff --git a/src/jvm/src/test/kotlin/query/CountTest.kt b/src/jvm/src/test/kotlin/query/CountQueryTest.kt similarity index 79% rename from src/jvm/src/test/kotlin/query/CountTest.kt rename to src/jvm/src/test/kotlin/query/CountQueryTest.kt index 7943110..9d2de61 100644 --- a/src/jvm/src/test/kotlin/query/CountTest.kt +++ b/src/jvm/src/test/kotlin/query/CountQueryTest.kt @@ -13,8 +13,8 @@ import kotlin.test.assertEquals /** * Unit tests for the `Count` object */ -@DisplayName("Kotlin | Common | Query: Count") -class CountTest { +@DisplayName("JVM | Kotlin | Query | CountQuery") +class CountQueryTest { /** Test table name */ private val tbl = "test_table" @@ -30,7 +30,7 @@ class CountTest { @Test @DisplayName("all generates correctly") fun all() = - assertEquals("SELECT COUNT(*) AS it FROM $tbl", Count.all(tbl), "Count query not constructed correctly") + assertEquals("SELECT COUNT(*) AS it FROM $tbl", CountQuery.all(tbl), "Count query not constructed correctly") @Test @DisplayName("byFields generates correctly (PostgreSQL)") @@ -38,7 +38,7 @@ class CountTest { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( "SELECT COUNT(*) AS it FROM $tbl WHERE data->>'test' = :field0", - Count.byFields(tbl, listOf(Field.equal("test", "", ":field0"))), + CountQuery.byFields(tbl, listOf(Field.equal("test", "", ":field0"))), "Count query not constructed correctly" ) } @@ -49,7 +49,7 @@ class CountTest { Configuration.dialectValue = Dialect.SQLITE assertEquals( "SELECT COUNT(*) AS it FROM $tbl WHERE data->>'test' = :field0", - Count.byFields(tbl, listOf(Field.equal("test", "", ":field0"))), + CountQuery.byFields(tbl, listOf(Field.equal("test", "", ":field0"))), "Count query not constructed correctly" ) } @@ -59,7 +59,7 @@ class CountTest { fun byContainsPostgres() { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( - "SELECT COUNT(*) AS it FROM $tbl WHERE data @> :criteria", Count.byContains(tbl), + "SELECT COUNT(*) AS it FROM $tbl WHERE data @> :criteria", CountQuery.byContains(tbl), "Count query not constructed correctly" ) } @@ -68,7 +68,7 @@ class CountTest { @DisplayName("byContains fails (SQLite)") fun byContainsSQLite() { Configuration.dialectValue = Dialect.SQLITE - assertThrows { Count.byContains(tbl) } + assertThrows { CountQuery.byContains(tbl) } } @Test @@ -77,7 +77,7 @@ class CountTest { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( "SELECT COUNT(*) AS it FROM $tbl WHERE jsonb_path_exists(data, :path::jsonpath)", - Count.byJsonPath(tbl), "Count query not constructed correctly" + CountQuery.byJsonPath(tbl), "Count query not constructed correctly" ) } @@ -85,6 +85,6 @@ class CountTest { @DisplayName("byJsonPath fails (SQLite)") fun byJsonPathSQLite() { Configuration.dialectValue = Dialect.SQLITE - assertThrows { Count.byJsonPath(tbl) } + assertThrows { CountQuery.byJsonPath(tbl) } } } diff --git a/src/jvm/src/test/kotlin/query/DefinitionTest.kt b/src/jvm/src/test/kotlin/query/DefinitionQueryTest.kt similarity index 80% rename from src/jvm/src/test/kotlin/query/DefinitionTest.kt rename to src/jvm/src/test/kotlin/query/DefinitionQueryTest.kt index 4a37200..71d1fef 100644 --- a/src/jvm/src/test/kotlin/query/DefinitionTest.kt +++ b/src/jvm/src/test/kotlin/query/DefinitionQueryTest.kt @@ -13,8 +13,8 @@ import kotlin.test.assertEquals /** * Unit tests for the `Definition` object */ -@DisplayName("Kotlin | Common | Query: Definition") -class DefinitionTest { +@DisplayName("JVM | Kotlin | Query | DefinitionQuery") +class DefinitionQueryTest { /** Test table name */ private val tbl = "test_table" @@ -32,27 +32,27 @@ class DefinitionTest { fun ensureTableFor() = assertEquals( "CREATE TABLE IF NOT EXISTS my.table (data JSONB NOT NULL)", - Definition.ensureTableFor("my.table", "JSONB"), "CREATE TABLE statement not constructed correctly" + DefinitionQuery.ensureTableFor("my.table", "JSONB"), "CREATE TABLE statement not constructed correctly" ) @Test @DisplayName("ensureTable generates correctly (PostgreSQL)") fun ensureTablePostgres() { Configuration.dialectValue = Dialect.POSTGRESQL - assertEquals("CREATE TABLE IF NOT EXISTS $tbl (data JSONB NOT NULL)", Definition.ensureTable(tbl)) + assertEquals("CREATE TABLE IF NOT EXISTS $tbl (data JSONB NOT NULL)", DefinitionQuery.ensureTable(tbl)) } @Test @DisplayName("ensureTable generates correctly (SQLite)") fun ensureTableSQLite() { Configuration.dialectValue = Dialect.SQLITE - assertEquals("CREATE TABLE IF NOT EXISTS $tbl (data TEXT NOT NULL)", Definition.ensureTable(tbl)) + assertEquals("CREATE TABLE IF NOT EXISTS $tbl (data TEXT NOT NULL)", DefinitionQuery.ensureTable(tbl)) } @Test @DisplayName("ensureTable fails when no dialect is set") fun ensureTableFailsUnknown() { - assertThrows { Definition.ensureTable(tbl) } + assertThrows { DefinitionQuery.ensureTable(tbl) } } @Test @@ -60,7 +60,7 @@ class DefinitionTest { fun ensureKeyWithSchema() = assertEquals( "CREATE UNIQUE INDEX IF NOT EXISTS idx_table_key ON test.table ((data->>'id'))", - Definition.ensureKey("test.table", Dialect.POSTGRESQL), + DefinitionQuery.ensureKey("test.table", Dialect.POSTGRESQL), "CREATE INDEX for key statement with schema not constructed correctly" ) @@ -69,7 +69,7 @@ class DefinitionTest { fun ensureKeyWithoutSchema() = assertEquals( "CREATE UNIQUE INDEX IF NOT EXISTS idx_${tbl}_key ON $tbl ((data->>'id'))", - Definition.ensureKey(tbl, Dialect.SQLITE), + DefinitionQuery.ensureKey(tbl, Dialect.SQLITE), "CREATE INDEX for key statement without schema not constructed correctly" ) @@ -78,7 +78,7 @@ class DefinitionTest { fun ensureIndexOnMultipleFields() = assertEquals( "CREATE INDEX IF NOT EXISTS idx_table_gibberish ON test.table ((data->>'taco'), (data->>'guac') DESC, (data->>'salsa') ASC)", - Definition.ensureIndexOn( + DefinitionQuery.ensureIndexOn( "test.table", "gibberish", listOf("taco", "guac DESC", "salsa ASC"), Dialect.POSTGRESQL ), @@ -90,7 +90,7 @@ class DefinitionTest { fun ensureIndexOnNestedPostgres() = assertEquals( "CREATE INDEX IF NOT EXISTS idx_${tbl}_nest ON $tbl ((data#>>'{a,b,c}'))", - Definition.ensureIndexOn(tbl, "nest", listOf("a.b.c"), Dialect.POSTGRESQL), + DefinitionQuery.ensureIndexOn(tbl, "nest", listOf("a.b.c"), Dialect.POSTGRESQL), "CREATE INDEX for nested PostgreSQL field incorrect" ) @@ -99,7 +99,7 @@ class DefinitionTest { fun ensureIndexOnNestedSQLite() = assertEquals( "CREATE INDEX IF NOT EXISTS idx_${tbl}_nest ON $tbl ((data->'a'->'b'->>'c'))", - Definition.ensureIndexOn(tbl, "nest", listOf("a.b.c"), Dialect.SQLITE), + DefinitionQuery.ensureIndexOn(tbl, "nest", listOf("a.b.c"), Dialect.SQLITE), "CREATE INDEX for nested SQLite field incorrect" ) @@ -109,7 +109,7 @@ class DefinitionTest { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( "CREATE INDEX IF NOT EXISTS idx_${tbl}_document ON $tbl USING GIN (data)", - Definition.ensureDocumentIndexOn(tbl, DocumentIndex.FULL), + DefinitionQuery.ensureDocumentIndexOn(tbl, DocumentIndex.FULL), "CREATE INDEX for full document index incorrect" ) } @@ -120,7 +120,7 @@ class DefinitionTest { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( "CREATE INDEX IF NOT EXISTS idx_${tbl}_document ON $tbl USING GIN (data jsonb_path_ops)", - Definition.ensureDocumentIndexOn(tbl, DocumentIndex.OPTIMIZED), + DefinitionQuery.ensureDocumentIndexOn(tbl, DocumentIndex.OPTIMIZED), "CREATE INDEX for optimized document index incorrect" ) } @@ -129,6 +129,6 @@ class DefinitionTest { @DisplayName("ensureDocumentIndexOn fails for SQLite") fun ensureDocumentIndexOnFailsSQLite() { Configuration.dialectValue = Dialect.SQLITE - assertThrows { Definition.ensureDocumentIndexOn(tbl, DocumentIndex.FULL) } + assertThrows { DefinitionQuery.ensureDocumentIndexOn(tbl, DocumentIndex.FULL) } } } diff --git a/src/jvm/src/test/kotlin/query/DeleteTest.kt b/src/jvm/src/test/kotlin/query/DeleteQueryTest.kt similarity index 75% rename from src/jvm/src/test/kotlin/query/DeleteTest.kt rename to src/jvm/src/test/kotlin/query/DeleteQueryTest.kt index dfdd80a..330b816 100644 --- a/src/jvm/src/test/kotlin/query/DeleteTest.kt +++ b/src/jvm/src/test/kotlin/query/DeleteQueryTest.kt @@ -13,8 +13,8 @@ import kotlin.test.assertEquals /** * Unit tests for the `Delete` object */ -@DisplayName("Kotlin | Common | Query: Delete") -class DeleteTest { +@DisplayName("JVM | Kotlin | Query | DeleteQuery") +class DeleteQueryTest { /** Test table name */ private val tbl = "test_table" @@ -33,7 +33,7 @@ class DeleteTest { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( "DELETE FROM $tbl WHERE data->>'id' = :id", - Delete.byId(tbl), "Delete query not constructed correctly" + DeleteQuery.byId(tbl), "Delete query not constructed correctly" ) } @@ -43,7 +43,7 @@ class DeleteTest { Configuration.dialectValue = Dialect.SQLITE assertEquals( "DELETE FROM $tbl WHERE data->>'id' = :id", - Delete.byId(tbl), "Delete query not constructed correctly" + DeleteQuery.byId(tbl), "Delete query not constructed correctly" ) } @@ -52,7 +52,7 @@ class DeleteTest { fun byFieldsPostgres() { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( - "DELETE FROM $tbl WHERE data->>'a' = :b", Delete.byFields(tbl, listOf(Field.equal("a", "", ":b"))), + "DELETE FROM $tbl WHERE data->>'a' = :b", DeleteQuery.byFields(tbl, listOf(Field.equal("a", "", ":b"))), "Delete query not constructed correctly" ) } @@ -62,7 +62,7 @@ class DeleteTest { fun byFieldsSQLite() { Configuration.dialectValue = Dialect.SQLITE assertEquals( - "DELETE FROM $tbl WHERE data->>'a' = :b", Delete.byFields(tbl, listOf(Field.equal("a", "", ":b"))), + "DELETE FROM $tbl WHERE data->>'a' = :b", DeleteQuery.byFields(tbl, listOf(Field.equal("a", "", ":b"))), "Delete query not constructed correctly" ) } @@ -72,7 +72,7 @@ class DeleteTest { fun byContainsPostgres() { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( - "DELETE FROM $tbl WHERE data @> :criteria", Delete.byContains(tbl), "Delete query not constructed correctly" + "DELETE FROM $tbl WHERE data @> :criteria", DeleteQuery.byContains(tbl), "Delete query not constructed correctly" ) } @@ -80,7 +80,7 @@ class DeleteTest { @DisplayName("byContains fails (SQLite)") fun byContainsSQLite() { Configuration.dialectValue = Dialect.SQLITE - assertThrows { Delete.byContains(tbl) } + assertThrows { DeleteQuery.byContains(tbl) } } @Test @@ -88,7 +88,7 @@ class DeleteTest { fun byJsonPathPostgres() { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( - "DELETE FROM $tbl WHERE jsonb_path_exists(data, :path::jsonpath)", Delete.byJsonPath(tbl), + "DELETE FROM $tbl WHERE jsonb_path_exists(data, :path::jsonpath)", DeleteQuery.byJsonPath(tbl), "Delete query not constructed correctly" ) } @@ -97,6 +97,6 @@ class DeleteTest { @DisplayName("byJsonPath fails (SQLite)") fun byJsonPathSQLite() { Configuration.dialectValue = Dialect.SQLITE - assertThrows { Delete.byJsonPath(tbl) } + assertThrows { DeleteQuery.byJsonPath(tbl) } } } diff --git a/src/jvm/src/test/kotlin/query/DocumentTest.kt b/src/jvm/src/test/kotlin/query/DocumentQueryTest.kt similarity index 85% rename from src/jvm/src/test/kotlin/query/DocumentTest.kt rename to src/jvm/src/test/kotlin/query/DocumentQueryTest.kt index 6566c7f..bb6d5bc 100644 --- a/src/jvm/src/test/kotlin/query/DocumentTest.kt +++ b/src/jvm/src/test/kotlin/query/DocumentQueryTest.kt @@ -14,8 +14,8 @@ import kotlin.test.assertTrue /** * Unit tests for the `Document` object */ -@DisplayName("Kotlin | Common | Query: Document") -class DocumentTest { +@DisplayName("JVM | Kotlin | Query | DocumentQuery") +class DocumentQueryTest { /** Test table name */ private val tbl = "test_table" @@ -32,14 +32,14 @@ class DocumentTest { @DisplayName("insert generates no auto ID (PostgreSQL)") fun insertNoAutoPostgres() { Configuration.dialectValue = Dialect.POSTGRESQL - assertEquals("INSERT INTO $tbl VALUES (:data)", Document.insert(tbl)) + assertEquals("INSERT INTO $tbl VALUES (:data)", DocumentQuery.insert(tbl)) } @Test @DisplayName("insert generates no auto ID (SQLite)") fun insertNoAutoSQLite() { Configuration.dialectValue = Dialect.SQLITE - assertEquals("INSERT INTO $tbl VALUES (:data)", Document.insert(tbl)) + assertEquals("INSERT INTO $tbl VALUES (:data)", DocumentQuery.insert(tbl)) } @Test @@ -49,7 +49,7 @@ class DocumentTest { assertEquals( "INSERT INTO $tbl VALUES (:data::jsonb || ('{\"id\":' " + "|| (SELECT COALESCE(MAX((data->>'id')::numeric), 0) + 1 FROM $tbl) || '}')::jsonb)", - Document.insert(tbl, AutoId.NUMBER) + DocumentQuery.insert(tbl, AutoId.NUMBER) ) } @@ -60,7 +60,7 @@ class DocumentTest { assertEquals( "INSERT INTO $tbl VALUES (json_set(:data, '$.id', " + "(SELECT coalesce(max(data->>'id'), 0) + 1 FROM $tbl)))", - Document.insert(tbl, AutoId.NUMBER) + DocumentQuery.insert(tbl, AutoId.NUMBER) ) } @@ -68,7 +68,7 @@ class DocumentTest { @DisplayName("insert generates auto UUID (PostgreSQL)") fun insertAutoUUIDPostgres() { Configuration.dialectValue = Dialect.POSTGRESQL - val query = Document.insert(tbl, AutoId.UUID) + val query = DocumentQuery.insert(tbl, AutoId.UUID) assertTrue( query.startsWith("INSERT INTO $tbl VALUES (:data::jsonb || '{\"id\":\""), "Query start not correct (actual: $query)" @@ -80,7 +80,7 @@ class DocumentTest { @DisplayName("insert generates auto UUID (SQLite)") fun insertAutoUUIDSQLite() { Configuration.dialectValue = Dialect.SQLITE - val query = Document.insert(tbl, AutoId.UUID) + val query = DocumentQuery.insert(tbl, AutoId.UUID) assertTrue( query.startsWith("INSERT INTO $tbl VALUES (json_set(:data, '$.id', '"), "Query start not correct (actual: $query)" @@ -94,7 +94,7 @@ class DocumentTest { try { Configuration.dialectValue = Dialect.POSTGRESQL Configuration.idStringLength = 8 - val query = Document.insert(tbl, AutoId.RANDOM_STRING) + val query = DocumentQuery.insert(tbl, AutoId.RANDOM_STRING) assertTrue( query.startsWith("INSERT INTO $tbl VALUES (:data::jsonb || '{\"id\":\""), "Query start not correct (actual: $query)" @@ -114,7 +114,7 @@ class DocumentTest { @DisplayName("insert generates auto random string (SQLite)") fun insertAutoRandomSQLite() { Configuration.dialectValue = Dialect.SQLITE - val query = Document.insert(tbl, AutoId.RANDOM_STRING) + val query = DocumentQuery.insert(tbl, AutoId.RANDOM_STRING) assertTrue( query.startsWith("INSERT INTO $tbl VALUES (json_set(:data, '$.id', '"), "Query start not correct (actual: $query)" @@ -130,7 +130,7 @@ class DocumentTest { @Test @DisplayName("insert fails when no dialect is set") fun insertFailsUnknown() { - assertThrows { Document.insert(tbl) } + assertThrows { DocumentQuery.insert(tbl) } } @Test @@ -139,12 +139,12 @@ class DocumentTest { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( "INSERT INTO $tbl VALUES (:data) ON CONFLICT ((data->>'id')) DO UPDATE SET data = EXCLUDED.data", - Document.save(tbl), "INSERT ON CONFLICT UPDATE statement not constructed correctly" + DocumentQuery.save(tbl), "INSERT ON CONFLICT UPDATE statement not constructed correctly" ) } @Test @DisplayName("update generates successfully") fun update() = - assertEquals("UPDATE $tbl SET data = :data", Document.update(tbl), "Update query not constructed correctly") + assertEquals("UPDATE $tbl SET data = :data", DocumentQuery.update(tbl), "Update query not constructed correctly") } diff --git a/src/jvm/src/test/kotlin/query/ExistsTest.kt b/src/jvm/src/test/kotlin/query/ExistsQueryTest.kt similarity index 82% rename from src/jvm/src/test/kotlin/query/ExistsTest.kt rename to src/jvm/src/test/kotlin/query/ExistsQueryTest.kt index fb22189..d9d09e2 100644 --- a/src/jvm/src/test/kotlin/query/ExistsTest.kt +++ b/src/jvm/src/test/kotlin/query/ExistsQueryTest.kt @@ -14,7 +14,7 @@ import kotlin.test.assertEquals * Unit tests for the `Exists` object */ @DisplayName("Kotlin | Common | Query: Exists") -class ExistsTest { +class ExistsQueryTest { /** Test table name */ private val tbl = "test_table" @@ -33,7 +33,7 @@ class ExistsTest { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( "SELECT EXISTS (SELECT 1 FROM $tbl WHERE data->>'id' = :id) AS it", - Exists.byId(tbl), "Exists query not constructed correctly" + ExistsQuery.byId(tbl), "Exists query not constructed correctly" ) } @@ -43,7 +43,7 @@ class ExistsTest { Configuration.dialectValue = Dialect.SQLITE assertEquals( "SELECT EXISTS (SELECT 1 FROM $tbl WHERE data->>'id' = :id) AS it", - Exists.byId(tbl), "Exists query not constructed correctly" + ExistsQuery.byId(tbl), "Exists query not constructed correctly" ) } @@ -53,7 +53,7 @@ class ExistsTest { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( "SELECT EXISTS (SELECT 1 FROM $tbl WHERE (data->>'it')::numeric = :test) AS it", - Exists.byFields(tbl, listOf(Field.equal("it", 7, ":test"))), + ExistsQuery.byFields(tbl, listOf(Field.equal("it", 7, ":test"))), "Exists query not constructed correctly" ) } @@ -64,7 +64,7 @@ class ExistsTest { Configuration.dialectValue = Dialect.SQLITE assertEquals( "SELECT EXISTS (SELECT 1 FROM $tbl WHERE data->>'it' = :test) AS it", - Exists.byFields(tbl, listOf(Field.equal("it", 7, ":test"))), + ExistsQuery.byFields(tbl, listOf(Field.equal("it", 7, ":test"))), "Exists query not constructed correctly" ) } @@ -74,7 +74,7 @@ class ExistsTest { fun byContainsPostgres() { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( - "SELECT EXISTS (SELECT 1 FROM $tbl WHERE data @> :criteria) AS it", Exists.byContains(tbl), + "SELECT EXISTS (SELECT 1 FROM $tbl WHERE data @> :criteria) AS it", ExistsQuery.byContains(tbl), "Exists query not constructed correctly" ) } @@ -83,7 +83,7 @@ class ExistsTest { @DisplayName("byContains fails (SQLite)") fun byContainsSQLite() { Configuration.dialectValue = Dialect.SQLITE - assertThrows { Exists.byContains(tbl) } + assertThrows { ExistsQuery.byContains(tbl) } } @Test @@ -92,7 +92,7 @@ class ExistsTest { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( "SELECT EXISTS (SELECT 1 FROM $tbl WHERE jsonb_path_exists(data, :path::jsonpath)) AS it", - Exists.byJsonPath(tbl), "Exists query not constructed correctly" + ExistsQuery.byJsonPath(tbl), "Exists query not constructed correctly" ) } @@ -100,6 +100,6 @@ class ExistsTest { @DisplayName("byJsonPath fails (SQLite)") fun byJsonPathSQLite() { Configuration.dialectValue = Dialect.SQLITE - assertThrows { Exists.byJsonPath(tbl) } + assertThrows { ExistsQuery.byJsonPath(tbl) } } } diff --git a/src/jvm/src/test/kotlin/query/FindTest.kt b/src/jvm/src/test/kotlin/query/FindQueryTest.kt similarity index 63% rename from src/jvm/src/test/kotlin/query/FindTest.kt rename to src/jvm/src/test/kotlin/query/FindQueryTest.kt index 5ad3e5a..faeb505 100644 --- a/src/jvm/src/test/kotlin/query/FindTest.kt +++ b/src/jvm/src/test/kotlin/query/FindQueryTest.kt @@ -8,16 +8,14 @@ import solutions.bitbadger.documents.Configuration import solutions.bitbadger.documents.Dialect import solutions.bitbadger.documents.DocumentException import solutions.bitbadger.documents.Field +import solutions.bitbadger.documents.support.TEST_TABLE import kotlin.test.assertEquals /** * Unit tests for the `Find` object */ -@DisplayName("Kotlin | Common | Query: Find") -class FindTest { - - /** Test table name */ - private val tbl = "test_table" +@DisplayName("JVM | Kotlin | Query | FindQuery") +class FindQueryTest { /** * Clear the connection string (resets Dialect) @@ -30,15 +28,15 @@ class FindTest { @Test @DisplayName("all generates correctly") fun all() = - assertEquals("SELECT data FROM $tbl", Find.all(tbl), "Find query not constructed correctly") + assertEquals("SELECT data FROM $TEST_TABLE", FindQuery.all(TEST_TABLE), "Find query not constructed correctly") @Test @DisplayName("byId generates correctly (PostgreSQL)") fun byIdPostgres() { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( - "SELECT data FROM $tbl WHERE data->>'id' = :id", - Find.byId(tbl), "Find query not constructed correctly" + "SELECT data FROM $TEST_TABLE WHERE data->>'id' = :id", + FindQuery.byId(TEST_TABLE), "Find query not constructed correctly" ) } @@ -47,8 +45,8 @@ class FindTest { fun byIdSQLite() { Configuration.dialectValue = Dialect.SQLITE assertEquals( - "SELECT data FROM $tbl WHERE data->>'id' = :id", - Find.byId(tbl), "Find query not constructed correctly" + "SELECT data FROM $TEST_TABLE WHERE data->>'id' = :id", + FindQuery.byId(TEST_TABLE), "Find query not constructed correctly" ) } @@ -57,8 +55,8 @@ class FindTest { fun byFieldsPostgres() { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( - "SELECT data FROM $tbl WHERE data->>'a' = :b AND (data->>'c')::numeric < :d", - Find.byFields(tbl, listOf(Field.equal("a", "", ":b"), Field.less("c", 14, ":d"))), + "SELECT data FROM $TEST_TABLE WHERE data->>'a' = :b AND (data->>'c')::numeric < :d", + FindQuery.byFields(TEST_TABLE, listOf(Field.equal("a", "", ":b"), Field.less("c", 14, ":d"))), "Find query not constructed correctly" ) } @@ -68,8 +66,8 @@ class FindTest { fun byFieldsSQLite() { Configuration.dialectValue = Dialect.SQLITE assertEquals( - "SELECT data FROM $tbl WHERE data->>'a' = :b AND data->>'c' < :d", - Find.byFields(tbl, listOf(Field.equal("a", "", ":b"), Field.less("c", 14, ":d"))), + "SELECT data FROM $TEST_TABLE WHERE data->>'a' = :b AND data->>'c' < :d", + FindQuery.byFields(TEST_TABLE, listOf(Field.equal("a", "", ":b"), Field.less("c", 14, ":d"))), "Find query not constructed correctly" ) } @@ -79,7 +77,7 @@ class FindTest { fun byContainsPostgres() { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( - "SELECT data FROM $tbl WHERE data @> :criteria", Find.byContains(tbl), + "SELECT data FROM $TEST_TABLE WHERE data @> :criteria", FindQuery.byContains(TEST_TABLE), "Find query not constructed correctly" ) } @@ -88,7 +86,7 @@ class FindTest { @DisplayName("byContains fails (SQLite)") fun byContainsSQLite() { Configuration.dialectValue = Dialect.SQLITE - assertThrows { Find.byContains(tbl) } + assertThrows { FindQuery.byContains(TEST_TABLE) } } @Test @@ -96,7 +94,8 @@ class FindTest { fun byJsonPathPostgres() { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( - "SELECT data FROM $tbl WHERE jsonb_path_exists(data, :path::jsonpath)", Find.byJsonPath(tbl), + "SELECT data FROM $TEST_TABLE WHERE jsonb_path_exists(data, :path::jsonpath)", + FindQuery.byJsonPath(TEST_TABLE), "Find query not constructed correctly" ) } @@ -105,6 +104,6 @@ class FindTest { @DisplayName("byJsonPath fails (SQLite)") fun byJsonPathSQLite() { Configuration.dialectValue = Dialect.SQLITE - assertThrows { Find.byJsonPath(tbl) } + assertThrows { FindQuery.byJsonPath(TEST_TABLE) } } } diff --git a/src/jvm/src/test/kotlin/query/PatchTest.kt b/src/jvm/src/test/kotlin/query/PatchQueryTest.kt similarity index 80% rename from src/jvm/src/test/kotlin/query/PatchTest.kt rename to src/jvm/src/test/kotlin/query/PatchQueryTest.kt index fd0cfad..0afcdf8 100644 --- a/src/jvm/src/test/kotlin/query/PatchTest.kt +++ b/src/jvm/src/test/kotlin/query/PatchQueryTest.kt @@ -13,8 +13,8 @@ import kotlin.test.assertEquals /** * Unit tests for the `Patch` object */ -@DisplayName("Kotlin | Common | Query: Patch") -class PatchTest { +@DisplayName("JVM | Kotlin | Query | PatchQuery") +class PatchQueryTest { /** Test table name */ private val tbl = "test_table" @@ -33,7 +33,7 @@ class PatchTest { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( "UPDATE $tbl SET data = data || :data WHERE data->>'id' = :id", - Patch.byId(tbl), "Patch query not constructed correctly" + PatchQuery.byId(tbl), "Patch query not constructed correctly" ) } @@ -43,7 +43,7 @@ class PatchTest { Configuration.dialectValue = Dialect.SQLITE assertEquals( "UPDATE $tbl SET data = json_patch(data, json(:data)) WHERE data->>'id' = :id", - Patch.byId(tbl), "Patch query not constructed correctly" + PatchQuery.byId(tbl), "Patch query not constructed correctly" ) } @@ -53,7 +53,7 @@ class PatchTest { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( "UPDATE $tbl SET data = data || :data WHERE data->>'z' = :y", - Patch.byFields(tbl, listOf(Field.equal("z", "", ":y"))), + PatchQuery.byFields(tbl, listOf(Field.equal("z", "", ":y"))), "Patch query not constructed correctly" ) } @@ -64,7 +64,7 @@ class PatchTest { Configuration.dialectValue = Dialect.SQLITE assertEquals( "UPDATE $tbl SET data = json_patch(data, json(:data)) WHERE data->>'z' = :y", - Patch.byFields(tbl, listOf(Field.equal("z", "", ":y"))), + PatchQuery.byFields(tbl, listOf(Field.equal("z", "", ":y"))), "Patch query not constructed correctly" ) } @@ -74,7 +74,7 @@ class PatchTest { fun byContainsPostgres() { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( - "UPDATE $tbl SET data = data || :data WHERE data @> :criteria", Patch.byContains(tbl), + "UPDATE $tbl SET data = data || :data WHERE data @> :criteria", PatchQuery.byContains(tbl), "Patch query not constructed correctly" ) } @@ -83,7 +83,7 @@ class PatchTest { @DisplayName("byContains fails (SQLite)") fun byContainsSQLite() { Configuration.dialectValue = Dialect.SQLITE - assertThrows { Patch.byContains(tbl) } + assertThrows { PatchQuery.byContains(tbl) } } @Test @@ -92,7 +92,7 @@ class PatchTest { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( "UPDATE $tbl SET data = data || :data WHERE jsonb_path_exists(data, :path::jsonpath)", - Patch.byJsonPath(tbl), "Patch query not constructed correctly" + PatchQuery.byJsonPath(tbl), "Patch query not constructed correctly" ) } @@ -100,6 +100,6 @@ class PatchTest { @DisplayName("byJsonPath fails (SQLite)") fun byJsonPathSQLite() { Configuration.dialectValue = Dialect.SQLITE - assertThrows { Patch.byJsonPath(tbl) } + assertThrows { PatchQuery.byJsonPath(tbl) } } } diff --git a/src/jvm/src/test/kotlin/query/QueryTest.kt b/src/jvm/src/test/kotlin/query/QueryTest.kt index 6788ac4..c16b31a 100644 --- a/src/jvm/src/test/kotlin/query/QueryTest.kt +++ b/src/jvm/src/test/kotlin/query/QueryTest.kt @@ -10,9 +10,9 @@ import solutions.bitbadger.documents.FieldMatch import kotlin.test.assertEquals /** - * Unit tests for the top-level query functions + * Unit tests for the package-level query functions */ -@DisplayName("Kotlin | Common | Query") +@DisplayName("JVM | Kotlin | Query | Package Functions") class QueryTest { /** diff --git a/src/jvm/src/test/kotlin/query/RemoveFieldsTest.kt b/src/jvm/src/test/kotlin/query/RemoveFieldsQueryTest.kt similarity index 82% rename from src/jvm/src/test/kotlin/query/RemoveFieldsTest.kt rename to src/jvm/src/test/kotlin/query/RemoveFieldsQueryTest.kt index 34fce2d..d042f17 100644 --- a/src/jvm/src/test/kotlin/query/RemoveFieldsTest.kt +++ b/src/jvm/src/test/kotlin/query/RemoveFieldsQueryTest.kt @@ -10,8 +10,8 @@ import kotlin.test.assertEquals /** * Unit tests for the `RemoveFields` object */ -@DisplayName("Kotlin | Common | Query: RemoveFields") -class RemoveFieldsTest { +@DisplayName("JVM | Kotlin | Query | RemoveFieldsQuery") +class RemoveFieldsQueryTest { /** Test table name */ private val tbl = "test_table" @@ -30,7 +30,7 @@ class RemoveFieldsTest { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( "UPDATE $tbl SET data = data - :name::text[] WHERE data->>'id' = :id", - RemoveFields.byId(tbl, listOf(Parameter(":name", ParameterType.STRING, "{a,z}"))), + RemoveFieldsQuery.byId(tbl, listOf(Parameter(":name", ParameterType.STRING, "{a,z}"))), "Remove Fields query not constructed correctly" ) } @@ -41,7 +41,7 @@ class RemoveFieldsTest { Configuration.dialectValue = Dialect.SQLITE assertEquals( "UPDATE $tbl SET data = json_remove(data, :name0, :name1) WHERE data->>'id' = :id", - RemoveFields.byId( + RemoveFieldsQuery.byId( tbl, listOf( Parameter(":name0", ParameterType.STRING, "a"), @@ -58,7 +58,7 @@ class RemoveFieldsTest { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( "UPDATE $tbl SET data = data - :name::text[] WHERE data->>'f' > :g", - RemoveFields.byFields( + RemoveFieldsQuery.byFields( tbl, listOf(Parameter(":name", ParameterType.STRING, "{b,c}")), listOf(Field.greater("f", "", ":g")) @@ -73,7 +73,7 @@ class RemoveFieldsTest { Configuration.dialectValue = Dialect.SQLITE assertEquals( "UPDATE $tbl SET data = json_remove(data, :name0, :name1) WHERE data->>'f' > :g", - RemoveFields.byFields( + RemoveFieldsQuery.byFields( tbl, listOf(Parameter(":name0", ParameterType.STRING, "b"), Parameter(":name1", ParameterType.STRING, "c")), listOf(Field.greater("f", "", ":g")) @@ -88,7 +88,7 @@ class RemoveFieldsTest { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( "UPDATE $tbl SET data = data - :name::text[] WHERE data @> :criteria", - RemoveFields.byContains(tbl, listOf(Parameter(":name", ParameterType.STRING, "{m,n}"))), + RemoveFieldsQuery.byContains(tbl, listOf(Parameter(":name", ParameterType.STRING, "{m,n}"))), "Remove Field query not constructed correctly" ) } @@ -97,7 +97,7 @@ class RemoveFieldsTest { @DisplayName("byContains fails (SQLite)") fun byContainsSQLite() { Configuration.dialectValue = Dialect.SQLITE - assertThrows { RemoveFields.byContains(tbl, listOf()) } + assertThrows { RemoveFieldsQuery.byContains(tbl, listOf()) } } @Test @@ -106,7 +106,7 @@ class RemoveFieldsTest { Configuration.dialectValue = Dialect.POSTGRESQL assertEquals( "UPDATE $tbl SET data = data - :name::text[] WHERE jsonb_path_exists(data, :path::jsonpath)", - RemoveFields.byJsonPath(tbl, listOf(Parameter(":name", ParameterType.STRING, "{o,p}"))), + RemoveFieldsQuery.byJsonPath(tbl, listOf(Parameter(":name", ParameterType.STRING, "{o,p}"))), "Remove Field query not constructed correctly" ) } @@ -115,6 +115,6 @@ class RemoveFieldsTest { @DisplayName("byJsonPath fails (SQLite)") fun byJsonPathSQLite() { Configuration.dialectValue = Dialect.SQLITE - assertThrows { RemoveFields.byJsonPath(tbl, listOf()) } + assertThrows { RemoveFieldsQuery.byJsonPath(tbl, listOf()) } } } \ No newline at end of file diff --git a/src/jvm/src/test/kotlin/query/WhereTest.kt b/src/jvm/src/test/kotlin/query/WhereTest.kt index cdac60d..95d68d8 100644 --- a/src/jvm/src/test/kotlin/query/WhereTest.kt +++ b/src/jvm/src/test/kotlin/query/WhereTest.kt @@ -10,7 +10,7 @@ import kotlin.test.assertEquals /** * Unit tests for the `Where` object */ -@DisplayName("Kotlin | Common | Query: Where") +@DisplayName("JVM | Kotlin | Query | Where") class WhereTest { /** diff --git a/src/jvm/src/test/kotlin/support/Types.kt b/src/jvm/src/test/kotlin/support/Types.kt index 97385e2..d56f23b 100644 --- a/src/jvm/src/test/kotlin/support/Types.kt +++ b/src/jvm/src/test/kotlin/support/Types.kt @@ -1,22 +1,18 @@ package solutions.bitbadger.documents.support -import kotlinx.serialization.Serializable import solutions.bitbadger.documents.extensions.insert /** The test table name to use for integration tests */ const val TEST_TABLE = "test_table" -@Serializable data class NumIdDocument(val key: Int, val text: String) { constructor() : this(0, "") } -@Serializable data class SubDocument(val foo: String, val bar: String) { constructor() : this("", "") } -@Serializable data class ArrayDocument(val id: String, val values: List) { constructor() : this("", listOf()) @@ -31,7 +27,6 @@ data class ArrayDocument(val id: String, val values: List) { } } -@Serializable data class JsonDocument(val id: String, val value: String = "", val numValue: Int = 0, val sub: SubDocument? = null) { constructor() : this("") @@ -50,3 +45,11 @@ data class JsonDocument(val id: String, val value: String = "", val numValue: In testDocuments.forEach { db.conn.insert(tableName, it) } } } + +// Test classes for AutoId generation + +data class ByteIdClass(val id: Byte) +data class ShortIdClass(val id: Short) +data class IntIdClass(val id: Int) +data class LongIdClass(val id: Long) +data class StringIdClass(val id: String) diff --git a/src/kotlin/pom.xml b/src/kotlin/pom.xml index 9889629..5549ee3 100644 --- a/src/kotlin/pom.xml +++ b/src/kotlin/pom.xml @@ -30,8 +30,6 @@ solutions.bitbadger.documents jvm 4.0.0-alpha1-SNAPSHOT - system - ${project.basedir}/../jvm/target/jvm-4.0.0-alpha1-SNAPSHOT.jar jar diff --git a/src/kotlin/src/main/kotlin/Count.kt b/src/kotlin/src/main/kotlin/Count.kt index d8fbf7b..c3b3ef5 100644 --- a/src/kotlin/src/main/kotlin/Count.kt +++ b/src/kotlin/src/main/kotlin/Count.kt @@ -2,7 +2,7 @@ package solutions.bitbadger.documents.kotlin import solutions.bitbadger.documents.* import solutions.bitbadger.documents.kotlin.extensions.* -import solutions.bitbadger.documents.query.Count +import solutions.bitbadger.documents.query.CountQuery import java.sql.Connection @@ -19,7 +19,7 @@ object Count { * @return A count of the documents in the table */ fun all(tableName: String, conn: Connection) = - conn.customScalar(Count.all(tableName), mapFunc = Results::toCount) + conn.customScalar(CountQuery.all(tableName), mapFunc = Results::toCount) /** * Count all documents in the table @@ -47,7 +47,7 @@ object Count { ): Long { val named = Parameters.nameFields(fields) return conn.customScalar( - Count.byFields(tableName, named, howMatched), + CountQuery.byFields(tableName, named, howMatched), Parameters.addFields(named), Results::toCount ) @@ -74,7 +74,7 @@ object Count { * @throws DocumentException If called on a SQLite connection */ inline fun byContains(tableName: String, criteria: TContains, conn: Connection) = - conn.customScalar(Count.byContains(tableName), listOf(Parameters.json(":criteria", criteria)), Results::toCount) + conn.customScalar(CountQuery.byContains(tableName), listOf(Parameters.json(":criteria", criteria)), Results::toCount) /** * Count documents using a JSON containment query (PostgreSQL only) @@ -98,7 +98,7 @@ object Count { */ fun byJsonPath(tableName: String, path: String, conn: Connection) = conn.customScalar( - Count.byJsonPath(tableName), + CountQuery.byJsonPath(tableName), listOf(Parameter(":path", ParameterType.STRING, path)), Results::toCount ) diff --git a/src/kotlin/src/main/kotlin/Delete.kt b/src/kotlin/src/main/kotlin/Delete.kt index e670d48..9cdaa42 100644 --- a/src/kotlin/src/main/kotlin/Delete.kt +++ b/src/kotlin/src/main/kotlin/Delete.kt @@ -3,7 +3,7 @@ package solutions.bitbadger.documents.kotlin import solutions.bitbadger.documents.* import solutions.bitbadger.documents.jvm.Delete as JvmDelete import solutions.bitbadger.documents.kotlin.extensions.* -import solutions.bitbadger.documents.query.Delete +import solutions.bitbadger.documents.query.DeleteQuery import java.sql.Connection /** @@ -60,7 +60,7 @@ object Delete { * @throws DocumentException If called on a SQLite connection */ inline fun byContains(tableName: String, criteria: TContains, conn: Connection) = - conn.customNonQuery(Delete.byContains(tableName), listOf(Parameters.json(":criteria", criteria))) + conn.customNonQuery(DeleteQuery.byContains(tableName), listOf(Parameters.json(":criteria", criteria))) /** * Delete documents using a JSON containment query (PostgreSQL only) diff --git a/src/kotlin/src/main/kotlin/Document.kt b/src/kotlin/src/main/kotlin/Document.kt index 2c2547e..4b391b3 100644 --- a/src/kotlin/src/main/kotlin/Document.kt +++ b/src/kotlin/src/main/kotlin/Document.kt @@ -5,7 +5,7 @@ import solutions.bitbadger.documents.Configuration import solutions.bitbadger.documents.Dialect import solutions.bitbadger.documents.Field import solutions.bitbadger.documents.extensions.customNonQuery -import solutions.bitbadger.documents.query.Document +import solutions.bitbadger.documents.query.DocumentQuery import solutions.bitbadger.documents.query.Where import solutions.bitbadger.documents.query.statementWhere import java.sql.Connection @@ -25,7 +25,7 @@ object Document { inline fun insert(tableName: String, document: TDoc, conn: Connection) { val strategy = Configuration.autoIdStrategy val query = if (strategy == AutoId.DISABLED) { - Document.insert(tableName) + DocumentQuery.insert(tableName) } else { val idField = Configuration.idField val dialect = Configuration.dialect("Create auto-ID insert query") @@ -52,7 +52,7 @@ object Document { ":data" } - Document.insert(tableName).replace(":data", dataParam) + DocumentQuery.insert(tableName).replace(":data", dataParam) } conn.customNonQuery(query, listOf(Parameters.json(":data", document))) } @@ -74,7 +74,7 @@ object Document { * @param conn The connection on which the query should be executed */ inline fun save(tableName: String, document: TDoc, conn: Connection) = - conn.customNonQuery(Document.save(tableName), listOf(Parameters.json(":data", document))) + conn.customNonQuery(DocumentQuery.save(tableName), listOf(Parameters.json(":data", document))) /** * Save a document, inserting it if it does not exist and updating it if it does (AKA "upsert") @@ -95,7 +95,7 @@ object Document { */ inline fun update(tableName: String, docId: TKey, document: TDoc, conn: Connection) = conn.customNonQuery( - statementWhere(Document.update(tableName), Where.byId(":id", docId)), + statementWhere(DocumentQuery.update(tableName), Where.byId(":id", docId)), Parameters.addFields( listOf(Field.equal(Configuration.idField, docId, ":id")), mutableListOf(Parameters.json(":data", document)) diff --git a/src/kotlin/src/main/kotlin/Exists.kt b/src/kotlin/src/main/kotlin/Exists.kt index e253bbb..4cbc05b 100644 --- a/src/kotlin/src/main/kotlin/Exists.kt +++ b/src/kotlin/src/main/kotlin/Exists.kt @@ -3,7 +3,7 @@ package solutions.bitbadger.documents.kotlin import solutions.bitbadger.documents.* import solutions.bitbadger.documents.jvm.Exists as JvmExists import solutions.bitbadger.documents.kotlin.extensions.* -import solutions.bitbadger.documents.query.Exists +import solutions.bitbadger.documents.query.ExistsQuery import java.sql.Connection /** @@ -66,7 +66,7 @@ object Exists { */ inline fun byContains(tableName: String, criteria: TContains, conn: Connection) = conn.customScalar( - Exists.byContains(tableName), + ExistsQuery.byContains(tableName), listOf(Parameters.json(":criteria", criteria)), Results::toExists ) diff --git a/src/kotlin/src/main/kotlin/Find.kt b/src/kotlin/src/main/kotlin/Find.kt index a9ecf18..37af42a 100644 --- a/src/kotlin/src/main/kotlin/Find.kt +++ b/src/kotlin/src/main/kotlin/Find.kt @@ -2,7 +2,7 @@ package solutions.bitbadger.documents.kotlin import solutions.bitbadger.documents.* import solutions.bitbadger.documents.kotlin.extensions.* -import solutions.bitbadger.documents.query.Find +import solutions.bitbadger.documents.query.FindQuery import solutions.bitbadger.documents.query.orderBy import java.sql.Connection @@ -20,7 +20,7 @@ object Find { * @return A list of documents from the given table */ inline fun all(tableName: String, orderBy: Collection>? = null, conn: Connection) = - conn.customList(Find.all(tableName) + (orderBy?.let(::orderBy) ?: ""), mapFunc = Results::fromData) + conn.customList(FindQuery.all(tableName) + (orderBy?.let(::orderBy) ?: ""), mapFunc = Results::fromData) /** * Retrieve all documents in the given table @@ -52,7 +52,7 @@ object Find { */ inline fun byId(tableName: String, docId: TKey, conn: Connection) = conn.customSingle( - Find.byId(tableName, docId), + FindQuery.byId(tableName, docId), Parameters.addFields(listOf(Field.equal(Configuration.idField, docId, ":id"))), Results::fromData ) @@ -86,7 +86,7 @@ object Find { ): List { val named = Parameters.nameFields(fields) return conn.customList( - Find.byFields(tableName, named, howMatched) + (orderBy?.let(::orderBy) ?: ""), + FindQuery.byFields(tableName, named, howMatched) + (orderBy?.let(::orderBy) ?: ""), Parameters.addFields(named), Results::fromData ) @@ -158,7 +158,7 @@ object Find { conn: Connection ) = conn.customList( - Find.byContains(tableName) + (orderBy?.let(::orderBy) ?: ""), + FindQuery.byContains(tableName) + (orderBy?.let(::orderBy) ?: ""), listOf(Parameters.json(":criteria", criteria)), Results::fromData ) @@ -223,7 +223,7 @@ object Find { conn: Connection ) = conn.customList( - Find.byJsonPath(tableName) + (orderBy?.let(::orderBy) ?: ""), + FindQuery.byJsonPath(tableName) + (orderBy?.let(::orderBy) ?: ""), listOf(Parameter(":path", ParameterType.STRING, path)), Results::fromData ) @@ -271,7 +271,7 @@ object Find { ): TDoc? { val named = Parameters.nameFields(fields) return conn.customSingle( - Find.byFields(tableName, named, howMatched) + (orderBy?.let(::orderBy) ?: ""), + FindQuery.byFields(tableName, named, howMatched) + (orderBy?.let(::orderBy) ?: ""), Parameters.addFields(named), Results::fromData ) @@ -328,7 +328,7 @@ object Find { conn: Connection ) = conn.customSingle( - Find.byContains(tableName) + (orderBy?.let(::orderBy) ?: ""), + FindQuery.byContains(tableName) + (orderBy?.let(::orderBy) ?: ""), listOf(Parameters.json(":criteria", criteria)), Results::fromData ) @@ -382,7 +382,7 @@ object Find { conn: Connection ) = conn.customSingle( - Find.byJsonPath(tableName) + (orderBy?.let(::orderBy) ?: ""), + FindQuery.byJsonPath(tableName) + (orderBy?.let(::orderBy) ?: ""), listOf(Parameter(":path", ParameterType.STRING, path)), Results::fromData ) diff --git a/src/kotlin/src/main/kotlin/Patch.kt b/src/kotlin/src/main/kotlin/Patch.kt index 097eb2d..e4e4041 100644 --- a/src/kotlin/src/main/kotlin/Patch.kt +++ b/src/kotlin/src/main/kotlin/Patch.kt @@ -2,7 +2,7 @@ package solutions.bitbadger.documents.kotlin import solutions.bitbadger.documents.* import solutions.bitbadger.documents.kotlin.extensions.* -import solutions.bitbadger.documents.query.Patch +import solutions.bitbadger.documents.query.PatchQuery import java.sql.Connection /** @@ -20,7 +20,7 @@ object Patch { */ inline fun byId(tableName: String, docId: TKey, patch: TPatch, conn: Connection) = conn.customNonQuery( - Patch.byId(tableName, docId), + PatchQuery.byId(tableName, docId), Parameters.addFields( listOf(Field.equal(Configuration.idField, docId, ":id")), mutableListOf(Parameters.json(":data", patch)) @@ -55,7 +55,7 @@ object Patch { ) { val named = Parameters.nameFields(fields) conn.customNonQuery( - Patch.byFields(tableName, named, howMatched), Parameters.addFields( + PatchQuery.byFields(tableName, named, howMatched), Parameters.addFields( named, mutableListOf(Parameters.json(":data", patch)) ) @@ -94,7 +94,7 @@ object Patch { conn: Connection ) = conn.customNonQuery( - Patch.byContains(tableName), + PatchQuery.byContains(tableName), listOf(Parameters.json(":criteria", criteria), Parameters.json(":data", patch)) ) @@ -120,7 +120,7 @@ object Patch { */ inline fun byJsonPath(tableName: String, path: String, patch: TPatch, conn: Connection) = conn.customNonQuery( - Patch.byJsonPath(tableName), + PatchQuery.byJsonPath(tableName), listOf(Parameter(":path", ParameterType.STRING, path), Parameters.json(":data", patch)) ) diff --git a/src/kotlin/src/main/kotlin/RemoveFields.kt b/src/kotlin/src/main/kotlin/RemoveFields.kt index f1c7675..f24d855 100644 --- a/src/kotlin/src/main/kotlin/RemoveFields.kt +++ b/src/kotlin/src/main/kotlin/RemoveFields.kt @@ -3,7 +3,7 @@ package solutions.bitbadger.documents.kotlin import solutions.bitbadger.documents.* import solutions.bitbadger.documents.jvm.RemoveFields as JvmRemoveFields import solutions.bitbadger.documents.kotlin.extensions.* -import solutions.bitbadger.documents.query.RemoveFields +import solutions.bitbadger.documents.query.RemoveFieldsQuery import java.sql.Connection /** @@ -83,7 +83,7 @@ object RemoveFields { ) { val nameParams = Parameters.fieldNames(toRemove) conn.customNonQuery( - RemoveFields.byContains(tableName, nameParams), + RemoveFieldsQuery.byContains(tableName, nameParams), listOf(Parameters.json(":criteria", criteria), *nameParams.toTypedArray()) ) } diff --git a/src/kotlin/src/test/kotlin/Types.kt b/src/kotlin/src/test/kotlin/Types.kt new file mode 100644 index 0000000..51d0b38 --- /dev/null +++ b/src/kotlin/src/test/kotlin/Types.kt @@ -0,0 +1,52 @@ +package solutions.bitbadger.documents.kotlin + +import kotlinx.serialization.Serializable +import solutions.bitbadger.documents.extensions.insert + +/** The test table name to use for integration tests */ +const val TEST_TABLE = "test_table" + +@Serializable +data class NumIdDocument(val key: Int, val text: String) { + constructor() : this(0, "") +} + +@Serializable +data class SubDocument(val foo: String, val bar: String) { + constructor() : this("", "") +} + +@Serializable +data class ArrayDocument(val id: String, val values: List) { + + constructor() : this("", listOf()) + + companion object { + /** A set of documents used for integration tests */ + val testDocuments = listOf( + ArrayDocument("first", listOf("a", "b", "c")), + ArrayDocument("second", listOf("c", "d", "e")), + ArrayDocument("third", listOf("x", "y", "z")) + ) + } +} + +@Serializable +data class JsonDocument(val id: String, val value: String = "", val numValue: Int = 0, val sub: SubDocument? = null) { + + constructor() : this("") + + companion object { + /** Documents to use for testing */ + private val testDocuments = listOf( + JsonDocument("one", "FIRST!", 0, null), + JsonDocument("two", "another", 10, SubDocument("green", "blue")), + JsonDocument("three", "", 4, null), + JsonDocument("four", "purple", 17, SubDocument("green", "red")), + JsonDocument("five", "purple", 18, null) + ) + +// fun load(db: ThrowawayDatabase, tableName: String = TEST_TABLE) = +// testDocuments.forEach { db.conn.insert(tableName, it) } + } +}