From e0ec37e8c249be5235dfe629cb673031653e4abd Mon Sep 17 00:00:00 2001 From: "Daniel J. Summers" Date: Tue, 11 Mar 2025 20:35:57 -0400 Subject: [PATCH] WIP on repo reorg --- documents.iml | 4 +- pom.xml | 2 +- src/common/pom.xml | 93 ++++++++++++ src/{main => common/src}/kotlin/AutoId.kt | 14 +- src/{main => common/src}/kotlin/Comparison.kt | 2 +- src/common/src/kotlin/Configuration.kt | 63 ++++++++ src/{main => common/src}/kotlin/Dialect.kt | 2 +- .../src}/kotlin/DocumentException.kt | 4 +- .../src}/kotlin/DocumentIndex.kt | 2 +- src/{main => common/src}/kotlin/Field.kt | 2 +- .../src}/kotlin/FieldFormat.kt | 2 +- src/{main => common/src}/kotlin/FieldMatch.kt | 2 +- src/{main => common/src}/kotlin/Op.kt | 2 +- src/{main => common/src}/kotlin/Parameter.kt | 2 +- .../src}/kotlin/ParameterName.kt | 2 +- .../src}/kotlin/ParameterType.kt | 4 +- .../src}/kotlin/query/Count.kt | 8 +- .../src}/kotlin/query/Definition.kt | 6 +- .../src}/kotlin/query/Delete.kt | 11 +- .../src}/kotlin/query/Document.kt | 8 +- .../src}/kotlin/query/Exists.kt | 6 +- src/{main => common/src}/kotlin/query/Find.kt | 10 +- .../src}/kotlin/query/Patch.kt | 14 +- .../src}/kotlin/query/Query.kt | 10 +- .../src}/kotlin/query/RemoveFields.kt | 8 +- .../src}/kotlin/query/Where.kt | 8 +- .../documents/common}/java/AutoIdTest.java | 8 +- .../common}/java/DocumentIndexTest.java | 6 +- .../common}/java/FieldMatchTest.java | 6 +- .../documents/common}/java/FieldTest.java | 6 +- .../documents/common}/java/OpTest.java | 6 +- .../common}/java/ParameterNameTest.java | 6 +- .../documents/common}/java/ParameterTest.java | 10 +- src/{ => common}/test/kotlin/AutoIdTest.kt | 4 +- .../test/kotlin/ComparisonTest.kt | 8 +- src/common/test/kotlin/ConfigurationTest.kt | 43 ++++++ src/{ => common}/test/kotlin/DialectTest.kt | 10 +- .../test/kotlin/DocumentIndexTest.kt | 4 +- .../test/kotlin/FieldMatchTest.kt | 4 +- src/{ => common}/test/kotlin/FieldTest.kt | 48 +++--- src/{ => common}/test/kotlin/OpTest.kt | 4 +- .../test/kotlin/ParameterNameTest.kt | 4 +- src/{ => common}/test/kotlin/ParameterTest.kt | 4 +- .../test/kotlin/query/CountTest.kt | 9 +- .../test/kotlin/query/DefinitionTest.kt | 12 +- .../test/kotlin/query/DeleteTest.kt | 12 +- .../test/kotlin/query/DocumentTest.kt | 9 +- .../test/kotlin/query/ExistsTest.kt | 9 +- .../test/kotlin/query/FindTest.kt | 12 +- .../test/kotlin/query/PatchTest.kt | 12 +- .../test/kotlin/query/QueryTest.kt | 9 +- .../test/kotlin/query/RemoveFieldsTest.kt | 8 +- .../test/kotlin/query/WhereTest.kt | 6 +- src/main/kotlin/Configuration.kt | 55 +------ src/main/kotlin/ConnectionExtensions.kt | 12 +- src/main/kotlin/Count.kt | 6 +- src/main/kotlin/Custom.kt | 48 +++--- src/main/kotlin/Definition.kt | 3 +- src/main/kotlin/Delete.kt | 6 +- src/main/kotlin/Document.kt | 21 +-- src/main/kotlin/Exists.kt | 6 +- src/main/kotlin/Find.kt | 8 +- src/main/kotlin/Parameters.kt | 9 +- src/main/kotlin/Patch.kt | 6 +- src/main/kotlin/RemoveFields.kt | 3 +- src/main/kotlin/Results.kt | 22 +-- src/main/kotlin/java/Custom.kt | 143 ++++++++++++++++++ src/main/kotlin/java/Results.kt | 91 +++++++++++ src/pom.xml | 92 +++++++++++ .../documents/java/ConfigurationTest.java | 2 + .../documents/java/ParametersTest.java | 21 +-- .../java/integration/postgresql/CountIT.java | 22 +++ .../documents/java/testDocs/JsonDocument.java | 5 +- src/test/kotlin/ConfigurationTest.kt | 32 ---- src/test/kotlin/ParametersTest.kt | 7 +- src/test/kotlin/integration/common/Count.kt | 1 + src/test/kotlin/integration/common/Custom.kt | 9 +- .../kotlin/integration/common/Definition.kt | 1 + src/test/kotlin/integration/common/Delete.kt | 1 + .../kotlin/integration/common/Document.kt | 1 + src/test/kotlin/integration/common/Exists.kt | 1 + src/test/kotlin/integration/common/Find.kt | 5 +- src/test/kotlin/integration/common/Patch.kt | 1 + .../kotlin/integration/common/RemoveFields.kt | 1 + .../kotlin/integration/postgresql/CountIT.kt | 2 +- .../kotlin/integration/postgresql/PgDB.kt | 2 + src/test/kotlin/integration/sqlite/CountIT.kt | 2 +- .../kotlin/integration/sqlite/DefinitionIT.kt | 2 +- .../kotlin/integration/sqlite/DeleteIT.kt | 2 +- .../kotlin/integration/sqlite/ExistsIT.kt | 2 +- src/test/kotlin/integration/sqlite/FindIT.kt | 2 +- src/test/kotlin/integration/sqlite/PatchIT.kt | 2 +- .../integration/sqlite/RemoveFieldsIT.kt | 2 +- .../kotlin/integration/sqlite/SQLiteDB.kt | 2 + 94 files changed, 903 insertions(+), 328 deletions(-) create mode 100644 src/common/pom.xml rename src/{main => common/src}/kotlin/AutoId.kt (90%) rename src/{main => common/src}/kotlin/Comparison.kt (97%) create mode 100644 src/common/src/kotlin/Configuration.kt rename src/{main => common/src}/kotlin/Dialect.kt (94%) rename src/{main => common/src}/kotlin/DocumentException.kt (76%) rename src/{main => common/src}/kotlin/DocumentIndex.kt (87%) rename src/{main => common/src}/kotlin/Field.kt (99%) rename src/{main => common/src}/kotlin/FieldFormat.kt (84%) rename src/{main => common/src}/kotlin/FieldMatch.kt (83%) rename src/{main => common/src}/kotlin/Op.kt (94%) rename src/{main => common/src}/kotlin/Parameter.kt (97%) rename src/{main => common/src}/kotlin/ParameterName.kt (91%) rename src/{main => common/src}/kotlin/ParameterType.kt (86%) rename src/{main => common/src}/kotlin/query/Count.kt (87%) rename src/{main => common/src}/kotlin/query/Definition.kt (96%) rename src/{main => common/src}/kotlin/query/Delete.kt (86%) rename src/{main => common/src}/kotlin/query/Document.kt (91%) rename src/{main => common/src}/kotlin/query/Exists.kt (93%) rename src/{main => common/src}/kotlin/query/Find.kt (87%) rename src/{main => common/src}/kotlin/query/Patch.kt (84%) rename src/{main => common/src}/kotlin/query/Query.kt (90%) rename src/{main => common/src}/kotlin/query/RemoveFields.kt (92%) rename src/{main => common/src}/kotlin/query/Where.kt (87%) rename src/{test/java/solutions/bitbadger/documents => common/test/java/solutions/bitbadger/documents/common}/java/AutoIdTest.java (97%) rename src/{test/java/solutions/bitbadger/documents => common/test/java/solutions/bitbadger/documents/common}/java/DocumentIndexTest.java (79%) rename src/{test/java/solutions/bitbadger/documents => common/test/java/solutions/bitbadger/documents/common}/java/FieldMatchTest.java (78%) rename src/{test/java/solutions/bitbadger/documents => common/test/java/solutions/bitbadger/documents/common}/java/FieldTest.java (99%) rename src/{test/java/solutions/bitbadger/documents => common/test/java/solutions/bitbadger/documents/common}/java/OpTest.java (94%) rename src/{test/java/solutions/bitbadger/documents => common/test/java/solutions/bitbadger/documents/common}/java/ParameterNameTest.java (88%) rename src/{test/java/solutions/bitbadger/documents => common/test/java/solutions/bitbadger/documents/common}/java/ParameterTest.java (82%) rename src/{ => common}/test/kotlin/AutoIdTest.kt (98%) rename src/{ => common}/test/kotlin/ComparisonTest.kt (96%) create mode 100644 src/common/test/kotlin/ConfigurationTest.kt rename src/{ => common}/test/kotlin/DialectTest.kt (77%) rename src/{ => common}/test/kotlin/DocumentIndexTest.kt (85%) rename src/{ => common}/test/kotlin/FieldMatchTest.kt (83%) rename src/{ => common}/test/kotlin/FieldTest.kt (95%) rename src/{ => common}/test/kotlin/OpTest.kt (96%) rename src/{ => common}/test/kotlin/ParameterNameTest.kt (91%) rename src/{ => common}/test/kotlin/ParameterTest.kt (93%) rename src/{ => common}/test/kotlin/query/CountTest.kt (88%) rename src/{ => common}/test/kotlin/query/DefinitionTest.kt (93%) rename src/{ => common}/test/kotlin/query/DeleteTest.kt (90%) rename src/{ => common}/test/kotlin/query/DocumentTest.kt (93%) rename src/{ => common}/test/kotlin/query/ExistsTest.kt (90%) rename src/{ => common}/test/kotlin/query/FindTest.kt (91%) rename src/{ => common}/test/kotlin/query/PatchTest.kt (90%) rename src/{ => common}/test/kotlin/query/QueryTest.kt (95%) rename src/{ => common}/test/kotlin/query/RemoveFieldsTest.kt (91%) rename src/{ => common}/test/kotlin/query/WhereTest.kt (97%) create mode 100644 src/main/kotlin/java/Custom.kt create mode 100644 src/main/kotlin/java/Results.kt create mode 100644 src/pom.xml create mode 100644 src/test/java/solutions/bitbadger/documents/java/integration/postgresql/CountIT.java diff --git a/documents.iml b/documents.iml index 7b09b3a..ab059ae 100644 --- a/documents.iml +++ b/documents.iml @@ -2,7 +2,9 @@ - + + + diff --git a/pom.xml b/pom.xml index 19963a3..3f86db7 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ compile - compile + process-sources compile diff --git a/src/common/pom.xml b/src/common/pom.xml new file mode 100644 index 0000000..cec57cb --- /dev/null +++ b/src/common/pom.xml @@ -0,0 +1,93 @@ + + + 4.0.0 + + solutions.bitbadger.documents + common + 4.0.0-alpha1-SNAPSHOT + jar + + + solutions.bitbadger + documents + 4.0.0-alpha1-SNAPSHOT + + + ${project.groupId}:${project.artifactId} + Expose a document store interface for PostgreSQL and SQLite (Common Library) + https://bitbadger.solutions/open-source/relational-documents/jvm/ + + + 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 + + + + + diff --git a/src/main/kotlin/AutoId.kt b/src/common/src/kotlin/AutoId.kt similarity index 90% rename from src/main/kotlin/AutoId.kt rename to src/common/src/kotlin/AutoId.kt index 3e4c4c8..daa61c1 100644 --- a/src/main/kotlin/AutoId.kt +++ b/src/common/src/kotlin/AutoId.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common import kotlin.jvm.Throws import kotlin.reflect.full.* @@ -10,10 +10,13 @@ import kotlin.reflect.jvm.isAccessible enum class AutoId { /** No automatic IDs will be generated */ DISABLED, + /** Generate a `MAX`-plus-1 numeric ID */ NUMBER, + /** Generate a `UUID` string ID */ UUID, + /** Generate a random hex character string ID */ RANDOM_STRING; @@ -24,7 +27,8 @@ enum class AutoId { * * @return A `UUID` string */ - @JvmStatic fun generateUUID(): String = + @JvmStatic + fun generateUUID(): String = java.util.UUID.randomUUID().toString().replace("-", "") /** @@ -33,7 +37,8 @@ enum class AutoId { * @param length The length of the string (optional; defaults to configured length) * @return A string of random hex characters of the requested length */ - @JvmStatic fun generateRandomString(length: Int? = null): String = + @JvmStatic + fun generateRandomString(length: Int? = null): String = (length ?: Configuration.idStringLength).let { len -> kotlin.random.Random.nextBytes((len + 2) / 2) .joinToString("") { String.format("%02x", it) } @@ -50,7 +55,8 @@ enum class AutoId { * @throws DocumentException If bad input prevents the determination */ @Throws(DocumentException::class) - @JvmStatic fun needsAutoId(strategy: AutoId, document: T, idProp: String): Boolean { + @JvmStatic + fun needsAutoId(strategy: AutoId, document: T, idProp: String): Boolean { if (document == null) throw DocumentException("document cannot be null") if (strategy == DISABLED) return false diff --git a/src/main/kotlin/Comparison.kt b/src/common/src/kotlin/Comparison.kt similarity index 97% rename from src/main/kotlin/Comparison.kt rename to src/common/src/kotlin/Comparison.kt index f187882..5946aeb 100644 --- a/src/main/kotlin/Comparison.kt +++ b/src/common/src/kotlin/Comparison.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common /** * Information required to generate a JSON field comparison diff --git a/src/common/src/kotlin/Configuration.kt b/src/common/src/kotlin/Configuration.kt new file mode 100644 index 0000000..683a386 --- /dev/null +++ b/src/common/src/kotlin/Configuration.kt @@ -0,0 +1,63 @@ +package solutions.bitbadger.documents.common + +import java.sql.Connection +import java.sql.DriverManager +import kotlin.jvm.Throws + +/** + * Configuration for the document library + */ +object Configuration { + + /** The field in which a document's ID is stored */ + @JvmField + var idField = "id" + + /** The automatic ID strategy to use */ + @JvmField + var autoIdStrategy = AutoId.DISABLED + + /** The length of automatic random hex character string */ + @JvmField + var idStringLength = 16 + + /** The derived dialect value from the connection string */ + internal var dialectValue: Dialect? = null + + /** The connection string for the JDBC connection */ + @JvmStatic + var connectionString: String? = null + set(value) { + field = value + dialectValue = if (value.isNullOrBlank()) null else Dialect.deriveFromConnectionString(value) + } + + /** + * Retrieve a new connection to the configured database + * + * @return A new connection to the configured database + * @throws IllegalArgumentException If the connection string is not set before calling this + */ + @JvmStatic + fun dbConn(): Connection { + if (connectionString == null) { + throw IllegalArgumentException("Please provide a connection string before attempting data access") + } + return DriverManager.getConnection(connectionString) + } + + /** + * The dialect in use + * + * @param process The process being attempted + * @return The dialect for the current connection + * @throws DocumentException If the dialect has not been set + */ + @Throws(DocumentException::class) + @JvmStatic + @JvmOverloads + fun dialect(process: String? = null): Dialect = + dialectValue ?: throw DocumentException( + "Database mode not set" + if (process == null) "" else "; cannot $process" + ) +} diff --git a/src/main/kotlin/Dialect.kt b/src/common/src/kotlin/Dialect.kt similarity index 94% rename from src/main/kotlin/Dialect.kt rename to src/common/src/kotlin/Dialect.kt index 986dddb..e950ba5 100644 --- a/src/main/kotlin/Dialect.kt +++ b/src/common/src/kotlin/Dialect.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common /** * The SQL dialect to use when building queries diff --git a/src/main/kotlin/DocumentException.kt b/src/common/src/kotlin/DocumentException.kt similarity index 76% rename from src/main/kotlin/DocumentException.kt rename to src/common/src/kotlin/DocumentException.kt index bb0e0ff..c8ce19f 100644 --- a/src/main/kotlin/DocumentException.kt +++ b/src/common/src/kotlin/DocumentException.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common /** * An exception caused by invalid operations in the document library @@ -6,4 +6,4 @@ package solutions.bitbadger.documents * @param message The message for the exception * @param cause The underlying exception (optional) */ -class DocumentException(message: String, cause: Throwable? = null) : Exception(message, cause) +class DocumentException(message: String, cause: Throwable? = null) : Exception(message, cause) \ No newline at end of file diff --git a/src/main/kotlin/DocumentIndex.kt b/src/common/src/kotlin/DocumentIndex.kt similarity index 87% rename from src/main/kotlin/DocumentIndex.kt rename to src/common/src/kotlin/DocumentIndex.kt index 3ce8743..45f1fac 100644 --- a/src/main/kotlin/DocumentIndex.kt +++ b/src/common/src/kotlin/DocumentIndex.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common /** * The type of index to generate for the document diff --git a/src/main/kotlin/Field.kt b/src/common/src/kotlin/Field.kt similarity index 99% rename from src/main/kotlin/Field.kt rename to src/common/src/kotlin/Field.kt index d15a838..7b75702 100644 --- a/src/main/kotlin/Field.kt +++ b/src/common/src/kotlin/Field.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common /** * A field and its comparison diff --git a/src/main/kotlin/FieldFormat.kt b/src/common/src/kotlin/FieldFormat.kt similarity index 84% rename from src/main/kotlin/FieldFormat.kt rename to src/common/src/kotlin/FieldFormat.kt index c804a87..02d4c20 100644 --- a/src/main/kotlin/FieldFormat.kt +++ b/src/common/src/kotlin/FieldFormat.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common /** * The data format for a document field retrieval diff --git a/src/main/kotlin/FieldMatch.kt b/src/common/src/kotlin/FieldMatch.kt similarity index 83% rename from src/main/kotlin/FieldMatch.kt rename to src/common/src/kotlin/FieldMatch.kt index 3b1d3ff..e621dba 100644 --- a/src/main/kotlin/FieldMatch.kt +++ b/src/common/src/kotlin/FieldMatch.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common /** * How fields should be matched in by-field queries diff --git a/src/main/kotlin/Op.kt b/src/common/src/kotlin/Op.kt similarity index 94% rename from src/main/kotlin/Op.kt rename to src/common/src/kotlin/Op.kt index 61723c9..dc93dfc 100644 --- a/src/main/kotlin/Op.kt +++ b/src/common/src/kotlin/Op.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common /** * A comparison operator used for fields diff --git a/src/main/kotlin/Parameter.kt b/src/common/src/kotlin/Parameter.kt similarity index 97% rename from src/main/kotlin/Parameter.kt rename to src/common/src/kotlin/Parameter.kt index 1bd707b..9e63336 100644 --- a/src/main/kotlin/Parameter.kt +++ b/src/common/src/kotlin/Parameter.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common import java.sql.PreparedStatement import java.sql.Types diff --git a/src/main/kotlin/ParameterName.kt b/src/common/src/kotlin/ParameterName.kt similarity index 91% rename from src/main/kotlin/ParameterName.kt rename to src/common/src/kotlin/ParameterName.kt index a090db0..566dca0 100644 --- a/src/main/kotlin/ParameterName.kt +++ b/src/common/src/kotlin/ParameterName.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common /** * Derive parameter names; each instance wraps a counter to provide names for anonymous fields diff --git a/src/main/kotlin/ParameterType.kt b/src/common/src/kotlin/ParameterType.kt similarity index 86% rename from src/main/kotlin/ParameterType.kt rename to src/common/src/kotlin/ParameterType.kt index 77a88da..159bc14 100644 --- a/src/main/kotlin/ParameterType.kt +++ b/src/common/src/kotlin/ParameterType.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common /** * The types of parameters supported by the document library @@ -6,8 +6,10 @@ package solutions.bitbadger.documents enum class ParameterType { /** The parameter value is some sort of number (`Byte`, `Short`, `Int`, or `Long`) */ NUMBER, + /** The parameter value is a string */ STRING, + /** The parameter should be JSON-encoded */ JSON, } diff --git a/src/main/kotlin/query/Count.kt b/src/common/src/kotlin/query/Count.kt similarity index 87% rename from src/main/kotlin/query/Count.kt rename to src/common/src/kotlin/query/Count.kt index e3db117..28b726d 100644 --- a/src/main/kotlin/query/Count.kt +++ b/src/common/src/kotlin/query/Count.kt @@ -1,8 +1,8 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.query -import solutions.bitbadger.documents.Field -import solutions.bitbadger.documents.FieldMatch -import solutions.bitbadger.documents.query.byFields as byFieldsBase; +import solutions.bitbadger.documents.common.Field +import solutions.bitbadger.documents.common.FieldMatch +import solutions.bitbadger.documents.common.query.byFields as byFieldsBase; /** * Functions to count documents diff --git a/src/main/kotlin/query/Definition.kt b/src/common/src/kotlin/query/Definition.kt similarity index 96% rename from src/main/kotlin/query/Definition.kt rename to src/common/src/kotlin/query/Definition.kt index e3c2ccd..c43ea3b 100644 --- a/src/main/kotlin/query/Definition.kt +++ b/src/common/src/kotlin/query/Definition.kt @@ -1,6 +1,6 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.query -import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.* /** * Functions to create queries to define tables and indexes @@ -87,6 +87,6 @@ object Definition { throw DocumentException("'Document indexes are only supported on PostgreSQL") } val (_, tbl) = splitSchemaAndTable(tableName) - return "CREATE INDEX IF NOT EXISTS idx_${tbl}_document ON $tableName USING GIN (data${indexType.sql})"; + return "CREATE INDEX IF NOT EXISTS idx_${tbl}_document ON $tableName USING GIN (data${indexType.sql})" } } diff --git a/src/main/kotlin/query/Delete.kt b/src/common/src/kotlin/query/Delete.kt similarity index 86% rename from src/main/kotlin/query/Delete.kt rename to src/common/src/kotlin/query/Delete.kt index 53882f5..e5fc511 100644 --- a/src/main/kotlin/query/Delete.kt +++ b/src/common/src/kotlin/query/Delete.kt @@ -1,9 +1,9 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.query -import solutions.bitbadger.documents.Field -import solutions.bitbadger.documents.FieldMatch -import solutions.bitbadger.documents.query.byFields as byFieldsBase -import solutions.bitbadger.documents.query.byId as byIdBase +import solutions.bitbadger.documents.common.Field +import solutions.bitbadger.documents.common.FieldMatch +import solutions.bitbadger.documents.common.query.byFields as byFieldsBase +import solutions.bitbadger.documents.common.query.byId as byIdBase /** * Functions to delete documents @@ -14,7 +14,6 @@ object Delete { * Query to delete documents from a table * * @param tableName The table in which documents should be deleted (may include schema) - * @param where The WHERE clause for the delete statement * @return A query to delete documents */ private fun delete(tableName: String) = diff --git a/src/main/kotlin/query/Document.kt b/src/common/src/kotlin/query/Document.kt similarity index 91% rename from src/main/kotlin/query/Document.kt rename to src/common/src/kotlin/query/Document.kt index c60c986..6ee19b9 100644 --- a/src/main/kotlin/query/Document.kt +++ b/src/common/src/kotlin/query/Document.kt @@ -1,8 +1,8 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.query -import solutions.bitbadger.documents.AutoId -import solutions.bitbadger.documents.Configuration -import solutions.bitbadger.documents.Dialect +import solutions.bitbadger.documents.common.AutoId +import solutions.bitbadger.documents.common.Configuration +import solutions.bitbadger.documents.common.Dialect /** * Functions for document-level operations diff --git a/src/main/kotlin/query/Exists.kt b/src/common/src/kotlin/query/Exists.kt similarity index 93% rename from src/main/kotlin/query/Exists.kt rename to src/common/src/kotlin/query/Exists.kt index 54689d0..7e21c8e 100644 --- a/src/main/kotlin/query/Exists.kt +++ b/src/common/src/kotlin/query/Exists.kt @@ -1,7 +1,7 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.query -import solutions.bitbadger.documents.Field -import solutions.bitbadger.documents.FieldMatch +import solutions.bitbadger.documents.common.Field +import solutions.bitbadger.documents.common.FieldMatch /** * Functions to check for document existence diff --git a/src/main/kotlin/query/Find.kt b/src/common/src/kotlin/query/Find.kt similarity index 87% rename from src/main/kotlin/query/Find.kt rename to src/common/src/kotlin/query/Find.kt index 6d57232..c622485 100644 --- a/src/main/kotlin/query/Find.kt +++ b/src/common/src/kotlin/query/Find.kt @@ -1,9 +1,9 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.query -import solutions.bitbadger.documents.Field -import solutions.bitbadger.documents.FieldMatch -import solutions.bitbadger.documents.query.byId as byIdBase -import solutions.bitbadger.documents.query.byFields as byFieldsBase +import solutions.bitbadger.documents.common.Field +import solutions.bitbadger.documents.common.FieldMatch +import solutions.bitbadger.documents.common.query.byId as byIdBase +import solutions.bitbadger.documents.common.query.byFields as byFieldsBase /** * Functions to retrieve documents diff --git a/src/main/kotlin/query/Patch.kt b/src/common/src/kotlin/query/Patch.kt similarity index 84% rename from src/main/kotlin/query/Patch.kt rename to src/common/src/kotlin/query/Patch.kt index dc1e699..3589154 100644 --- a/src/main/kotlin/query/Patch.kt +++ b/src/common/src/kotlin/query/Patch.kt @@ -1,11 +1,11 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.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.query.byFields as byFieldsBase -import solutions.bitbadger.documents.query.byId as byIdBase +import solutions.bitbadger.documents.common.Configuration +import solutions.bitbadger.documents.common.Dialect +import solutions.bitbadger.documents.common.Field +import solutions.bitbadger.documents.common.FieldMatch +import solutions.bitbadger.documents.common.query.byFields as byFieldsBase +import solutions.bitbadger.documents.common.query.byId as byIdBase /** * Functions to create queries to patch (partially update) JSON documents diff --git a/src/main/kotlin/query/Query.kt b/src/common/src/kotlin/query/Query.kt similarity index 90% rename from src/main/kotlin/query/Query.kt rename to src/common/src/kotlin/query/Query.kt index 39784bc..5d6cafd 100644 --- a/src/main/kotlin/query/Query.kt +++ b/src/common/src/kotlin/query/Query.kt @@ -1,9 +1,9 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.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.common.Configuration +import solutions.bitbadger.documents.common.Dialect +import solutions.bitbadger.documents.common.Field +import solutions.bitbadger.documents.common.FieldMatch // ~~~ TOP-LEVEL FUNCTIONS FOR THE QUERY PACKAGE ~~~ diff --git a/src/main/kotlin/query/RemoveFields.kt b/src/common/src/kotlin/query/RemoveFields.kt similarity index 92% rename from src/main/kotlin/query/RemoveFields.kt rename to src/common/src/kotlin/query/RemoveFields.kt index b3842c4..0190269 100644 --- a/src/main/kotlin/query/RemoveFields.kt +++ b/src/common/src/kotlin/query/RemoveFields.kt @@ -1,8 +1,8 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.query -import solutions.bitbadger.documents.* -import solutions.bitbadger.documents.query.byFields as byFieldsBase -import solutions.bitbadger.documents.query.byId as byIdBase +import solutions.bitbadger.documents.common.* +import solutions.bitbadger.documents.common.query.byFields as byFieldsBase +import solutions.bitbadger.documents.common.query.byId as byIdBase /** * Functions to create queries to remove fields from documents diff --git a/src/main/kotlin/query/Where.kt b/src/common/src/kotlin/query/Where.kt similarity index 87% rename from src/main/kotlin/query/Where.kt rename to src/common/src/kotlin/query/Where.kt index d33f40b..7e49aa2 100644 --- a/src/main/kotlin/query/Where.kt +++ b/src/common/src/kotlin/query/Where.kt @@ -1,6 +1,10 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.query -import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.Configuration +import solutions.bitbadger.documents.common.Dialect +import solutions.bitbadger.documents.common.DocumentException +import solutions.bitbadger.documents.common.Field +import solutions.bitbadger.documents.common.FieldMatch /** * Functions to create `WHERE` clause fragments diff --git a/src/test/java/solutions/bitbadger/documents/java/AutoIdTest.java b/src/common/test/java/solutions/bitbadger/documents/common/java/AutoIdTest.java similarity index 97% rename from src/test/java/solutions/bitbadger/documents/java/AutoIdTest.java rename to src/common/test/java/solutions/bitbadger/documents/common/java/AutoIdTest.java index 6375b24..1708332 100644 --- a/src/test/java/solutions/bitbadger/documents/java/AutoIdTest.java +++ b/src/common/test/java/solutions/bitbadger/documents/common/java/AutoIdTest.java @@ -1,9 +1,9 @@ -package solutions.bitbadger.documents.java; +package solutions.bitbadger.documents.common.java; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import solutions.bitbadger.documents.AutoId; -import solutions.bitbadger.documents.DocumentException; +import solutions.bitbadger.documents.common.AutoId; +import solutions.bitbadger.documents.common.DocumentException; import solutions.bitbadger.documents.java.testDocs.*; import static org.junit.jupiter.api.Assertions.*; @@ -11,7 +11,7 @@ import static org.junit.jupiter.api.Assertions.*; /** * Unit tests for the `AutoId` enum */ -@DisplayName("Java | AutoId") +@DisplayName("Java | Common | AutoId") final public class AutoIdTest { @Test diff --git a/src/test/java/solutions/bitbadger/documents/java/DocumentIndexTest.java b/src/common/test/java/solutions/bitbadger/documents/common/java/DocumentIndexTest.java similarity index 79% rename from src/test/java/solutions/bitbadger/documents/java/DocumentIndexTest.java rename to src/common/test/java/solutions/bitbadger/documents/common/java/DocumentIndexTest.java index c54f9cb..95716e7 100644 --- a/src/test/java/solutions/bitbadger/documents/java/DocumentIndexTest.java +++ b/src/common/test/java/solutions/bitbadger/documents/common/java/DocumentIndexTest.java @@ -1,15 +1,15 @@ -package solutions.bitbadger.documents.java; +package solutions.bitbadger.documents.common.java; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import solutions.bitbadger.documents.DocumentIndex; +import solutions.bitbadger.documents.common.DocumentIndex; import static org.junit.jupiter.api.Assertions.assertEquals; /** * Unit tests for the `DocumentIndex` enum */ -@DisplayName("Java | DocumentIndex") +@DisplayName("Java | Common | DocumentIndex") final public class DocumentIndexTest { @Test diff --git a/src/test/java/solutions/bitbadger/documents/java/FieldMatchTest.java b/src/common/test/java/solutions/bitbadger/documents/common/java/FieldMatchTest.java similarity index 78% rename from src/test/java/solutions/bitbadger/documents/java/FieldMatchTest.java rename to src/common/test/java/solutions/bitbadger/documents/common/java/FieldMatchTest.java index c974534..c8f02da 100644 --- a/src/test/java/solutions/bitbadger/documents/java/FieldMatchTest.java +++ b/src/common/test/java/solutions/bitbadger/documents/common/java/FieldMatchTest.java @@ -1,15 +1,15 @@ -package solutions.bitbadger.documents.java; +package solutions.bitbadger.documents.common.java; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import solutions.bitbadger.documents.FieldMatch; +import solutions.bitbadger.documents.common.FieldMatch; import static org.junit.jupiter.api.Assertions.assertEquals; /** * Unit tests for the `FieldMatch` enum */ -@DisplayName("Java | FieldMatch") +@DisplayName("Java | Common | FieldMatch") final public class FieldMatchTest { @Test diff --git a/src/test/java/solutions/bitbadger/documents/java/FieldTest.java b/src/common/test/java/solutions/bitbadger/documents/common/java/FieldTest.java similarity index 99% rename from src/test/java/solutions/bitbadger/documents/java/FieldTest.java rename to src/common/test/java/solutions/bitbadger/documents/common/java/FieldTest.java index 287b1ef..672ff2a 100644 --- a/src/test/java/solutions/bitbadger/documents/java/FieldTest.java +++ b/src/common/test/java/solutions/bitbadger/documents/common/java/FieldTest.java @@ -1,10 +1,10 @@ -package solutions.bitbadger.documents.java; +package solutions.bitbadger.documents.common.java; import kotlin.Pair; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import solutions.bitbadger.documents.*; +import solutions.bitbadger.documents.common.*; import java.util.Collection; import java.util.List; @@ -14,7 +14,7 @@ import static org.junit.jupiter.api.Assertions.*; /** * Unit tests for the `Field` class */ -@DisplayName("Java | Field") +@DisplayName("Java | Common | Field") final public class FieldTest { /** diff --git a/src/test/java/solutions/bitbadger/documents/java/OpTest.java b/src/common/test/java/solutions/bitbadger/documents/common/java/OpTest.java similarity index 94% rename from src/test/java/solutions/bitbadger/documents/java/OpTest.java rename to src/common/test/java/solutions/bitbadger/documents/common/java/OpTest.java index 3a319cf..2d70565 100644 --- a/src/test/java/solutions/bitbadger/documents/java/OpTest.java +++ b/src/common/test/java/solutions/bitbadger/documents/common/java/OpTest.java @@ -1,15 +1,15 @@ -package solutions.bitbadger.documents.java; +package solutions.bitbadger.documents.common.java; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import solutions.bitbadger.documents.Op; +import solutions.bitbadger.documents.common.Op; import static org.junit.jupiter.api.Assertions.assertEquals; /** * Unit tests for the `Op` enum */ -@DisplayName("Java | Op") +@DisplayName("Java | Common | Op") final public class OpTest { @Test diff --git a/src/test/java/solutions/bitbadger/documents/java/ParameterNameTest.java b/src/common/test/java/solutions/bitbadger/documents/common/java/ParameterNameTest.java similarity index 88% rename from src/test/java/solutions/bitbadger/documents/java/ParameterNameTest.java rename to src/common/test/java/solutions/bitbadger/documents/common/java/ParameterNameTest.java index 15d5498..f8bdff9 100644 --- a/src/test/java/solutions/bitbadger/documents/java/ParameterNameTest.java +++ b/src/common/test/java/solutions/bitbadger/documents/common/java/ParameterNameTest.java @@ -1,15 +1,15 @@ -package solutions.bitbadger.documents.java; +package solutions.bitbadger.documents.common.java; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import solutions.bitbadger.documents.ParameterName; +import solutions.bitbadger.documents.common.ParameterName; import static org.junit.jupiter.api.Assertions.assertEquals; /** * Unit tests for the `ParameterName` class */ -@DisplayName("Java | ParameterName") +@DisplayName("Java | Common | ParameterName") final public class ParameterNameTest { @Test diff --git a/src/test/java/solutions/bitbadger/documents/java/ParameterTest.java b/src/common/test/java/solutions/bitbadger/documents/common/java/ParameterTest.java similarity index 82% rename from src/test/java/solutions/bitbadger/documents/java/ParameterTest.java rename to src/common/test/java/solutions/bitbadger/documents/common/java/ParameterTest.java index 2e6556b..aba9a4c 100644 --- a/src/test/java/solutions/bitbadger/documents/java/ParameterTest.java +++ b/src/common/test/java/solutions/bitbadger/documents/common/java/ParameterTest.java @@ -1,17 +1,17 @@ -package solutions.bitbadger.documents.java; +package solutions.bitbadger.documents.common.java; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import solutions.bitbadger.documents.DocumentException; -import solutions.bitbadger.documents.Parameter; -import solutions.bitbadger.documents.ParameterType; +import solutions.bitbadger.documents.common.DocumentException; +import solutions.bitbadger.documents.common.Parameter; +import solutions.bitbadger.documents.common.ParameterType; import static org.junit.jupiter.api.Assertions.*; /** * Unit tests for the `Parameter` class */ -@DisplayName("Java | Parameter") +@DisplayName("Java | Common | Parameter") final public class ParameterTest { @Test diff --git a/src/test/kotlin/AutoIdTest.kt b/src/common/test/kotlin/AutoIdTest.kt similarity index 98% rename from src/test/kotlin/AutoIdTest.kt rename to src/common/test/kotlin/AutoIdTest.kt index 58cc9aa..540342e 100644 --- a/src/test/kotlin/AutoIdTest.kt +++ b/src/common/test/kotlin/AutoIdTest.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test @@ -11,7 +11,7 @@ import kotlin.test.assertTrue /** * Unit tests for the `AutoId` enum */ -@DisplayName("Kotlin | AutoId") +@DisplayName("Kotlin | Common | AutoId") class AutoIdTest { @Test diff --git a/src/test/kotlin/ComparisonTest.kt b/src/common/test/kotlin/ComparisonTest.kt similarity index 96% rename from src/test/kotlin/ComparisonTest.kt rename to src/common/test/kotlin/ComparisonTest.kt index af6d4d9..3cd54ad 100644 --- a/src/test/kotlin/ComparisonTest.kt +++ b/src/common/test/kotlin/ComparisonTest.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test @@ -21,7 +21,8 @@ class ComparisonBetweenTest { @Test @DisplayName("isNumeric is false with strings") fun isNumericFalseForStringsAndBetween() = - assertFalse(ComparisonBetween(Pair("eh", "zed")).isNumeric, + assertFalse( + ComparisonBetween(Pair("eh", "zed")).isNumeric, "A BETWEEN with strings should not be numeric") @Test @@ -32,7 +33,8 @@ class ComparisonBetweenTest { @Test @DisplayName("isNumeric is true with shorts") fun isNumericTrueForShortAndBetween() = - assertTrue(ComparisonBetween(Pair(0, 9)).isNumeric, + assertTrue( + ComparisonBetween(Pair(0, 9)).isNumeric, "A BETWEEN with shorts should be numeric") @Test diff --git a/src/common/test/kotlin/ConfigurationTest.kt b/src/common/test/kotlin/ConfigurationTest.kt new file mode 100644 index 0000000..cef0cb3 --- /dev/null +++ b/src/common/test/kotlin/ConfigurationTest.kt @@ -0,0 +1,43 @@ +package solutions.bitbadger.documents.common + +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows +import kotlin.test.assertEquals + +/** + * Unit tests for the `Configuration` object + */ +@DisplayName("Kotlin | Common | Configuration") +class ConfigurationTest { + + @Test + @DisplayName("Default ID field is `id`") + fun defaultIdField() { + assertEquals("id", Configuration.idField, "Default ID field incorrect") + } + + @Test + @DisplayName("Default Auto ID strategy is `DISABLED`") + fun defaultAutoId() { + assertEquals(AutoId.DISABLED, Configuration.autoIdStrategy, "Default Auto ID strategy should be `disabled`") + } + + @Test + @DisplayName("Default ID string length should be 16") + fun defaultIdStringLength() { + assertEquals(16, Configuration.idStringLength, "Default ID string length should be 16") + } + + @Test + @DisplayName("Dialect is derived from connection string") + fun dialectIsDerived() { + try { + assertThrows { Configuration.dialect() } + Configuration.connectionString = "jdbc:postgresql:db" + assertEquals(Dialect.POSTGRESQL, Configuration.dialect()) + } finally { + Configuration.connectionString = null + } + } +} diff --git a/src/test/kotlin/DialectTest.kt b/src/common/test/kotlin/DialectTest.kt similarity index 77% rename from src/test/kotlin/DialectTest.kt rename to src/common/test/kotlin/DialectTest.kt index 29c6c51..b2fe4b2 100644 --- a/src/test/kotlin/DialectTest.kt +++ b/src/common/test/kotlin/DialectTest.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test @@ -9,19 +9,21 @@ import kotlin.test.assertTrue /** * Unit tests for the `Dialect` enum */ -@DisplayName("Dialect") +@DisplayName("Kotlin | Common | Dialect") class DialectTest { @Test @DisplayName("deriveFromConnectionString derives PostgreSQL correctly") fun derivesPostgres() = - assertEquals(Dialect.POSTGRESQL, Dialect.deriveFromConnectionString("jdbc:postgresql:db"), + assertEquals( + Dialect.POSTGRESQL, Dialect.deriveFromConnectionString("jdbc:postgresql:db"), "Dialect should have been PostgreSQL") @Test @DisplayName("deriveFromConnectionString derives PostgreSQL correctly") fun derivesSQLite() = - assertEquals(Dialect.SQLITE, Dialect.deriveFromConnectionString("jdbc:sqlite:memory"), + assertEquals( + Dialect.SQLITE, Dialect.deriveFromConnectionString("jdbc:sqlite:memory"), "Dialect should have been SQLite") @Test diff --git a/src/test/kotlin/DocumentIndexTest.kt b/src/common/test/kotlin/DocumentIndexTest.kt similarity index 85% rename from src/test/kotlin/DocumentIndexTest.kt rename to src/common/test/kotlin/DocumentIndexTest.kt index 9747cde..9840671 100644 --- a/src/test/kotlin/DocumentIndexTest.kt +++ b/src/common/test/kotlin/DocumentIndexTest.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test @@ -7,7 +7,7 @@ import kotlin.test.assertEquals /** * Unit tests for the `DocumentIndex` enum */ -@DisplayName("Kotlin | DocumentIndex") +@DisplayName("Kotlin | Common | DocumentIndex") class DocumentIndexTest { @Test diff --git a/src/test/kotlin/FieldMatchTest.kt b/src/common/test/kotlin/FieldMatchTest.kt similarity index 83% rename from src/test/kotlin/FieldMatchTest.kt rename to src/common/test/kotlin/FieldMatchTest.kt index ceb1725..2c3fdad 100644 --- a/src/test/kotlin/FieldMatchTest.kt +++ b/src/common/test/kotlin/FieldMatchTest.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test @@ -7,7 +7,7 @@ import kotlin.test.assertEquals /** * Unit tests for the `FieldMatch` enum */ -@DisplayName("Kotlin | FieldMatch") +@DisplayName("Kotlin | Common | FieldMatch") class FieldMatchTest { @Test diff --git a/src/test/kotlin/FieldTest.kt b/src/common/test/kotlin/FieldTest.kt similarity index 95% rename from src/test/kotlin/FieldTest.kt rename to src/common/test/kotlin/FieldTest.kt index 783979b..c32a2a9 100644 --- a/src/test/kotlin/FieldTest.kt +++ b/src/common/test/kotlin/FieldTest.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.DisplayName @@ -11,7 +11,7 @@ import kotlin.test.assertNull /** * Unit tests for the `Field` class */ -@DisplayName("Kotlin | Field") +@DisplayName("Kotlin | Common | Field") class FieldTest { /** @@ -19,7 +19,7 @@ class FieldTest { */ @AfterEach fun cleanUp() { - Configuration.connectionString = null + Configuration.dialectValue = null } // ~~~ INSTANCE METHODS ~~~ @@ -122,7 +122,7 @@ class FieldTest { @Test @DisplayName("toWhere generates for exists w/o qualifier (PostgreSQL)") fun toWhereExistsNoQualPostgres() { - Configuration.connectionString = ":postgresql:" + Configuration.dialectValue = Dialect.POSTGRESQL assertEquals("data->>'that_field' IS NOT NULL", Field.exists("that_field").toWhere(), "Field WHERE clause not generated correctly") } @@ -130,7 +130,7 @@ class FieldTest { @Test @DisplayName("toWhere generates for exists w/o qualifier (SQLite)") fun toWhereExistsNoQualSQLite() { - Configuration.connectionString = ":sqlite:" + Configuration.dialectValue = Dialect.SQLITE assertEquals("data->>'that_field' IS NOT NULL", Field.exists("that_field").toWhere(), "Field WHERE clause not generated correctly") } @@ -138,7 +138,7 @@ class FieldTest { @Test @DisplayName("toWhere generates for not-exists w/o qualifier (PostgreSQL)") fun toWhereNotExistsNoQualPostgres() { - Configuration.connectionString = ":postgresql:" + Configuration.dialectValue = Dialect.POSTGRESQL assertEquals("data->>'a_field' IS NULL", Field.notExists("a_field").toWhere(), "Field WHERE clause not generated correctly") } @@ -146,7 +146,7 @@ class FieldTest { @Test @DisplayName("toWhere generates for not-exists w/o qualifier (SQLite)") fun toWhereNotExistsNoQualSQLite() { - Configuration.connectionString = ":sqlite:" + Configuration.dialectValue = Dialect.SQLITE assertEquals("data->>'a_field' IS NULL", Field.notExists("a_field").toWhere(), "Field WHERE clause not generated correctly") } @@ -154,7 +154,7 @@ class FieldTest { @Test @DisplayName("toWhere generates for BETWEEN w/o qualifier, numeric range (PostgreSQL)") fun toWhereBetweenNoQualNumericPostgres() { - Configuration.connectionString = ":postgresql:" + Configuration.dialectValue = Dialect.POSTGRESQL assertEquals("(data->>'age')::numeric BETWEEN @agemin AND @agemax", Field.between("age", 13, 17, "@age").toWhere(), "Field WHERE clause not generated correctly") } @@ -162,7 +162,7 @@ class FieldTest { @Test @DisplayName("toWhere generates for BETWEEN w/o qualifier, alphanumeric range (PostgreSQL)") fun toWhereBetweenNoQualAlphaPostgres() { - Configuration.connectionString = ":postgresql:" + Configuration.dialectValue = Dialect.POSTGRESQL assertEquals("data->>'city' BETWEEN :citymin AND :citymax", Field.between("city", "Atlanta", "Chicago", ":city").toWhere(), "Field WHERE clause not generated correctly") @@ -171,7 +171,7 @@ class FieldTest { @Test @DisplayName("toWhere generates for BETWEEN w/o qualifier (SQLite)") fun toWhereBetweenNoQualSQLite() { - Configuration.connectionString = ":sqlite:" + Configuration.dialectValue = Dialect.SQLITE assertEquals("data->>'age' BETWEEN @agemin AND @agemax", Field.between("age", 13, 17, "@age").toWhere(), "Field WHERE clause not generated correctly") } @@ -179,7 +179,7 @@ class FieldTest { @Test @DisplayName("toWhere generates for BETWEEN w/ qualifier, numeric range (PostgreSQL)") fun toWhereBetweenQualNumericPostgres() { - Configuration.connectionString = ":postgresql:" + Configuration.dialectValue = Dialect.POSTGRESQL assertEquals("(test.data->>'age')::numeric BETWEEN @agemin AND @agemax", Field.between("age", 13, 17, "@age").withQualifier("test").toWhere(), "Field WHERE clause not generated correctly") @@ -188,7 +188,7 @@ class FieldTest { @Test @DisplayName("toWhere generates for BETWEEN w/ qualifier, alphanumeric range (PostgreSQL)") fun toWhereBetweenQualAlphaPostgres() { - Configuration.connectionString = ":postgresql:" + Configuration.dialectValue = Dialect.POSTGRESQL assertEquals("unit.data->>'city' BETWEEN :citymin AND :citymax", Field.between("city", "Atlanta", "Chicago", ":city").withQualifier("unit").toWhere(), "Field WHERE clause not generated correctly") @@ -197,7 +197,7 @@ class FieldTest { @Test @DisplayName("toWhere generates for BETWEEN w/ qualifier (SQLite)") fun toWhereBetweenQualSQLite() { - Configuration.connectionString = ":sqlite:" + Configuration.dialectValue = Dialect.SQLITE assertEquals("my.data->>'age' BETWEEN @agemin AND @agemax", Field.between("age", 13, 17, "@age").withQualifier("my").toWhere(), "Field WHERE clause not generated correctly") @@ -206,7 +206,7 @@ class FieldTest { @Test @DisplayName("toWhere generates for IN/any, numeric values (PostgreSQL)") fun toWhereAnyNumericPostgres() { - Configuration.connectionString = ":postgresql:" + Configuration.dialectValue = Dialect.POSTGRESQL assertEquals("(data->>'even')::numeric IN (:nbr_0, :nbr_1, :nbr_2)", Field.any("even", listOf(2, 4, 6), ":nbr").toWhere(), "Field WHERE clause not generated correctly") } @@ -214,7 +214,7 @@ class FieldTest { @Test @DisplayName("toWhere generates for IN/any, alphanumeric values (PostgreSQL)") fun toWhereAnyAlphaPostgres() { - Configuration.connectionString = ":postgresql:" + Configuration.dialectValue = Dialect.POSTGRESQL assertEquals("data->>'test' IN (:city_0, :city_1)", Field.any("test", listOf("Atlanta", "Chicago"), ":city").toWhere(), "Field WHERE clause not generated correctly") @@ -223,7 +223,7 @@ class FieldTest { @Test @DisplayName("toWhere generates for IN/any (SQLite)") fun toWhereAnySQLite() { - Configuration.connectionString = ":sqlite:" + Configuration.dialectValue = Dialect.SQLITE assertEquals("data->>'test' IN (:city_0, :city_1)", Field.any("test", listOf("Atlanta", "Chicago"), ":city").toWhere(), "Field WHERE clause not generated correctly") @@ -232,7 +232,7 @@ class FieldTest { @Test @DisplayName("toWhere generates for inArray (PostgreSQL)") fun toWhereInArrayPostgres() { - Configuration.connectionString = ":postgresql:" + Configuration.dialectValue = Dialect.POSTGRESQL assertEquals("data->'even' ??| ARRAY[:it_0, :it_1, :it_2, :it_3]", Field.inArray("even", "tbl", listOf(2, 4, 6, 8), ":it").toWhere(), "Field WHERE clause not generated correctly") @@ -241,7 +241,7 @@ class FieldTest { @Test @DisplayName("toWhere generates for inArray (SQLite)") fun toWhereInArraySQLite() { - Configuration.connectionString = ":sqlite:" + Configuration.dialectValue = Dialect.SQLITE assertEquals("EXISTS (SELECT 1 FROM json_each(tbl.data, '$.test') WHERE value IN (:city_0, :city_1))", Field.inArray("test", "tbl", listOf("Atlanta", "Chicago"), ":city").toWhere(), "Field WHERE clause not generated correctly") @@ -250,7 +250,7 @@ class FieldTest { @Test @DisplayName("toWhere generates for others w/o qualifier (PostgreSQL)") fun toWhereOtherNoQualPostgres() { - Configuration.connectionString = ":postgresql:" + Configuration.dialectValue = Dialect.POSTGRESQL assertEquals("data->>'some_field' = :value", Field.equal("some_field", "", ":value").toWhere(), "Field WHERE clause not generated correctly") } @@ -258,7 +258,7 @@ class FieldTest { @Test @DisplayName("toWhere generates for others w/o qualifier (SQLite)") fun toWhereOtherNoQualSQLite() { - Configuration.connectionString = ":sqlite:" + Configuration.dialectValue = Dialect.SQLITE assertEquals("data->>'some_field' = :value", Field.equal("some_field", "", ":value").toWhere(), "Field WHERE clause not generated correctly") } @@ -266,7 +266,7 @@ class FieldTest { @Test @DisplayName("toWhere generates no-parameter w/ qualifier (PostgreSQL)") fun toWhereNoParamWithQualPostgres() { - Configuration.connectionString = ":postgresql:" + Configuration.dialectValue = Dialect.POSTGRESQL assertEquals("test.data->>'no_field' IS NOT NULL", Field.exists("no_field").withQualifier("test").toWhere(), "Field WHERE clause not generated correctly") } @@ -274,7 +274,7 @@ class FieldTest { @Test @DisplayName("toWhere generates no-parameter w/ qualifier (SQLite)") fun toWhereNoParamWithQualSQLite() { - Configuration.connectionString = ":sqlite:" + Configuration.dialectValue = Dialect.SQLITE assertEquals("test.data->>'no_field' IS NOT NULL", Field.exists("no_field").withQualifier("test").toWhere(), "Field WHERE clause not generated correctly") } @@ -282,7 +282,7 @@ class FieldTest { @Test @DisplayName("toWhere generates parameter w/ qualifier (PostgreSQL)") fun toWhereParamWithQualPostgres() { - Configuration.connectionString = ":postgresql:" + Configuration.dialectValue = Dialect.POSTGRESQL assertEquals("(q.data->>'le_field')::numeric <= :it", Field.lessOrEqual("le_field", 18, ":it").withQualifier("q").toWhere(), "Field WHERE clause not generated correctly") @@ -291,7 +291,7 @@ class FieldTest { @Test @DisplayName("toWhere generates parameter w/ qualifier (SQLite)") fun toWhereParamWithQualSQLite() { - Configuration.connectionString = ":sqlite:" + Configuration.dialectValue = Dialect.SQLITE assertEquals("q.data->>'le_field' <= :it", Field.lessOrEqual("le_field", 18, ":it").withQualifier("q").toWhere(), "Field WHERE clause not generated correctly") diff --git a/src/test/kotlin/OpTest.kt b/src/common/test/kotlin/OpTest.kt similarity index 96% rename from src/test/kotlin/OpTest.kt rename to src/common/test/kotlin/OpTest.kt index 5e6d6cd..6a272e9 100644 --- a/src/test/kotlin/OpTest.kt +++ b/src/common/test/kotlin/OpTest.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test @@ -7,7 +7,7 @@ import kotlin.test.assertEquals /** * Unit tests for the `Op` enum */ -@DisplayName("Kotlin | Op") +@DisplayName("Kotlin | Common | Op") class OpTest { @Test diff --git a/src/test/kotlin/ParameterNameTest.kt b/src/common/test/kotlin/ParameterNameTest.kt similarity index 91% rename from src/test/kotlin/ParameterNameTest.kt rename to src/common/test/kotlin/ParameterNameTest.kt index b08f6bb..93dd9c8 100644 --- a/src/test/kotlin/ParameterNameTest.kt +++ b/src/common/test/kotlin/ParameterNameTest.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test @@ -7,7 +7,7 @@ import kotlin.test.assertEquals /** * Unit tests for the `ParameterName` class */ -@DisplayName("Kotlin | ParameterName") +@DisplayName("Kotlin | Common | ParameterName") class ParameterNameTest { @Test diff --git a/src/test/kotlin/ParameterTest.kt b/src/common/test/kotlin/ParameterTest.kt similarity index 93% rename from src/test/kotlin/ParameterTest.kt rename to src/common/test/kotlin/ParameterTest.kt index 959ad25..ea8753a 100644 --- a/src/test/kotlin/ParameterTest.kt +++ b/src/common/test/kotlin/ParameterTest.kt @@ -1,4 +1,4 @@ -package solutions.bitbadger.documents +package solutions.bitbadger.documents.common import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.assertThrows @@ -9,7 +9,7 @@ import kotlin.test.assertNull /** * Unit tests for the `Parameter` class */ -@DisplayName("Kotlin | Parameter") +@DisplayName("Kotlin | Common | Parameter") class ParameterTest { @Test diff --git a/src/test/kotlin/query/CountTest.kt b/src/common/test/kotlin/query/CountTest.kt similarity index 88% rename from src/test/kotlin/query/CountTest.kt rename to src/common/test/kotlin/query/CountTest.kt index 3caab47..a664f21 100644 --- a/src/test/kotlin/query/CountTest.kt +++ b/src/common/test/kotlin/query/CountTest.kt @@ -1,16 +1,19 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.query import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows -import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.Configuration +import solutions.bitbadger.documents.common.Dialect +import solutions.bitbadger.documents.common.DocumentException +import solutions.bitbadger.documents.common.Field import kotlin.test.assertEquals /** * Unit tests for the `Count` object */ -@DisplayName("Count (Query)") +@DisplayName("Kotlin | Common | Query: Count") class CountTest { /** Test table name */ diff --git a/src/test/kotlin/query/DefinitionTest.kt b/src/common/test/kotlin/query/DefinitionTest.kt similarity index 93% rename from src/test/kotlin/query/DefinitionTest.kt rename to src/common/test/kotlin/query/DefinitionTest.kt index bcad33a..90343c9 100644 --- a/src/test/kotlin/query/DefinitionTest.kt +++ b/src/common/test/kotlin/query/DefinitionTest.kt @@ -1,19 +1,19 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.query import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows -import solutions.bitbadger.documents.Configuration -import solutions.bitbadger.documents.Dialect -import solutions.bitbadger.documents.DocumentException -import solutions.bitbadger.documents.DocumentIndex +import solutions.bitbadger.documents.common.Configuration +import solutions.bitbadger.documents.common.Dialect +import solutions.bitbadger.documents.common.DocumentException +import solutions.bitbadger.documents.common.DocumentIndex import kotlin.test.assertEquals /** * Unit tests for the `Definition` object */ -@DisplayName("Definition (Query)") +@DisplayName("Kotlin | Common | Query: Definition") class DefinitionTest { /** Test table name */ diff --git a/src/test/kotlin/query/DeleteTest.kt b/src/common/test/kotlin/query/DeleteTest.kt similarity index 90% rename from src/test/kotlin/query/DeleteTest.kt rename to src/common/test/kotlin/query/DeleteTest.kt index 1fed573..54206d8 100644 --- a/src/test/kotlin/query/DeleteTest.kt +++ b/src/common/test/kotlin/query/DeleteTest.kt @@ -1,19 +1,19 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.query import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows -import solutions.bitbadger.documents.Configuration -import solutions.bitbadger.documents.Dialect -import solutions.bitbadger.documents.DocumentException -import solutions.bitbadger.documents.Field +import solutions.bitbadger.documents.common.Configuration +import solutions.bitbadger.documents.common.Dialect +import solutions.bitbadger.documents.common.DocumentException +import solutions.bitbadger.documents.common.Field import kotlin.test.assertEquals /** * Unit tests for the `Delete` object */ -@DisplayName("Delete (Query)") +@DisplayName("Kotlin | Common | Query: Delete") class DeleteTest { /** Test table name */ diff --git a/src/test/kotlin/query/DocumentTest.kt b/src/common/test/kotlin/query/DocumentTest.kt similarity index 93% rename from src/test/kotlin/query/DocumentTest.kt rename to src/common/test/kotlin/query/DocumentTest.kt index 5f67fde..1ee9277 100644 --- a/src/test/kotlin/query/DocumentTest.kt +++ b/src/common/test/kotlin/query/DocumentTest.kt @@ -1,17 +1,20 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.query import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows -import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.AutoId +import solutions.bitbadger.documents.common.Configuration +import solutions.bitbadger.documents.common.Dialect +import solutions.bitbadger.documents.common.DocumentException import kotlin.test.assertEquals import kotlin.test.assertTrue /** * Unit tests for the `Document` object */ -@DisplayName("Document (Query)") +@DisplayName("Kotlin | Common | Query: Document") class DocumentTest { /** Test table name */ diff --git a/src/test/kotlin/query/ExistsTest.kt b/src/common/test/kotlin/query/ExistsTest.kt similarity index 90% rename from src/test/kotlin/query/ExistsTest.kt rename to src/common/test/kotlin/query/ExistsTest.kt index bbef7ce..a1ea2d9 100644 --- a/src/test/kotlin/query/ExistsTest.kt +++ b/src/common/test/kotlin/query/ExistsTest.kt @@ -1,16 +1,19 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.query import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows -import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.Configuration +import solutions.bitbadger.documents.common.Dialect +import solutions.bitbadger.documents.common.DocumentException +import solutions.bitbadger.documents.common.Field import kotlin.test.assertEquals /** * Unit tests for the `Exists` object */ -@DisplayName("Exists (Query)") +@DisplayName("Kotlin | Common | Query: Exists") class ExistsTest { /** Test table name */ diff --git a/src/test/kotlin/query/FindTest.kt b/src/common/test/kotlin/query/FindTest.kt similarity index 91% rename from src/test/kotlin/query/FindTest.kt rename to src/common/test/kotlin/query/FindTest.kt index 0526fa3..4b89e82 100644 --- a/src/test/kotlin/query/FindTest.kt +++ b/src/common/test/kotlin/query/FindTest.kt @@ -1,19 +1,19 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.query import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows -import solutions.bitbadger.documents.Configuration -import solutions.bitbadger.documents.Dialect -import solutions.bitbadger.documents.DocumentException -import solutions.bitbadger.documents.Field +import solutions.bitbadger.documents.common.Configuration +import solutions.bitbadger.documents.common.Dialect +import solutions.bitbadger.documents.common.DocumentException +import solutions.bitbadger.documents.common.Field import kotlin.test.assertEquals /** * Unit tests for the `Find` object */ -@DisplayName("Find (Query)") +@DisplayName("Kotlin | Common | Query: Find") class FindTest { /** Test table name */ diff --git a/src/test/kotlin/query/PatchTest.kt b/src/common/test/kotlin/query/PatchTest.kt similarity index 90% rename from src/test/kotlin/query/PatchTest.kt rename to src/common/test/kotlin/query/PatchTest.kt index 707f186..e7511b0 100644 --- a/src/test/kotlin/query/PatchTest.kt +++ b/src/common/test/kotlin/query/PatchTest.kt @@ -1,19 +1,19 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.query import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows -import solutions.bitbadger.documents.Configuration -import solutions.bitbadger.documents.Dialect -import solutions.bitbadger.documents.DocumentException -import solutions.bitbadger.documents.Field +import solutions.bitbadger.documents.common.Configuration +import solutions.bitbadger.documents.common.Dialect +import solutions.bitbadger.documents.common.DocumentException +import solutions.bitbadger.documents.common.Field import kotlin.test.assertEquals /** * Unit tests for the `Patch` object */ -@DisplayName("Patch (Query)") +@DisplayName("Kotlin | Common | Query: Patch") class PatchTest { /** Test table name */ diff --git a/src/test/kotlin/query/QueryTest.kt b/src/common/test/kotlin/query/QueryTest.kt similarity index 95% rename from src/test/kotlin/query/QueryTest.kt rename to src/common/test/kotlin/query/QueryTest.kt index d5344f3..82e5285 100644 --- a/src/test/kotlin/query/QueryTest.kt +++ b/src/common/test/kotlin/query/QueryTest.kt @@ -1,15 +1,18 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.query import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test -import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.Configuration +import solutions.bitbadger.documents.common.Dialect +import solutions.bitbadger.documents.common.Field +import solutions.bitbadger.documents.common.FieldMatch import kotlin.test.assertEquals /** * Unit tests for the top-level query functions */ -@DisplayName("Query") +@DisplayName("Kotlin | Common | Query") class QueryTest { /** diff --git a/src/test/kotlin/query/RemoveFieldsTest.kt b/src/common/test/kotlin/query/RemoveFieldsTest.kt similarity index 91% rename from src/test/kotlin/query/RemoveFieldsTest.kt rename to src/common/test/kotlin/query/RemoveFieldsTest.kt index e06ff44..498a435 100644 --- a/src/test/kotlin/query/RemoveFieldsTest.kt +++ b/src/common/test/kotlin/query/RemoveFieldsTest.kt @@ -1,16 +1,20 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.query import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.Configuration +import solutions.bitbadger.documents.common.Dialect +import solutions.bitbadger.documents.common.DocumentException +import solutions.bitbadger.documents.common.Field import kotlin.test.assertEquals /** * Unit tests for the `RemoveFields` object */ -@DisplayName("RemoveFields (Query)") +@DisplayName("Kotlin | Common | Query: RemoveFields") class RemoveFieldsTest { /** Test table name */ diff --git a/src/test/kotlin/query/WhereTest.kt b/src/common/test/kotlin/query/WhereTest.kt similarity index 97% rename from src/test/kotlin/query/WhereTest.kt rename to src/common/test/kotlin/query/WhereTest.kt index c8ebfbc..aeed546 100644 --- a/src/test/kotlin/query/WhereTest.kt +++ b/src/common/test/kotlin/query/WhereTest.kt @@ -1,16 +1,16 @@ -package solutions.bitbadger.documents.query +package solutions.bitbadger.documents.common.query import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows -import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.* import kotlin.test.assertEquals /** * Unit tests for the `Where` object */ -@DisplayName("Where (Query)") +@DisplayName("Kotlin | Common | Query: Where") class WhereTest { /** diff --git a/src/main/kotlin/Configuration.kt b/src/main/kotlin/Configuration.kt index 7313eea..705a1d9 100644 --- a/src/main/kotlin/Configuration.kt +++ b/src/main/kotlin/Configuration.kt @@ -1,6 +1,9 @@ package solutions.bitbadger.documents import kotlinx.serialization.json.Json +import solutions.bitbadger.documents.common.AutoId +import solutions.bitbadger.documents.common.Dialect +import solutions.bitbadger.documents.common.DocumentException import java.sql.Connection import java.sql.DriverManager import kotlin.jvm.Throws @@ -20,58 +23,8 @@ object Configuration { coerceInputValues = true } - /** The field in which a document's ID is stored */ - @JvmField - var idField = "id" - - /** The automatic ID strategy to use */ - @JvmField - var autoIdStrategy = AutoId.DISABLED - - /** The length of automatic random hex character string */ - @JvmField - var idStringLength = 16 - /** The JSON serializer to use for documents */ + @JvmStatic var serializer: DocumentSerializer = DocumentSerializerKotlin() - /** The derived dialect value from the connection string */ - internal var dialectValue: Dialect? = null - - /** The connection string for the JDBC connection */ - @JvmStatic - var connectionString: String? = null - set(value) { - field = value - dialectValue = if (value.isNullOrBlank()) null else Dialect.deriveFromConnectionString(value) - } - - /** - * Retrieve a new connection to the configured database - * - * @return A new connection to the configured database - * @throws IllegalArgumentException If the connection string is not set before calling this - */ - @JvmStatic - fun dbConn(): Connection { - if (connectionString == null) { - throw IllegalArgumentException("Please provide a connection string before attempting data access") - } - return DriverManager.getConnection(connectionString) - } - - /** - * The dialect in use - * - * @param process The process being attempted - * @return The dialect for the current connection - * @throws DocumentException If the dialect has not been set - */ - @Throws(DocumentException::class) - @JvmStatic - @JvmOverloads - fun dialect(process: String? = null): Dialect = - dialectValue ?: throw DocumentException( - "Database mode not set" + if (process == null) "" else "; cannot $process" - ) } diff --git a/src/main/kotlin/ConnectionExtensions.kt b/src/main/kotlin/ConnectionExtensions.kt index 841fb31..c63406b 100644 --- a/src/main/kotlin/ConnectionExtensions.kt +++ b/src/main/kotlin/ConnectionExtensions.kt @@ -1,5 +1,9 @@ package solutions.bitbadger.documents +import solutions.bitbadger.documents.common.DocumentIndex +import solutions.bitbadger.documents.common.Field +import solutions.bitbadger.documents.common.FieldMatch +import solutions.bitbadger.documents.common.Parameter import java.sql.Connection import java.sql.ResultSet @@ -14,7 +18,7 @@ import java.sql.ResultSet * @return A list of results for the given query */ inline fun Connection.customList( - query: String, parameters: Collection> = listOf(), mapFunc: (ResultSet) -> TDoc + query: String, parameters: Collection> = listOf(), noinline mapFunc: (ResultSet, Class) -> TDoc ) = Custom.list(query, parameters, this, mapFunc) /** @@ -26,7 +30,7 @@ inline fun Connection.customList( * @return The document if one matches the query, `null` otherwise */ inline fun Connection.customSingle( - query: String, parameters: Collection> = listOf(), mapFunc: (ResultSet) -> TDoc + query: String, parameters: Collection> = listOf(), noinline mapFunc: (ResultSet, Class) -> TDoc ) = Custom.single(query, parameters, this, mapFunc) /** @@ -46,10 +50,10 @@ fun Connection.customNonQuery(query: String, parameters: Collection * @param mapFunc The mapping function between the document and the domain item * @return The scalar value from the query */ -inline fun Connection.customScalar( +inline fun Connection.customScalar( query: String, parameters: Collection> = listOf(), - mapFunc: (ResultSet) -> T & Any + noinline mapFunc: (ResultSet, Class) -> T ) = Custom.scalar(query, parameters, this, mapFunc) // ~~~ DEFINITION QUERIES ~~~ diff --git a/src/main/kotlin/Count.kt b/src/main/kotlin/Count.kt index 3d4d26f..b865af0 100644 --- a/src/main/kotlin/Count.kt +++ b/src/main/kotlin/Count.kt @@ -1,6 +1,10 @@ package solutions.bitbadger.documents -import solutions.bitbadger.documents.query.Count +import solutions.bitbadger.documents.common.Field +import solutions.bitbadger.documents.common.FieldMatch +import solutions.bitbadger.documents.common.Parameter +import solutions.bitbadger.documents.common.ParameterType +import solutions.bitbadger.documents.common.query.Count import java.sql.Connection /** diff --git a/src/main/kotlin/Custom.kt b/src/main/kotlin/Custom.kt index 1902aec..e3e8ca7 100644 --- a/src/main/kotlin/Custom.kt +++ b/src/main/kotlin/Custom.kt @@ -1,5 +1,7 @@ package solutions.bitbadger.documents +import solutions.bitbadger.documents.common.Parameter +import solutions.bitbadger.documents.java.Custom import java.sql.Connection import java.sql.ResultSet @@ -13,13 +15,17 @@ object Custom { * * @param query The query to retrieve the results * @param parameters Parameters to use for the query + * @param clazz The class of the document to be returned * @param conn The connection over which the query should be executed * @param mapFunc The mapping function between the document and the domain item * @return A list of results for the given query */ inline fun list( - query: String, parameters: Collection> = listOf(), conn: Connection, mapFunc: (ResultSet) -> TDoc - ) = Parameters.apply(conn, query, parameters).use { Results.toCustomList(it, mapFunc) } + query: String, + parameters: Collection> = listOf(), + conn: Connection, + noinline mapFunc: (ResultSet, Class) -> TDoc + ) = Custom.list(query, parameters, TDoc::class.java, conn, mapFunc) /** * Execute a query that returns a list of results (creates connection) @@ -30,7 +36,9 @@ object Custom { * @return A list of results for the given query */ inline fun list( - query: String, parameters: Collection> = listOf(), mapFunc: (ResultSet) -> TDoc + query: String, + parameters: Collection> = listOf(), + noinline mapFunc: (ResultSet, Class) -> TDoc ) = Configuration.dbConn().use { list(query, parameters, it, mapFunc) } /** @@ -43,8 +51,11 @@ object Custom { * @return The document if one matches the query, `null` otherwise */ inline fun single( - query: String, parameters: Collection> = listOf(), conn: Connection, mapFunc: (ResultSet) -> TDoc - ) = list("$query LIMIT 1", parameters, conn, mapFunc).singleOrNull() + query: String, + parameters: Collection> = listOf(), + conn: Connection, + noinline mapFunc: (ResultSet, Class) -> TDoc + ) = Custom.single(query, parameters, TDoc::class.java, conn, mapFunc) /** * Execute a query that returns one or no results @@ -55,7 +66,9 @@ object Custom { * @return The document if one matches the query, `null` otherwise */ inline fun single( - query: String, parameters: Collection> = listOf(), mapFunc: (ResultSet) -> TDoc + query: String, + parameters: Collection> = listOf(), + noinline mapFunc: (ResultSet, Class) -> TDoc ) = Configuration.dbConn().use { single(query, parameters, it, mapFunc) } /** @@ -65,9 +78,8 @@ object Custom { * @param conn The connection over which the query should be executed * @param parameters Parameters to use for the query */ - fun nonQuery(query: String, parameters: Collection> = listOf(), conn: Connection) { - Parameters.apply(conn, query, parameters).use { it.executeUpdate() } - } + fun nonQuery(query: String, parameters: Collection> = listOf(), conn: Connection) = + Custom.nonQuery(query, parameters, conn) /** * Execute a query that returns no results @@ -87,14 +99,12 @@ object Custom { * @param mapFunc The mapping function between the document and the domain item * @return The scalar value from the query */ - inline fun scalar( - query: String, parameters: Collection> = listOf(), conn: Connection, mapFunc: (ResultSet) -> T & Any - ) = Parameters.apply(conn, query, parameters).use { stmt -> - stmt.executeQuery().use { rs -> - rs.next() - mapFunc(rs) - } - } + inline fun scalar( + query: String, + parameters: Collection> = listOf(), + conn: Connection, + noinline mapFunc: (ResultSet, Class) -> T + ) = Custom.scalar(query, parameters, T::class.java, conn, mapFunc) /** * Execute a query that returns a scalar result @@ -104,7 +114,7 @@ object Custom { * @param mapFunc The mapping function between the document and the domain item * @return The scalar value from the query */ - inline fun scalar( - query: String, parameters: Collection> = listOf(), mapFunc: (ResultSet) -> T & Any + inline fun scalar( + query: String, parameters: Collection> = listOf(), noinline mapFunc: (ResultSet, Class) -> T ) = Configuration.dbConn().use { scalar(query, parameters, it, mapFunc) } } diff --git a/src/main/kotlin/Definition.kt b/src/main/kotlin/Definition.kt index d61712c..424d742 100644 --- a/src/main/kotlin/Definition.kt +++ b/src/main/kotlin/Definition.kt @@ -1,7 +1,8 @@ package solutions.bitbadger.documents +import solutions.bitbadger.documents.common.DocumentIndex import java.sql.Connection -import solutions.bitbadger.documents.query.Definition +import solutions.bitbadger.documents.common.query.Definition /** * Functions to define tables and indexes diff --git a/src/main/kotlin/Delete.kt b/src/main/kotlin/Delete.kt index e3ef705..eca0352 100644 --- a/src/main/kotlin/Delete.kt +++ b/src/main/kotlin/Delete.kt @@ -1,6 +1,10 @@ package solutions.bitbadger.documents -import solutions.bitbadger.documents.query.Delete +import solutions.bitbadger.documents.common.Field +import solutions.bitbadger.documents.common.FieldMatch +import solutions.bitbadger.documents.common.Parameter +import solutions.bitbadger.documents.common.ParameterType +import solutions.bitbadger.documents.common.query.Delete import java.sql.Connection /** diff --git a/src/main/kotlin/Document.kt b/src/main/kotlin/Document.kt index da06089..6984e5d 100644 --- a/src/main/kotlin/Document.kt +++ b/src/main/kotlin/Document.kt @@ -1,9 +1,12 @@ package solutions.bitbadger.documents +import solutions.bitbadger.documents.common.AutoId +import solutions.bitbadger.documents.common.Dialect +import solutions.bitbadger.documents.common.Field import java.sql.Connection -import solutions.bitbadger.documents.query.Document -import solutions.bitbadger.documents.query.Where -import solutions.bitbadger.documents.query.statementWhere +import solutions.bitbadger.documents.common.query.Document +import solutions.bitbadger.documents.common.query.Where +import solutions.bitbadger.documents.common.query.statementWhere /** * Functions for manipulating documents @@ -18,7 +21,7 @@ object Document { * @param conn The connection on which the query should be executed */ @JvmStatic - inline fun insert(tableName: String, document: TDoc, conn: Connection) { + fun insert(tableName: String, document: TDoc, conn: Connection) { val strategy = Configuration.autoIdStrategy val query = if (strategy == AutoId.DISABLED) { Document.insert(tableName) @@ -60,7 +63,7 @@ object Document { * @param document The document to be inserted */ @JvmStatic - inline fun insert(tableName: String, document: TDoc) = + fun insert(tableName: String, document: TDoc) = Configuration.dbConn().use { insert(tableName, document, it) } /** @@ -71,7 +74,7 @@ object Document { * @param conn The connection on which the query should be executed */ @JvmStatic - inline fun save(tableName: String, document: TDoc, conn: Connection) = + fun save(tableName: String, document: TDoc, conn: Connection) = conn.customNonQuery(Document.save(tableName), listOf(Parameters.json(":data", document))) /** @@ -81,7 +84,7 @@ object Document { * @param document The document to be saved */ @JvmStatic - inline fun save(tableName: String, document: TDoc) = + fun save(tableName: String, document: TDoc) = Configuration.dbConn().use { save(tableName, document, it) } /** @@ -93,7 +96,7 @@ object Document { * @param conn The connection on which the query should be executed */ @JvmStatic - inline fun update(tableName: String, docId: TKey, document: TDoc, conn: Connection) = + fun update(tableName: String, docId: TKey, document: TDoc, conn: Connection) = conn.customNonQuery( statementWhere(Document.update(tableName), Where.byId(":id", docId)), Parameters.addFields( @@ -110,6 +113,6 @@ object Document { * @param document The document to be replaced */ @JvmStatic - inline fun update(tableName: String, docId: TKey, document: TDoc) = + fun update(tableName: String, docId: TKey, document: TDoc) = Configuration.dbConn().use { update(tableName, docId, document, it) } } diff --git a/src/main/kotlin/Exists.kt b/src/main/kotlin/Exists.kt index 0b1e1ce..4b0072a 100644 --- a/src/main/kotlin/Exists.kt +++ b/src/main/kotlin/Exists.kt @@ -1,6 +1,10 @@ package solutions.bitbadger.documents -import solutions.bitbadger.documents.query.Exists +import solutions.bitbadger.documents.common.Field +import solutions.bitbadger.documents.common.FieldMatch +import solutions.bitbadger.documents.common.Parameter +import solutions.bitbadger.documents.common.ParameterType +import solutions.bitbadger.documents.common.query.Exists import java.sql.Connection /** diff --git a/src/main/kotlin/Find.kt b/src/main/kotlin/Find.kt index 898d910..6135145 100644 --- a/src/main/kotlin/Find.kt +++ b/src/main/kotlin/Find.kt @@ -1,8 +1,12 @@ package solutions.bitbadger.documents +import solutions.bitbadger.documents.common.Field +import solutions.bitbadger.documents.common.FieldMatch +import solutions.bitbadger.documents.common.Parameter +import solutions.bitbadger.documents.common.ParameterType import java.sql.Connection -import solutions.bitbadger.documents.query.Find -import solutions.bitbadger.documents.query.orderBy +import solutions.bitbadger.documents.common.query.Find +import solutions.bitbadger.documents.common.query.orderBy /** * Functions to find and retrieve documents diff --git a/src/main/kotlin/Parameters.kt b/src/main/kotlin/Parameters.kt index 3bf15b2..f31a5db 100644 --- a/src/main/kotlin/Parameters.kt +++ b/src/main/kotlin/Parameters.kt @@ -1,5 +1,7 @@ package solutions.bitbadger.documents +import solutions.bitbadger.documents.common.* +import solutions.bitbadger.documents.common.ParameterName import java.sql.Connection import java.sql.PreparedStatement import java.sql.SQLException @@ -37,8 +39,9 @@ object Parameters { * @param value The object to be encoded as JSON * @return A parameter with the value encoded */ - inline fun json(name: String, value: T) = - Parameter(name, ParameterType.JSON, Configuration.json.encodeToString(value)) + @JvmStatic + fun json(name: String, value: T) = + Parameter(name, ParameterType.JSON, Configuration.serializer.serialize(value)) /** * Add field parameters to the given set of parameters @@ -110,7 +113,9 @@ object Parameters { * @param names The names of the fields to be removed * @param parameterName The parameter name to use for the query * @return A list of parameters to use for building the query + * @throws DocumentException If the dialect has not been set */ + @Throws(DocumentException::class) @JvmStatic @JvmOverloads fun fieldNames(names: Collection, parameterName: String = ":name"): MutableCollection> = diff --git a/src/main/kotlin/Patch.kt b/src/main/kotlin/Patch.kt index ea3128c..4b23b78 100644 --- a/src/main/kotlin/Patch.kt +++ b/src/main/kotlin/Patch.kt @@ -1,6 +1,10 @@ package solutions.bitbadger.documents -import solutions.bitbadger.documents.query.Patch +import solutions.bitbadger.documents.common.Field +import solutions.bitbadger.documents.common.FieldMatch +import solutions.bitbadger.documents.common.Parameter +import solutions.bitbadger.documents.common.ParameterType +import solutions.bitbadger.documents.common.query.Patch import java.sql.Connection /** diff --git a/src/main/kotlin/RemoveFields.kt b/src/main/kotlin/RemoveFields.kt index 7ce2c21..486351a 100644 --- a/src/main/kotlin/RemoveFields.kt +++ b/src/main/kotlin/RemoveFields.kt @@ -1,6 +1,7 @@ package solutions.bitbadger.documents -import solutions.bitbadger.documents.query.RemoveFields +import solutions.bitbadger.documents.common.* +import solutions.bitbadger.documents.common.query.RemoveFields import java.sql.Connection /** diff --git a/src/main/kotlin/Results.kt b/src/main/kotlin/Results.kt index 1ab07fc..e487f0a 100644 --- a/src/main/kotlin/Results.kt +++ b/src/main/kotlin/Results.kt @@ -1,5 +1,8 @@ package solutions.bitbadger.documents +import solutions.bitbadger.documents.common.Dialect +import solutions.bitbadger.documents.common.DocumentException +import solutions.bitbadger.documents.java.Results import java.sql.PreparedStatement import java.sql.ResultSet import java.sql.SQLException @@ -16,17 +19,18 @@ object Results { * @param rs A `ResultSet` set to the row with the document to be constructed * @return The constructed domain item */ - inline fun fromDocument(field: String, rs: ResultSet) = - Configuration.json.decodeFromString(rs.getString(field)) + inline fun fromDocument(field: String): (ResultSet, Class) -> TDoc = + { rs, _ -> Results.fromDocument(field, rs, TDoc::class.java) } /** * Create a domain item from a document * * @param rs A `ResultSet` set to the row with the document to be constructed< + * @param clazz The class of the document to be returned * @return The constructed domain item */ - inline fun fromData(rs: ResultSet) = - fromDocument("data", rs) + inline fun fromData(rs: ResultSet, clazz: Class = TDoc::class.java) = + Results.fromDocument("data", rs, TDoc::class.java) /** * Create a list of items for the results of the given command, using the specified mapping function @@ -36,7 +40,7 @@ object Results { * @return A list of items from the query's result * @throws DocumentException If there is a problem executing the query */ - inline fun toCustomList(stmt: PreparedStatement, mapFunc: (ResultSet) -> TDoc) = + inline fun toCustomList(stmt: PreparedStatement, mapFunc: (ResultSet) -> TDoc) = try { stmt.executeQuery().use { val results = mutableListOf() @@ -55,10 +59,10 @@ object Results { * @param rs A `ResultSet` set to the row with the count to retrieve * @return The count from the row */ - fun toCount(rs: ResultSet) = + fun toCount(rs: ResultSet, clazz: Class = Long::class.java) = when (Configuration.dialect()) { Dialect.POSTGRESQL -> rs.getInt("it").toLong() - Dialect.SQLITE -> rs.getLong("it") + Dialect.SQLITE -> rs.getLong("it") } /** @@ -67,9 +71,9 @@ object Results { * @param rs A `ResultSet` set to the row with the true/false value to retrieve * @return The true/false value from the row */ - fun toExists(rs: ResultSet) = + fun toExists(rs: ResultSet, clazz: Class = Boolean::class.java) = when (Configuration.dialect()) { Dialect.POSTGRESQL -> rs.getBoolean("it") - Dialect.SQLITE -> toCount(rs) > 0L + Dialect.SQLITE -> toCount(rs) > 0L } } diff --git a/src/main/kotlin/java/Custom.kt b/src/main/kotlin/java/Custom.kt new file mode 100644 index 0000000..7d5ee67 --- /dev/null +++ b/src/main/kotlin/java/Custom.kt @@ -0,0 +1,143 @@ +package solutions.bitbadger.documents.java + +import solutions.bitbadger.documents.common.Configuration +import solutions.bitbadger.documents.common.Parameter +import solutions.bitbadger.documents.Parameters +import java.sql.Connection +import java.sql.ResultSet + +object Custom { + + /** + * Execute a query that returns a list of results + * + * @param query The query to retrieve the results + * @param parameters Parameters to use for the query + * @param clazz The class of the document to be returned + * @param conn The connection over which the query should be executed + * @param mapFunc The mapping function between the document and the domain item + * @return A list of results for the given query + */ + @JvmStatic + fun list( + query: String, + parameters: Collection> = listOf(), + clazz: Class, + conn: Connection, + mapFunc: (ResultSet, Class) -> TDoc + ) = Parameters.apply(conn, query, parameters).use { Results.toCustomList(it, clazz, mapFunc) } + + /** + * Execute a query that returns a list of results (creates connection) + * + * @param query The query to retrieve the results + * @param parameters Parameters to use for the query + * @param clazz The class of the document to be returned + * @param mapFunc The mapping function between the document and the domain item + * @return A list of results for the given query + */ + @JvmStatic + fun list( + query: String, + parameters: Collection> = listOf(), + clazz: Class, + mapFunc: (ResultSet, Class) -> TDoc + ) = Configuration.dbConn().use { list(query, parameters, clazz, it, mapFunc) } + + /** + * Execute a query that returns one or no results + * + * @param query The query to retrieve the results + * @param parameters Parameters to use for the query + * @param clazz The class of the document to be returned + * @param conn The connection over which the query should be executed + * @param mapFunc The mapping function between the document and the domain item + * @return The document if one matches the query, `null` otherwise + */ + @JvmStatic + fun single( + query: String, + parameters: Collection> = listOf(), + clazz: Class, + conn: Connection, + mapFunc: (ResultSet, Class) -> TDoc + ) = list("$query LIMIT 1", parameters, clazz, conn, mapFunc).singleOrNull() + + /** + * Execute a query that returns one or no results + * + * @param query The query to retrieve the results + * @param parameters Parameters to use for the query + * @param clazz The class of the document to be returned + * @param mapFunc The mapping function between the document and the domain item + * @return The document if one matches the query, `null` otherwise + */ + @JvmStatic + fun single( + query: String, + parameters: Collection> = listOf(), + clazz: Class, + mapFunc: (ResultSet, Class) -> TDoc + ) = Configuration.dbConn().use { single(query, parameters, clazz, it, mapFunc) } + + /** + * Execute a query that returns no results + * + * @param query The query to retrieve the results + * @param conn The connection over which the query should be executed + * @param parameters Parameters to use for the query + */ + @JvmStatic + fun nonQuery(query: String, parameters: Collection> = listOf(), conn: Connection) { + Parameters.apply(conn, query, parameters).use { it.executeUpdate() } + } + + /** + * Execute a query that returns no results + * + * @param query The query to retrieve the results + * @param parameters Parameters to use for the query + */ + @JvmStatic + @JvmOverloads + fun nonQuery(query: String, parameters: Collection> = listOf()) = + Configuration.dbConn().use { nonQuery(query, parameters, it) } + + /** + * Execute a query that returns a scalar result + * + * @param query The query to retrieve the result + * @param parameters Parameters to use for the query + * @param conn The connection over which the query should be executed + * @param mapFunc The mapping function between the document and the domain item + * @return The scalar value from the query + */ + @JvmStatic + fun scalar( + query: String, + parameters: Collection> = listOf(), + clazz: Class, + conn: Connection, + mapFunc: (ResultSet, Class) -> T + ) = Parameters.apply(conn, query, parameters).use { stmt -> + stmt.executeQuery().use { rs -> + rs.next() + mapFunc(rs, clazz) + } + } + + /** + * Execute a query that returns a scalar result + * + * @param query The query to retrieve the result + * @param parameters Parameters to use for the query + * @param mapFunc The mapping function between the document and the domain item + * @return The scalar value from the query + */ + fun scalar( + query: String, + parameters: Collection> = listOf(), + clazz: Class, + mapFunc: (ResultSet, Class) -> T + ) = Configuration.dbConn().use { scalar(query, parameters, clazz, it, mapFunc) } +} diff --git a/src/main/kotlin/java/Results.kt b/src/main/kotlin/java/Results.kt new file mode 100644 index 0000000..9b6f9eb --- /dev/null +++ b/src/main/kotlin/java/Results.kt @@ -0,0 +1,91 @@ +package solutions.bitbadger.documents.java + +import solutions.bitbadger.documents.Configuration +import solutions.bitbadger.documents.common.Dialect +import solutions.bitbadger.documents.common.DocumentException +import java.sql.PreparedStatement +import java.sql.ResultSet +import java.sql.SQLException +import kotlin.jvm.Throws + +object Results { + + /** + * Create a domain item from a document, specifying the field in which the document is found + * + * @param field The field name containing the JSON document + * @param rs A `ResultSet` set to the row with the document to be constructed + * @param clazz The class of the document to be returned + * @return The constructed domain item + */ + @JvmStatic + fun fromDocument(field: String, rs: ResultSet, clazz: Class) = + Configuration.serializer.deserialize(rs.getString(field), clazz) + + /** + * Create a domain item from a document + * + * @param rs A `ResultSet` set to the row with the document to be constructed< + * @param clazz The class of the document to be returned + * @return The constructed domain item + */ + @JvmStatic + fun fromData(rs: ResultSet, clazz: Class) = + fromDocument("data", rs, clazz) + + /** + * Create a list of items for the results of the given command, using the specified mapping function + * + * @param stmt The prepared statement to execute + * @param mapFunc The mapping function from data reader to domain class instance + * @param clazz The class of the document to be returned + * @return A list of items from the query's result + * @throws DocumentException If there is a problem executing the query + */ + @Throws(DocumentException::class) + @JvmStatic + fun toCustomList( + stmt: PreparedStatement, clazz: Class, mapFunc: (ResultSet, Class) -> TDoc + ) = + try { + stmt.executeQuery().use { + val results = mutableListOf() + while (it.next()) { + results.add(mapFunc(it, clazz)) + } + results.toList() + } + } catch (ex: SQLException) { + throw DocumentException("Error retrieving documents from query: ${ex.message}", ex) + } + + /** + * Extract a count from the first column + * + * @param rs A `ResultSet` set to the row with the count to retrieve + * @return The count from the row + * @throws DocumentException If the dialect has not been set + */ + @Throws(DocumentException::class) + @JvmStatic + fun toCount(rs: ResultSet) = + when (Configuration.dialect()) { + Dialect.POSTGRESQL -> rs.getInt("it").toLong() + Dialect.SQLITE -> rs.getLong("it") + } + + /** + * Extract a true/false value from the first column + * + * @param rs A `ResultSet` set to the row with the true/false value to retrieve + * @return The true/false value from the row + * @throws DocumentException If the dialect has not been set + */ + @Throws(DocumentException::class) + @JvmStatic + fun toExists(rs: ResultSet) = + when (Configuration.dialect()) { + Dialect.POSTGRESQL -> rs.getBoolean("it") + Dialect.SQLITE -> toCount(rs) > 0L + } +} diff --git a/src/pom.xml b/src/pom.xml new file mode 100644 index 0000000..928441f --- /dev/null +++ b/src/pom.xml @@ -0,0 +1,92 @@ + + + 4.0.0 + + solutions.bitbadger + documents + 4.0.0-alpha1-SNAPSHOT + pom + + ${project.groupId}:${project.artifactId} + Expose a document store interface for PostgreSQL and SQLite + https://bitbadger.solutions/open-source/solutions.bitbadger.documents + + + + MIT License + https://www.opensource.org/licenses/mit-license.php + + + + + + Daniel J. Summers + daniel@bitbadger.solutions + Bit Badger Solutions + https://bitbadger.solutions + + + + + scm:git:https://git.bitbadger.solutions/bit-badger/solutions.bitbadger.documents.git + scm:git:https://git.bitbadger.solutions/bit-badger/solutions.bitbadger.documents.git + https://git.bitbadger.solutions/bit-badger/solutions.bitbadger.documents + + + + UTF-8 + official + 11 + 2.1.0 + 1.8.0 + + + + common + + + + + 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 + + + + \ No newline at end of file diff --git a/src/test/java/solutions/bitbadger/documents/java/ConfigurationTest.java b/src/test/java/solutions/bitbadger/documents/java/ConfigurationTest.java index ed6a71a..c24b49c 100644 --- a/src/test/java/solutions/bitbadger/documents/java/ConfigurationTest.java +++ b/src/test/java/solutions/bitbadger/documents/java/ConfigurationTest.java @@ -3,6 +3,8 @@ package solutions.bitbadger.documents.java; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import solutions.bitbadger.documents.*; +import solutions.bitbadger.documents.common.Dialect; +import solutions.bitbadger.documents.common.DocumentException; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/solutions/bitbadger/documents/java/ParametersTest.java b/src/test/java/solutions/bitbadger/documents/java/ParametersTest.java index 6c011d1..c3b98c8 100644 --- a/src/test/java/solutions/bitbadger/documents/java/ParametersTest.java +++ b/src/test/java/solutions/bitbadger/documents/java/ParametersTest.java @@ -4,8 +4,11 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import solutions.bitbadger.documents.*; +import solutions.bitbadger.documents.common.DocumentException; +import solutions.bitbadger.documents.common.Field; +import solutions.bitbadger.documents.common.Parameter; +import solutions.bitbadger.documents.common.ParameterType; -import java.util.Collection; import java.util.List; import static org.junit.jupiter.api.Assertions.*; @@ -63,9 +66,9 @@ final public class ParametersTest { @Test @DisplayName("fieldNames generates a single parameter (PostgreSQL)") - public void fieldNamesSinglePostgres() { + public void fieldNamesSinglePostgres() throws DocumentException { Configuration.setConnectionString(":postgresql:"); - Parameter[] nameParams = Parameters.fieldNames(List.of("test")).toArray(new Parameter[] { }); + Parameter[] nameParams = Parameters.fieldNames(List.of("test")).toArray(new Parameter[]{}); assertEquals(1, nameParams.length, "There should be one name parameter"); assertEquals(":name", nameParams[0].getName(), "The parameter name is incorrect"); assertEquals(ParameterType.STRING, nameParams[0].getType(), "The parameter type is incorrect"); @@ -74,10 +77,10 @@ final public class ParametersTest { @Test @DisplayName("fieldNames generates multiple parameters (PostgreSQL)") - public void fieldNamesMultiplePostgres() { + public void fieldNamesMultiplePostgres() throws DocumentException { Configuration.setConnectionString(":postgresql:"); Parameter[] nameParams = Parameters.fieldNames(List.of("test", "this", "today")) - .toArray(new Parameter[] { }); + .toArray(new Parameter[]{}); assertEquals(1, nameParams.length, "There should be one name parameter"); assertEquals(":name", nameParams[0].getName(), "The parameter name is incorrect"); assertEquals(ParameterType.STRING, nameParams[0].getType(), "The parameter type is incorrect"); @@ -86,9 +89,9 @@ final public class ParametersTest { @Test @DisplayName("fieldNames generates a single parameter (SQLite)") - public void fieldNamesSingleSQLite() { + public void fieldNamesSingleSQLite() throws DocumentException { Configuration.setConnectionString(":sqlite:"); - Parameter[] nameParams = Parameters.fieldNames(List.of("test")).toArray(new Parameter[] { }); + Parameter[] nameParams = Parameters.fieldNames(List.of("test")).toArray(new Parameter[]{}); assertEquals(1, nameParams.length, "There should be one name parameter"); assertEquals(":name0", nameParams[0].getName(), "The parameter name is incorrect"); assertEquals(ParameterType.STRING, nameParams[0].getType(), "The parameter type is incorrect"); @@ -97,10 +100,10 @@ final public class ParametersTest { @Test @DisplayName("fieldNames generates multiple parameters (SQLite)") - public void fieldNamesMultipleSQLite() { + public void fieldNamesMultipleSQLite() throws DocumentException { Configuration.setConnectionString(":sqlite:"); Parameter[] nameParams = Parameters.fieldNames(List.of("test", "this", "today")) - .toArray(new Parameter[] { }); + .toArray(new Parameter[]{}); assertEquals(3, nameParams.length, "There should be one name parameter"); assertEquals(":name0", nameParams[0].getName(), "The first parameter name is incorrect"); assertEquals(ParameterType.STRING, nameParams[0].getType(), "The first parameter type is incorrect"); diff --git a/src/test/java/solutions/bitbadger/documents/java/integration/postgresql/CountIT.java b/src/test/java/solutions/bitbadger/documents/java/integration/postgresql/CountIT.java new file mode 100644 index 0000000..32fb88d --- /dev/null +++ b/src/test/java/solutions/bitbadger/documents/java/integration/postgresql/CountIT.java @@ -0,0 +1,22 @@ +package solutions.bitbadger.documents.java.integration.postgresql; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import solutions.bitbadger.documents.integration.postgresql.PgDB; +import solutions.bitbadger.documents.java.integration.common.Count; + +/** + * PostgreSQL integration tests for the `Count` object / `count*` connection extension functions + */ +@DisplayName("Java | PostgreSQL: Count") +public class CountIT { + + @Test + @DisplayName("all counts all documents") + public void all() { + try (PgDB db = new PgDB()) { + Count.all(db); + } + } + +} diff --git a/src/test/java/solutions/bitbadger/documents/java/testDocs/JsonDocument.java b/src/test/java/solutions/bitbadger/documents/java/testDocs/JsonDocument.java index be54944..7bd9906 100644 --- a/src/test/java/solutions/bitbadger/documents/java/testDocs/JsonDocument.java +++ b/src/test/java/solutions/bitbadger/documents/java/testDocs/JsonDocument.java @@ -1,5 +1,6 @@ package solutions.bitbadger.documents.java.testDocs; +import kotlinx.serialization.Serializable; import solutions.bitbadger.documents.Document; import solutions.bitbadger.documents.integration.ThrowawayDatabase; @@ -7,6 +8,7 @@ import java.util.List; import static solutions.bitbadger.documents.integration.TypesKt.TEST_TABLE; +@Serializable public class JsonDocument { private String id; @@ -70,8 +72,7 @@ public class JsonDocument { public static void load(ThrowawayDatabase db, String tableName) { for (JsonDocument doc : testDocuments) { - // TODO: inline reified generics cannot be called from Java :( - // Document.insert(tableName, doc, db.getConn()); + Document.insert(tableName, doc, db.getConn()); } } diff --git a/src/test/kotlin/ConfigurationTest.kt b/src/test/kotlin/ConfigurationTest.kt index 22754a5..d3689f7 100644 --- a/src/test/kotlin/ConfigurationTest.kt +++ b/src/test/kotlin/ConfigurationTest.kt @@ -2,8 +2,6 @@ package solutions.bitbadger.documents import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows -import kotlin.test.assertEquals import kotlin.test.assertFalse import kotlin.test.assertTrue @@ -20,34 +18,4 @@ class ConfigurationTest { assertFalse(Configuration.json.configuration.explicitNulls, "Explicit Nulls should not have been set") assertTrue(Configuration.json.configuration.coerceInputValues, "Coerce Input Values should have been set") } - - @Test - @DisplayName("Default ID field is `id`") - fun defaultIdField() { - assertEquals("id", Configuration.idField, "Default ID field incorrect") - } - - @Test - @DisplayName("Default Auto ID strategy is `DISABLED`") - fun defaultAutoId() { - assertEquals(AutoId.DISABLED, Configuration.autoIdStrategy, "Default Auto ID strategy should be `disabled`") - } - - @Test - @DisplayName("Default ID string length should be 16") - fun defaultIdStringLength() { - assertEquals(16, Configuration.idStringLength, "Default ID string length should be 16") - } - - @Test - @DisplayName("Dialect is derived from connection string") - fun dialectIsDerived() { - try { - assertThrows { Configuration.dialect() } - Configuration.connectionString = "jdbc:postgresql:db" - assertEquals(Dialect.POSTGRESQL, Configuration.dialect()) - } finally { - Configuration.connectionString = null - } - } } diff --git a/src/test/kotlin/ParametersTest.kt b/src/test/kotlin/ParametersTest.kt index 686ed67..566c267 100644 --- a/src/test/kotlin/ParametersTest.kt +++ b/src/test/kotlin/ParametersTest.kt @@ -3,6 +3,7 @@ package solutions.bitbadger.documents import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.assertThrows +import solutions.bitbadger.documents.common.* import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNotSame @@ -51,8 +52,10 @@ class ParametersTest { @Test @DisplayName("replaceNamesInQuery replaces successfully") fun replaceNamesInQuery() { - val parameters = listOf(Parameter(":data", ParameterType.JSON, "{}"), - Parameter(":data_ext", ParameterType.STRING, "")) + val parameters = listOf( + Parameter(":data", ParameterType.JSON, "{}"), + Parameter(":data_ext", ParameterType.STRING, "") + ) val query = "SELECT data, data_ext FROM tbl WHERE data = :data AND data_ext = :data_ext AND more_data = :data" assertEquals("SELECT data, data_ext FROM tbl WHERE data = ? AND data_ext = ? AND more_data = ?", Parameters.replaceNamesInQuery(query, parameters), "Parameters not replaced correctly") diff --git a/src/test/kotlin/integration/common/Count.kt b/src/test/kotlin/integration/common/Count.kt index f6cad25..e360977 100644 --- a/src/test/kotlin/integration/common/Count.kt +++ b/src/test/kotlin/integration/common/Count.kt @@ -1,6 +1,7 @@ package solutions.bitbadger.documents.integration.common import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.Field import solutions.bitbadger.documents.integration.JsonDocument import solutions.bitbadger.documents.integration.TEST_TABLE import solutions.bitbadger.documents.integration.ThrowawayDatabase diff --git a/src/test/kotlin/integration/common/Custom.kt b/src/test/kotlin/integration/common/Custom.kt index 8170e94..f8361c6 100644 --- a/src/test/kotlin/integration/common/Custom.kt +++ b/src/test/kotlin/integration/common/Custom.kt @@ -1,12 +1,15 @@ package solutions.bitbadger.documents.integration.common import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.Field +import solutions.bitbadger.documents.common.Parameter +import solutions.bitbadger.documents.common.ParameterType import solutions.bitbadger.documents.integration.JsonDocument import solutions.bitbadger.documents.integration.TEST_TABLE import solutions.bitbadger.documents.integration.ThrowawayDatabase -import solutions.bitbadger.documents.query.Count -import solutions.bitbadger.documents.query.Delete -import solutions.bitbadger.documents.query.Find +import solutions.bitbadger.documents.common.query.Count +import solutions.bitbadger.documents.common.query.Delete +import solutions.bitbadger.documents.common.query.Find import kotlin.test.assertEquals import kotlin.test.assertNotNull import kotlin.test.assertNull diff --git a/src/test/kotlin/integration/common/Definition.kt b/src/test/kotlin/integration/common/Definition.kt index d8f763d..e667ce8 100644 --- a/src/test/kotlin/integration/common/Definition.kt +++ b/src/test/kotlin/integration/common/Definition.kt @@ -1,6 +1,7 @@ package solutions.bitbadger.documents.integration.common import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.DocumentIndex import solutions.bitbadger.documents.integration.TEST_TABLE import solutions.bitbadger.documents.integration.ThrowawayDatabase import kotlin.test.assertFalse diff --git a/src/test/kotlin/integration/common/Delete.kt b/src/test/kotlin/integration/common/Delete.kt index 4a929b5..1e69426 100644 --- a/src/test/kotlin/integration/common/Delete.kt +++ b/src/test/kotlin/integration/common/Delete.kt @@ -1,6 +1,7 @@ package solutions.bitbadger.documents.integration.common import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.Field import solutions.bitbadger.documents.integration.JsonDocument import solutions.bitbadger.documents.integration.TEST_TABLE import solutions.bitbadger.documents.integration.ThrowawayDatabase diff --git a/src/test/kotlin/integration/common/Document.kt b/src/test/kotlin/integration/common/Document.kt index 9396776..bb3c41b 100644 --- a/src/test/kotlin/integration/common/Document.kt +++ b/src/test/kotlin/integration/common/Document.kt @@ -1,6 +1,7 @@ package solutions.bitbadger.documents.integration.common import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.Field import solutions.bitbadger.documents.integration.* import kotlin.test.* diff --git a/src/test/kotlin/integration/common/Exists.kt b/src/test/kotlin/integration/common/Exists.kt index 05ba58e..2dc51b8 100644 --- a/src/test/kotlin/integration/common/Exists.kt +++ b/src/test/kotlin/integration/common/Exists.kt @@ -1,6 +1,7 @@ package solutions.bitbadger.documents.integration.common import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.Field import solutions.bitbadger.documents.integration.JsonDocument import solutions.bitbadger.documents.integration.TEST_TABLE import solutions.bitbadger.documents.integration.ThrowawayDatabase diff --git a/src/test/kotlin/integration/common/Find.kt b/src/test/kotlin/integration/common/Find.kt index 48cd857..839991d 100644 --- a/src/test/kotlin/integration/common/Find.kt +++ b/src/test/kotlin/integration/common/Find.kt @@ -1,6 +1,8 @@ package solutions.bitbadger.documents.integration.common import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.Field +import solutions.bitbadger.documents.common.FieldMatch import solutions.bitbadger.documents.integration.* import kotlin.test.assertEquals import kotlin.test.assertNotNull @@ -209,7 +211,8 @@ object Find { fun firstByFieldsMatchOrdered(db: ThrowawayDatabase) { JsonDocument.load(db) - val doc = db.conn.findFirstByFields(TEST_TABLE, listOf(Field.equal("sub.foo", "green")), orderBy = listOf(Field.named("n:numValue DESC"))) + val doc = db.conn.findFirstByFields(TEST_TABLE, listOf(Field.equal("sub.foo", "green")), orderBy = listOf( + Field.named("n:numValue DESC"))) assertNotNull(doc, "There should have been a document returned") assertEquals("four", doc.id, "An incorrect document was returned") } diff --git a/src/test/kotlin/integration/common/Patch.kt b/src/test/kotlin/integration/common/Patch.kt index 77fc60a..37d7315 100644 --- a/src/test/kotlin/integration/common/Patch.kt +++ b/src/test/kotlin/integration/common/Patch.kt @@ -1,6 +1,7 @@ package solutions.bitbadger.documents.integration.common import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.Field import solutions.bitbadger.documents.integration.JsonDocument import solutions.bitbadger.documents.integration.TEST_TABLE import solutions.bitbadger.documents.integration.ThrowawayDatabase diff --git a/src/test/kotlin/integration/common/RemoveFields.kt b/src/test/kotlin/integration/common/RemoveFields.kt index cbfeeaf..e8381a1 100644 --- a/src/test/kotlin/integration/common/RemoveFields.kt +++ b/src/test/kotlin/integration/common/RemoveFields.kt @@ -1,6 +1,7 @@ package solutions.bitbadger.documents.integration.common import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.Field import solutions.bitbadger.documents.integration.JsonDocument import solutions.bitbadger.documents.integration.TEST_TABLE import solutions.bitbadger.documents.integration.ThrowawayDatabase diff --git a/src/test/kotlin/integration/postgresql/CountIT.kt b/src/test/kotlin/integration/postgresql/CountIT.kt index 9709cf9..9b4dc33 100644 --- a/src/test/kotlin/integration/postgresql/CountIT.kt +++ b/src/test/kotlin/integration/postgresql/CountIT.kt @@ -7,7 +7,7 @@ import kotlin.test.Test /** * PostgreSQL integration tests for the `Count` object / `count*` connection extension functions */ -@DisplayName("PostgreSQL - Count") +@DisplayName("Kotlin | PostgreSQL: Count") class CountIT { @Test diff --git a/src/test/kotlin/integration/postgresql/PgDB.kt b/src/test/kotlin/integration/postgresql/PgDB.kt index ae517d3..c72af32 100644 --- a/src/test/kotlin/integration/postgresql/PgDB.kt +++ b/src/test/kotlin/integration/postgresql/PgDB.kt @@ -1,6 +1,8 @@ package solutions.bitbadger.documents.integration.postgresql import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.Parameter +import solutions.bitbadger.documents.common.ParameterType import solutions.bitbadger.documents.integration.TEST_TABLE import solutions.bitbadger.documents.integration.ThrowawayDatabase diff --git a/src/test/kotlin/integration/sqlite/CountIT.kt b/src/test/kotlin/integration/sqlite/CountIT.kt index 0ebdeb7..7b08ddf 100644 --- a/src/test/kotlin/integration/sqlite/CountIT.kt +++ b/src/test/kotlin/integration/sqlite/CountIT.kt @@ -2,7 +2,7 @@ package solutions.bitbadger.documents.integration.sqlite import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.assertThrows -import solutions.bitbadger.documents.DocumentException +import solutions.bitbadger.documents.common.DocumentException import solutions.bitbadger.documents.integration.common.Count import kotlin.test.Test diff --git a/src/test/kotlin/integration/sqlite/DefinitionIT.kt b/src/test/kotlin/integration/sqlite/DefinitionIT.kt index 8e1a6cd..0cd15fa 100644 --- a/src/test/kotlin/integration/sqlite/DefinitionIT.kt +++ b/src/test/kotlin/integration/sqlite/DefinitionIT.kt @@ -2,7 +2,7 @@ package solutions.bitbadger.documents.integration.sqlite import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.assertThrows -import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.DocumentException import solutions.bitbadger.documents.integration.common.Definition import kotlin.test.Test diff --git a/src/test/kotlin/integration/sqlite/DeleteIT.kt b/src/test/kotlin/integration/sqlite/DeleteIT.kt index b623e24..40c100e 100644 --- a/src/test/kotlin/integration/sqlite/DeleteIT.kt +++ b/src/test/kotlin/integration/sqlite/DeleteIT.kt @@ -2,7 +2,7 @@ package solutions.bitbadger.documents.integration.sqlite import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.assertThrows -import solutions.bitbadger.documents.DocumentException +import solutions.bitbadger.documents.common.DocumentException import solutions.bitbadger.documents.integration.common.Delete import kotlin.test.Test diff --git a/src/test/kotlin/integration/sqlite/ExistsIT.kt b/src/test/kotlin/integration/sqlite/ExistsIT.kt index d9c0c6d..42bf633 100644 --- a/src/test/kotlin/integration/sqlite/ExistsIT.kt +++ b/src/test/kotlin/integration/sqlite/ExistsIT.kt @@ -2,7 +2,7 @@ package solutions.bitbadger.documents.integration.sqlite import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.assertThrows -import solutions.bitbadger.documents.DocumentException +import solutions.bitbadger.documents.common.DocumentException import solutions.bitbadger.documents.integration.common.Exists import kotlin.test.Test diff --git a/src/test/kotlin/integration/sqlite/FindIT.kt b/src/test/kotlin/integration/sqlite/FindIT.kt index f0f05bd..6750c03 100644 --- a/src/test/kotlin/integration/sqlite/FindIT.kt +++ b/src/test/kotlin/integration/sqlite/FindIT.kt @@ -2,7 +2,7 @@ package solutions.bitbadger.documents.integration.sqlite import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.assertThrows -import solutions.bitbadger.documents.DocumentException +import solutions.bitbadger.documents.common.DocumentException import solutions.bitbadger.documents.integration.common.Find import kotlin.test.Test diff --git a/src/test/kotlin/integration/sqlite/PatchIT.kt b/src/test/kotlin/integration/sqlite/PatchIT.kt index 7878bdf..76e9c27 100644 --- a/src/test/kotlin/integration/sqlite/PatchIT.kt +++ b/src/test/kotlin/integration/sqlite/PatchIT.kt @@ -2,7 +2,7 @@ package solutions.bitbadger.documents.integration.sqlite import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.assertThrows -import solutions.bitbadger.documents.DocumentException +import solutions.bitbadger.documents.common.DocumentException import solutions.bitbadger.documents.integration.common.Patch import kotlin.test.Test diff --git a/src/test/kotlin/integration/sqlite/RemoveFieldsIT.kt b/src/test/kotlin/integration/sqlite/RemoveFieldsIT.kt index bbc26a3..096d1fb 100644 --- a/src/test/kotlin/integration/sqlite/RemoveFieldsIT.kt +++ b/src/test/kotlin/integration/sqlite/RemoveFieldsIT.kt @@ -2,7 +2,7 @@ package solutions.bitbadger.documents.integration.sqlite import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.assertThrows -import solutions.bitbadger.documents.DocumentException +import solutions.bitbadger.documents.common.DocumentException import solutions.bitbadger.documents.integration.common.RemoveFields import kotlin.test.Test diff --git a/src/test/kotlin/integration/sqlite/SQLiteDB.kt b/src/test/kotlin/integration/sqlite/SQLiteDB.kt index 55504a0..e6be940 100644 --- a/src/test/kotlin/integration/sqlite/SQLiteDB.kt +++ b/src/test/kotlin/integration/sqlite/SQLiteDB.kt @@ -1,6 +1,8 @@ package solutions.bitbadger.documents.integration.sqlite import solutions.bitbadger.documents.* +import solutions.bitbadger.documents.common.Parameter +import solutions.bitbadger.documents.common.ParameterType import solutions.bitbadger.documents.integration.TEST_TABLE import solutions.bitbadger.documents.integration.ThrowawayDatabase import java.io.File