-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, null/0, 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@read_query:select()) -> cake@internal@read_query:read_query(). to_query(Qry) -> _pipe = Qry, {select_query, _pipe}. -spec col(binary()) -> cake@internal@read_query:select_value(). col(Nm) -> _pipe = Nm, {select_column, _pipe}. -spec alias(cake@internal@read_query:select_value(), binary()) -> cake@internal@read_query:select_value(). alias(Vl, Als) -> _pipe = Vl, {select_alias, _pipe, Als}. -spec bool(boolean()) -> cake@internal@read_query:select_value(). bool(Vl) -> _pipe = Vl, _pipe@1 = {bool_param, _pipe}, {select_param, _pipe@1}. -spec float(float()) -> cake@internal@read_query:select_value(). float(Vl) -> _pipe = Vl, _pipe@1 = {float_param, _pipe}, {select_param, _pipe@1}. -spec int(integer()) -> cake@internal@read_query:select_value(). int(Vl) -> _pipe = Vl, _pipe@1 = {int_param, _pipe}, {select_param, _pipe@1}. -spec string(binary()) -> cake@internal@read_query:select_value(). string(Vl) -> _pipe = Vl, _pipe@1 = {string_param, _pipe}, {select_param, _pipe@1}. -spec null() -> cake@internal@read_query:select_value(). null() -> _pipe = null_param, {select_param, _pipe}. -spec fragment(cake@internal@read_query:fragment()) -> cake@internal@read_query:select_value(). fragment(Frgmt) -> _pipe = Frgmt, {select_fragment, _pipe}. -spec new() -> cake@internal@read_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@read_query:select()) -> cake@internal@read_query:select(). all(Qry) -> erlang:setelement(2, Qry, select_all). -spec distinct(cake@internal@read_query:select()) -> cake@internal@read_query:select(). distinct(Qry) -> erlang:setelement(2, Qry, select_distinct). -spec get_kind( cake@internal@read_query:select(), cake@internal@read_query:select_kind() ) -> cake@internal@read_query:select(). get_kind(Qry, Knd) -> erlang:setelement(2, Qry, Knd). -spec from_table(cake@internal@read_query:select(), binary()) -> cake@internal@read_query:select(). from_table(Qry, Tbl_nm) -> erlang:setelement(4, Qry, {from_table, Tbl_nm}). -spec from_sub_query( cake@internal@read_query:select(), cake@internal@read_query:read_query(), binary() ) -> cake@internal@read_query:select(). from_sub_query(Qry, Sb_qry, Als) -> erlang:setelement(4, Qry, {from_sub_query, Sb_qry, Als}). -spec no_from(cake@internal@read_query:select()) -> cake@internal@read_query:select(). no_from(Qry) -> erlang:setelement(4, Qry, no_from). -spec get_from(cake@internal@read_query:select()) -> cake@internal@read_query:from(). get_from(Qry) -> erlang:element(4, Qry). -spec select( cake@internal@read_query:select(), cake@internal@read_query:select_value() ) -> cake@internal@read_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@read_query:select(), cake@internal@read_query:select_value() ) -> cake@internal@read_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@read_query:select(), list(cake@internal@read_query:select_value()) ) -> cake@internal@read_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@read_query:select(), list(cake@internal@read_query:select_value()) ) -> cake@internal@read_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@read_query:select()) -> cake@internal@read_query:selects(). get_select(Qry) -> erlang:element(3, Qry). -spec join(cake@internal@read_query:select(), cake@internal@read_query:join()) -> cake@internal@read_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@read_query:select(), cake@internal@read_query:join() ) -> cake@internal@read_query:select(). replace_join(Qry, Jn) -> erlang:setelement( 5, Qry, begin _pipe = [Jn], {joins, _pipe} end ). -spec joins( cake@internal@read_query:select(), list(cake@internal@read_query:join()) ) -> cake@internal@read_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@read_query:select(), list(cake@internal@read_query:join()) ) -> cake@internal@read_query:select(). replace_joins(Qry, Jns) -> erlang:setelement( 5, Qry, begin _pipe = Jns, {joins, _pipe} end ). -spec no_join(cake@internal@read_query:select()) -> cake@internal@read_query:select(). no_join(Qry) -> erlang:setelement(5, Qry, no_joins). -spec get_joins(cake@internal@read_query:select()) -> cake@internal@read_query:joins(). get_joins(Qry) -> erlang:element(5, Qry). -spec where(cake@internal@read_query:select(), cake@internal@read_query:where()) -> cake@internal@read_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@read_query:select(), cake@internal@read_query:where() ) -> cake@internal@read_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@read_query:select(), cake@internal@read_query:where() ) -> cake@internal@read_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@read_query:select(), cake@internal@read_query:where() ) -> cake@internal@read_query:select(). replace_where(Qry, Whr) -> erlang:setelement(6, Qry, Whr). -spec no_where(cake@internal@read_query:select()) -> cake@internal@read_query:select(). no_where(Qry) -> erlang:setelement(6, Qry, no_where). -spec get_where(cake@internal@read_query:select()) -> cake@internal@read_query:where(). get_where(Qry) -> erlang:element(6, Qry). -spec having( cake@internal@read_query:select(), cake@internal@read_query:where() ) -> cake@internal@read_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@read_query:select(), cake@internal@read_query:where() ) -> cake@internal@read_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@read_query:select(), cake@internal@read_query:where() ) -> cake@internal@read_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@read_query:select(), cake@internal@read_query:where() ) -> cake@internal@read_query:select(). replace_having(Qry, Whr) -> erlang:setelement(8, Qry, Whr). -spec no_having(cake@internal@read_query:select()) -> cake@internal@read_query:select(). no_having(Qry) -> erlang:setelement(8, Qry, no_where). -spec get_having(cake@internal@read_query:select()) -> cake@internal@read_query:where(). get_having(Qry) -> erlang:element(8, Qry). -spec group_by(cake@internal@read_query:select(), binary()) -> cake@internal@read_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@read_query:select(), binary()) -> cake@internal@read_query:select(). replace_group_by(Qry, Grpb) -> erlang:setelement(7, Qry, {group_by, [Grpb]}). -spec group_bys(cake@internal@read_query:select(), list(binary())) -> cake@internal@read_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@read_query:select(), list(binary())) -> cake@internal@read_query:select(). replace_group_bys(Qry, Grpbs) -> erlang:setelement(7, Qry, {group_by, Grpbs}). -spec no_group_by(cake@internal@read_query:select()) -> cake@internal@read_query:select(). no_group_by(Qry) -> erlang:setelement(7, Qry, no_group_by). -spec get_group_by(cake@internal@read_query:select()) -> cake@internal@read_query:group_by(). get_group_by(Qry) -> erlang:element(7, Qry). -spec limit(cake@internal@read_query:select(), integer()) -> cake@internal@read_query:select(). limit(Qry, Lmt) -> Lmt@1 = begin _pipe = Lmt, cake@internal@read_query:limit_new(_pipe) end, erlang:setelement(10, Qry, Lmt@1). -spec no_limit(cake@internal@read_query:select()) -> cake@internal@read_query:select(). no_limit(Qry) -> erlang:setelement(10, Qry, no_limit). -spec get_limit(cake@internal@read_query:select()) -> cake@internal@read_query:limit(). get_limit(Qry) -> erlang:element(10, Qry). -spec offset(cake@internal@read_query:select(), integer()) -> cake@internal@read_query:select(). offset(Qry, Offst) -> Offst@1 = begin _pipe = Offst, cake@internal@read_query:offset_new(_pipe) end, erlang:setelement(11, Qry, Offst@1). -spec no_offset(cake@internal@read_query:select()) -> cake@internal@read_query:select(). no_offset(Qry) -> erlang:setelement(11, Qry, no_offset). -spec get_offset(cake@internal@read_query:select()) -> cake@internal@read_query:offset(). get_offset(Qry) -> erlang:element(11, Qry). -spec map_order_by_direction_constructor(direction()) -> cake@internal@read_query:order_by_direction(). map_order_by_direction_constructor(In) -> case In of asc -> asc; desc -> desc end. -spec order_by_asc(cake@internal@read_query:select(), binary()) -> cake@internal@read_query:select(). order_by_asc(Qry, Ordb) -> _pipe = Qry, cake@internal@read_query:select_order_by( _pipe, {order_by, [{order_by_column, Ordb, asc}]}, true ). -spec order_by_asc_nulls_first(cake@internal@read_query:select(), binary()) -> cake@internal@read_query:select(). order_by_asc_nulls_first(Qry, Ordb) -> _pipe = Qry, cake@internal@read_query:select_order_by( _pipe, {order_by, [{order_by_column, Ordb, asc_nulls_first}]}, true ). -spec order_by_asc_nulls_last(cake@internal@read_query:select(), binary()) -> cake@internal@read_query:select(). order_by_asc_nulls_last(Qry, Ordb) -> _pipe = Qry, cake@internal@read_query:select_order_by( _pipe, {order_by, [{order_by_column, Ordb, asc_nulls_first}]}, true ). -spec replace_order_by_asc(cake@internal@read_query:select(), binary()) -> cake@internal@read_query:select(). replace_order_by_asc(Qry, Ordb) -> _pipe = Qry, cake@internal@read_query:select_order_by( _pipe, {order_by, [{order_by_column, Ordb, asc}]}, false ). -spec replace_order_by_asc_nulls_first( cake@internal@read_query:select(), binary() ) -> cake@internal@read_query:select(). replace_order_by_asc_nulls_first(Qry, Ordb) -> _pipe = Qry, cake@internal@read_query:select_order_by( _pipe, {order_by, [{order_by_column, Ordb, asc_nulls_first}]}, false ). -spec replace_order_by_asc_nulls_last( cake@internal@read_query:select(), binary() ) -> cake@internal@read_query:select(). replace_order_by_asc_nulls_last(Qry, Ordb) -> _pipe = Qry, cake@internal@read_query:select_order_by( _pipe, {order_by, [{order_by_column, Ordb, asc_nulls_first}]}, false ). -spec order_by_desc(cake@internal@read_query:select(), binary()) -> cake@internal@read_query:select(). order_by_desc(Qry, Ordb) -> _pipe = Qry, cake@internal@read_query:select_order_by( _pipe, {order_by, [{order_by_column, Ordb, desc}]}, true ). -spec order_by_desc_nulls_first(cake@internal@read_query:select(), binary()) -> cake@internal@read_query:select(). order_by_desc_nulls_first(Qry, Ordb) -> _pipe = Qry, cake@internal@read_query:select_order_by( _pipe, {order_by, [{order_by_column, Ordb, desc_nulls_first}]}, true ). -spec order_by_desc_nulls_last(cake@internal@read_query:select(), binary()) -> cake@internal@read_query:select(). order_by_desc_nulls_last(Qry, Ordb) -> _pipe = Qry, cake@internal@read_query:select_order_by( _pipe, {order_by, [{order_by_column, Ordb, desc_nulls_first}]}, true ). -spec replace_order_by_desc(cake@internal@read_query:select(), binary()) -> cake@internal@read_query:select(). replace_order_by_desc(Qry, Ordb) -> _pipe = Qry, cake@internal@read_query:select_order_by( _pipe, {order_by, [{order_by_column, Ordb, desc}]}, false ). -spec replace_order_by_desc_nulls_first( cake@internal@read_query:select(), binary() ) -> cake@internal@read_query:select(). replace_order_by_desc_nulls_first(Qry, Ordb) -> _pipe = Qry, cake@internal@read_query:select_order_by( _pipe, {order_by, [{order_by_column, Ordb, desc_nulls_first}]}, false ). -spec replace_order_by_desc_nulls_last( cake@internal@read_query:select(), binary() ) -> cake@internal@read_query:select(). replace_order_by_desc_nulls_last(Qry, Ordb) -> _pipe = Qry, cake@internal@read_query:select_order_by( _pipe, {order_by, [{order_by_column, Ordb, desc_nulls_first}]}, false ). -spec order_by(cake@internal@read_query:select(), binary(), direction()) -> cake@internal@read_query:select(). order_by(Qry, Ordb, Dir) -> Dir@1 = begin _pipe = Dir, map_order_by_direction_constructor(_pipe) end, _pipe@1 = Qry, cake@internal@read_query:select_order_by( _pipe@1, {order_by, [{order_by_column, Ordb, Dir@1}]}, true ). -spec replace_order_by(cake@internal@read_query:select(), binary(), direction()) -> cake@internal@read_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@read_query:select_order_by( _pipe@1, {order_by, [{order_by_column, Ordb, Dir@1}]}, false ). -spec no_order_by(cake@internal@read_query:select()) -> cake@internal@read_query:select(). no_order_by(Qry) -> erlang:setelement(9, Qry, no_order_by). -spec get_order_by(cake@internal@read_query:select()) -> cake@internal@read_query:order_by(). get_order_by(Qry) -> erlang:element(9, Qry). -spec epilog(cake@internal@read_query:select(), binary()) -> cake@internal@read_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@read_query:select()) -> cake@internal@read_query:select(). no_epilog(Qry) -> erlang:setelement(12, Qry, no_epilog). -spec get_epilog(cake@internal@read_query:select()) -> cake@internal@read_query:epilog(). get_epilog(Qry) -> erlang:element(12, Qry). -spec comment(cake@internal@read_query:select(), binary()) -> cake@internal@read_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@read_query:select()) -> cake@internal@read_query:select(). no_comment(Qry) -> erlang:setelement(13, Qry, no_comment). -spec get_comment(cake@internal@read_query:select()) -> cake@internal@read_query:comment(). get_comment(Qry) -> erlang:element(13, Qry).