Packages

SQL query builder core for Gleam

Current section

Files

Jump to
galchemy src galchemy@examples@orm_declarative.erl
Raw

src/galchemy@examples@orm_declarative.erl

-module(galchemy@examples@orm_declarative).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src\\galchemy\\examples\\orm_declarative.gleam").
-export([main/0]).
-file("src\\galchemy\\examples\\orm_declarative.gleam", 78).
-spec users_model() -> galchemy@orm@declarative:model().
users_model() ->
galchemy@orm@declarative:model_(
<<"public"/utf8>>,
<<"users"/utf8>>,
[begin
_pipe = galchemy@orm@declarative:int(<<"id"/utf8>>),
galchemy@orm@declarative:primary_key(_pipe)
end,
galchemy@orm@declarative:text(<<"name"/utf8>>),
begin
_pipe@1 = galchemy@orm@declarative:text(<<"email"/utf8>>),
galchemy@orm@declarative:unique(_pipe@1)
end],
[galchemy@orm@declarative:has_many(
<<"posts"/utf8>>,
<<"posts_user_id_fkey"/utf8>>,
<<"public"/utf8>>,
<<"posts"/utf8>>,
[galchemy@orm@declarative:pair(
<<"id"/utf8>>,
<<"user_id"/utf8>>
)]
)]
).
-file("src\\galchemy\\examples\\orm_declarative.gleam", 95).
-spec posts_model() -> galchemy@orm@declarative:model().
posts_model() ->
galchemy@orm@declarative:model_(
<<"public"/utf8>>,
<<"posts"/utf8>>,
[begin
_pipe = galchemy@orm@declarative:int(<<"id"/utf8>>),
galchemy@orm@declarative:primary_key(_pipe)
end,
galchemy@orm@declarative:int(<<"user_id"/utf8>>),
galchemy@orm@declarative:text(<<"title"/utf8>>),
galchemy@orm@declarative:bool(<<"published"/utf8>>)],
[galchemy@orm@declarative:belongs_to(
<<"user"/utf8>>,
<<"posts_user_id_fkey"/utf8>>,
<<"public"/utf8>>,
<<"users"/utf8>>,
[galchemy@orm@declarative:pair(
<<"user_id"/utf8>>,
<<"id"/utf8>>
)]
)]
).
-file("src\\galchemy\\examples\\orm_declarative.gleam", 113).
-spec unwrap({ok, MXZ} | {error, any()}) -> MXZ.
unwrap(Value) ->
case Value of
{ok, Inner} ->
Inner;
{error, Error} ->
erlang:error(#{gleam_error => panic,
message => gleam@string:inspect(Error),
file => <<?FILEPATH/utf8>>,
module => <<"galchemy/examples/orm_declarative"/utf8>>,
function => <<"unwrap"/utf8>>,
line => 116})
end.
-file("src\\galchemy\\examples\\orm_declarative.gleam", 15).
-spec main() -> nil.
main() ->
Users = users_model(),
Posts = posts_model(),
Snapshot = unwrap(galchemy@orm@declarative:to_snapshot([Users, Posts])),
Registry = unwrap(galchemy@orm@runtime_registry:from_models([Users, Posts])),
Users_ref = begin
_pipe = unwrap(galchemy@orm@query:from_model(Users)),
galchemy@orm@query:as_(_pipe, <<"u"/utf8>>)
end,
Posts_ref = begin
_pipe@1 = unwrap(galchemy@orm@query:from_model(Posts)),
galchemy@orm@query:as_(_pipe@1, <<"p"/utf8>>)
end,
Base_query = unwrap(
galchemy@orm@query:select_fields(
Users_ref,
[galchemy@orm@query:field_as(<<"id"/utf8>>, <<"user_id"/utf8>>),
galchemy@orm@query:field_as(
<<"name"/utf8>>,
<<"user_name"/utf8>>
),
galchemy@orm@query:field_as(<<"email"/utf8>>, <<"email"/utf8>>)]
)
),
Joined_query = unwrap(
galchemy@orm@query:left_join_relation(
Base_query,
Users_ref,
<<"posts"/utf8>>,
Posts_ref
)
),
Name_filter = unwrap(
galchemy@orm@query:ilike(
Users_ref,
<<"name"/utf8>>,
galchemy@dsl@expr:text(<<"A%"/utf8>>)
)
),
Order_by_id = unwrap(galchemy@orm@query:asc(Users_ref, <<"id"/utf8>>)),
Final_query = begin
_pipe@2 = Joined_query,
_pipe@3 = galchemy@orm@query:where_(_pipe@2, Name_filter),
_pipe@4 = galchemy@orm@query:order_by(_pipe@3, Order_by_id),
galchemy@orm@query:limit(_pipe@4, 20)
end,
Mapper = galchemy@orm@result:tuple2(
galchemy@orm@result:scalar_as(
<<"user_id"/utf8>>,
galchemy@orm@codec:int()
),
galchemy@orm@result:scalar_as(
<<"user_name"/utf8>>,
galchemy@orm@codec:text()
)
),
Sample_row = galchemy@orm@result:row(
[galchemy@orm@result:scalar(<<"user_id"/utf8>>, {int, 1}),
galchemy@orm@result:scalar(
<<"user_name"/utf8>>,
{text, <<"Ann"/utf8>>}
)],
[]
),
{Mapped_row, _} = unwrap(
galchemy@orm@result:one(
Mapper,
Sample_row,
galchemy@orm@materializer:new(galchemy@orm@mapper_registry:empty())
)
),
gleam_stdlib:println(<<"ORM declarative example"/utf8>>),
gleam_stdlib:println(<<"Schema snapshot:"/utf8>>),
gleam_stdlib:println(gleam@string:inspect(Snapshot)),
gleam_stdlib:println(<<"Runtime registry models:"/utf8>>),
gleam_stdlib:println(
gleam@string:inspect(galchemy@orm@runtime_registry:all(Registry))
),
gleam_stdlib:println(<<"Compiled model-first query:"/utf8>>),
gleam_stdlib:println(
gleam@string:inspect(galchemy:compile({select, Final_query}))
),
gleam_stdlib:println(<<"Mapped scalar row:"/utf8>>),
gleam_stdlib:println(gleam@string:inspect(Mapped_row)).