package solutions.bitbadger.documents.query import solutions.bitbadger.documents.* import solutions.bitbadger.documents.query.byFields as byFieldsBase import solutions.bitbadger.documents.query.byId as byIdBase /** * Functions to create queries to remove fields from documents */ object RemoveFields { /** * Create a query to remove fields based on the given parameters * * @param tableName The name of the table in which documents should have fields removed * @param toRemove The parameters for the fields to be removed * @return A query to remove fields from documents in the given table */ private fun removeFields(tableName: String, toRemove: Collection>) = when (Configuration.dialect("generate field removal query")) { Dialect.POSTGRESQL -> "UPDATE $tableName SET data = data - ${toRemove.elementAt(0).name}::text[]" Dialect.SQLITE -> toRemove.joinToString(", ") { it.name }.let { "UPDATE $tableName SET data = json_remove(data, $it)" } } /** * A query to patch (partially update) a JSON document by its ID * * @param tableName The name of the table where the document is stored * @param toRemove The parameters for the fields to be removed * @param docId The ID of the document to be updated (optional, used for type checking) * @return A query to patch a JSON document by its ID */ fun byId(tableName: String, toRemove: Collection>, docId: TKey? = null) = byIdBase(removeFields(tableName, toRemove), docId) /** * A query to patch (partially update) a JSON document using field match criteria * * @param tableName The name of the table where the documents are stored * @param toRemove The parameters for the fields to be removed * @param fields The field criteria * @param howMatched How the fields should be matched (optional, defaults to `ALL`) * @return A query to patch JSON documents by field match criteria */ fun byFields( tableName: String, toRemove: Collection>, fields: Collection>, howMatched: FieldMatch? = null ) = byFieldsBase(removeFields(tableName, toRemove), fields, howMatched) /** * A query to patch (partially update) a JSON document by JSON containment (PostgreSQL only) * * @param tableName The name of the table where the document is stored * @param toRemove The parameters for the fields to be removed * @return A query to patch JSON documents by JSON containment */ fun byContains(tableName: String, toRemove: Collection>) = statementWhere(removeFields(tableName, toRemove), Where.jsonContains()) /** * A query to patch (partially update) a JSON document by JSON path match (PostgreSQL only) * * @param tableName The name of the table where the document is stored * @param toRemove The parameters for the fields to be removed * @return A query to patch JSON documents by JSON path match */ fun byJsonPath(tableName: String, toRemove: Collection>) = statementWhere(removeFields(tableName, toRemove), Where.jsonPathMatches()) }