-module(cake@delete). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/cake/delete.gleam"). -export([to_query/1, new/0, modifier/2, no_modifier/1, get_modifier/1, table/2, no_table/1, get_table/1, using_table/2, using_sub_query/3, replace_using_table/2, replace_using_sub_query/3, no_using/1, get_using/1, join/2, replace_join/2, joins/2, replace_joins/2, no_join/1, get_joins/1, where/2, or_where/2, xor_where/2, not_where/2, replace_where/2, no_where/1, get_where/1, returning/2, no_returning/1, epilog/2, no_epilog/1, get_epilog/1, comment/2, no_comment/1, get_comment/1]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC( " A DSL to build `DELETE` queries.\n" "\n" " ## Aliases\n" "\n" " ```gleam\n" " import cake/delete as d\n" " import cake/where as w\n" " import cake/join as j\n" " ```\n" "\n" " ---\n" "\n" " ## Query Lifecycle\n" "\n" " ```mermaid\n" " flowchart LR\n" " A[d.new] --> B[d.table]\n" " B --> C[d.using_table / d.join]\n" " C --> D[d.where]\n" " D --> E[d.returning]\n" " E --> F[d.to_query]\n" " ```\n" "\n" " ---\n" "\n" " ## Constructor\n" "\n" " ### `new() -> Delete(a)`\n" "\n" " Creates an empty `Delete` query.\n" "\n" " ### `to_query(delete: Delete(a)) -> WriteQuery(a)`\n" "\n" " Converts a `Delete` into a `WriteQuery` for execution.\n" "\n" " ---\n" "\n" " ## Table\n" "\n" " ### `table(delete, table_name) -> Delete(a)`\n" "\n" " Sets the table from which rows will be deleted.\n" "\n" " ```gleam\n" " d.new()\n" " |> d.table(\"sessions\")\n" " |> d.where(w.lt(w.col(\"expires_at\"), w.date(today)))\n" " |> d.to_query\n" " // DELETE FROM sessions WHERE expires_at < $1\n" " ```\n" "\n" " | Function | Effect |\n" " | ------ | ------ |\n" " | `table(delete, name)` | Set the target table |\n" " | `no_table(delete)` | Remove the target table |\n" "\n" " ---\n" "\n" " ## USING clause\n" "\n" " `USING` allows referencing additional tables to filter which rows are deleted.\n" " It is the `DELETE` equivalent of a `FROM` join-helper on 🐘 PostgreSQL.\n" "\n" " ```mermaid\n" " flowchart TD\n" " A[DELETE FROM a] --> B{USING}\n" " B -->|table| C[USING b]\n" " B -->|sub-query| D[USING sub AS alias]\n" " C --> E[WHERE a.b_id = b.id]\n" " D --> E\n" " ```\n" "\n" " ### `using_table(delete, table_name) -> Delete(a)`\n" "\n" " Appends a table reference to the `USING` clause.\n" "\n" " ```gleam\n" " d.new()\n" " |> d.table(\"order_items\")\n" " |> d.using_table(\"orders\")\n" " |> d.where(w.and([\n" " w.eq(w.col(\"order_items.order_id\"), w.col(\"orders.id\")),\n" " w.eq(w.col(\"orders.status\"), w.string(\"cancelled\")),\n" " ]))\n" " // DELETE FROM order_items USING orders\n" " // WHERE order_items.order_id = orders.id AND orders.status = $1\n" " ```\n" "\n" " ### `using_sub_query(delete, query, alias) -> Delete(a)`\n" "\n" " Appends an aliased sub-query to the `USING` clause.\n" "\n" " > 🦭 MariaDB and 🐬 MySQL do not support sub-queries in `USING` — use a `JOIN`\n" " > or a `WHERE` sub-query instead.\n" "\n" " ### Database compatibility for USING\n" "\n" " | Database | Table | Sub-query |\n" " | ------------- | ----- | --------- |\n" " | 🐘 PostgreSQL | ✅ | ✅ |\n" " | 🦭 MariaDB | ✅ | ❌ |\n" " | 🐬 MySQL | ✅ | ❌ |\n" " | 🪶 SQLite | ❌ | ❌ |\n" "\n" " > For 🦭 MariaDB and 🐬 MySQL the primary table used in `FROM` must also be\n" " > listed in `USING`. For example:\n" " >\n" " > ```sql\n" " > DELETE a FROM a USING a, b WHERE a.b_id = b.id\n" " > ```\n" "\n" " ### Replace / remove variants\n" "\n" " | Function | Effect |\n" " | ------ | ------ |\n" " | `replace_using_table(delete, name)` | Replace USING with one table |\n" " | `replace_using_sub_query(delete, query, alias)` | Replace USING with one sub-query |\n" " | `no_using(delete)` | Remove USING clause |\n" "\n" " ---\n" "\n" " ## JOIN\n" "\n" " For 🦭 MariaDB and 🐬 MySQL, `JOIN` is the standard way to filter a `DELETE`\n" " against another table.\n" "\n" " > On 🐘 PostgreSQL and 🪶 SQLite, `JOIN` on a `DELETE` requires a `USING`\n" " > clause to be set.\n" "\n" " ```gleam\n" " d.new()\n" " |> d.table(\"order_items\")\n" " |> d.join(j.inner(\n" " with: j.table(\"orders\"),\n" " on: w.eq(w.col(\"order_items.order_id\"), w.col(\"orders.id\")),\n" " alias: \"orders\",\n" " ))\n" " |> d.where(w.eq(w.col(\"orders.status\"), w.string(\"cancelled\")))\n" " ```\n" "\n" " | Function | Effect |\n" " | ------ | ------ |\n" " | `join(delete, join)` | Append one join |\n" " | `replace_join(delete, join)` | Replace all joins with one |\n" " | `joins(delete, joins)` | Append many joins |\n" " | `replace_joins(delete, joins)` | Replace all joins |\n" " | `no_join(delete)` | Remove all joins |\n" "\n" " ---\n" "\n" " ## WHERE clause\n" "\n" " See [`cake/where`](where.md) for building `Where` values.\n" "\n" " ### `where(delete, where) -> Delete(a)`\n" "\n" " Adds a condition with `AND` semantics.\n" "\n" " ```gleam\n" " d.new()\n" " |> d.table(\"users\")\n" " |> d.where(w.eq(w.col(\"active\"), w.bool(False)))\n" " |> d.where(w.lt(w.col(\"created_at\"), w.date(cutoff)))\n" " // DELETE FROM users WHERE active = $1 AND created_at < $2\n" " ```\n" "\n" " ### `or_where(delete, where) -> Delete(a)`\n" "\n" " Combines with `OR` semantics.\n" "\n" " ### `xor_where(delete, where) -> Delete(a)`\n" "\n" " Combines with exactly-one-true `XOR` semantics. Implemented via a custom\n" " `OR / AND / NOT` expansion on all adapters — native `XOR` is not used on any\n" " adapter, including 🦭 MariaDB / 🐬 MySQL.\n" "\n" " > For odd-parity XOR (matching 🦭 MariaDB / 🐬 MySQL native `XOR`), use\n" " > `w.xor_parity` instead.\n" "\n" " ### `not_where(delete, where) -> Delete(a)`\n" "\n" " Negates the given condition with `NOT` and combines with `AND` semantics.\n" "\n" " - If there is no current WHERE, the condition is set as a standalone `NOT`.\n" " - If the outermost WHERE is an `AndWhere`, the negated condition is appended to it.\n" " - Otherwise, the existing WHERE and the new `NOT` condition are wrapped in an `AndWhere`.\n" "\n" " | Function | Effect |\n" " | ------ | ------ |\n" " | `replace_where(delete, where)` | Replace the entire WHERE |\n" " | `no_where(delete)` | Remove WHERE clause |\n" "\n" " ---\n" "\n" " ## RETURNING\n" "\n" " Fetch column values from the deleted rows.\n" "\n" " > Only supported by 🐘 PostgreSQL and 🪶 SQLite.\n" "\n" " ```gleam\n" " d.new()\n" " |> d.table(\"sessions\")\n" " |> d.where(w.eq(w.col(\"user_id\"), w.int(42)))\n" " |> d.returning([\"id\", \"token\"])\n" " // DELETE FROM sessions WHERE user_id = $1 RETURNING id, token\n" " ```\n" "\n" " | Function | Effect |\n" " | ------ | ------ |\n" " | `returning(delete, cols)` | Return the listed columns |\n" " | `no_returning(delete)` | Remove RETURNING clause |\n" "\n" " ---\n" "\n" " ## Modifier\n" "\n" " A raw string modifier inserted after `DELETE`\n" " (e.g. `LOW_PRIORITY` or `QUICK` for MySQL).\n" "\n" " ```gleam\n" " d.new() |> d.modifier(\"LOW_PRIORITY\")\n" " // DELETE LOW_PRIORITY FROM ...\n" " ```\n" "\n" " ---\n" "\n" " ## Epilog and Comment\n" "\n" " ```gleam\n" " d.new()\n" " |> d.table(\"audit_log\")\n" " |> d.where(w.lt(w.col(\"created_at\"), w.date(cutoff)))\n" " |> d.epilog(\"RETURNING id\")\n" " |> d.comment(\"purge old audit records\")\n" " ```\n" "\n" " ---\n" "\n" " ## Full Example\n" "\n" " ```gleam\n" " import cake/delete as d\n" " import cake/where as w\n" "\n" " d.new()\n" " |> d.table(\"messages\")\n" " |> d.where(w.and([\n" " w.eq(w.col(\"read\"), w.bool(True)),\n" " w.lt(w.col(\"created_at\"), w.date(thirty_days_ago)),\n" " ]))\n" " |> d.returning([\"id\"])\n" " |> d.to_query\n" " ```\n" "\n" "\n" " \n" " \n" " \n" " \n" " \n" "\n" ). -file("src/cake/delete.gleam", 337). ?DOC(" Creates a `WriteQuery` from a `Delete` query.\n"). -spec to_query(cake@internal@write_query:delete(ERG)) -> cake@internal@write_query:write_query(ERG). to_query(Delete) -> _pipe = Delete, {delete_query, _pipe}. -file("src/cake/delete.gleam", 345). ?DOC(" Creates an empty `Delete` query.\n"). -spec new() -> cake@internal@write_query:delete(any()). new() -> {delete, no_delete_modifier, no_delete_table, no_delete_using, no_joins, no_where, no_returning, no_epilog, no_comment}. -file("src/cake/delete.gleam", 362). ?DOC(" Sets the `DELETE` modifier.\n"). -spec modifier(cake@internal@write_query:delete(ERL), binary()) -> cake@internal@write_query:delete(ERL). modifier(Delete, Modifier) -> Modifier@1 = begin _pipe = Modifier, gleam@string:trim(_pipe) end, case Modifier@1 of <<""/utf8>> -> {delete, no_delete_modifier, erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}; _ -> {delete, begin _pipe@1 = Modifier@1, {delete_modifier, _pipe@1} end, erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)} end. -file("src/cake/delete.gleam", 375). ?DOC(" Removes the `DELETE` modifier.\n"). -spec no_modifier(cake@internal@write_query:delete(ERO)) -> cake@internal@write_query:delete(ERO). no_modifier(Delete) -> {delete, no_delete_modifier, erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}. -file("src/cake/delete.gleam", 381). ?DOC(" Gets the `DELETE` modifier.\n"). -spec get_modifier(cake@internal@write_query:delete(any())) -> binary(). get_modifier(Delete) -> case erlang:element(2, Delete) of no_delete_modifier -> <<""/utf8>>; {delete_modifier, Keyword} -> Keyword end. -file("src/cake/delete.gleam", 393). ?DOC( " Sets the table name of the `Delete` query, aka the table where\n" " the rows will be deleted from.\n" ). -spec table(cake@internal@write_query:delete(ERT), binary()) -> cake@internal@write_query:delete(ERT). table(Delete, Table_name) -> {delete, erlang:element(2, Delete), begin _pipe = Table_name, {delete_table, _pipe} end, erlang:element(4, Delete), erlang:element(5, Delete), erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}. -file("src/cake/delete.gleam", 402). ?DOC(" Removes the table name from the `Delete` query.\n"). -spec no_table(cake@internal@write_query:delete(ERW)) -> cake@internal@write_query:delete(ERW). no_table(Delete) -> {delete, erlang:element(2, Delete), no_delete_table, erlang:element(4, Delete), erlang:element(5, Delete), erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}. -file("src/cake/delete.gleam", 408). ?DOC(" Gets the table name of the `Delete` query.\n"). -spec get_table(cake@internal@write_query:delete(any())) -> cake@internal@write_query:delete_table(). get_table(Delete) -> erlang:element(3, Delete). -file("src/cake/delete.gleam", 428). ?DOC( " Adds a `USING` clause to the `Delete` query specifying a table.\n" "\n" " If the query already has a `USING` clause, the new `USING` clause\n" " will be appended to the existing one.\n" "\n" " The `USING` clause is used to specify additional tables that are used\n" " to filter the rows to be deleted.\n" "\n" " NOTICE: 🪶SQLite does not support `USING`.\n" "\n" " NOTICE: For 🦭MariaDB and 🐬MySQL it is mandatory to specify the table set\n" " within the `FROM` clause in the `USING` clause, again - e.g. in raw SQL:\n" " `DELETE * FROM a USING a, b, WHERE a.b_id = b.id;`\n" ). -spec using_table(cake@internal@write_query:delete(ESB), binary()) -> cake@internal@write_query:delete(ESB). using_table(Delete, Table_name) -> case erlang:element(4, Delete) of no_delete_using -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), begin _pipe@1 = [begin _pipe = Table_name, {from_table, _pipe} end], {delete_using, _pipe@1} end, erlang:element(5, Delete), erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}; {delete_using, Delete_usings} -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), begin _pipe@2 = Delete_usings, _pipe@4 = lists:append( _pipe@2, [begin _pipe@3 = Table_name, {from_table, _pipe@3} end] ), {delete_using, _pipe@4} end, erlang:element(5, Delete), erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)} end. -file("src/cake/delete.gleam", 463). ?DOC( " Adds a `USING` clause to the `Delete` query specifying a sub-query.\n" "\n" " The sub-query must be aliased.\n" "\n" " If the query already has a `USING` clause, the new `USING` clause\n" " will be appended to the existing one.\n" "\n" " The `USING` clause is used to specify additional tables that are used\n" " to filter the rows to be deleted.\n" "\n" " NOTICE: 🪶SQLite does not support `USING`.\n" "\n" " NOTICE: 🦭MariaDB and 🐬MySQL do not support derived tables (sub-queries)\n" " in the `USING` clause of a multi-table `DELETE` - only literal table names\n" " are accepted there. Use a sub-query in a `WHERE` clause or a `JOIN` instead.\n" "\n" " NOTICE: 🪶SQLite does not support `USING` at all.\n" ). -spec using_sub_query( cake@internal@write_query:delete(ESE), cake@internal@read_query:read_query(), binary() ) -> cake@internal@write_query:delete(ESE). using_sub_query(Delete, Query, Alias) -> case erlang:element(4, Delete) of no_delete_using -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), begin _pipe = [{from_sub_query, Query, Alias}], {delete_using, _pipe} end, erlang:element(5, Delete), erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}; {delete_using, Delete_usings} -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), begin _pipe@1 = Delete_usings, _pipe@2 = lists:append( _pipe@1, [{from_sub_query, Query, Alias}] ), {delete_using, _pipe@2} end, erlang:element(5, Delete), erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)} end. -file("src/cake/delete.gleam", 483). ?DOC(" Replaces the `USING` clause of the `Delete` query with a table.\n"). -spec replace_using_table(cake@internal@write_query:delete(ESH), binary()) -> cake@internal@write_query:delete(ESH). replace_using_table(Delete, Table_name) -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), begin _pipe@1 = [begin _pipe = Table_name, {from_table, _pipe} end], {delete_using, _pipe@1} end, erlang:element(5, Delete), erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}. -file("src/cake/delete.gleam", 492). ?DOC(" Replaces the `USING` clause of the `Delete` query with a sub-query.\n"). -spec replace_using_sub_query( cake@internal@write_query:delete(ESK), cake@internal@read_query:read_query(), binary() ) -> cake@internal@write_query:delete(ESK). replace_using_sub_query(Delete, Query, Alias) -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), begin _pipe = [{from_sub_query, Query, Alias}], {delete_using, _pipe} end, erlang:element(5, Delete), erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}. -file("src/cake/delete.gleam", 502). ?DOC(" Removes the `USING` clause from the `Delete` query.\n"). -spec no_using(cake@internal@write_query:delete(ESN)) -> cake@internal@write_query:delete(ESN). no_using(Delete) -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), no_delete_using, erlang:element(5, Delete), erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}. -file("src/cake/delete.gleam", 508). ?DOC(" Gets the `USING` clause of the `Delete` query.\n"). -spec get_using(cake@internal@write_query:delete(any())) -> list(cake@internal@read_query:from()). get_using(Delete) -> case erlang:element(4, Delete) of no_delete_using -> []; {delete_using, Using} -> Using end. -file("src/cake/delete.gleam", 522). ?DOC( " Adds a `Join` to the `Delete` query.\n" "\n" " NOTICE: On 🐘PostgreSQL and 🪶SQLite `Joins` are only allowed if the `FROM`\n" " clause is set as well.\n" ). -spec join( cake@internal@write_query:delete(EST), cake@internal@read_query:join() ) -> cake@internal@write_query:delete(EST). join(Delete, Join) -> case erlang:element(5, Delete) of {joins, Existing_joins} -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), begin _pipe = Existing_joins, _pipe@1 = lists:append(_pipe, [Join]), {joins, _pipe@1} end, erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}; no_joins -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), begin _pipe@2 = [Join], {joins, _pipe@2} end, erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)} end. -file("src/cake/delete.gleam", 535). ?DOC( " Replaces any `Join`s of the `Delete` query with a single `Join`.\n" "\n" " NOTICE: On 🐘PostgreSQL and 🪶SQLite `Joins` are only allowed if the `FROM`\n" " clause is set as well.\n" ). -spec replace_join( cake@internal@write_query:delete(ESW), cake@internal@read_query:join() ) -> cake@internal@write_query:delete(ESW). replace_join(Delete, Join) -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), begin _pipe = [Join], {joins, _pipe} end, erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}. -file("src/cake/delete.gleam", 544). ?DOC( " Adds `Join`s to the `Delete` query.\n" "\n" " NOTICE: On 🐘PostgreSQL and 🪶SQLite `Joins` are only allowed if the `FROM`\n" " clause is set as well.\n" ). -spec joins( cake@internal@write_query:delete(ESZ), list(cake@internal@read_query:join()) ) -> cake@internal@write_query:delete(ESZ). joins(Delete, Joins) -> case {Joins, erlang:element(5, Delete)} of {[], _} -> Delete; {_, {joins, Existing_joins}} -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), begin _pipe = Existing_joins, _pipe@1 = lists:append(_pipe, Joins), {joins, _pipe@1} end, erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}; {_, no_joins} -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), begin _pipe@2 = Joins, {joins, _pipe@2} end, erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)} end. -file("src/cake/delete.gleam", 558). ?DOC( " Replaces any `Join`s of the `Delete` query with the given `Join`s.\n" "\n" " NOTICE: On 🐘PostgreSQL and 🪶SQLite `Joins` are only allowed if the `FROM`\n" " clause is set as well.\n" ). -spec replace_joins( cake@internal@write_query:delete(ETD), list(cake@internal@read_query:join()) ) -> cake@internal@write_query:delete(ETD). replace_joins(Delete, Joins) -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), begin _pipe = Joins, {joins, _pipe} end, erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}. -file("src/cake/delete.gleam", 567). ?DOC(" Removes any `Joins` from the `Delete` query.\n"). -spec no_join(cake@internal@write_query:delete(ETH)) -> cake@internal@write_query:delete(ETH). no_join(Delete) -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), no_joins, erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}. -file("src/cake/delete.gleam", 573). ?DOC(" Gets the `Joins` of the `Delete` query.\n"). -spec get_joins(cake@internal@write_query:delete(any())) -> cake@internal@read_query:joins(). get_joins(Delete) -> erlang:element(5, Delete). -file("src/cake/delete.gleam", 588). ?DOC( " Sets an `AndWhere` or appends into an existing `AndWhere`.\n" "\n" " - If the outermost `Where` is an `AndWhere`, the new `Where` is appended\n" " to the list within `AndWhere`.\n" " - If the query does not have a `Where` clause, the given `Where` is set\n" " instead.\n" " - If the outermost `Where` is any other kind of `Where`, this and the\n" " current outermost `Where` are wrapped in an `AndWhere`.\n" ). -spec where( cake@internal@write_query:delete(ETM), cake@internal@read_query:where() ) -> cake@internal@write_query:delete(ETM). where(Delete, Where) -> case erlang:element(6, Delete) of no_where -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), Where, erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}; {and_where, Conditions} -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), begin _pipe = Conditions, _pipe@1 = lists:append(_pipe, [Where]), {and_where, _pipe@1} end, erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}; _ -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), begin _pipe@2 = [erlang:element(6, Delete), Where], {and_where, _pipe@2} end, erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)} end. -file("src/cake/delete.gleam", 606). ?DOC( " Sets an `OrWhere` or appends into an existing `OrWhere`.\n" "\n" " - If the outermost `Where` is an `OrWhere`, the new `Where` is appended\n" " to the list within `OrWhere`.\n" " - If the query does not have a `Where` clause, the given `Where` is set\n" " instead.\n" " - If the outermost `Where` is any other kind of `Where`, this and the\n" " current outermost `Where` are wrapped in an `OrWhere`.\n" ). -spec or_where( cake@internal@write_query:delete(ETP), cake@internal@read_query:where() ) -> cake@internal@write_query:delete(ETP). or_where(Delete, Where) -> case erlang:element(6, Delete) of no_where -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), Where, erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}; {or_where, Conditions} -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), begin _pipe = Conditions, _pipe@1 = lists:append(_pipe, [Where]), {or_where, _pipe@1} end, erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}; _ -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), begin _pipe@2 = [erlang:element(6, Delete), Where], {or_where, _pipe@2} end, erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)} end. -file("src/cake/delete.gleam", 631). ?DOC( " Sets an `XorWhere` or appends into an existing `XorWhere`.\n" "\n" " - If the outermost `Where` is an `XorWhere`, the new `Where` is appended\n" " to the list within `XorWhere`.\n" " - If the query does not have a `Where` clause, the given `Where` is set\n" " instead.\n" " - If the outermost `Where` is any other kind of `Where`, this and the\n" " current outermost `Where` are wrapped in an `XorWhere`.\n" "\n" " NOTICE: *Cake* implements this using a custom `OR / AND / NOT` expansion\n" " on all four adapters (🐘PostgreSQL, 🪶SQLite, 🦭MariaDB, 🐬MySQL) —\n" " native `XOR` is **not** used on any adapter.\n" "\n" " For odd-parity XOR (which on 🦭MariaDB / 🐬MySQL delegates to its native\n" " `XOR`) use `where.xor_parity` instead.\n" ). -spec xor_where( cake@internal@write_query:delete(ETS), cake@internal@read_query:where() ) -> cake@internal@write_query:delete(ETS). xor_where(Delete, Where) -> case erlang:element(6, Delete) of no_where -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), Where, erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}; {xor_where, Conditions} -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), begin _pipe = Conditions, _pipe@1 = lists:append(_pipe, [Where]), {xor_where, _pipe@1} end, erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}; _ -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), begin _pipe@2 = [erlang:element(6, Delete), Where], {xor_where, _pipe@2} end, erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)} end. -file("src/cake/delete.gleam", 651). ?DOC( " Sets a `NotWhere` or appends into an existing `AndWhere`.\n" "\n" " - Wraps the given `Where` in a `NotWhere`, then applies it with `AND`\n" " semantics:\n" " - If the query does not have a `Where` clause, the given `Where` is set\n" " as a `NotWhere`.\n" " - If the outermost `Where` is an `AndWhere`, the new `NotWhere` is appended\n" " to the list within `AndWhere`.\n" " - If the outermost `Where` is any other kind of `Where`, this and the\n" " current outermost `Where` are wrapped in an `AndWhere`.\n" ). -spec not_where( cake@internal@write_query:delete(ETV), cake@internal@read_query:where() ) -> cake@internal@write_query:delete(ETV). not_where(Delete, Where) -> case erlang:element(6, Delete) of no_where -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), {not_where, Where}, erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}; {and_where, Conditions} -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), begin _pipe = Conditions, _pipe@1 = lists:append(_pipe, [{not_where, Where}]), {and_where, _pipe@1} end, erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}; _ -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), begin _pipe@2 = [erlang:element(6, Delete), {not_where, Where}], {and_where, _pipe@2} end, erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)} end. -file("src/cake/delete.gleam", 671). ?DOC(" Replaces the `Where` in the `Delete` query.\n"). -spec replace_where( cake@internal@write_query:delete(ETY), cake@internal@read_query:where() ) -> cake@internal@write_query:delete(ETY). replace_where(Delete, Where) -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), Where, erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}. -file("src/cake/delete.gleam", 680). ?DOC(" Removes the `Where` from the `Delete` query.\n"). -spec no_where(cake@internal@write_query:delete(EUB)) -> cake@internal@write_query:delete(EUB). no_where(Delete) -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), no_where, erlang:element(7, Delete), erlang:element(8, Delete), erlang:element(9, Delete)}. -file("src/cake/delete.gleam", 686). ?DOC(" Gets the `Where` of the `Delete` query.\n"). -spec get_where(cake@internal@write_query:delete(any())) -> cake@internal@read_query:where(). get_where(Delete) -> erlang:element(6, Delete). -file("src/cake/delete.gleam", 694). ?DOC(" Specify the columns to return after the `Delete` query.\n"). -spec returning(cake@internal@write_query:delete(EUG), list(binary())) -> cake@internal@write_query:delete(EUG). returning(Delete, Returning) -> case Returning of [] -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), erlang:element(6, Delete), no_returning, erlang:element(8, Delete), erlang:element(9, Delete)}; _ -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), erlang:element(6, Delete), begin _pipe = Returning, {returning, _pipe} end, erlang:element(8, Delete), erlang:element(9, Delete)} end. -file("src/cake/delete.gleam", 706). ?DOC(" Specify that no columns should be returned after the `Delete` query.\n"). -spec no_returning(cake@internal@write_query:delete(EUK)) -> cake@internal@write_query:delete(EUK). no_returning(Delete) -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), erlang:element(6, Delete), no_returning, erlang:element(8, Delete), erlang:element(9, Delete)}. -file("src/cake/delete.gleam", 714). ?DOC(" Specify an epilog for the `Delete` query.\n"). -spec epilog(cake@internal@write_query:delete(EUN), binary()) -> cake@internal@write_query:delete(EUN). epilog(Delete, Epilog) -> Epilog@1 = begin _pipe = Epilog, gleam@string:trim(_pipe) end, case Epilog@1 of <<""/utf8>> -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), erlang:element(6, Delete), erlang:element(7, Delete), no_epilog, erlang:element(9, Delete)}; _ -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), erlang:element(6, Delete), erlang:element(7, Delete), begin _pipe@1 = (<<" "/utf8, Epilog@1/binary>>), {epilog, _pipe@1} end, erlang:element(9, Delete)} end. -file("src/cake/delete.gleam", 724). ?DOC(" Specify that no epilog should be added to the `Delete` query.\n"). -spec no_epilog(cake@internal@write_query:delete(EUQ)) -> cake@internal@write_query:delete(EUQ). no_epilog(Delete) -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), erlang:element(6, Delete), erlang:element(7, Delete), no_epilog, erlang:element(9, Delete)}. -file("src/cake/delete.gleam", 730). ?DOC(" Get the epilog from a `Delete` query.\n"). -spec get_epilog(cake@internal@write_query:delete(any())) -> cake@internal@read_query:epilog(). get_epilog(Delete) -> erlang:element(8, Delete). -file("src/cake/delete.gleam", 738). ?DOC(" Specify a comment for the `Delete` query.\n"). -spec comment(cake@internal@write_query:delete(EUV), binary()) -> cake@internal@write_query:delete(EUV). comment(Delete, Comment) -> Comment@1 = begin _pipe = Comment, gleam@string:trim(_pipe) end, case Comment@1 of <<""/utf8>> -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), no_comment}; _ -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), begin _pipe@1 = (<<" "/utf8, Comment@1/binary>>), {comment, _pipe@1} end} end. -file("src/cake/delete.gleam", 748). ?DOC(" Specify that no comment should be added to the `Delete` query.\n"). -spec no_comment(cake@internal@write_query:delete(EUY)) -> cake@internal@write_query:delete(EUY). no_comment(Delete) -> {delete, erlang:element(2, Delete), erlang:element(3, Delete), erlang:element(4, Delete), erlang:element(5, Delete), erlang:element(6, Delete), erlang:element(7, Delete), erlang:element(8, Delete), no_comment}. -file("src/cake/delete.gleam", 754). ?DOC(" Get the comment from a `Delete` query.\n"). -spec get_comment(cake@internal@write_query:delete(any())) -> cake@internal@read_query:comment(). get_comment(Delete) -> erlang:element(9, Delete).