Current section

Files

Jump to
cake src cake@select.erl
Raw

src/cake@select.erl

-module(cake@select).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([to_query/1, col/1, alias/2, bool/1, float/1, int/1, string/1, fragment/1, new/0, all/1, distinct/1, get_kind/2, from_table/2, from_sub_query/3, no_from/1, get_from/1, select/2, replace_select/2, selects/2, replace_selects/2, get_select/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, replace_where/2, no_where/1, get_where/1, having/2, or_having/2, xor_having/2, replace_having/2, no_having/1, get_having/1, group_by/2, replace_group_by/2, group_bys/2, replace_group_bys/2, no_group_by/1, get_group_by/1, limit/2, no_limit/1, get_limit/1, offset/2, no_offset/1, get_offset/1, order_by_asc/2, order_by_asc_nulls_first/2, order_by_asc_nulls_last/2, replace_order_by_asc/2, replace_order_by_asc_nulls_first/2, replace_order_by_asc_nulls_last/2, order_by_desc/2, order_by_desc_nulls_first/2, order_by_desc_nulls_last/2, replace_order_by_desc/2, replace_order_by_desc_nulls_first/2, replace_order_by_desc_nulls_last/2, order_by/3, replace_order_by/3, no_order_by/1, get_order_by/1, epilog/2, no_epilog/1, get_epilog/1, comment/2, no_comment/1, get_comment/1]).
-export_type([direction/0]).
-type direction() :: asc | desc.
-spec to_query(cake@internal@query:select()) -> cake@internal@query:'query'().
to_query(Qry) ->
_pipe = Qry,
{select_query, _pipe}.
-spec col(binary()) -> cake@internal@query:select_value().
col(Nm) ->
_pipe = Nm,
{select_column, _pipe}.
-spec alias(cake@internal@query:select_value(), binary()) -> cake@internal@query:select_value().
alias(Vl, Als) ->
_pipe = Vl,
{select_alias, _pipe, Als}.
-spec bool(boolean()) -> cake@internal@query:select_value().
bool(Vl) ->
_pipe = Vl,
_pipe@1 = cake@internal@param:bool(_pipe),
{select_param, _pipe@1}.
-spec float(float()) -> cake@internal@query:select_value().
float(Vl) ->
_pipe = Vl,
_pipe@1 = cake@internal@param:float(_pipe),
{select_param, _pipe@1}.
-spec int(integer()) -> cake@internal@query:select_value().
int(Vl) ->
_pipe = Vl,
_pipe@1 = cake@internal@param:int(_pipe),
{select_param, _pipe@1}.
-spec string(binary()) -> cake@internal@query:select_value().
string(Vl) ->
_pipe = Vl,
_pipe@1 = cake@internal@param:string(_pipe),
{select_param, _pipe@1}.
-spec fragment(cake@internal@query:fragment()) -> cake@internal@query:select_value().
fragment(Frgmt) ->
_pipe = Frgmt,
{select_fragment, _pipe}.
-spec new() -> cake@internal@query:select().
new() ->
{select,
select_all,
no_selects,
no_from,
no_joins,
no_where,
no_group_by,
no_where,
no_order_by,
no_limit,
no_offset,
no_epilog,
no_comment}.
-spec all(cake@internal@query:select()) -> cake@internal@query:select().
all(Qry) ->
erlang:setelement(2, Qry, select_all).
-spec distinct(cake@internal@query:select()) -> cake@internal@query:select().
distinct(Qry) ->
erlang:setelement(2, Qry, select_distinct).
-spec get_kind(cake@internal@query:select(), cake@internal@query:select_kind()) -> cake@internal@query:select().
get_kind(Qry, Knd) ->
erlang:setelement(2, Qry, Knd).
-spec from_table(cake@internal@query:select(), binary()) -> cake@internal@query:select().
from_table(Qry, Tbl_nm) ->
erlang:setelement(4, Qry, {from_table, Tbl_nm}).
-spec from_sub_query(
cake@internal@query:select(),
cake@internal@query:'query'(),
binary()
) -> cake@internal@query:select().
from_sub_query(Qry, Sb_qry, Als) ->
erlang:setelement(4, Qry, {from_sub_query, Sb_qry, Als}).
-spec no_from(cake@internal@query:select()) -> cake@internal@query:select().
no_from(Qry) ->
erlang:setelement(4, Qry, no_from).
-spec get_from(cake@internal@query:select()) -> cake@internal@query:from().
get_from(Qry) ->
erlang:element(4, Qry).
-spec select(cake@internal@query:select(), cake@internal@query:select_value()) -> cake@internal@query:select().
select(Qry, Sv) ->
case erlang:element(3, Qry) of
no_selects ->
erlang:setelement(3, Qry, {selects, [Sv]});
{selects, Qry_slcts} ->
erlang:setelement(
3,
Qry,
begin
_pipe = Qry_slcts,
_pipe@1 = lists:append(_pipe, [Sv]),
{selects, _pipe@1}
end
)
end.
-spec replace_select(
cake@internal@query:select(),
cake@internal@query:select_value()
) -> cake@internal@query:select().
replace_select(Qry, Sv) ->
case erlang:element(3, Qry) of
no_selects ->
erlang:setelement(3, Qry, {selects, [Sv]});
{selects, Qry_slcts} ->
erlang:setelement(
3,
Qry,
begin
_pipe = Qry_slcts,
_pipe@1 = lists:append(_pipe, [Sv]),
{selects, _pipe@1}
end
)
end.
-spec selects(
cake@internal@query:select(),
list(cake@internal@query:select_value())
) -> cake@internal@query:select().
selects(Qry, Svs) ->
case {Svs, erlang:element(3, Qry)} of
{[], _} ->
Qry;
{Svs@1, no_selects} ->
erlang:setelement(3, Qry, {selects, Svs@1});
{Svs@2, {selects, Qry_slcts}} ->
erlang:setelement(
3,
Qry,
begin
_pipe = Qry_slcts,
_pipe@1 = lists:append(_pipe, Svs@2),
{selects, _pipe@1}
end
)
end.
-spec replace_selects(
cake@internal@query:select(),
list(cake@internal@query:select_value())
) -> cake@internal@query:select().
replace_selects(Qry, Svs) ->
case {Svs, erlang:element(3, Qry)} of
{[], _} ->
Qry;
{Svs@1, no_selects} ->
erlang:setelement(3, Qry, {selects, Svs@1});
{Svs@2, {selects, Qry_slcts}} ->
erlang:setelement(
3,
Qry,
begin
_pipe = Qry_slcts,
_pipe@1 = lists:append(_pipe, Svs@2),
{selects, _pipe@1}
end
)
end.
-spec get_select(cake@internal@query:select()) -> cake@internal@query:selects().
get_select(Qry) ->
erlang:element(3, Qry).
-spec join(cake@internal@query:select(), cake@internal@query:join()) -> cake@internal@query:select().
join(Qry, Jn) ->
case erlang:element(5, Qry) of
{joins, Jns} ->
erlang:setelement(
5,
Qry,
begin
_pipe = Jns,
_pipe@1 = lists:append(_pipe, [Jn]),
{joins, _pipe@1}
end
);
no_joins ->
erlang:setelement(
5,
Qry,
begin
_pipe@2 = [Jn],
{joins, _pipe@2}
end
)
end.
-spec replace_join(cake@internal@query:select(), cake@internal@query:join()) -> cake@internal@query:select().
replace_join(Qry, Jn) ->
erlang:setelement(
5,
Qry,
begin
_pipe = [Jn],
{joins, _pipe}
end
).
-spec joins(cake@internal@query:select(), list(cake@internal@query:join())) -> cake@internal@query:select().
joins(Qry, Jns) ->
case {Jns, erlang:element(5, Qry)} of
{[], _} ->
erlang:setelement(5, Qry, {joins, Jns});
{Jns@1, {joins, Qry_joins}} ->
erlang:setelement(
5,
Qry,
begin
_pipe = Qry_joins,
_pipe@1 = lists:append(_pipe, Jns@1),
{joins, _pipe@1}
end
);
{Jns@2, no_joins} ->
erlang:setelement(
5,
Qry,
begin
_pipe@2 = Jns@2,
{joins, _pipe@2}
end
)
end.
-spec replace_joins(
cake@internal@query:select(),
list(cake@internal@query:join())
) -> cake@internal@query:select().
replace_joins(Qry, Jns) ->
erlang:setelement(
5,
Qry,
begin
_pipe = Jns,
{joins, _pipe}
end
).
-spec no_join(cake@internal@query:select()) -> cake@internal@query:select().
no_join(Qry) ->
erlang:setelement(5, Qry, no_joins).
-spec get_joins(cake@internal@query:select()) -> cake@internal@query:joins().
get_joins(Qry) ->
erlang:element(5, Qry).
-spec where(cake@internal@query:select(), cake@internal@query:where()) -> cake@internal@query:select().
where(Qry, Whr) ->
case erlang:element(6, Qry) of
no_where ->
erlang:setelement(6, Qry, Whr);
{and_where, Wheres} ->
erlang:setelement(
6,
Qry,
{and_where,
begin
_pipe = Wheres,
lists:append(_pipe, [Whr])
end}
);
_ ->
erlang:setelement(
6,
Qry,
{and_where, [erlang:element(6, Qry), Whr]}
)
end.
-spec or_where(cake@internal@query:select(), cake@internal@query:where()) -> cake@internal@query:select().
or_where(Qry, Whr) ->
case erlang:element(6, Qry) of
no_where ->
erlang:setelement(6, Qry, Whr);
{or_where, Wheres} ->
erlang:setelement(
6,
Qry,
{or_where,
begin
_pipe = Wheres,
lists:append(_pipe, [Whr])
end}
);
_ ->
erlang:setelement(6, Qry, {or_where, [erlang:element(6, Qry), Whr]})
end.
-spec xor_where(cake@internal@query:select(), cake@internal@query:where()) -> cake@internal@query:select().
xor_where(Qry, Whr) ->
case erlang:element(6, Qry) of
no_where ->
erlang:setelement(6, Qry, Whr);
{xor_where, Wheres} ->
erlang:setelement(
6,
Qry,
{xor_where,
begin
_pipe = Wheres,
lists:append(_pipe, [Whr])
end}
);
_ ->
erlang:setelement(
6,
Qry,
{xor_where, [erlang:element(6, Qry), Whr]}
)
end.
-spec replace_where(cake@internal@query:select(), cake@internal@query:where()) -> cake@internal@query:select().
replace_where(Qry, Whr) ->
erlang:setelement(6, Qry, Whr).
-spec no_where(cake@internal@query:select()) -> cake@internal@query:select().
no_where(Qry) ->
erlang:setelement(6, Qry, no_where).
-spec get_where(cake@internal@query:select()) -> cake@internal@query:where().
get_where(Qry) ->
erlang:element(6, Qry).
-spec having(cake@internal@query:select(), cake@internal@query:where()) -> cake@internal@query:select().
having(Qry, Whr) ->
case erlang:element(8, Qry) of
no_where ->
erlang:setelement(8, Qry, Whr);
{and_where, Wheres} ->
erlang:setelement(
8,
Qry,
{and_where,
begin
_pipe = Wheres,
lists:append(_pipe, [Whr])
end}
);
_ ->
erlang:setelement(
8,
Qry,
{and_where, [erlang:element(8, Qry), Whr]}
)
end.
-spec or_having(cake@internal@query:select(), cake@internal@query:where()) -> cake@internal@query:select().
or_having(Qry, Whr) ->
case erlang:element(8, Qry) of
no_where ->
erlang:setelement(8, Qry, Whr);
{or_where, Wheres} ->
erlang:setelement(
8,
Qry,
{or_where,
begin
_pipe = Wheres,
lists:append(_pipe, [Whr])
end}
);
_ ->
erlang:setelement(8, Qry, {or_where, [erlang:element(8, Qry), Whr]})
end.
-spec xor_having(cake@internal@query:select(), cake@internal@query:where()) -> cake@internal@query:select().
xor_having(Qry, Whr) ->
case erlang:element(8, Qry) of
no_where ->
erlang:setelement(8, Qry, Whr);
{xor_where, Wheres} ->
erlang:setelement(
8,
Qry,
{xor_where,
begin
_pipe = Wheres,
lists:append(_pipe, [Whr])
end}
);
_ ->
erlang:setelement(
8,
Qry,
{xor_where, [erlang:element(8, Qry), Whr]}
)
end.
-spec replace_having(cake@internal@query:select(), cake@internal@query:where()) -> cake@internal@query:select().
replace_having(Qry, Whr) ->
erlang:setelement(8, Qry, Whr).
-spec no_having(cake@internal@query:select()) -> cake@internal@query:select().
no_having(Qry) ->
erlang:setelement(8, Qry, no_where).
-spec get_having(cake@internal@query:select()) -> cake@internal@query:where().
get_having(Qry) ->
erlang:element(8, Qry).
-spec group_by(cake@internal@query:select(), binary()) -> cake@internal@query:select().
group_by(Qry, Grpb) ->
case erlang:element(7, Qry) of
no_group_by ->
erlang:setelement(7, Qry, {group_by, [Grpb]});
{group_by, Grpbs} ->
erlang:setelement(
7,
Qry,
{group_by,
begin
_pipe = Grpbs,
lists:append(_pipe, [Grpb])
end}
)
end.
-spec replace_group_by(cake@internal@query:select(), binary()) -> cake@internal@query:select().
replace_group_by(Qry, Grpb) ->
erlang:setelement(7, Qry, {group_by, [Grpb]}).
-spec group_bys(cake@internal@query:select(), list(binary())) -> cake@internal@query:select().
group_bys(Qry, Grpbs) ->
case erlang:element(7, Qry) of
no_group_by ->
erlang:setelement(7, Qry, {group_by, Grpbs});
{group_by, Grpbs@1} ->
erlang:setelement(
7,
Qry,
{group_by,
begin
_pipe = Grpbs@1,
lists:append(_pipe, Grpbs@1)
end}
)
end.
-spec replace_group_bys(cake@internal@query:select(), list(binary())) -> cake@internal@query:select().
replace_group_bys(Qry, Grpbs) ->
erlang:setelement(7, Qry, {group_by, Grpbs}).
-spec no_group_by(cake@internal@query:select()) -> cake@internal@query:select().
no_group_by(Qry) ->
erlang:setelement(7, Qry, no_group_by).
-spec get_group_by(cake@internal@query:select()) -> cake@internal@query:group_by().
get_group_by(Qry) ->
erlang:element(7, Qry).
-spec limit(cake@internal@query:select(), integer()) -> cake@internal@query:select().
limit(Qry, Lmt) ->
Lmt@1 = begin
_pipe = Lmt,
cake@internal@query:limit_new(_pipe)
end,
erlang:setelement(10, Qry, Lmt@1).
-spec no_limit(cake@internal@query:select()) -> cake@internal@query:select().
no_limit(Qry) ->
erlang:setelement(10, Qry, no_limit).
-spec get_limit(cake@internal@query:select()) -> cake@internal@query:limit().
get_limit(Qry) ->
erlang:element(10, Qry).
-spec offset(cake@internal@query:select(), integer()) -> cake@internal@query:select().
offset(Qry, Offst) ->
Offst@1 = begin
_pipe = Offst,
cake@internal@query:offset_new(_pipe)
end,
erlang:setelement(11, Qry, Offst@1).
-spec no_offset(cake@internal@query:select()) -> cake@internal@query:select().
no_offset(Qry) ->
erlang:setelement(11, Qry, no_offset).
-spec get_offset(cake@internal@query:select()) -> cake@internal@query:offset().
get_offset(Qry) ->
erlang:element(11, Qry).
-spec map_order_by_direction_constructor(direction()) -> cake@internal@query:order_by_direction().
map_order_by_direction_constructor(In) ->
case In of
asc ->
asc;
desc ->
desc
end.
-spec order_by_asc(cake@internal@query:select(), binary()) -> cake@internal@query:select().
order_by_asc(Qry, Ordb) ->
_pipe = Qry,
cake@internal@query:select_order_by(
_pipe,
{order_by, [{order_by_column, Ordb, asc}]},
true
).
-spec order_by_asc_nulls_first(cake@internal@query:select(), binary()) -> cake@internal@query:select().
order_by_asc_nulls_first(Qry, Ordb) ->
_pipe = Qry,
cake@internal@query:select_order_by(
_pipe,
{order_by, [{order_by_column, Ordb, asc_nulls_first}]},
true
).
-spec order_by_asc_nulls_last(cake@internal@query:select(), binary()) -> cake@internal@query:select().
order_by_asc_nulls_last(Qry, Ordb) ->
_pipe = Qry,
cake@internal@query:select_order_by(
_pipe,
{order_by, [{order_by_column, Ordb, asc_nulls_first}]},
true
).
-spec replace_order_by_asc(cake@internal@query:select(), binary()) -> cake@internal@query:select().
replace_order_by_asc(Qry, Ordb) ->
_pipe = Qry,
cake@internal@query:select_order_by(
_pipe,
{order_by, [{order_by_column, Ordb, asc}]},
false
).
-spec replace_order_by_asc_nulls_first(cake@internal@query:select(), binary()) -> cake@internal@query:select().
replace_order_by_asc_nulls_first(Qry, Ordb) ->
_pipe = Qry,
cake@internal@query:select_order_by(
_pipe,
{order_by, [{order_by_column, Ordb, asc_nulls_first}]},
false
).
-spec replace_order_by_asc_nulls_last(cake@internal@query:select(), binary()) -> cake@internal@query:select().
replace_order_by_asc_nulls_last(Qry, Ordb) ->
_pipe = Qry,
cake@internal@query:select_order_by(
_pipe,
{order_by, [{order_by_column, Ordb, asc_nulls_first}]},
false
).
-spec order_by_desc(cake@internal@query:select(), binary()) -> cake@internal@query:select().
order_by_desc(Qry, Ordb) ->
_pipe = Qry,
cake@internal@query:select_order_by(
_pipe,
{order_by, [{order_by_column, Ordb, desc}]},
true
).
-spec order_by_desc_nulls_first(cake@internal@query:select(), binary()) -> cake@internal@query:select().
order_by_desc_nulls_first(Qry, Ordb) ->
_pipe = Qry,
cake@internal@query:select_order_by(
_pipe,
{order_by, [{order_by_column, Ordb, desc_nulls_first}]},
true
).
-spec order_by_desc_nulls_last(cake@internal@query:select(), binary()) -> cake@internal@query:select().
order_by_desc_nulls_last(Qry, Ordb) ->
_pipe = Qry,
cake@internal@query:select_order_by(
_pipe,
{order_by, [{order_by_column, Ordb, desc_nulls_first}]},
true
).
-spec replace_order_by_desc(cake@internal@query:select(), binary()) -> cake@internal@query:select().
replace_order_by_desc(Qry, Ordb) ->
_pipe = Qry,
cake@internal@query:select_order_by(
_pipe,
{order_by, [{order_by_column, Ordb, desc}]},
false
).
-spec replace_order_by_desc_nulls_first(cake@internal@query:select(), binary()) -> cake@internal@query:select().
replace_order_by_desc_nulls_first(Qry, Ordb) ->
_pipe = Qry,
cake@internal@query:select_order_by(
_pipe,
{order_by, [{order_by_column, Ordb, desc_nulls_first}]},
false
).
-spec replace_order_by_desc_nulls_last(cake@internal@query:select(), binary()) -> cake@internal@query:select().
replace_order_by_desc_nulls_last(Qry, Ordb) ->
_pipe = Qry,
cake@internal@query:select_order_by(
_pipe,
{order_by, [{order_by_column, Ordb, desc_nulls_first}]},
false
).
-spec order_by(cake@internal@query:select(), binary(), direction()) -> cake@internal@query:select().
order_by(Qry, Ordb, Dir) ->
Dir@1 = begin
_pipe = Dir,
map_order_by_direction_constructor(_pipe)
end,
_pipe@1 = Qry,
cake@internal@query:select_order_by(
_pipe@1,
{order_by, [{order_by_column, Ordb, Dir@1}]},
true
).
-spec replace_order_by(cake@internal@query:select(), binary(), direction()) -> cake@internal@query:select().
replace_order_by(Qry, Ordb, Dir) ->
Dir@1 = begin
_pipe = Dir,
map_order_by_direction_constructor(_pipe)
end,
_pipe@1 = Qry,
cake@internal@query:select_order_by(
_pipe@1,
{order_by, [{order_by_column, Ordb, Dir@1}]},
false
).
-spec no_order_by(cake@internal@query:select()) -> cake@internal@query:select().
no_order_by(Qry) ->
erlang:setelement(9, Qry, no_order_by).
-spec get_order_by(cake@internal@query:select()) -> cake@internal@query:order_by().
get_order_by(Qry) ->
erlang:element(9, Qry).
-spec epilog(cake@internal@query:select(), binary()) -> cake@internal@query:select().
epilog(Qry, Eplg) ->
Eplg@1 = begin
_pipe = Eplg,
gleam@string:trim(_pipe)
end,
case Eplg@1 of
<<""/utf8>> ->
erlang:setelement(12, Qry, no_epilog);
_ ->
erlang:setelement(
12,
Qry,
begin
_pipe@1 = (<<" "/utf8, Eplg@1/binary>>),
{epilog, _pipe@1}
end
)
end.
-spec no_epilog(cake@internal@query:select()) -> cake@internal@query:select().
no_epilog(Qry) ->
erlang:setelement(12, Qry, no_epilog).
-spec get_epilog(cake@internal@query:select()) -> cake@internal@query:epilog().
get_epilog(Qry) ->
erlang:element(12, Qry).
-spec comment(cake@internal@query:select(), binary()) -> cake@internal@query:select().
comment(Qry, Cmmnt) ->
Cmmnt@1 = begin
_pipe = Cmmnt,
gleam@string:trim(_pipe)
end,
case Cmmnt@1 of
<<""/utf8>> ->
erlang:setelement(13, Qry, no_comment);
_ ->
erlang:setelement(
13,
Qry,
begin
_pipe@1 = (<<" "/utf8, Cmmnt@1/binary>>),
{comment, _pipe@1}
end
)
end.
-spec no_comment(cake@internal@query:select()) -> cake@internal@query:select().
no_comment(Qry) ->
erlang:setelement(13, Qry, no_comment).
-spec get_comment(cake@internal@query:select()) -> cake@internal@query:comment().
get_comment(Qry) ->
erlang:element(13, Qry).