diff --git a/src/core/pom.xml b/src/core/pom.xml index 2da4e57..d54de26 100644 --- a/src/core/pom.xml +++ b/src/core/pom.xml @@ -106,6 +106,9 @@ jar + + ${project.basedir}/src/main/kotlin + diff --git a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Count.scala b/src/scala/src/main/scala/Count.scala similarity index 92% rename from src/scala/src/main/scala/solutions/bitbadger/documents/scala/Count.scala rename to src/scala/src/main/scala/Count.scala index a2a1d3c..df5a319 100644 --- a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Count.scala +++ b/src/scala/src/main/scala/Count.scala @@ -62,12 +62,12 @@ object Count: * Count documents using a JSON containment query (PostgreSQL only) * * @param tableName The name of the table in which documents should be counted - * @param criteria The object for which JSON containment should be checked - * @param conn The connection on which the count should be executed + * @param criteria The object for which JSON containment should be checked + * @param conn The connection on which the count should be executed * @return A count of the matching documents in the table * @throws DocumentException If called on a SQLite connection */ - def byContains[TContains](tableName: String, criteria: TContains, conn: Connection): Long = + def byContains[A](tableName: String, criteria: A, conn: Connection): Long = CoreCount.byContains(tableName, criteria, conn) /** @@ -78,7 +78,7 @@ object Count: * @return A count of the matching documents in the table * @throws DocumentException If called on a SQLite connection */ - def byContains[TContains](tableName: String, criteria: TContains): Long = + def byContains[A](tableName: String, criteria: A): Long = CoreCount.byContains(tableName, criteria) /** diff --git a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Custom.scala b/src/scala/src/main/scala/Custom.scala similarity index 73% rename from src/scala/src/main/scala/solutions/bitbadger/documents/scala/Custom.scala rename to src/scala/src/main/scala/Custom.scala index b59bee2..d946b33 100644 --- a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Custom.scala +++ b/src/scala/src/main/scala/Custom.scala @@ -18,9 +18,9 @@ object Custom: * @return A list of results for the given query * @throws DocumentException If parameters are invalid */ - def list[TDoc](query: String, parameters: Seq[Parameter[?]], conn: Connection, - mapFunc: (ResultSet, ClassTag[TDoc]) => TDoc)(implicit tag: ClassTag[TDoc]): List[TDoc] = - Using(Parameters.apply(conn, query, parameters)) { stmt => Results.toCustomList[TDoc](stmt, mapFunc) }.get + def list[Doc](query: String, parameters: Seq[Parameter[?]], conn: Connection, + mapFunc: (ResultSet, ClassTag[Doc]) => Doc)(using tag: ClassTag[Doc]): List[Doc] = + Using(Parameters.apply(conn, query, parameters)) { stmt => Results.toCustomList[Doc](stmt, mapFunc) }.get /** * Execute a query that returns a list of results @@ -31,8 +31,8 @@ object Custom: * @return A list of results for the given query * @throws DocumentException If parameters are invalid */ - def list[TDoc](query: String, conn: Connection, - mapFunc: (ResultSet, ClassTag[TDoc]) => TDoc)(implicit tag: ClassTag[TDoc]): List[TDoc] = + def list[Doc](query: String, conn: Connection, mapFunc: (ResultSet, ClassTag[Doc]) => Doc) + (using tag: ClassTag[Doc]): List[Doc] = list(query, List(), conn, mapFunc) /** @@ -44,9 +44,9 @@ object Custom: * @return A list of results for the given query * @throws DocumentException If parameters are invalid */ - def list[TDoc](query: String, parameters: Seq[Parameter[?]], - mapFunc: (ResultSet, ClassTag[TDoc]) => TDoc)(implicit tag: ClassTag[TDoc]): List[TDoc] = - Using(Configuration.dbConn()) { conn => list[TDoc](query, parameters, conn, mapFunc) }.get + def list[Doc](query: String, parameters: Seq[Parameter[?]], mapFunc: (ResultSet, ClassTag[Doc]) => Doc) + (using tag: ClassTag[Doc]): List[Doc] = + Using(Configuration.dbConn()) { conn => list[Doc](query, parameters, conn, mapFunc) }.get /** * Execute a query that returns a list of results (creates connection) @@ -56,8 +56,7 @@ object Custom: * @return A list of results for the given query * @throws DocumentException If parameters are invalid */ - def list[TDoc](query: String, - mapFunc: (ResultSet, ClassTag[TDoc]) => TDoc)(implicit tag: ClassTag[TDoc]): List[TDoc] = + def list[Doc](query: String, mapFunc: (ResultSet, ClassTag[Doc]) => Doc)(using tag: ClassTag[Doc]): List[Doc] = list(query, List(), mapFunc) /** @@ -70,9 +69,9 @@ object Custom: * @return An `Option` value, with the document if one matches the query * @throws DocumentException If parameters are invalid */ - def single[TDoc](query: String, parameters: Seq[Parameter[?]], conn: Connection, - mapFunc: (ResultSet, ClassTag[TDoc]) => TDoc)(implicit tag: ClassTag[TDoc]): Option[TDoc] = - list[TDoc](s"$query LIMIT 1", parameters, conn, mapFunc).headOption + def single[Doc](query: String, parameters: Seq[Parameter[?]], conn: Connection, + mapFunc: (ResultSet, ClassTag[Doc]) => Doc)(using tag: ClassTag[Doc]): Option[Doc] = + list[Doc](s"$query LIMIT 1", parameters, conn, mapFunc).headOption /** * Execute a query that returns one or no results @@ -83,9 +82,9 @@ object Custom: * @return An `Option` value, with the document if one matches the query * @throws DocumentException If parameters are invalid */ - def single[TDoc](query: String, conn: Connection, - mapFunc: (ResultSet, ClassTag[TDoc]) => TDoc)(implicit tag: ClassTag[TDoc]): Option[TDoc] = - list[TDoc](s"$query LIMIT 1", List(), conn, mapFunc).headOption + def single[Doc](query: String, conn: Connection, mapFunc: (ResultSet, ClassTag[Doc]) => Doc) + (using tag: ClassTag[Doc]): Option[Doc] = + list[Doc](s"$query LIMIT 1", List(), conn, mapFunc).headOption /** * Execute a query that returns one or no results (creates connection) @@ -96,9 +95,9 @@ object Custom: * @return An `Option` value, with the document if one matches the query * @throws DocumentException If parameters are invalid */ - def single[TDoc](query: String, parameters: Seq[Parameter[?]], - mapFunc: (ResultSet, ClassTag[TDoc]) => TDoc)(implicit tag: ClassTag[TDoc]): Option[TDoc] = - Using(Configuration.dbConn()) { conn => single[TDoc](query, parameters, conn, mapFunc) }.get + def single[Doc](query: String, parameters: Seq[Parameter[?]], mapFunc: (ResultSet, ClassTag[Doc]) => Doc) + (using tag: ClassTag[Doc]): Option[Doc] = + Using(Configuration.dbConn()) { conn => single[Doc](query, parameters, conn, mapFunc) }.get /** * Execute a query that returns one or no results (creates connection) @@ -108,9 +107,8 @@ object Custom: * @return An `Option` value, with the document if one matches the query * @throws DocumentException If parameters are invalid */ - def single[TDoc](query: String, - mapFunc: (ResultSet, ClassTag[TDoc]) => TDoc)(implicit tag: ClassTag[TDoc]): Option[TDoc] = - single[TDoc](query, List(), mapFunc) + def single[Doc](query: String, mapFunc: (ResultSet, ClassTag[Doc]) => Doc)(using tag: ClassTag[Doc]): Option[Doc] = + single[Doc](query, List(), mapFunc) /** * Execute a query that returns no results @@ -162,8 +160,8 @@ object Custom: * @return The scalar value from the query * @throws DocumentException If parameters are invalid */ - def scalar[T](query: String, parameters: Seq[Parameter[?]], conn: Connection, - mapFunc: (ResultSet, ClassTag[T]) => T)(implicit tag: ClassTag[T]): T = + def scalar[A](query: String, parameters: Seq[Parameter[?]], conn: Connection, mapFunc: (ResultSet, ClassTag[A]) => A) + (using tag: ClassTag[A]): A = Using(Parameters.apply(conn, query, parameters)) { stmt => Using(stmt.executeQuery()) { rs => rs.next() @@ -180,9 +178,8 @@ object Custom: * @return The scalar value from the query * @throws DocumentException If parameters are invalid */ - def scalar[T](query: String, conn: Connection, - mapFunc: (ResultSet, ClassTag[T]) => T)(implicit tag: ClassTag[T]): T = - scalar[T](query, List(), conn, mapFunc) + def scalar[A](query: String, conn: Connection, mapFunc: (ResultSet, ClassTag[A]) => A)(using tag: ClassTag[A]): A = + scalar[A](query, List(), conn, mapFunc) /** * Execute a query that returns a scalar result (creates connection) @@ -193,9 +190,9 @@ object Custom: * @return The scalar value from the query * @throws DocumentException If parameters are invalid */ - def scalar[T](query: String, parameters: Seq[Parameter[?]], - mapFunc: (ResultSet, ClassTag[T]) => T)(implicit tag: ClassTag[T]): T = - Using(Configuration.dbConn()) { conn => scalar[T](query, parameters, conn, mapFunc) }.get + def scalar[A](query: String, parameters: Seq[Parameter[?]], mapFunc: (ResultSet, ClassTag[A]) => A) + (using tag: ClassTag[A]): A = + Using(Configuration.dbConn()) { conn => scalar[A](query, parameters, conn, mapFunc) }.get /** * Execute a query that returns a scalar result (creates connection) @@ -205,6 +202,5 @@ object Custom: * @return The scalar value from the query * @throws DocumentException If parameters are invalid */ - def scalar[T](query: String, - mapFunc: (ResultSet, ClassTag[T]) => T)(implicit tag: ClassTag[T]): T = - scalar[T](query, List(), mapFunc) + def scalar[A](query: String, mapFunc: (ResultSet, ClassTag[A]) => A)(using tag: ClassTag[A]): A = + scalar[A](query, List(), mapFunc) diff --git a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Definition.scala b/src/scala/src/main/scala/Definition.scala similarity index 100% rename from src/scala/src/main/scala/solutions/bitbadger/documents/scala/Definition.scala rename to src/scala/src/main/scala/Definition.scala diff --git a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Delete.scala b/src/scala/src/main/scala/Delete.scala similarity index 91% rename from src/scala/src/main/scala/solutions/bitbadger/documents/scala/Delete.scala rename to src/scala/src/main/scala/Delete.scala index 19729af..bd67103 100644 --- a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Delete.scala +++ b/src/scala/src/main/scala/Delete.scala @@ -19,7 +19,7 @@ object Delete: * @param conn The connection on which the deletion should be executed * @throws DocumentException If no dialect has been configured */ - def byId[TKey](tableName: String, docId: TKey, conn: Connection): Unit = + def byId[Key](tableName: String, docId: Key, conn: Connection): Unit = CoreDelete.byId(tableName, docId, conn) /** @@ -29,7 +29,7 @@ object Delete: * @param docId The ID of the document to be deleted * @throws DocumentException If no connection string has been set */ - def byId[TKey](tableName: String, docId: TKey): Unit = + def byId[Key](tableName: String, docId: Key): Unit = CoreDelete.byId(tableName, docId) /** @@ -63,7 +63,7 @@ object Delete: * @param conn The connection on which the deletion should be executed * @throws DocumentException If called on a SQLite connection */ - def byContains[TContains](tableName: String, criteria: TContains, conn: Connection): Unit = + def byContains[A](tableName: String, criteria: A, conn: Connection): Unit = CoreDelete.byContains(tableName, criteria, conn) /** @@ -73,7 +73,7 @@ object Delete: * @param criteria The object for which JSON containment should be checked * @throws DocumentException If no connection string has been set, or if called on a SQLite connection */ - def byContains[TContains](tableName: String, criteria: TContains): Unit = + def byContains[A](tableName: String, criteria: A): Unit = CoreDelete.byContains(tableName, criteria) /** @@ -91,7 +91,7 @@ object Delete: * Delete documents using a JSON Path match query (PostgreSQL only; creates connection) * * @param tableName The name of the table from which documents should be deleted - * @param path The JSON path comparison to match + * @param path The JSON path comparison to match * @throws DocumentException If no connection string has been set, or if called on a SQLite connection */ def byJsonPath(tableName: String, path: String): Unit = diff --git a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Document.scala b/src/scala/src/main/scala/Document.scala similarity index 71% rename from src/scala/src/main/scala/solutions/bitbadger/documents/scala/Document.scala rename to src/scala/src/main/scala/Document.scala index ca23662..cab75fe 100644 --- a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Document.scala +++ b/src/scala/src/main/scala/Document.scala @@ -14,7 +14,7 @@ object Document: * @param conn The connection on which the query should be executed * @throws DocumentException If IDs are misconfigured, or if the database command fails */ - def insert[TDoc](tableName: String, document: TDoc, conn: Connection): Unit = + def insert[Doc](tableName: String, document: Doc, conn: Connection): Unit = CoreDocument.insert(tableName, document, conn) /** @@ -24,49 +24,49 @@ object Document: * @param document The document to be inserted * @throws DocumentException If IDs are misconfigured, or if the database command fails */ - def insert[TDoc](tableName: String, document: TDoc): Unit = + def insert[Doc](tableName: String, document: Doc): Unit = CoreDocument.insert(tableName, document) /** * Save a document, inserting it if it does not exist and updating it if it does (AKA "upsert") * * @param tableName The table in which the document should be saved (may include schema) - * @param document The document to be saved - * @param conn The connection on which the query should be executed + * @param document The document to be saved + * @param conn The connection on which the query should be executed * @throws DocumentException If the database command fails */ - def save[TDoc](tableName: String, document: TDoc, conn: Connection): Unit = + def save[Doc](tableName: String, document: Doc, conn: Connection): Unit = CoreDocument.save(tableName, document, conn) /** * Save a document, inserting it if it does not exist and updating it if it does (AKA "upsert"; creates connection) * * @param tableName The table in which the document should be saved (may include schema) - * @param document The document to be saved + * @param document The document to be saved * @throws DocumentException If the database command fails */ - def save[TDoc](tableName: String, document: TDoc): Unit = + def save[Doc](tableName: String, document: Doc): Unit = CoreDocument.save(tableName, document) /** * Update (replace) a document by its ID * * @param tableName The table in which the document should be replaced (may include schema) - * @param docId The ID of the document to be replaced - * @param document The document to be replaced - * @param conn The connection on which the query should be executed + * @param docId The ID of the document to be replaced + * @param document The document to be replaced + * @param conn The connection on which the query should be executed * @throws DocumentException If no dialect has been configured, or if the database command fails */ - def update[TKey, TDoc](tableName: String, docId: TKey, document: TDoc, conn: Connection): Unit = + def update[Key, Doc](tableName: String, docId: Key, document: Doc, conn: Connection): Unit = CoreDocument.update(tableName, docId, document, conn) /** * Update (replace) a document by its ID (creates connection) * * @param tableName The table in which the document should be replaced (may include schema) - * @param docId The ID of the document to be replaced - * @param document The document to be replaced + * @param docId The ID of the document to be replaced + * @param document The document to be replaced * @throws DocumentException If no dialect has been configured, or if the database command fails */ - def update[TKey, TDoc](tableName: String, docId: TKey, document: TDoc): Unit = + def update[Key, Doc](tableName: String, docId: Key, document: Doc): Unit = CoreDocument.update(tableName, docId, document) diff --git a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Exists.scala b/src/scala/src/main/scala/Exists.scala similarity index 92% rename from src/scala/src/main/scala/solutions/bitbadger/documents/scala/Exists.scala rename to src/scala/src/main/scala/Exists.scala index 90883f0..ef1c4fb 100644 --- a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Exists.scala +++ b/src/scala/src/main/scala/Exists.scala @@ -20,7 +20,7 @@ object Exists: * @return True if the document exists, false if not * @throws DocumentException If no dialect has been configured */ - def byId[TKey](tableName: String, docId: TKey, conn: Connection): Boolean = + def byId[Key](tableName: String, docId: Key, conn: Connection): Boolean = CoreExists.byId(tableName, docId, conn) /** @@ -31,7 +31,7 @@ object Exists: * @return True if the document exists, false if not * @throws DocumentException If no connection string has been set */ - def byId[TKey](tableName: String, docId: TKey): Boolean = + def byId[Key](tableName: String, docId: Key): Boolean = CoreExists.byId(tableName, docId) /** @@ -68,7 +68,7 @@ object Exists: * @return True if any matching documents exist, false if not * @throws DocumentException If called on a SQLite connection */ - def byContains[TContains](tableName: String, criteria: TContains, conn: Connection): Boolean = + def byContains[A](tableName: String, criteria: A, conn: Connection): Boolean = CoreExists.byContains(tableName, criteria, conn) /** @@ -79,7 +79,7 @@ object Exists: * @return True if any matching documents exist, false if not * @throws DocumentException If no connection string has been set, or if called on a SQLite connection */ - def byContains[TContains](tableName: String, criteria: TContains): Boolean = + def byContains[A](tableName: String, criteria: A): Boolean = CoreExists.byContains(tableName, criteria) /** @@ -98,7 +98,7 @@ object Exists: * Determine document existence using a JSON Path match query (PostgreSQL only; creates connection) * * @param tableName The name of the table in which document existence should be checked - * @param path The JSON path comparison to match + * @param path The JSON path comparison to match * @return True if any matching documents exist, false if not * @throws DocumentException If no connection string has been set, or if called on a SQLite connection */ diff --git a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Find.scala b/src/scala/src/main/scala/Find.scala similarity index 67% rename from src/scala/src/main/scala/solutions/bitbadger/documents/scala/Find.scala rename to src/scala/src/main/scala/Find.scala index eb6534f..4335be7 100644 --- a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Find.scala +++ b/src/scala/src/main/scala/Find.scala @@ -22,8 +22,8 @@ object Find: * @return A list of documents from the given table * @throws DocumentException If query execution fails */ - def all[TDoc](tableName: String, orderBy: Seq[Field[?]], conn: Connection)(implicit tag: ClassTag[TDoc]): List[TDoc] = - Custom.list[TDoc](FindQuery.all(tableName) + QueryUtils.orderBy(orderBy.asJava), conn, Results.fromData) + def all[Doc](tableName: String, orderBy: Seq[Field[?]], conn: Connection)(using tag: ClassTag[Doc]): List[Doc] = + Custom.list[Doc](FindQuery.all(tableName) + QueryUtils.orderBy(orderBy.asJava), conn, Results.fromData) /** * Retrieve all documents in the given table, ordering results by the optional given fields @@ -33,43 +33,43 @@ object Find: * @return A list of documents from the given table * @throws DocumentException If query execution fails */ - def all[TDoc](tableName: String, conn: Connection)(implicit tag: ClassTag[TDoc]): List[TDoc] = - all[TDoc](tableName, List(), conn) + def all[Doc](tableName: String, conn: Connection)(using tag: ClassTag[Doc]): List[Doc] = + all[Doc](tableName, List(), conn) /** * Retrieve all documents in the given table (creates connection) * * @param tableName The table from which documents should be retrieved - * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) + * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) * @return A list of documents from the given table * @throws DocumentException If no connection string has been set, or if query execution fails */ - def all[TDoc](tableName: String, orderBy: Seq[Field[?]] = List())(implicit tag: ClassTag[TDoc]): List[TDoc] = - Using(Configuration.dbConn()) { conn => all[TDoc](tableName, orderBy, conn) }.get + def all[Doc](tableName: String, orderBy: Seq[Field[?]] = List())(using tag: ClassTag[Doc]): List[Doc] = + Using(Configuration.dbConn()) { conn => all[Doc](tableName, orderBy, conn) }.get /** * Retrieve a document by its ID * * @param tableName The table from which the document should be retrieved - * @param docId The ID of the document to retrieve - * @param conn The connection over which documents should be retrieved + * @param docId The ID of the document to retrieve + * @param conn The connection over which documents should be retrieved * @return An `Option` with the document if it is found * @throws DocumentException If no dialect has been configured */ - def byId[TKey, TDoc](tableName: String, docId: TKey, conn: Connection)(implicit tag: ClassTag[TDoc]): Option[TDoc] = - Custom.single[TDoc](FindQuery.byId(tableName, docId), + def byId[Key, Doc](tableName: String, docId: Key, conn: Connection)(using tag: ClassTag[Doc]): Option[Doc] = + Custom.single[Doc](FindQuery.byId(tableName, docId), Parameters.addFields(Field.equal(Configuration.idField, docId, ":id") :: Nil).toSeq, conn, Results.fromData) /** * Retrieve a document by its ID (creates connection * * @param tableName The table from which the document should be retrieved - * @param docId The ID of the document to retrieve + * @param docId The ID of the document to retrieve * @return An `Option` with the document if it is found * @throws DocumentException If no connection string has been set */ - def byId[TKey, TDoc](tableName: String, docId: TKey)(implicit tag: ClassTag[TDoc]): Option[TDoc] = - Using(Configuration.dbConn()) { conn => byId[TKey, TDoc](tableName, docId, conn) }.get + def byId[Key, Doc](tableName: String, docId: Key)(using tag: ClassTag[Doc]): Option[Doc] = + Using(Configuration.dbConn()) { conn => byId[Key, Doc](tableName, docId, conn) }.get /** * Retrieve documents using a field comparison, ordering results by the given fields @@ -82,10 +82,10 @@ object Find: * @return A list of documents matching the field comparison * @throws DocumentException If no dialect has been configured, or if parameters are invalid */ - def byFields[TDoc](tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch], orderBy: Seq[Field[?]], - conn: Connection)(implicit tag: ClassTag[TDoc]): List[TDoc] = + def byFields[Doc](tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch], orderBy: Seq[Field[?]], + conn: Connection)(using tag: ClassTag[Doc]): List[Doc] = val named = Parameters.nameFields(fields) - Custom.list[TDoc]( + Custom.list[Doc]( FindQuery.byFields(tableName, named.asJava, howMatched.orNull) + QueryUtils.orderBy(orderBy.asJava), Parameters.addFields(named).toSeq, conn, Results.fromData) @@ -99,9 +99,9 @@ object Find: * @return A list of documents matching the field comparison * @throws DocumentException If no dialect has been configured, or if parameters are invalid */ - def byFields[TDoc](tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch], conn: Connection) - (implicit tag: ClassTag[TDoc]): List[TDoc] = - byFields[TDoc](tableName, fields, howMatched, List(), conn) + def byFields[Doc](tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch], conn: Connection) + (using tag: ClassTag[Doc]): List[Doc] = + byFields[Doc](tableName, fields, howMatched, List(), conn) /** * Retrieve documents using a field comparison, ordering results by the given fields @@ -113,9 +113,9 @@ object Find: * @return A list of documents matching the field comparison * @throws DocumentException If no dialect has been configured, or if parameters are invalid */ - def byFields[TDoc](tableName: String, fields: Seq[Field[?]], orderBy: Seq[Field[?]], conn: Connection) - (implicit tag: ClassTag[TDoc]): List[TDoc] = - byFields[TDoc](tableName, fields, None, orderBy, conn) + def byFields[Doc](tableName: String, fields: Seq[Field[?]], orderBy: Seq[Field[?]], conn: Connection) + (using tag: ClassTag[Doc]): List[Doc] = + byFields[Doc](tableName, fields, None, orderBy, conn) /** * Retrieve documents using a field comparison, ordering results by the given fields (creates connection) @@ -127,9 +127,9 @@ object Find: * @return A list of documents matching the field comparison * @throws DocumentException If no connection string has been set, or if parameters are invalid */ - def byFields[TDoc](tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch] = None, - orderBy: Seq[Field[?]] = List())(implicit tag: ClassTag[TDoc]): List[TDoc] = - Using(Configuration.dbConn()) { conn => byFields[TDoc](tableName, fields, howMatched, orderBy, conn) }.get + def byFields[Doc](tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch] = None, + orderBy: Seq[Field[?]] = List())(using tag: ClassTag[Doc]): List[Doc] = + Using(Configuration.dbConn()) { conn => byFields[Doc](tableName, fields, howMatched, orderBy, conn) }.get /** * Retrieve documents using a JSON containment query, ordering results by the given fields (PostgreSQL only) @@ -141,9 +141,9 @@ object Find: * @return A list of documents matching the JSON containment query * @throws DocumentException If called on a SQLite connection */ - def byContains[TDoc, TContains](tableName: String, criteria: TContains, orderBy: Seq[Field[?]], - conn: Connection)(implicit tag: ClassTag[TDoc]): List[TDoc] = - Custom.list[TDoc](FindQuery.byContains(tableName) + QueryUtils.orderBy(orderBy.asJava), + def byContains[Doc, A](tableName: String, criteria: A, orderBy: Seq[Field[?]], conn: Connection) + (using tag: ClassTag[Doc]): List[Doc] = + Custom.list[Doc](FindQuery.byContains(tableName) + QueryUtils.orderBy(orderBy.asJava), Parameters.json(":criteria", criteria) :: Nil, conn, Results.fromData) /** @@ -155,9 +155,8 @@ object Find: * @return A list of documents matching the JSON containment query * @throws DocumentException If called on a SQLite connection */ - def byContains[TDoc, TContains](tableName: String, criteria: TContains, conn: Connection) - (implicit tag: ClassTag[TDoc]): List[TDoc] = - byContains[TDoc, TContains](tableName, criteria, List(), conn) + def byContains[Doc, A](tableName: String, criteria: A, conn: Connection)(using tag: ClassTag[Doc]): List[Doc] = + byContains[Doc, A](tableName, criteria, List(), conn) /** * Retrieve documents using a JSON containment query, ordering results by the given fields (PostgreSQL only; creates @@ -169,9 +168,9 @@ object Find: * @return A list of documents matching the JSON containment query * @throws DocumentException If no connection string has been set, or if called on a SQLite connection */ - def byContains[TDoc, TContains](tableName: String, criteria: TContains, orderBy: Seq[Field[?]] = List()) - (implicit tag: ClassTag[TDoc]): List[TDoc] = - Using(Configuration.dbConn()) { conn => byContains[TDoc, TContains](tableName, criteria, orderBy, conn) }.get + def byContains[Doc, A](tableName: String, criteria: A, orderBy: Seq[Field[?]] = List()) + (using tag: ClassTag[Doc]): List[Doc] = + Using(Configuration.dbConn()) { conn => byContains[Doc, A](tableName, criteria, orderBy, conn) }.get /** * Retrieve documents using a JSON Path match query, ordering results by the given fields (PostgreSQL only) @@ -183,9 +182,9 @@ object Find: * @return A list of documents matching the JSON Path match query * @throws DocumentException If called on a SQLite connection */ - def byJsonPath[TDoc](tableName: String, path: String, orderBy: Seq[Field[?]], conn: Connection) - (implicit tag: ClassTag[TDoc]): List[TDoc] = - Custom.list[TDoc](FindQuery.byJsonPath(tableName) + QueryUtils.orderBy(orderBy.asJava), + def byJsonPath[Doc](tableName: String, path: String, orderBy: Seq[Field[?]], conn: Connection) + (using tag: ClassTag[Doc]): List[Doc] = + Custom.list[Doc](FindQuery.byJsonPath(tableName) + QueryUtils.orderBy(orderBy.asJava), Parameter(":path", ParameterType.STRING, path) :: Nil, conn, Results.fromData) /** @@ -197,8 +196,8 @@ object Find: * @return A list of documents matching the JSON Path match query * @throws DocumentException If called on a SQLite connection */ - def byJsonPath[TDoc](tableName: String, path: String, conn: Connection)(implicit tag: ClassTag[TDoc]): List[TDoc] = - byJsonPath[TDoc](tableName, path, List(), conn) + def byJsonPath[Doc](tableName: String, path: String, conn: Connection)(using tag: ClassTag[Doc]): List[Doc] = + byJsonPath[Doc](tableName, path, List(), conn) /** * Retrieve documents using a JSON Path match query, ordering results by the given fields (PostgreSQL only; creates @@ -210,9 +209,9 @@ object Find: * @return A list of documents matching the JSON Path match query * @throws DocumentException If no connection string has been set, or if called on a SQLite connection */ - def byJsonPath[TDoc](tableName: String, path: String, orderBy: Seq[Field[?]] = List()) - (implicit tag: ClassTag[TDoc]): List[TDoc] = - Using(Configuration.dbConn()) { conn => byJsonPath[TDoc](tableName, path, orderBy, conn) }.get + def byJsonPath[Doc](tableName: String, path: String, orderBy: Seq[Field[?]] = List()) + (using tag: ClassTag[Doc]): List[Doc] = + Using(Configuration.dbConn()) { conn => byJsonPath[Doc](tableName, path, orderBy, conn) }.get /** * Retrieve the first document using a field comparison and ordering fields @@ -225,10 +224,10 @@ object Find: * @return An `Option` with the first document matching the field comparison if found * @throws DocumentException If no dialect has been configured, or if parameters are invalid */ - def firstByFields[TDoc](tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch], - orderBy: Seq[Field[?]], conn: Connection)(implicit tag: ClassTag[TDoc]): Option[TDoc] = + def firstByFields[Doc](tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch], + orderBy: Seq[Field[?]], conn: Connection)(using tag: ClassTag[Doc]): Option[Doc] = val named = Parameters.nameFields(fields) - Custom.single[TDoc]( + Custom.single[Doc]( FindQuery.byFields(tableName, named.asJava, howMatched.orNull) + QueryUtils.orderBy(orderBy.asJava), Parameters.addFields(named).toSeq, conn, Results.fromData) @@ -242,9 +241,9 @@ object Find: * @return An `Option` with the first document matching the field comparison if found * @throws DocumentException If no dialect has been configured, or if parameters are invalid */ - def firstByFields[TDoc](tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch], conn: Connection) - (implicit tag: ClassTag[TDoc]): Option[TDoc] = - firstByFields[TDoc](tableName, fields, howMatched, List(), conn) + def firstByFields[Doc](tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch], conn: Connection) + (using tag: ClassTag[Doc]): Option[Doc] = + firstByFields[Doc](tableName, fields, howMatched, List(), conn) /** * Retrieve the first document using a field comparison and ordering fields @@ -256,9 +255,9 @@ object Find: * @return An `Option` with the first document matching the field comparison if found * @throws DocumentException If no dialect has been configured, or if parameters are invalid */ - def firstByFields[TDoc](tableName: String, fields: Seq[Field[?]], orderBy: Seq[Field[?]], conn: Connection) - (implicit tag: ClassTag[TDoc]): Option[TDoc] = - firstByFields[TDoc](tableName, fields, None, orderBy, conn) + def firstByFields[Doc](tableName: String, fields: Seq[Field[?]], orderBy: Seq[Field[?]], conn: Connection) + (using tag: ClassTag[Doc]): Option[Doc] = + firstByFields[Doc](tableName, fields, None, orderBy, conn) /** * Retrieve the first document using a field comparison @@ -269,9 +268,9 @@ object Find: * @return An `Option` with the first document matching the field comparison if found * @throws DocumentException If no dialect has been configured, or if parameters are invalid */ - def firstByFields[TDoc](tableName: String, fields: Seq[Field[?]], conn: Connection) - (implicit tag: ClassTag[TDoc]): Option[TDoc] = - firstByFields[TDoc](tableName, fields, None, List(), conn) + def firstByFields[Doc](tableName: String, fields: Seq[Field[?]], conn: Connection) + (using tag: ClassTag[Doc]): Option[Doc] = + firstByFields[Doc](tableName, fields, None, List(), conn) /** * Retrieve the first document using a field comparison and optional ordering fields (creates connection) @@ -283,9 +282,9 @@ object Find: * @return An `Option` with the first document matching the field comparison if found * @throws DocumentException If no connection string has been set, or if parameters are invalid */ - def firstByFields[TDoc](tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch] = None, - orderBy: Seq[Field[?]] = List())(implicit tag: ClassTag[TDoc]): Option[TDoc] = - Using(Configuration.dbConn()) { conn => firstByFields[TDoc](tableName, fields, howMatched, orderBy, conn) }.get + def firstByFields[Doc](tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch] = None, + orderBy: Seq[Field[?]] = List())(using tag: ClassTag[Doc]): Option[Doc] = + Using(Configuration.dbConn()) { conn => firstByFields[Doc](tableName, fields, howMatched, orderBy, conn) }.get /** * Retrieve the first document using a JSON containment query and ordering fields (PostgreSQL only) @@ -297,9 +296,9 @@ object Find: * @return An `Option` with the first document matching the JSON containment query if found * @throws DocumentException If called on a SQLite connection */ - def firstByContains[TDoc, TContains](tableName: String, criteria: TContains, orderBy: Seq[Field[?]], - conn: Connection)(implicit tag: ClassTag[TDoc]): Option[TDoc] = - Custom.single[TDoc](FindQuery.byContains(tableName) + QueryUtils.orderBy(orderBy.asJava), + def firstByContains[Doc, A](tableName: String, criteria: A, orderBy: Seq[Field[?]], conn: Connection) + (using tag: ClassTag[Doc]): Option[Doc] = + Custom.single[Doc](FindQuery.byContains(tableName) + QueryUtils.orderBy(orderBy.asJava), Parameters.json(":criteria", criteria) :: Nil, conn, Results.fromData) /** @@ -311,9 +310,8 @@ object Find: * @return An `Option` with the first document matching the JSON containment query if found * @throws DocumentException If called on a SQLite connection */ - def firstByContains[TDoc, TContains](tableName: String, criteria: TContains, conn: Connection) - (implicit tag: ClassTag[TDoc]): Option[TDoc] = - firstByContains[TDoc, TContains](tableName, criteria, List(), conn) + def firstByContains[Doc, A](tableName: String, criteria: A, conn: Connection)(using tag: ClassTag[Doc]): Option[Doc] = + firstByContains[Doc, A](tableName, criteria, List(), conn) /** * Retrieve the first document using a JSON containment query and optional ordering fields (PostgreSQL only; creates @@ -325,23 +323,23 @@ object Find: * @return An `Option` with the first document matching the JSON containment query if found * @throws DocumentException If no connection string has been set, or if called on a SQLite connection */ - def firstByContains[TDoc, TContains](tableName: String, criteria: TContains, orderBy: Seq[Field[?]] = List()) - (implicit tag: ClassTag[TDoc]): Option[TDoc] = - Using(Configuration.dbConn()) { conn => firstByContains[TDoc, TContains](tableName, criteria, orderBy, conn) }.get + def firstByContains[Doc, A](tableName: String, criteria: A, orderBy: Seq[Field[?]] = List()) + (using tag: ClassTag[Doc]): Option[Doc] = + Using(Configuration.dbConn()) { conn => firstByContains[Doc, A](tableName, criteria, orderBy, conn) }.get /** * Retrieve the first document using a JSON Path match query and ordering fields (PostgreSQL only) * * @param tableName The table from which documents should be retrieved - * @param path The JSON path comparison to match - * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) - * @param conn The connection over which documents should be retrieved + * @param path The JSON path comparison to match + * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) + * @param conn The connection over which documents should be retrieved * @return An `Optional` item, with the first document matching the JSON Path match query if found * @throws DocumentException If called on a SQLite connection */ - def firstByJsonPath[TDoc](tableName: String, path: String, orderBy: Seq[Field[?]], conn: Connection) - (implicit tag: ClassTag[TDoc]): Option[TDoc] = - Custom.single[TDoc](FindQuery.byJsonPath(tableName) + QueryUtils.orderBy(orderBy.asJava), + def firstByJsonPath[Doc](tableName: String, path: String, orderBy: Seq[Field[?]], conn: Connection) + (using tag: ClassTag[Doc]): Option[Doc] = + Custom.single[Doc](FindQuery.byJsonPath(tableName) + QueryUtils.orderBy(orderBy.asJava), Parameter(":path", ParameterType.STRING, path) :: Nil, conn, Results.fromData) /** @@ -353,20 +351,19 @@ object Find: * @return An `Option` with the first document matching the JSON Path match query if found * @throws DocumentException If called on a SQLite connection */ - def firstByJsonPath[TDoc](tableName: String, path: String, conn: Connection) - (implicit tag: ClassTag[TDoc]): Option[TDoc] = - firstByJsonPath[TDoc](tableName, path, List(), conn) + def firstByJsonPath[Doc](tableName: String, path: String, conn: Connection)(using tag: ClassTag[Doc]): Option[Doc] = + firstByJsonPath[Doc](tableName, path, List(), conn) /** * Retrieve the first document using a JSON Path match query and optional ordering fields (PostgreSQL only; creates * connection) * * @param tableName The table from which documents should be retrieved - * @param path The JSON path comparison to match - * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) + * @param path The JSON path comparison to match + * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) * @return An `Optional` item, with the first document matching the JSON Path match query if found * @throws DocumentException If no connection string has been set, or if called on a SQLite connection */ - def firstByJsonPath[TDoc](tableName: String, path: String, orderBy: Seq[Field[?]] = List()) - (implicit tag: ClassTag[TDoc]): Option[TDoc] = - Using(Configuration.dbConn()) { conn => firstByJsonPath[TDoc](tableName, path, orderBy, conn) }.get + def firstByJsonPath[Doc](tableName: String, path: String, orderBy: Seq[Field[?]] = List()) + (using tag: ClassTag[Doc]): Option[Doc] = + Using(Configuration.dbConn()) { conn => firstByJsonPath[Doc](tableName, path, orderBy, conn) }.get diff --git a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Parameters.scala b/src/scala/src/main/scala/Parameters.scala similarity index 90% rename from src/scala/src/main/scala/solutions/bitbadger/documents/scala/Parameters.scala rename to src/scala/src/main/scala/Parameters.scala index 02b2d5d..2499863 100644 --- a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Parameters.scala +++ b/src/scala/src/main/scala/Parameters.scala @@ -38,13 +38,13 @@ object Parameters: * @param value The object to be encoded as JSON * @return A parameter with the value encoded */ - def json[T](name: String, value: T): Parameter[String] = + def json[A](name: String, value: A): Parameter[String] = CoreParameters.json(name, value) /** * Add field parameters to the given set of parameters * - * @param fields The fields being compared in the query + * @param fields The fields being compared in the query * @param existing Any existing parameters for the query (optional, defaults to empty collection) * @return A collection of parameters for the query */ @@ -56,7 +56,7 @@ object Parameters: /** * Replace the parameter names in the query with question marks * - * @param query The query with named placeholders + * @param query The query with named placeholders * @param parameters The parameters for the query * @return The query, with name parameters changed to `?`s */ @@ -66,8 +66,8 @@ object Parameters: /** * Apply the given parameters to the given query, returning a prepared statement * - * @param conn The active JDBC connection - * @param query The query + * @param conn The active JDBC connection + * @param query The query * @param parameters The parameters for the query * @return A `PreparedStatement` with the parameter names replaced with `?` and parameter values bound * @throws DocumentException If parameter names are invalid or number value types are invalid @@ -78,7 +78,7 @@ object Parameters: /** * Create parameters for field names to be removed from a document * - * @param names The names of the fields to be removed + * @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 diff --git a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Patch.scala b/src/scala/src/main/scala/Patch.scala similarity index 83% rename from src/scala/src/main/scala/solutions/bitbadger/documents/scala/Patch.scala rename to src/scala/src/main/scala/Patch.scala index b53bb83..e90e150 100644 --- a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Patch.scala +++ b/src/scala/src/main/scala/Patch.scala @@ -20,7 +20,7 @@ object Patch: * @param conn The connection on which the update should be executed * @throws DocumentException If no dialect has been configured */ - def byId[TKey, TPatch](tableName: String, docId: TKey, patch: TPatch, conn: Connection): Unit = + def byId[Key, Patch](tableName: String, docId: Key, patch: Patch, conn: Connection): Unit = CorePatch.byId(tableName, docId, patch, conn) /** @@ -31,7 +31,7 @@ object Patch: * @param patch The object whose properties should be replaced in the document * @throws DocumentException If no connection string has been set */ - def byId[TKey, TPatch](tableName: String, docId: TKey, patch: TPatch) = + def byId[Key, Patch](tableName: String, docId: Key, patch: Patch): Unit = CorePatch.byId(tableName, docId, patch) /** @@ -44,8 +44,8 @@ object Patch: * @param conn The connection on which the update should be executed * @throws DocumentException If no dialect has been configured, or if parameters are invalid */ - def byFields[TPatch](tableName: String, fields: Seq[Field[?]], patch: TPatch, howMatched: Option[FieldMatch], - conn: Connection): Unit = + def byFields[Patch](tableName: String, fields: Seq[Field[?]], patch: Patch, howMatched: Option[FieldMatch], + conn: Connection): Unit = CorePatch.byFields(tableName, fields.asJava, patch, howMatched.orNull, conn) /** @@ -57,7 +57,7 @@ object Patch: * @param conn The connection on which the update should be executed * @throws DocumentException If no dialect has been configured, or if parameters are invalid */ - def byFields[TPatch](tableName: String, fields: Seq[Field[?]], patch: TPatch, conn: Connection): Unit = + def byFields[Patch](tableName: String, fields: Seq[Field[?]], patch: Patch, conn: Connection): Unit = byFields(tableName, fields, patch, None, conn) /** @@ -69,8 +69,8 @@ object Patch: * @param howMatched How the fields should be matched * @throws DocumentException If no connection string has been set, or if parameters are invalid */ - def byFields[TPatch](tableName: String, fields: Seq[Field[?]], patch: TPatch, - howMatched: Option[FieldMatch] = None): Unit = + def byFields[Patch](tableName: String, fields: Seq[Field[?]], patch: Patch, + howMatched: Option[FieldMatch] = None): Unit = CorePatch.byFields(tableName, fields.asJava, patch, howMatched.orNull) /** @@ -82,7 +82,7 @@ object Patch: * @param conn The connection on which the update should be executed * @throws DocumentException If called on a SQLite connection */ - def byContains[TContains, TPatch](tableName: String, criteria: TContains, patch: TPatch, conn: Connection): Unit = + def byContains[A, Patch](tableName: String, criteria: A, patch: Patch, conn: Connection): Unit = CorePatch.byContains(tableName, criteria, patch, conn) /** @@ -93,7 +93,7 @@ object Patch: * @param patch The object whose properties should be replaced in the document * @throws DocumentException If no connection string has been set, or if called on a SQLite connection */ - def byContains[TContains, TPatch](tableName: String, criteria: TContains, patch: TPatch): Unit = + def byContains[A, Patch](tableName: String, criteria: A, patch: Patch): Unit = CorePatch.byContains(tableName, criteria, patch) /** @@ -105,7 +105,7 @@ object Patch: * @param conn The connection on which the update should be executed * @throws DocumentException If called on a SQLite connection */ - def byJsonPath[TPatch](tableName: String, path: String, patch: TPatch, conn: Connection): Unit = + def byJsonPath[Patch](tableName: String, path: String, patch: Patch, conn: Connection): Unit = CorePatch.byJsonPath(tableName, path, patch, conn) /** @@ -116,5 +116,5 @@ object Patch: * @param patch The object whose properties should be replaced in the document * @throws DocumentException If no connection string has been set, or if called on a SQLite connection */ - def byJsonPath[TPatch](tableName: String, path: String, patch: TPatch): Unit = + def byJsonPath[Patch](tableName: String, path: String, patch: Patch): Unit = CorePatch.byJsonPath(tableName, path, patch) diff --git a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/RemoveFields.scala b/src/scala/src/main/scala/RemoveFields.scala similarity index 93% rename from src/scala/src/main/scala/solutions/bitbadger/documents/scala/RemoveFields.scala rename to src/scala/src/main/scala/RemoveFields.scala index 2701553..a605b7f 100644 --- a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/RemoveFields.scala +++ b/src/scala/src/main/scala/RemoveFields.scala @@ -20,7 +20,7 @@ object RemoveFields: * @param conn The connection on which the update should be executed * @throws DocumentException If no dialect has been configured */ - def byId[TKey](tableName: String, docId: TKey, toRemove: Seq[String], conn: Connection): Unit = + def byId[Key](tableName: String, docId: Key, toRemove: Seq[String], conn: Connection): Unit = CoreRemoveFields.byId(tableName, docId, toRemove.asJava, conn) /** @@ -31,7 +31,7 @@ object RemoveFields: * @param toRemove The names of the fields to be removed * @throws DocumentException If no connection string has been set */ - def byId[TKey](tableName: String, docId: TKey, toRemove: Seq[String]): Unit = + def byId[Key](tableName: String, docId: Key, toRemove: Seq[String]): Unit = CoreRemoveFields.byId(tableName, docId, toRemove.asJava) /** @@ -82,7 +82,7 @@ object RemoveFields: * @param conn The connection on which the update should be executed * @throws DocumentException If called on a SQLite connection */ - def byContains[TContains](tableName: String, criteria: TContains, toRemove: Seq[String], conn: Connection): Unit = + def byContains[A](tableName: String, criteria: A, toRemove: Seq[String], conn: Connection): Unit = CoreRemoveFields.byContains(tableName, criteria, toRemove.asJava, conn) /** @@ -93,7 +93,7 @@ object RemoveFields: * @param toRemove The names of the fields to be removed * @throws DocumentException If no connection string has been set, or if called on a SQLite connection */ - def byContains[TContains](tableName: String, criteria: TContains, toRemove: Seq[String]): Unit = + def byContains[A](tableName: String, criteria: A, toRemove: Seq[String]): Unit = CoreRemoveFields.byContains(tableName, criteria, toRemove.asJava) /** diff --git a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Results.scala b/src/scala/src/main/scala/Results.scala similarity index 82% rename from src/scala/src/main/scala/solutions/bitbadger/documents/scala/Results.scala rename to src/scala/src/main/scala/Results.scala index bab76e4..18de0c1 100644 --- a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/Results.scala +++ b/src/scala/src/main/scala/Results.scala @@ -21,8 +21,8 @@ object Results: * @param ignored The class tag (placeholder used for signature; implicit tag used for serialization) * @return The constructed domain item */ - def fromDocument[TDoc](field: String, rs: ResultSet, ignored: ClassTag[TDoc])(implicit tag: ClassTag[TDoc]): TDoc = - CoreResults.fromDocument(field, rs, tag.runtimeClass.asInstanceOf[Class[TDoc]]) + def fromDocument[Doc](field: String, rs: ResultSet, ignored: ClassTag[Doc])(using tag: ClassTag[Doc]): Doc = + CoreResults.fromDocument(field, rs, tag.runtimeClass.asInstanceOf[Class[Doc]]) /** * Create a domain item from a document @@ -31,21 +31,21 @@ object Results: * @param ignored The class tag (placeholder used for signature; implicit tag used for serialization) * @return The constructed domain item */ - def fromData[TDoc](rs: ResultSet, ignored: ClassTag[TDoc])(implicit tag: ClassTag[TDoc]): TDoc = - fromDocument[TDoc]("data", rs, tag) + def fromData[Doc](rs: ResultSet, ignored: ClassTag[Doc])(using tag: ClassTag[Doc]): Doc = + fromDocument[Doc]("data", rs, tag) /** * 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 stmt The prepared statement to execute * @param mapFunc The mapping function from data reader to domain class instance * @return A list of items from the query's result * @throws DocumentException If there is a problem executing the query (unchecked) */ - def toCustomList[TDoc](stmt: PreparedStatement, - mapFunc: (ResultSet, ClassTag[TDoc]) => TDoc)(implicit tag: ClassTag[TDoc]): List[TDoc] = + def toCustomList[Doc](stmt: PreparedStatement,mapFunc: (ResultSet, ClassTag[Doc]) => Doc) + (using tag: ClassTag[Doc]): List[Doc] = try - val buffer = ListBuffer[TDoc]() + val buffer = ListBuffer[Doc]() Using(stmt.executeQuery()) { rs => while (rs.next()) { buffer.append(mapFunc(rs, tag)) diff --git a/src/scala/src/main/scala/extensions/package.scala b/src/scala/src/main/scala/extensions/package.scala new file mode 100644 index 0000000..c7c4dd6 --- /dev/null +++ b/src/scala/src/main/scala/extensions/package.scala @@ -0,0 +1,497 @@ +package solutions.bitbadger.documents.scala.extensions + +import solutions.bitbadger.documents.{DocumentIndex, Field, FieldMatch, Parameter} +import solutions.bitbadger.documents.scala.* + +import java.sql.{Connection, ResultSet} +import scala.reflect.ClassTag + +extension (conn: Connection) + + // ~~~ CUSTOM QUERIES ~~~ + + /** + * 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 mapFunc The mapping function between the document and the domain item + * @return A list of results for the given query + * @throws DocumentException If parameters are invalid + */ + def customList[Doc](query: String, parameters: Seq[Parameter[?]], mapFunc: (ResultSet, ClassTag[Doc]) => Doc) + (using tag: ClassTag[Doc]): List[Doc] = + Custom.list[Doc](query, parameters, conn, mapFunc) + + /** + * Execute a query that returns a list of results + * + * @param query The query to retrieve the results + * @param mapFunc The mapping function between the document and the domain item + * @return A list of results for the given query + * @throws DocumentException If parameters are invalid + */ + def customList[Doc](query: String, mapFunc: (ResultSet, ClassTag[Doc]) => Doc) + (using tag: ClassTag[Doc]): List[Doc] = + Custom.list[Doc](query, conn, 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 mapFunc The mapping function between the document and the domain item + * @return An optional document, filled if one matches the query + * @throws DocumentException If parameters are invalid + */ + def customSingle[Doc](query: String, parameters: Seq[Parameter[?]], mapFunc: (ResultSet, ClassTag[Doc]) => Doc) + (using tag: ClassTag[Doc]): Option[Doc] = + Custom.single[Doc](query, parameters, conn, mapFunc) + + /** + * Execute a query that returns one or no results + * + * @param query The query to retrieve the results + * @param mapFunc The mapping function between the document and the domain item + * @return An optional document, filled if one matches the query + * @throws DocumentException If parameters are invalid + */ + def customSingle[Doc](query: String, mapFunc: (ResultSet, ClassTag[Doc]) => Doc) + (using tag: ClassTag[Doc]): Option[Doc] = + Custom.single[Doc](query, conn, mapFunc) + + /** + * Execute a query that returns no results + * + * @param query The query to retrieve the results + * @param parameters Parameters to use for the query + * @throws DocumentException If parameters are invalid + */ + def customNonQuery(query: String, parameters: Seq[Parameter[?]] = List()): Unit = + Custom.nonQuery(query, parameters, conn) + + /** + * 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 + * @throws DocumentException If parameters are invalid + */ + def customScalar[A](query: String, parameters: Seq[Parameter[?]], mapFunc: (ResultSet, ClassTag[A]) => A) + (using tag: ClassTag[A]): A = + Custom.scalar[A](query, parameters, conn, mapFunc) + + /** + * Execute a query that returns a scalar result + * + * @param query The query to retrieve the result + * @param mapFunc The mapping function between the document and the domain item + * @return The scalar value from the query + * @throws DocumentException If parameters are invalid + */ + def customScalar[A](query: String, mapFunc: (ResultSet, ClassTag[A]) => A)(using tag: ClassTag[A]): A = + Custom.scalar[A](query, conn, mapFunc) + + // ~~~ DEFINITION QUERIES ~~~ + + /** + * Create a document table if necessary + * + * @param tableName The table whose existence should be ensured (may include schema) + * @throws DocumentException If the dialect is not configured + */ + def ensureTable(tableName: String): Unit = + Definition.ensureTable(tableName, conn) + + /** + * Create an index on field(s) within documents in the specified table if necessary + * + * @param tableName The table to be indexed (may include schema) + * @param indexName The name of the index to create + * @param fields One or more fields to be indexed< + * @throws DocumentException If any dependent process does + */ + def ensureFieldIndex(tableName: String, indexName: String, fields: Seq[String]): Unit = + Definition.ensureFieldIndex(tableName, indexName, fields, conn) + + /** + * Create a document index on a table (PostgreSQL only) + * + * @param tableName The table to be indexed (may include schema) + * @param indexType The type of index to ensure + * @throws DocumentException If called on a SQLite connection + */ + def ensureDocumentIndex(tableName: String, indexType: DocumentIndex): Unit = + Definition.ensureDocumentIndex (tableName, indexType, conn) + + // ~~~ DOCUMENT MANIPULATION QUERIES ~~~ + + /** + * Insert a new document + * + * @param tableName The table into which the document should be inserted (may include schema) + * @param document The document to be inserted + * @throws DocumentException If IDs are misconfigured, or if the database command fails + */ + def insert[Doc](tableName: String, document: Doc): Unit = + Document.insert(tableName, document, conn) + + /** + * Save a document, inserting it if it does not exist and updating it if it does (AKA "upsert") + * + * @param tableName The table in which the document should be saved (may include schema) + * @param document The document to be saved + * @throws DocumentException If the database command fails + */ + def save[Doc](tableName: String, document: Doc): Unit = + Document.save(tableName, document, conn) + + /** + * Update (replace) a document by its ID + * + * @param tableName The table in which the document should be replaced (may include schema) + * @param docId The ID of the document to be replaced + * @param document The document to be replaced + * @throws DocumentException If no dialect has been configured, or if the database command fails + */ + def update[Key, Doc](tableName: String, docId: Key, document: Doc): Unit = + Document.update(tableName, docId, document, conn) + + // ~~~ DOCUMENT COUNT QUERIES ~~~ + + /** + * Count all documents in the table + * + * @param tableName The name of the table in which documents should be counted + * @return A count of the documents in the table + * @throws DocumentException If any dependent process does + */ + def countAll(tableName: String): Long = + Count.all(tableName, conn) + + /** + * Count documents using a field comparison + * + * @param tableName The name of the table in which documents should be counted + * @param fields The fields which should be compared + * @param howMatched How the fields should be matched (optional, default `ALL`) + * @return A count of the matching documents in the table + * @throws DocumentException If the dialect has not been configured + */ + def countByFields(tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch] = None): Long = + Count.byFields(tableName, fields, howMatched, conn) + + /** + * Count documents using a JSON containment query (PostgreSQL only) + * + * @param tableName The name of the table in which documents should be counted + * @param criteria The object for which JSON containment should be checked + * @return A count of the matching documents in the table + * @throws DocumentException If called on a SQLite connection + */ + def countByContains[A](tableName: String, criteria: A): Long = + Count.byContains(tableName, criteria, conn) + + /** + * Count documents using a JSON Path match query (PostgreSQL only) + * + * @param tableName The name of the table in which documents should be counted + * @param path The JSON path comparison to match + * @return A count of the matching documents in the table + * @throws DocumentException If called on a SQLite connection + */ + def countByJsonPath(tableName: String, path: String): Long = + Count.byJsonPath(tableName, path, conn) + + // ~~~ DOCUMENT EXISTENCE QUERIES ~~~ + + /** + * Determine a document's existence by its ID + * + * @param tableName The name of the table in which document existence should be checked + * @param docId The ID of the document to be checked + * @return True if the document exists, false if not + * @throws DocumentException If no dialect has been configured + */ + def existsById[Key](tableName: String, docId: Key): Boolean = + Exists.byId(tableName, docId, conn) + + /** + * Determine document existence using a field comparison + * + * @param tableName The name of the table in which document existence should be checked + * @param fields The fields which should be compared + * @param howMatched How the fields should be matched + * @return True if any matching documents exist, false if not + * @throws DocumentException If no dialect has been configured, or if parameters are invalid + */ + def existsByFields(tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch] = None): Boolean = + Exists.byFields(tableName, fields, howMatched, conn) + + /** + * Determine document existence using a JSON containment query (PostgreSQL only) + * + * @param tableName The name of the table in which document existence should be checked + * @param criteria The object for which JSON containment should be checked + * @return True if any matching documents exist, false if not + * @throws DocumentException If called on a SQLite connection + */ + def existsByContains[A](tableName: String, criteria: A): Boolean = + Exists.byContains(tableName, criteria, conn) + + /** + * Determine document existence using a JSON Path match query (PostgreSQL only) + * + * @param tableName The name of the table in which document existence should be checked + * @param path The JSON path comparison to match + * @return True if any matching documents exist, false if not + * @throws DocumentException If called on a SQLite connection + */ + def existsByJsonPath(tableName: String, path: String): Boolean = + Exists.byJsonPath(tableName, path, conn) + + // ~~~ DOCUMENT RETRIEVAL QUERIES ~~~ + + /** + * Retrieve all documents in the given table, ordering results by the optional given fields + * + * @param tableName The table from which documents should be retrieved + * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) + * @return A list of documents from the given table + * @throws DocumentException If query execution fails + */ + def findAll[Doc](tableName: String, orderBy: Seq[Field[?]] = List())(using tag: ClassTag[Doc]): List[Doc] = + Find.all[Doc](tableName, orderBy, conn) + + /** + * Retrieve a document by its ID + * + * @param tableName The table from which the document should be retrieved + * @param docId The ID of the document to retrieve + * @return The document if it is found, `None` otherwise + * @throws DocumentException If no dialect has been configured + */ + def findById[Key, Doc](tableName: String, docId: Key)(using tag: ClassTag[Doc]): Option[Doc] = + Find.byId[Key, Doc](tableName, docId, conn) + + /** + * Retrieve documents using a field comparison, ordering results by the optional given fields + * + * @param tableName The table from which the document should be retrieved + * @param fields The fields which should be compared + * @param howMatched How the fields should be matched + * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) + * @return A list of documents matching the field comparison + * @throws DocumentException If no dialect has been configured, or if parameters are invalid + */ + def findByFields[Doc](tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch] = None, + orderBy: Seq[Field[?]] = List())(using tag: ClassTag[Doc]): List[Doc] = + Find.byFields[Doc](tableName, fields, howMatched, orderBy, conn) + + /** + * Retrieve documents using a JSON containment query, ordering results by the optional given fields (PostgreSQL + * only) + * + * @param tableName The name of the table in which document existence should be checked + * @param criteria The object for which JSON containment should be checked + * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) + * @return A list of documents matching the JSON containment query + * @throws DocumentException If called on a SQLite connection + */ + def findByContains[Doc, A](tableName: String, criteria: A, orderBy: Seq[Field[?]] = List()) + (using tag: ClassTag[Doc]): List[Doc] = + Find.byContains[Doc, A](tableName, criteria, orderBy, conn) + + /** + * Retrieve documents using a JSON Path match query, ordering results by the optional given fields (PostgreSQL only) + * + * @param tableName The table from which documents should be retrieved + * @param path The JSON path comparison to match + * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) + * @return A list of documents matching the JSON Path match query + * @throws DocumentException If called on a SQLite connection + */ + def findByJsonPath[Doc](tableName: String, path: String, orderBy: Seq[Field[?]] = List()) + (using tag: ClassTag[Doc]): List[Doc] = + Find.byJsonPath[Doc](tableName, path, orderBy, conn) + + /** + * Retrieve the first document using a field comparison and optional ordering fields + * + * @param tableName The table from which documents should be retrieved + * @param fields The fields which should be compared + * @param howMatched How the fields should be matched (optional, defaults to `FieldMatch.ALL`) + * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) + * @return The first document matching the field comparison, or `None` if no matches are found + * @throws DocumentException If no dialect has been configured, or if parameters are invalid + */ + def findFirstByFields[Doc](tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch] = None, + orderBy: Seq[Field[?]] = List())(using tag: ClassTag[Doc]): Option[Doc] = + Find.firstByFields[Doc](tableName, fields, howMatched, orderBy, conn) + + /** + * Retrieve the first document using a JSON containment query and optional ordering fields (PostgreSQL only) + * + * @param tableName The table from which documents should be retrieved + * @param criteria The object for which JSON containment should be checked + * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) + * @return The first document matching the JSON containment query, or `None` if no matches are found + * @throws DocumentException If called on a SQLite connection + */ + def findFirstByContains[Doc, A](tableName: String, criteria: A, orderBy: Seq[Field[?]] = List()) + (using tag: ClassTag[Doc]): Option[Doc] = + Find.firstByContains[Doc, A](tableName, criteria, orderBy, conn) + + /** + * Retrieve the first document using a JSON Path match query and optional ordering fields (PostgreSQL only) + * + * @param tableName The table from which documents should be retrieved + * @param path The JSON path comparison to match + * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) + * @return The first document matching the JSON Path match query, or `None` if no matches are found + * @throws DocumentException If called on a SQLite connection + */ + def findFirstByJsonPath[Doc](tableName: String, path: String, orderBy: Seq[Field[?]] = List()) + (using tag: ClassTag[Doc]): Option[Doc] = + Find.firstByJsonPath[Doc](tableName, path, orderBy, conn) + + // ~~~ DOCUMENT PATCH (PARTIAL UPDATE) QUERIES ~~~ + + /** + * Patch a document by its ID + * + * @param tableName The name of the table in which a document should be patched + * @param docId The ID of the document to be patched + * @param patch The object whose properties should be replaced in the document + * @throws DocumentException If no dialect has been configured + */ + def patchById[Key, Patch](tableName: String, docId: Key, patch: Patch): Unit = + Patch.byId(tableName, docId, patch, conn) + + /** + * Patch documents using a field comparison + * + * @param tableName The name of the table in which documents should be patched + * @param fields The fields which should be compared + * @param patch The object whose properties should be replaced in the document + * @param howMatched How the fields should be matched + * @throws DocumentException If no dialect has been configured, or if parameters are invalid + */ + def patchByFields[Patch](tableName: String, fields: Seq[Field[?]], patch: Patch, + howMatched: Option[FieldMatch] = None): Unit = + Patch.byFields(tableName, fields, patch, howMatched, conn) + + /** + * Patch documents using a JSON containment query (PostgreSQL only) + * + * @param tableName The name of the table in which documents should be patched + * @param criteria The object against which JSON containment should be checked + * @param patch The object whose properties should be replaced in the document + * @throws DocumentException If called on a SQLite connection + */ + def patchByContains[A, Patch](tableName: String, criteria: A, patch: Patch): Unit = + Patch.byContains(tableName, criteria, patch, conn) + + /** + * Patch documents using a JSON Path match query (PostgreSQL only) + * + * @param tableName The name of the table in which documents should be patched + * @param path The JSON path comparison to match + * @param patch The object whose properties should be replaced in the document + * @throws DocumentException If called on a SQLite connection + */ + def patchByJsonPath[Patch](tableName: String, path: String, patch: Patch): Unit = + Patch.byJsonPath(tableName, path, patch, conn) + + // ~~~ DOCUMENT FIELD REMOVAL QUERIES ~~~ + + /** + * Remove fields from a document by its ID + * + * @param tableName The name of the table in which the document's fields should be removed + * @param docId The ID of the document to have fields removed + * @param toRemove The names of the fields to be removed + * @throws DocumentException If no dialect has been configured + */ + def removeFieldsById[Key](tableName: String, docId: Key, toRemove: Seq[String]): Unit = + RemoveFields.byId(tableName, docId, toRemove, conn) + + /** + * Remove fields from documents using a field comparison + * + * @param tableName The name of the table in which document fields should be removed + * @param fields The fields which should be compared + * @param toRemove The names of the fields to be removed + * @param howMatched How the fields should be matched + * @throws DocumentException If no dialect has been configured, or if parameters are invalid + */ + def removeFieldsByFields(tableName: String, fields: Seq[Field[?]], toRemove: Seq[String], + howMatched: Option[FieldMatch] = None): Unit = + RemoveFields.byFields(tableName, fields, toRemove, howMatched, conn) + + /** + * Remove fields from documents using a JSON containment query (PostgreSQL only) + * + * @param tableName The name of the table in which document fields should be removed + * @param criteria The object against which JSON containment should be checked + * @param toRemove The names of the fields to be removed + * @throws DocumentException If called on a SQLite connection + */ + def removeFieldsByContains[A](tableName: String, criteria: A, toRemove: Seq[String]): Unit = + RemoveFields.byContains(tableName, criteria, toRemove, conn) + + /** + * Remove fields from documents using a JSON Path match query (PostgreSQL only) + * + * @param tableName The name of the table in which document fields should be removed + * @param path The JSON path comparison to match + * @param toRemove The names of the fields to be removed + * @throws DocumentException If called on a SQLite connection + */ + def removeFieldsByJsonPath(tableName: String, path: String, toRemove: Seq[String]): Unit = + RemoveFields.byJsonPath(tableName, path, toRemove, conn) + + // ~~~ DOCUMENT DELETION QUERIES ~~~ + + /** + * Delete a document by its ID + * + * @param tableName The name of the table from which documents should be deleted + * @param docId The ID of the document to be deleted + * @throws DocumentException If no dialect has been configured + */ + def deleteById[Key](tableName: String, docId: Key): Unit = + Delete.byId(tableName, docId, conn) + + /** + * Delete documents using a field comparison + * + * @param tableName The name of the table from which documents should be deleted + * @param fields The fields which should be compared + * @param howMatched How the fields should be matched + * @throws DocumentException If no dialect has been configured, or if parameters are invalid + */ + def deleteByFields(tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch] = None): Unit = + Delete.byFields(tableName, fields, howMatched, conn) + + /** + * Delete documents using a JSON containment query (PostgreSQL only) + * + * @param tableName The name of the table from which documents should be deleted + * @param criteria The object for which JSON containment should be checked + * @throws DocumentException If called on a SQLite connection + */ + def deleteByContains[A](tableName: String, criteria: A): Unit = + Delete.byContains(tableName, criteria, conn) + + /** + * Delete documents using a JSON Path match query (PostgreSQL only) + * + * @param tableName The name of the table from which documents should be deleted + * @param path The JSON path comparison to match + * @throws DocumentException If called on a SQLite connection + */ + def deleteByJsonPath(tableName: String, path: String): Unit = + Delete.byJsonPath(tableName, path, conn) diff --git a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/extensions/package.scala b/src/scala/src/main/scala/solutions/bitbadger/documents/scala/extensions/package.scala deleted file mode 100644 index 142fd26..0000000 --- a/src/scala/src/main/scala/solutions/bitbadger/documents/scala/extensions/package.scala +++ /dev/null @@ -1,499 +0,0 @@ -package solutions.bitbadger.documents.scala - -import solutions.bitbadger.documents.{DocumentIndex, Field, FieldMatch, Parameter} - -import java.sql.{Connection, ResultSet} -import scala.reflect.ClassTag - -package object extensions: - - extension (conn: Connection) - - // ~~~ CUSTOM QUERIES ~~~ - - /** - * 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 mapFunc The mapping function between the document and the domain item - * @return A list of results for the given query - * @throws DocumentException If parameters are invalid - */ - def customList[TDoc](query: String, parameters: Seq[Parameter[?]], - mapFunc: (ResultSet, ClassTag[TDoc]) => TDoc)(implicit tag: ClassTag[TDoc]): List[TDoc] = - Custom.list[TDoc](query, parameters, conn, mapFunc) - - /** - * Execute a query that returns a list of results - * - * @param query The query to retrieve the results - * @param mapFunc The mapping function between the document and the domain item - * @return A list of results for the given query - * @throws DocumentException If parameters are invalid - */ - def customList[TDoc](query: String, - mapFunc: (ResultSet, ClassTag[TDoc]) => TDoc)(implicit tag: ClassTag[TDoc]): List[TDoc] = - Custom.list[TDoc](query, conn, 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 mapFunc The mapping function between the document and the domain item - * @return An optional document, filled if one matches the query - * @throws DocumentException If parameters are invalid - */ - def customSingle[TDoc](query: String, parameters: Seq[Parameter[?]], - mapFunc: (ResultSet, ClassTag[TDoc]) => TDoc)(implicit tag: ClassTag[TDoc]): Option[TDoc] = - Custom.single[TDoc](query, parameters, conn, mapFunc) - - /** - * Execute a query that returns one or no results - * - * @param query The query to retrieve the results - * @param mapFunc The mapping function between the document and the domain item - * @return An optional document, filled if one matches the query - * @throws DocumentException If parameters are invalid - */ - def customSingle[TDoc](query: String, - mapFunc: (ResultSet, ClassTag[TDoc]) => TDoc)(implicit tag: ClassTag[TDoc]): Option[TDoc] = - Custom.single[TDoc](query, conn, mapFunc) - - /** - * Execute a query that returns no results - * - * @param query The query to retrieve the results - * @param parameters Parameters to use for the query - * @throws DocumentException If parameters are invalid - */ - def customNonQuery(query: String, parameters: Seq[Parameter[?]] = List()): Unit = - Custom.nonQuery(query, parameters, conn) - - /** - * 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 - * @throws DocumentException If parameters are invalid - */ - def customScalar[T](query: String, parameters: Seq[Parameter[?]], - mapFunc: (ResultSet, ClassTag[T]) => T)(implicit tag: ClassTag[T]): T = - Custom.scalar[T](query, parameters, conn, mapFunc) - - /** - * Execute a query that returns a scalar result - * - * @param query The query to retrieve the result - * @param mapFunc The mapping function between the document and the domain item - * @return The scalar value from the query - * @throws DocumentException If parameters are invalid - */ - def customScalar[T](query: String, - mapFunc: (ResultSet, ClassTag[T]) => T)(implicit tag: ClassTag[T]): T = - Custom.scalar[T](query, conn, mapFunc) - - // ~~~ DEFINITION QUERIES ~~~ - - /** - * Create a document table if necessary - * - * @param tableName The table whose existence should be ensured (may include schema) - * @throws DocumentException If the dialect is not configured - */ - def ensureTable(tableName: String): Unit = - Definition.ensureTable(tableName, conn) - - /** - * Create an index on field(s) within documents in the specified table if necessary - * - * @param tableName The table to be indexed (may include schema) - * @param indexName The name of the index to create - * @param fields One or more fields to be indexed< - * @throws DocumentException If any dependent process does - */ - def ensureFieldIndex(tableName: String, indexName: String, fields: Seq[String]): Unit = - Definition.ensureFieldIndex(tableName, indexName, fields, conn) - - /** - * Create a document index on a table (PostgreSQL only) - * - * @param tableName The table to be indexed (may include schema) - * @param indexType The type of index to ensure - * @throws DocumentException If called on a SQLite connection - */ - def ensureDocumentIndex(tableName: String, indexType: DocumentIndex): Unit = - Definition.ensureDocumentIndex (tableName, indexType, conn) - - // ~~~ DOCUMENT MANIPULATION QUERIES ~~~ - - /** - * Insert a new document - * - * @param tableName The table into which the document should be inserted (may include schema) - * @param document The document to be inserted - * @throws DocumentException If IDs are misconfigured, or if the database command fails - */ - def insert[TDoc](tableName: String, document: TDoc): Unit = - Document.insert(tableName, document, conn) - - /** - * Save a document, inserting it if it does not exist and updating it if it does (AKA "upsert") - * - * @param tableName The table in which the document should be saved (may include schema) - * @param document The document to be saved - * @throws DocumentException If the database command fails - */ - def save[TDoc](tableName: String, document: TDoc): Unit = - Document.save(tableName, document, conn) - - /** - * Update (replace) a document by its ID - * - * @param tableName The table in which the document should be replaced (may include schema) - * @param docId The ID of the document to be replaced - * @param document The document to be replaced - * @throws DocumentException If no dialect has been configured, or if the database command fails - */ - def update[TKey, TDoc](tableName: String, docId: TKey, document: TDoc): Unit = - Document.update(tableName, docId, document, conn) - - // ~~~ DOCUMENT COUNT QUERIES ~~~ - - /** - * Count all documents in the table - * - * @param tableName The name of the table in which documents should be counted - * @return A count of the documents in the table - * @throws DocumentException If any dependent process does - */ - def countAll(tableName: String): Long = - Count.all(tableName, conn) - - /** - * Count documents using a field comparison - * - * @param tableName The name of the table in which documents should be counted - * @param fields The fields which should be compared - * @param howMatched How the fields should be matched (optional, default `ALL`) - * @return A count of the matching documents in the table - * @throws DocumentException If the dialect has not been configured - */ - def countByFields(tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch] = None): Long = - Count.byFields(tableName, fields, howMatched, conn) - - /** - * Count documents using a JSON containment query (PostgreSQL only) - * - * @param tableName The name of the table in which documents should be counted - * @param criteria The object for which JSON containment should be checked - * @return A count of the matching documents in the table - * @throws DocumentException If called on a SQLite connection - */ - def countByContains[TContains](tableName: String, criteria: TContains): Long = - Count.byContains(tableName, criteria, conn) - - /** - * Count documents using a JSON Path match query (PostgreSQL only) - * - * @param tableName The name of the table in which documents should be counted - * @param path The JSON path comparison to match - * @return A count of the matching documents in the table - * @throws DocumentException If called on a SQLite connection - */ - def countByJsonPath(tableName: String, path: String): Long = - Count.byJsonPath(tableName, path, conn) - - // ~~~ DOCUMENT EXISTENCE QUERIES ~~~ - - /** - * Determine a document's existence by its ID - * - * @param tableName The name of the table in which document existence should be checked - * @param docId The ID of the document to be checked - * @return True if the document exists, false if not - * @throws DocumentException If no dialect has been configured - */ - def existsById[TKey](tableName: String, docId: TKey): Boolean = - Exists.byId(tableName, docId, conn) - - /** - * Determine document existence using a field comparison - * - * @param tableName The name of the table in which document existence should be checked - * @param fields The fields which should be compared - * @param howMatched How the fields should be matched - * @return True if any matching documents exist, false if not - * @throws DocumentException If no dialect has been configured, or if parameters are invalid - */ - def existsByFields(tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch] = None): Boolean = - Exists.byFields(tableName, fields, howMatched, conn) - - /** - * Determine document existence using a JSON containment query (PostgreSQL only) - * - * @param tableName The name of the table in which document existence should be checked - * @param criteria The object for which JSON containment should be checked - * @return True if any matching documents exist, false if not - * @throws DocumentException If called on a SQLite connection - */ - def existsByContains[TContains](tableName: String, criteria: TContains): Boolean = - Exists.byContains(tableName, criteria, conn) - - /** - * Determine document existence using a JSON Path match query (PostgreSQL only) - * - * @param tableName The name of the table in which document existence should be checked - * @param path The JSON path comparison to match - * @return True if any matching documents exist, false if not - * @throws DocumentException If called on a SQLite connection - */ - def existsByJsonPath(tableName: String, path: String): Boolean = - Exists.byJsonPath(tableName, path, conn) - - // ~~~ DOCUMENT RETRIEVAL QUERIES ~~~ - - /** - * Retrieve all documents in the given table, ordering results by the optional given fields - * - * @param tableName The table from which documents should be retrieved - * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) - * @return A list of documents from the given table - * @throws DocumentException If query execution fails - */ - def findAll[TDoc](tableName: String, orderBy: Seq[Field[?]] = List())(implicit tag: ClassTag[TDoc]): List[TDoc] = - Find.all[TDoc](tableName, orderBy, conn) - - /** - * Retrieve a document by its ID - * - * @param tableName The table from which the document should be retrieved - * @param docId The ID of the document to retrieve - * @return The document if it is found, `None` otherwise - * @throws DocumentException If no dialect has been configured - */ - def findById[TKey, TDoc](tableName: String, docId: TKey)(implicit tag: ClassTag[TDoc]): Option[TDoc] = - Find.byId[TKey, TDoc](tableName, docId, conn) - - /** - * Retrieve documents using a field comparison, ordering results by the optional given fields - * - * @param tableName The table from which the document should be retrieved - * @param fields The fields which should be compared - * @param howMatched How the fields should be matched - * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) - * @return A list of documents matching the field comparison - * @throws DocumentException If no dialect has been configured, or if parameters are invalid - */ - def findByFields[TDoc](tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch] = None, - orderBy: Seq[Field[?]] = List())(implicit tag: ClassTag[TDoc]): List[TDoc] = - Find.byFields[TDoc](tableName, fields, howMatched, orderBy, conn) - - /** - * Retrieve documents using a JSON containment query, ordering results by the optional given fields (PostgreSQL - * only) - * - * @param tableName The name of the table in which document existence should be checked - * @param criteria The object for which JSON containment should be checked - * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) - * @return A list of documents matching the JSON containment query - * @throws DocumentException If called on a SQLite connection - */ - def findByContains[TDoc, TContains](tableName: String, criteria: TContains, orderBy: Seq[Field[?]] = List()) - (implicit tag: ClassTag[TDoc]): List[TDoc] = - Find.byContains[TDoc, TContains](tableName, criteria, orderBy, conn) - - /** - * Retrieve documents using a JSON Path match query, ordering results by the optional given fields (PostgreSQL only) - * - * @param tableName The table from which documents should be retrieved - * @param path The JSON path comparison to match - * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) - * @return A list of documents matching the JSON Path match query - * @throws DocumentException If called on a SQLite connection - */ - def findByJsonPath[TDoc](tableName: String, path: String, orderBy: Seq[Field[?]] = List()) - (implicit tag: ClassTag[TDoc]): List[TDoc] = - Find.byJsonPath[TDoc](tableName, path, orderBy, conn) - - /** - * Retrieve the first document using a field comparison and optional ordering fields - * - * @param tableName The table from which documents should be retrieved - * @param fields The fields which should be compared - * @param howMatched How the fields should be matched (optional, defaults to `FieldMatch.ALL`) - * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) - * @return The first document matching the field comparison, or `None` if no matches are found - * @throws DocumentException If no dialect has been configured, or if parameters are invalid - */ - def findFirstByFields[TDoc](tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch] = None, - orderBy: Seq[Field[?]] = List())(implicit tag: ClassTag[TDoc]): Option[TDoc] = - Find.firstByFields[TDoc](tableName, fields, howMatched, orderBy, conn) - - /** - * Retrieve the first document using a JSON containment query and optional ordering fields (PostgreSQL only) - * - * @param tableName The table from which documents should be retrieved - * @param criteria The object for which JSON containment should be checked - * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) - * @return The first document matching the JSON containment query, or `None` if no matches are found - * @throws DocumentException If called on a SQLite connection - */ - def findFirstByContains[TDoc, TContains](tableName: String, criteria: TContains, orderBy: Seq[Field[?]] = List()) - (implicit tag: ClassTag[TDoc]): Option[TDoc] = - Find.firstByContains[TDoc, TContains](tableName, criteria, orderBy, conn) - - /** - * Retrieve the first document using a JSON Path match query and optional ordering fields (PostgreSQL only) - * - * @param tableName The table from which documents should be retrieved - * @param path The JSON path comparison to match - * @param orderBy Fields by which the query should be ordered (optional, defaults to no ordering) - * @return The first document matching the JSON Path match query, or `None` if no matches are found - * @throws DocumentException If called on a SQLite connection - */ - def findFirstByJsonPath[TDoc](tableName: String, path: String, orderBy: Seq[Field[?]] = List()) - (implicit tag: ClassTag[TDoc]): Option[TDoc] = - Find.firstByJsonPath[TDoc](tableName, path, orderBy, conn) - - // ~~~ DOCUMENT PATCH (PARTIAL UPDATE) QUERIES ~~~ - - /** - * Patch a document by its ID - * - * @param tableName The name of the table in which a document should be patched - * @param docId The ID of the document to be patched - * @param patch The object whose properties should be replaced in the document - * @throws DocumentException If no dialect has been configured - */ - def patchById[TKey, TPatch](tableName: String, docId: TKey, patch: TPatch): Unit = - Patch.byId(tableName, docId, patch, conn) - - /** - * Patch documents using a field comparison - * - * @param tableName The name of the table in which documents should be patched - * @param fields The fields which should be compared - * @param patch The object whose properties should be replaced in the document - * @param howMatched How the fields should be matched - * @throws DocumentException If no dialect has been configured, or if parameters are invalid - */ - def patchByFields[TPatch](tableName: String, fields: Seq[Field[?]], patch: TPatch, - howMatched: Option[FieldMatch] = None): Unit = - Patch.byFields(tableName, fields, patch, howMatched, conn) - - /** - * Patch documents using a JSON containment query (PostgreSQL only) - * - * @param tableName The name of the table in which documents should be patched - * @param criteria The object against which JSON containment should be checked - * @param patch The object whose properties should be replaced in the document - * @throws DocumentException If called on a SQLite connection - */ - def patchByContains[TContains, TPatch](tableName: String, criteria: TContains, patch: TPatch): Unit = - Patch.byContains(tableName, criteria, patch, conn) - - /** - * Patch documents using a JSON Path match query (PostgreSQL only) - * - * @param tableName The name of the table in which documents should be patched - * @param path The JSON path comparison to match - * @param patch The object whose properties should be replaced in the document - * @throws DocumentException If called on a SQLite connection - */ - def patchByJsonPath[TPatch](tableName: String, path: String, patch: TPatch): Unit = - Patch.byJsonPath(tableName, path, patch, conn) - - // ~~~ DOCUMENT FIELD REMOVAL QUERIES ~~~ - - /** - * Remove fields from a document by its ID - * - * @param tableName The name of the table in which the document's fields should be removed - * @param docId The ID of the document to have fields removed - * @param toRemove The names of the fields to be removed - * @throws DocumentException If no dialect has been configured - */ - def removeFieldsById[TKey](tableName: String, docId: TKey, toRemove: Seq[String]): Unit = - RemoveFields.byId(tableName, docId, toRemove, conn) - - /** - * Remove fields from documents using a field comparison - * - * @param tableName The name of the table in which document fields should be removed - * @param fields The fields which should be compared - * @param toRemove The names of the fields to be removed - * @param howMatched How the fields should be matched - * @throws DocumentException If no dialect has been configured, or if parameters are invalid - */ - def removeFieldsByFields(tableName: String, fields: Seq[Field[?]], toRemove: Seq[String], - howMatched: Option[FieldMatch] = None): Unit = - RemoveFields.byFields(tableName, fields, toRemove, howMatched, conn) - - /** - * Remove fields from documents using a JSON containment query (PostgreSQL only) - * - * @param tableName The name of the table in which document fields should be removed - * @param criteria The object against which JSON containment should be checked - * @param toRemove The names of the fields to be removed - * @throws DocumentException If called on a SQLite connection - */ - def removeFieldsByContains[TContains](tableName: String, criteria: TContains, toRemove: Seq[String]): Unit = - RemoveFields.byContains(tableName, criteria, toRemove, conn) - - /** - * Remove fields from documents using a JSON Path match query (PostgreSQL only) - * - * @param tableName The name of the table in which document fields should be removed - * @param path The JSON path comparison to match - * @param toRemove The names of the fields to be removed - * @throws DocumentException If called on a SQLite connection - */ - def removeFieldsByJsonPath(tableName: String, path: String, toRemove: Seq[String]): Unit = - RemoveFields.byJsonPath(tableName, path, toRemove, conn) - - // ~~~ DOCUMENT DELETION QUERIES ~~~ - - /** - * Delete a document by its ID - * - * @param tableName The name of the table from which documents should be deleted - * @param docId The ID of the document to be deleted - * @throws DocumentException If no dialect has been configured - */ - def deleteById[TKey](tableName: String, docId: TKey): Unit = - Delete.byId(tableName, docId, conn) - - /** - * Delete documents using a field comparison - * - * @param tableName The name of the table from which documents should be deleted - * @param fields The fields which should be compared - * @param howMatched How the fields should be matched - * @throws DocumentException If no dialect has been configured, or if parameters are invalid - */ - def deleteByFields(tableName: String, fields: Seq[Field[?]], howMatched: Option[FieldMatch] = None): Unit = - Delete.byFields(tableName, fields, howMatched, conn) - - /** - * Delete documents using a JSON containment query (PostgreSQL only) - * - * @param tableName The name of the table from which documents should be deleted - * @param criteria The object for which JSON containment should be checked - * @throws DocumentException If called on a SQLite connection - */ - def deleteByContains[TContains](tableName: String, criteria: TContains): Unit = - Delete.byContains(tableName, criteria, conn) - - /** - * Delete documents using a JSON Path match query (PostgreSQL only) - * - * @param tableName The name of the table from which documents should be deleted - * @param path The JSON path comparison to match - * @throws DocumentException If called on a SQLite connection - */ - def deleteByJsonPath(tableName: String, path: String): Unit = - Delete.byJsonPath(tableName, path, conn) diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/AutoIdTest.scala b/src/scala/src/test/scala/AutoIdTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/AutoIdTest.scala rename to src/scala/src/test/scala/AutoIdTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/ByteIdClass.scala b/src/scala/src/test/scala/ByteIdClass.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/ByteIdClass.scala rename to src/scala/src/test/scala/ByteIdClass.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/ConfigurationTest.scala b/src/scala/src/test/scala/ConfigurationTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/ConfigurationTest.scala rename to src/scala/src/test/scala/ConfigurationTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/CountQueryTest.scala b/src/scala/src/test/scala/CountQueryTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/CountQueryTest.scala rename to src/scala/src/test/scala/CountQueryTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/DefinitionQueryTest.scala b/src/scala/src/test/scala/DefinitionQueryTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/DefinitionQueryTest.scala rename to src/scala/src/test/scala/DefinitionQueryTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/DeleteQueryTest.scala b/src/scala/src/test/scala/DeleteQueryTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/DeleteQueryTest.scala rename to src/scala/src/test/scala/DeleteQueryTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/DialectTest.scala b/src/scala/src/test/scala/DialectTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/DialectTest.scala rename to src/scala/src/test/scala/DialectTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/DocumentIndexTest.scala b/src/scala/src/test/scala/DocumentIndexTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/DocumentIndexTest.scala rename to src/scala/src/test/scala/DocumentIndexTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/DocumentQueryTest.scala b/src/scala/src/test/scala/DocumentQueryTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/DocumentQueryTest.scala rename to src/scala/src/test/scala/DocumentQueryTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/ExistsQueryTest.scala b/src/scala/src/test/scala/ExistsQueryTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/ExistsQueryTest.scala rename to src/scala/src/test/scala/ExistsQueryTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/FieldMatchTest.scala b/src/scala/src/test/scala/FieldMatchTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/FieldMatchTest.scala rename to src/scala/src/test/scala/FieldMatchTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/FieldTest.scala b/src/scala/src/test/scala/FieldTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/FieldTest.scala rename to src/scala/src/test/scala/FieldTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/FindQueryTest.scala b/src/scala/src/test/scala/FindQueryTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/FindQueryTest.scala rename to src/scala/src/test/scala/FindQueryTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/ForceDialect.scala b/src/scala/src/test/scala/ForceDialect.scala similarity index 83% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/ForceDialect.scala rename to src/scala/src/test/scala/ForceDialect.scala index 7665d26..d233bd9 100644 --- a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/ForceDialect.scala +++ b/src/scala/src/test/scala/ForceDialect.scala @@ -7,11 +7,11 @@ import solutions.bitbadger.documents.Configuration */ object ForceDialect: - def postgres (): Unit = + def postgres(): Unit = Configuration.setConnectionString(":postgresql:") - def sqlite (): Unit = + def sqlite(): Unit = Configuration.setConnectionString(":sqlite:") - def none (): Unit = + def none(): Unit = Configuration.setConnectionString(null) diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/IntIdClass.scala b/src/scala/src/test/scala/IntIdClass.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/IntIdClass.scala rename to src/scala/src/test/scala/IntIdClass.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/LongIdClass.scala b/src/scala/src/test/scala/LongIdClass.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/LongIdClass.scala rename to src/scala/src/test/scala/LongIdClass.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/OpTest.scala b/src/scala/src/test/scala/OpTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/OpTest.scala rename to src/scala/src/test/scala/OpTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/ParameterNameTest.scala b/src/scala/src/test/scala/ParameterNameTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/ParameterNameTest.scala rename to src/scala/src/test/scala/ParameterNameTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/ParameterTest.scala b/src/scala/src/test/scala/ParameterTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/ParameterTest.scala rename to src/scala/src/test/scala/ParameterTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/ParametersTest.scala b/src/scala/src/test/scala/ParametersTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/ParametersTest.scala rename to src/scala/src/test/scala/ParametersTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/PatchQueryTest.scala b/src/scala/src/test/scala/PatchQueryTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/PatchQueryTest.scala rename to src/scala/src/test/scala/PatchQueryTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/QueryUtilsTest.scala b/src/scala/src/test/scala/QueryUtilsTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/QueryUtilsTest.scala rename to src/scala/src/test/scala/QueryUtilsTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/RemoveFieldsQueryTest.scala b/src/scala/src/test/scala/RemoveFieldsQueryTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/RemoveFieldsQueryTest.scala rename to src/scala/src/test/scala/RemoveFieldsQueryTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/ShortIdClass.scala b/src/scala/src/test/scala/ShortIdClass.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/ShortIdClass.scala rename to src/scala/src/test/scala/ShortIdClass.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/StringIdClass.scala b/src/scala/src/test/scala/StringIdClass.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/StringIdClass.scala rename to src/scala/src/test/scala/StringIdClass.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/WhereTest.scala b/src/scala/src/test/scala/WhereTest.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/WhereTest.scala rename to src/scala/src/test/scala/WhereTest.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/ArrayDocument.scala b/src/scala/src/test/scala/integration/ArrayDocument.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/ArrayDocument.scala rename to src/scala/src/test/scala/integration/ArrayDocument.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/CountFunctions.scala b/src/scala/src/test/scala/integration/CountFunctions.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/CountFunctions.scala rename to src/scala/src/test/scala/integration/CountFunctions.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/CustomFunctions.scala b/src/scala/src/test/scala/integration/CustomFunctions.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/CustomFunctions.scala rename to src/scala/src/test/scala/integration/CustomFunctions.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/DefinitionFunctions.scala b/src/scala/src/test/scala/integration/DefinitionFunctions.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/DefinitionFunctions.scala rename to src/scala/src/test/scala/integration/DefinitionFunctions.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/DeleteFunctions.scala b/src/scala/src/test/scala/integration/DeleteFunctions.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/DeleteFunctions.scala rename to src/scala/src/test/scala/integration/DeleteFunctions.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/DocumentFunctions.scala b/src/scala/src/test/scala/integration/DocumentFunctions.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/DocumentFunctions.scala rename to src/scala/src/test/scala/integration/DocumentFunctions.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/ExistsFunctions.scala b/src/scala/src/test/scala/integration/ExistsFunctions.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/ExistsFunctions.scala rename to src/scala/src/test/scala/integration/ExistsFunctions.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/FindFunctions.scala b/src/scala/src/test/scala/integration/FindFunctions.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/FindFunctions.scala rename to src/scala/src/test/scala/integration/FindFunctions.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/JacksonDocumentSerializer.scala b/src/scala/src/test/scala/integration/JacksonDocumentSerializer.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/JacksonDocumentSerializer.scala rename to src/scala/src/test/scala/integration/JacksonDocumentSerializer.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/JsonDocument.scala b/src/scala/src/test/scala/integration/JsonDocument.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/JsonDocument.scala rename to src/scala/src/test/scala/integration/JsonDocument.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/NumIdDocument.scala b/src/scala/src/test/scala/integration/NumIdDocument.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/NumIdDocument.scala rename to src/scala/src/test/scala/integration/NumIdDocument.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PatchFunctions.scala b/src/scala/src/test/scala/integration/PatchFunctions.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PatchFunctions.scala rename to src/scala/src/test/scala/integration/PatchFunctions.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PgDB.scala b/src/scala/src/test/scala/integration/PgDB.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PgDB.scala rename to src/scala/src/test/scala/integration/PgDB.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PostgreSQLCountIT.scala b/src/scala/src/test/scala/integration/PostgreSQLCountIT.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PostgreSQLCountIT.scala rename to src/scala/src/test/scala/integration/PostgreSQLCountIT.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PostgreSQLCustomIT.scala b/src/scala/src/test/scala/integration/PostgreSQLCustomIT.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PostgreSQLCustomIT.scala rename to src/scala/src/test/scala/integration/PostgreSQLCustomIT.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PostgreSQLDefinitionIT.scala b/src/scala/src/test/scala/integration/PostgreSQLDefinitionIT.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PostgreSQLDefinitionIT.scala rename to src/scala/src/test/scala/integration/PostgreSQLDefinitionIT.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PostgreSQLDeleteIT.scala b/src/scala/src/test/scala/integration/PostgreSQLDeleteIT.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PostgreSQLDeleteIT.scala rename to src/scala/src/test/scala/integration/PostgreSQLDeleteIT.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PostgreSQLDocumentIT.scala b/src/scala/src/test/scala/integration/PostgreSQLDocumentIT.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PostgreSQLDocumentIT.scala rename to src/scala/src/test/scala/integration/PostgreSQLDocumentIT.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PostgreSQLExistsIT.scala b/src/scala/src/test/scala/integration/PostgreSQLExistsIT.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PostgreSQLExistsIT.scala rename to src/scala/src/test/scala/integration/PostgreSQLExistsIT.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PostgreSQLFindIT.scala b/src/scala/src/test/scala/integration/PostgreSQLFindIT.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PostgreSQLFindIT.scala rename to src/scala/src/test/scala/integration/PostgreSQLFindIT.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PostgreSQLPatchIT.scala b/src/scala/src/test/scala/integration/PostgreSQLPatchIT.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PostgreSQLPatchIT.scala rename to src/scala/src/test/scala/integration/PostgreSQLPatchIT.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PostgreSQLRemoveFieldsIT.scala b/src/scala/src/test/scala/integration/PostgreSQLRemoveFieldsIT.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/PostgreSQLRemoveFieldsIT.scala rename to src/scala/src/test/scala/integration/PostgreSQLRemoveFieldsIT.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/RemoveFieldsFunctions.scala b/src/scala/src/test/scala/integration/RemoveFieldsFunctions.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/RemoveFieldsFunctions.scala rename to src/scala/src/test/scala/integration/RemoveFieldsFunctions.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLiteCountIT.scala b/src/scala/src/test/scala/integration/SQLiteCountIT.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLiteCountIT.scala rename to src/scala/src/test/scala/integration/SQLiteCountIT.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLiteCustomIT.scala b/src/scala/src/test/scala/integration/SQLiteCustomIT.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLiteCustomIT.scala rename to src/scala/src/test/scala/integration/SQLiteCustomIT.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLiteDB.scala b/src/scala/src/test/scala/integration/SQLiteDB.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLiteDB.scala rename to src/scala/src/test/scala/integration/SQLiteDB.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLiteDefinitionIT.scala b/src/scala/src/test/scala/integration/SQLiteDefinitionIT.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLiteDefinitionIT.scala rename to src/scala/src/test/scala/integration/SQLiteDefinitionIT.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLiteDeleteIT.scala b/src/scala/src/test/scala/integration/SQLiteDeleteIT.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLiteDeleteIT.scala rename to src/scala/src/test/scala/integration/SQLiteDeleteIT.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLiteDocumentIT.scala b/src/scala/src/test/scala/integration/SQLiteDocumentIT.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLiteDocumentIT.scala rename to src/scala/src/test/scala/integration/SQLiteDocumentIT.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLiteExistsIT.scala b/src/scala/src/test/scala/integration/SQLiteExistsIT.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLiteExistsIT.scala rename to src/scala/src/test/scala/integration/SQLiteExistsIT.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLiteFindIT.scala b/src/scala/src/test/scala/integration/SQLiteFindIT.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLiteFindIT.scala rename to src/scala/src/test/scala/integration/SQLiteFindIT.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLitePatchIT.scala b/src/scala/src/test/scala/integration/SQLitePatchIT.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLitePatchIT.scala rename to src/scala/src/test/scala/integration/SQLitePatchIT.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLiteRemoveFieldsIT.scala b/src/scala/src/test/scala/integration/SQLiteRemoveFieldsIT.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SQLiteRemoveFieldsIT.scala rename to src/scala/src/test/scala/integration/SQLiteRemoveFieldsIT.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SubDocument.scala b/src/scala/src/test/scala/integration/SubDocument.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/SubDocument.scala rename to src/scala/src/test/scala/integration/SubDocument.scala diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/ThrowawayDatabase.scala b/src/scala/src/test/scala/integration/ThrowawayDatabase.scala similarity index 100% rename from src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/integration/ThrowawayDatabase.scala rename to src/scala/src/test/scala/integration/ThrowawayDatabase.scala diff --git a/src/scala/src/test/scala/package.scala b/src/scala/src/test/scala/package.scala new file mode 100644 index 0000000..dc80f93 --- /dev/null +++ b/src/scala/src/test/scala/package.scala @@ -0,0 +1,3 @@ +package solutions.bitbadger.documents.scala.tests + +def TEST_TABLE = "test_table" diff --git a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/package.scala b/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/package.scala deleted file mode 100644 index 8992837..0000000 --- a/src/scala/src/test/scala/solutions/bitbadger/documents/scala/tests/package.scala +++ /dev/null @@ -1,6 +0,0 @@ -package solutions.bitbadger.documents.scala - -package object tests { - - def TEST_TABLE = "test_table" -} \ No newline at end of file