Packages
cake
0.1.0
4.1.0
4.0.0
3.0.0
2.2.2
2.2.1
2.2.0
2.1.3
2.1.2
2.1.1
2.1.0
2.0.2
2.0.1
2.0.0
1.1.2
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-rc.0
retired
0.15.0
retired
0.14.0
retired
0.13.0
retired
0.12.0
retired
0.11.0
retired
0.10.1
retired
0.10.0
retired
0.9.2
retired
0.9.1
retired
0.9.0
retired
0.8.0
retired
0.7.0
retired
0.6.0
retired
0.5.0
retired
0.4.0
retired
0.3.0
retired
0.2.0
retired
0.1.0
retired
0.0.1
retired
🎂 An SQL query builder for Gleam for SQL dialects 🐘PostgreSQL, 🪶SQLite, 🦭MariaDB, and 🐬MySQL
Retired package: Deprecated - a stable release is available, please use >= 1.0.0
Current section
Files
Jump to
Current section
Files
src/cake.gleam
import cake/adapter/postgres_adapter
import cake/adapter/sqlite_adapter
import cake/internal/query as q
import cake/param as p
import cake/query/combined as c
import cake/query/fragment as frgmt
import cake/query/from as f
import cake/query/join as j
import cake/query/select as s
import cake/query/where as w
import cake/stdlib/iox
import gleam/dynamic
import gleam/erlang/process
// import cake/query/having as h
// import cake/query/limit as l
// import cake/query/order as o
// import cake/query/window as win
// import cake/query/with as with
pub fn main() {
process.sleep(100)
let _ = run_dummy_fragment()
process.sleep(100)
let _ = run_dummy_select()
process.sleep(100)
let _ = run_dummy_union_all()
process.sleep(100)
Nil
}
pub fn run_dummy_fragment() {
iox.print_dashes()
let cats_query =
f.table(name: "cats")
|> s.new_from()
let select_query =
cats_query
|> s.where(
w.col("name")
|> w.eq(
w.fragment(
frgmt.prepared(
"LOWER("
<> frgmt.placeholder
<> ") OR name = LOWER("
<> frgmt.placeholder
<> ")",
[p.string("Timmy"), p.string("Jimmy")],
),
),
)
|> iox.dbg,
)
|> s.to_query
process.sleep(100)
let query_decoder =
dynamic.tuple3(dynamic.string, dynamic.int, dynamic.string)
iox.println("SQLite")
let _ =
run_on_sqlite(select_query, query_decoder)
|> iox.print_tap("Result: ")
|> iox.dbg
process.sleep(100)
iox.println("Postgres")
let _ =
run_on_postgres(select_query, query_decoder)
|> iox.print_tap("Result: ")
|> iox.dbg
}
pub fn run_dummy_select() {
iox.print_dashes()
let cats_sub_query =
f.table(name: "cats")
|> s.new_from()
let dogs_sub_query =
f.table(name: "dogs")
|> s.new_from()
let cats_t = q.qualified_identifier("cats")
let owners_t = q.qualified_identifier("owners")
let where =
w.or([
w.col(cats_t("age")) |> w.eq(w.int(10)),
w.col(cats_t("name")) |> w.eq(w.string("foo")),
w.col(cats_t("name")) |> w.eq(w.string("foo")),
w.col(cats_t("age")) |> w.in([w.int(1), w.int(2)]),
])
let select_query =
cats_sub_query
|> s.to_query
|> f.sub_query(alias: "cats")
|> s.new_from
|> s.select([
s.col(cats_t("name")),
s.col(cats_t("age")),
s.col(owners_t("name")) |> s.alias("owner_name"),
])
|> s.where(where)
|> s.order_asc(cats_t("name"))
|> s.order_replace(by: cats_t("age"), direction: s.Asc)
|> s.set_limit(1)
|> s.set_limit_and_offset(1, 0)
|> s.joins([
j.inner(
with: j.table("owners"),
alias: "owners",
on: w.or([
w.col(owners_t("id")) |> w.eq(w.col(cats_t("owner_id"))),
w.col(owners_t("id")) |> w.lt(w.int(20)),
w.col(owners_t("id")) |> w.is_not_null(),
]),
),
j.cross(with: j.sub_query(s.to_query(dogs_sub_query)), alias: "dogs"),
])
|> s.to_query
|> iox.dbg
process.sleep(100)
let query_decoder =
dynamic.tuple3(dynamic.string, dynamic.int, dynamic.string)
iox.println("SQLite")
let _ =
run_on_sqlite(select_query, query_decoder)
|> iox.print_tap("Result: ")
|> iox.dbg
process.sleep(100)
iox.println("Postgres")
let _ =
run_on_postgres(select_query, query_decoder)
|> iox.print_tap("Result: ")
|> iox.dbg
process.sleep(100)
}
pub fn run_dummy_union_all() {
iox.print_dashes()
let select_query =
f.table(name: "cats")
|> s.new_from()
|> s.select([s.col("name"), s.col("age")])
let select_query_a =
select_query
|> s.where(
w.or([
w.col("age") |> w.lte(w.int(4)),
w.col("name") |> w.like(pattern: "%ara%"),
// w.similar("name", to: "%(y|a)%"), // NOTICE: SIMILAR TO does not run on Sqlite
]),
)
let where_b = w.not(w.col("is_wild") |> w.is_not_bool(False))
let select_query_b =
select_query
|> s.where(w.col("age") |> w.gte(w.int(7)))
|> s.order_asc(by: "will_be_removed")
|> s.where(where_b)
let union_query =
[select_query_a, select_query_b]
|> c.union_all()
|> c.set_limit(1)
|> c.order_replace(by: "age", direction: c.Asc)
|> c.to_query
|> iox.dbg
let query_decoder = dynamic.tuple2(dynamic.string, dynamic.int)
process.sleep(100)
iox.println("SQLite")
let _ =
run_on_sqlite(union_query, query_decoder)
|> iox.print_tap("Result: ")
|> iox.dbg
process.sleep(100)
iox.println("Postgres")
let _ =
run_on_postgres(union_query, query_decoder)
|> iox.print_tap("Result: ")
|> iox.dbg
process.sleep(100)
}
pub fn run_on_postgres(query, query_decoder) {
use conn <- postgres_adapter.with_connection()
let _ = drop_owners_table_if_exists() |> postgres_adapter.execute(conn)
let _ = create_owners_table() |> postgres_adapter.execute(conn)
let _ = insert_owners_rows() |> postgres_adapter.execute(conn)
let _ = drop_cats_table_if_exists() |> postgres_adapter.execute(conn)
let _ = create_cats_table() |> postgres_adapter.execute(conn)
let _ = insert_cats_rows() |> postgres_adapter.execute(conn)
let _ = drop_dogs_table_if_exists() |> postgres_adapter.execute(conn)
let _ = create_dogs_table() |> postgres_adapter.execute(conn)
let _ = insert_dogs_rows() |> postgres_adapter.execute(conn)
postgres_adapter.run_query(conn, query, query_decoder)
}
fn run_on_sqlite(query, query_decoder) {
use conn <- sqlite_adapter.with_memory_connection()
let _ = drop_owners_table_if_exists() |> sqlite_adapter.execute(conn)
let _ = create_owners_table() |> sqlite_adapter.execute(conn)
let _ = insert_owners_rows() |> sqlite_adapter.execute(conn)
let _ = drop_cats_table_if_exists() |> sqlite_adapter.execute(conn)
let _ = create_cats_table() |> sqlite_adapter.execute(conn)
let _ = insert_cats_rows() |> sqlite_adapter.execute(conn)
let _ = drop_dogs_table_if_exists() |> sqlite_adapter.execute(conn)
let _ = create_dogs_table() |> sqlite_adapter.execute(conn)
let _ = insert_dogs_rows() |> sqlite_adapter.execute(conn)
sqlite_adapter.run_query(conn, query, query_decoder)
}
fn drop_owners_table_if_exists() {
"DROP TABLE IF EXISTS owners;"
}
fn create_owners_table() {
"CREATE TABLE owners (
id int,
name text,
last_name text,
age int,
tags text[]
);"
}
fn insert_owners_rows() {
"INSERT INTO owners (id, name, last_name, age) VALUES
(1, 'Alice', 'Foo', 5),
(2, 'bob', 'BOB', 8),
(3, 'Charlie', 'Quux', 13)
;"
}
fn drop_cats_table_if_exists() {
"DROP TABLE IF EXISTS cats;"
}
fn create_cats_table() {
"CREATE TABLE cats (
name text,
age int,
is_wild boolean,
owner_id int
);"
}
fn insert_cats_rows() {
"INSERT INTO cats (name, age, is_wild, owner_id) VALUES
('Nubi', 4, TRUE, 1),
('Biffy', 10, NULL, 2),
('Ginny', 6, FALSE, 3),
('Karl', 8, TRUE, NULL),
('Clara', 3, TRUE, NULL)
;"
}
fn drop_dogs_table_if_exists() {
"DROP TABLE IF EXISTS dogs;"
}
fn create_dogs_table() {
"CREATE TABLE dogs (
name text,
age int,
is_trained boolean,
owner_id int
);"
}
fn insert_dogs_rows() {
"INSERT INTO dogs (name, age, is_trained, owner_id) VALUES
('Fubi', 1, TRUE, 1),
('Diffy', 2, NULL, 2),
('Tinny', 3, FALSE, 3),
('Karl', 4, TRUE, NULL),
('Clara', 5, TRUE, NULL)
;"
}
@external(erlang, "cake_ffi", "stacky")
pub fn stacky() -> a