package solutions.bitbadger.documents import solutions.bitbadger.documents.query.Exists import java.sql.Connection /** * Functions to determine whether documents exist */ object Exists { /** * 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 * @param conn The connection on which the existence check should be executed * @return True if the document exists, false if not */ fun byId(tableName: String, docId: TKey, conn: Connection) = conn.customScalar( Exists.byId(tableName, docId), Parameters.addFields(listOf(Field.equal(Configuration.idField, docId, ":id"))), Results::toExists ) /** * 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 */ fun byId(tableName: String, docId: TKey) = Configuration.dbConn().use { byId(tableName, docId, it) } /** * 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 * @param conn The connection on which the existence check should be executed * @return True if any matching documents exist, false if not */ fun byFields( tableName: String, fields: Collection>, howMatched: FieldMatch? = null, conn: Connection ): Boolean { val named = Parameters.nameFields(fields) return conn.customScalar( Exists.byFields(tableName, named, howMatched), Parameters.addFields(named), Results::toExists ) } /** * 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 */ fun byFields(tableName: String, fields: Collection>, howMatched: FieldMatch? = null) = Configuration.dbConn().use { byFields(tableName, fields, howMatched, it) } /** * 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 * @param conn The connection on which the existence check should be executed * @return True if any matching documents exist, false if not * @throws DocumentException If called on a SQLite connection */ inline fun byContains(tableName: String, criteria: TContains, conn: Connection) = conn.customScalar( Exists.byContains(tableName), listOf(Parameters.json(":criteria", criteria)), Results::toExists ) /** * 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 */ inline fun byContains(tableName: String, criteria: TContains) = Configuration.dbConn().use { byContains(tableName, criteria, it) } /** * 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 * @param conn The connection on which the existence check should be executed * @return True if any matching documents exist, false if not * @throws DocumentException If called on a SQLite connection */ fun byJsonPath(tableName: String, path: String, conn: Connection) = conn.customScalar( Exists.byJsonPath(tableName), listOf(Parameter(":path", ParameterType.STRING, path)), Results::toExists ) /** * 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 */ fun byJsonPath(tableName: String, path: String) = Configuration.dbConn().use { byJsonPath(tableName, path, it) } }