-module(cake@query@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, new_from/1, all/1, distinct/1, get_kind/2, from/2, get_from/1, selects/2, selects_replace/2, get_select/1, join/2, join_replace/2, joins/2, joins_replace/2, no_joins/1, get_joins/1, where/2, or_where/2, xor_where/2, where_replace/2, get_where/1, having/2, or_having/2, xor_having/2, having_replace/2, get_having/1, group_by/2, group_by_replace/2, groups_by/2, group_bys_replace/2, limit/2, get_limit/1, offset/2, get_offset/1, order_asc/2, order_asc_nulls_first/2, order_asc_replace/2, order_asc_nulls_first_replace/2, order_desc/2, order_desc_nulls_first/2, order_desc_replace/2, order_desc_nulls_first_replace/2, order/3, order_replace/3, 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@param:bool(_pipe), {select_param, _pipe@1}. -spec float(float()) -> cake@internal@query:select_value(). float(Vl) -> _pipe = Vl, _pipe@1 = cake@param:float(_pipe), {select_param, _pipe@1}. -spec int(integer()) -> cake@internal@query:select_value(). int(Vl) -> _pipe = Vl, _pipe@1 = cake@param:int(_pipe), {select_param, _pipe@1}. -spec string(binary()) -> cake@internal@query:select_value(). string(Vl) -> _pipe = Vl, _pipe@1 = cake@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 new_from(cake@internal@query:from()) -> cake@internal@query:select(). new_from(Frm) -> {select, select_all, no_selects, Frm, 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(cake@internal@query:select(), cake@internal@query:from()) -> cake@internal@query:select(). from(Qry, Frm) -> erlang:setelement(4, Qry, Frm). -spec get_from(cake@internal@query:select()) -> cake@internal@query:from(). get_from(Qry) -> erlang:element(4, Qry). -spec selects( cake@internal@query:select(), list(cake@internal@query:select_value()) ) -> cake@internal@query:select(). selects(Qry, Sv) -> case {Sv, erlang:element(3, Qry)} of {[], _} -> Qry; {Sv@1, no_selects} -> erlang:setelement(3, Qry, {selects, Sv@1}); {Sv@2, {selects, Qry_slcts}} -> erlang:setelement( 3, Qry, begin _pipe = Qry_slcts, _pipe@1 = lists:append(_pipe, Sv@2), {selects, _pipe@1} end ) end. -spec selects_replace( cake@internal@query:select(), list(cake@internal@query:select_value()) ) -> cake@internal@query:select(). selects_replace(Qry, Sv) -> case {Sv, erlang:element(3, Qry)} of {[], _} -> Qry; {Sv@1, no_selects} -> erlang:setelement(3, Qry, {selects, Sv@1}); {Sv@2, {selects, Qry_slcts}} -> erlang:setelement( 3, Qry, begin _pipe = Qry_slcts, _pipe@1 = lists:append(_pipe, Sv@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 join_replace(cake@internal@query:select(), cake@internal@query:join()) -> cake@internal@query:select(). join_replace(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 joins_replace( cake@internal@query:select(), list(cake@internal@query:join()) ) -> cake@internal@query:select(). joins_replace(Qry, Jns) -> erlang:setelement( 5, Qry, begin _pipe = Jns, {joins, _pipe} end ). -spec no_joins(cake@internal@query:select()) -> cake@internal@query:select(). no_joins(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) -> New_where = {xor_where, [erlang:element(6, Qry), Whr]}, erlang:setelement(6, Qry, New_where). -spec where_replace(cake@internal@query:select(), cake@internal@query:where()) -> cake@internal@query:select(). where_replace(Qry, Whr) -> erlang:setelement(6, Qry, Whr). -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) -> New_where = {xor_where, [erlang:element(8, Qry), Whr]}, erlang:setelement(8, Qry, New_where). -spec having_replace(cake@internal@query:select(), cake@internal@query:where()) -> cake@internal@query:select(). having_replace(Qry, Whr) -> erlang:setelement(8, Qry, Whr). -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 group_by_replace(cake@internal@query:select(), binary()) -> cake@internal@query:select(). group_by_replace(Qry, Grpb) -> erlang:setelement(7, Qry, {group_by, [Grpb]}). -spec groups_by(cake@internal@query:select(), list(binary())) -> cake@internal@query:select(). groups_by(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 group_bys_replace(cake@internal@query:select(), list(binary())) -> cake@internal@query:select(). group_bys_replace(Qry, Grpbs) -> erlang:setelement(7, Qry, {group_by, Grpbs}). -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 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 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_asc(cake@internal@query:select(), binary()) -> cake@internal@query:select(). order_asc(Qry, Ordb) -> _pipe = Qry, cake@internal@query:select_order_by( _pipe, {order_by, [{order_by_column, Ordb, asc}]}, true ). -spec order_asc_nulls_first(cake@internal@query:select(), binary()) -> cake@internal@query:select(). order_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_asc_replace(cake@internal@query:select(), binary()) -> cake@internal@query:select(). order_asc_replace(Qry, Ordb) -> _pipe = Qry, cake@internal@query:select_order_by( _pipe, {order_by, [{order_by_column, Ordb, asc}]}, false ). -spec order_asc_nulls_first_replace(cake@internal@query:select(), binary()) -> cake@internal@query:select(). order_asc_nulls_first_replace(Qry, Ordb) -> _pipe = Qry, cake@internal@query:select_order_by( _pipe, {order_by, [{order_by_column, Ordb, asc_nulls_first}]}, false ). -spec order_desc(cake@internal@query:select(), binary()) -> cake@internal@query:select(). order_desc(Qry, Ordb) -> _pipe = Qry, cake@internal@query:select_order_by( _pipe, {order_by, [{order_by_column, Ordb, desc}]}, true ). -spec order_desc_nulls_first(cake@internal@query:select(), binary()) -> cake@internal@query:select(). order_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_desc_replace(cake@internal@query:select(), binary()) -> cake@internal@query:select(). order_desc_replace(Qry, Ordb) -> _pipe = Qry, cake@internal@query:select_order_by( _pipe, {order_by, [{order_by_column, Ordb, desc}]}, false ). -spec order_desc_nulls_first_replace(cake@internal@query:select(), binary()) -> cake@internal@query:select(). order_desc_nulls_first_replace(Qry, Ordb) -> _pipe = Qry, cake@internal@query:select_order_by( _pipe, {order_by, [{order_by_column, Ordb, desc_nulls_first}]}, false ). -spec order(cake@internal@query:select(), binary(), direction()) -> cake@internal@query:select(). order(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 order_replace(cake@internal@query:select(), binary(), direction()) -> cake@internal@query:select(). order_replace(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 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).