Current section

Files

Jump to
cake src cake.gleam
Raw

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