Current section
Files
Jump to
Current section
Files
src/sqlode@codegen@queries.erl
-module(sqlode@codegen@queries).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/sqlode/codegen/queries.gleam").
-export([render/3]).
-file("src/sqlode/codegen/queries.gleam", 78).
-spec engine_placeholder_style_expr(sqlode@model:engine()) -> binary().
engine_placeholder_style_expr(Engine) ->
case Engine of
postgre_s_q_l ->
<<"runtime.DollarNumbered"/utf8>>;
my_s_q_l ->
<<"runtime.QuestionPositional"/utf8>>;
s_q_lite ->
<<"runtime.QuestionNumbered"/utf8>>
end.
-file("src/sqlode/codegen/queries.gleam", 86).
-spec render_query_function(
sqlode@naming:naming_context(),
sqlode@model:analyzed_query(),
boolean(),
binary()
) -> binary().
render_query_function(Naming_ctx, Query, Emit_sql_as_comment, Style_expr) ->
Has_params = not gleam@list:is_empty(erlang:element(3, Query)),
Comment = case Emit_sql_as_comment of
true ->
[<<"// SQL: "/utf8,
(erlang:element(5, erlang:element(2, Query)))/binary>>];
false ->
[]
end,
Return_type = case Has_params of
true ->
Params_type = <<(sqlode@naming:to_pascal_case(
Naming_ctx,
erlang:element(2, erlang:element(2, Query))
))/binary,
"Params"/utf8>>,
<<<<"runtime.RawQuery(params."/utf8, Params_type/binary>>/binary,
")"/utf8>>;
false ->
<<"runtime.RawQuery(Nil)"/utf8>>
end,
Encode_line = case Has_params of
true ->
Values_fn = <<(erlang:element(3, erlang:element(2, Query)))/binary,
"_values"/utf8>>,
<<<<" encode: params."/utf8, Values_fn/binary>>/binary,
","/utf8>>;
false ->
<<" encode: fn(_) { [] },"/utf8>>
end,
Slice_params = gleam@list:filter(
erlang:element(3, Query),
fun(P) -> erlang:element(6, P) end
),
Slice_info_line = case Slice_params of
[] ->
<<" slice_info: fn(_) { [] },"/utf8>>;
_ ->
Entries = begin
_pipe = Slice_params,
_pipe@1 = gleam@list:map(
_pipe,
fun(P@1) ->
<<<<<<<<"#("/utf8,
(erlang:integer_to_binary(
erlang:element(2, P@1)
))/binary>>/binary,
", list.length(p."/utf8>>/binary,
(erlang:element(3, P@1))/binary>>/binary,
"))"/utf8>>
end
),
gleam@string:join(_pipe@1, <<", "/utf8>>)
end,
<<<<" slice_info: fn(p) { ["/utf8, Entries/binary>>/binary,
"] },"/utf8>>
end,
gleam@string:join(
lists:append(
[Comment,
[<<<<<<<<"pub fn "/utf8,
(erlang:element(3, erlang:element(2, Query)))/binary>>/binary,
"() -> "/utf8>>/binary,
Return_type/binary>>/binary,
" {"/utf8>>,
<<" runtime.RawQuery("/utf8>>,
<<<<" name: \""/utf8,
(sqlode@codegen@common:escape_string(
erlang:element(2, erlang:element(2, Query))
))/binary>>/binary,
"\","/utf8>>,
<<<<" sql: \""/utf8,
(sqlode@codegen@common:escape_string(
erlang:element(5, erlang:element(2, Query))
))/binary>>/binary,
"\","/utf8>>,
<<<<" command: runtime."/utf8,
(sqlode@model:query_command_to_string(
erlang:element(4, erlang:element(2, Query))
))/binary>>/binary,
","/utf8>>,
<<<<" param_count: "/utf8,
(erlang:integer_to_binary(
erlang:element(7, erlang:element(2, Query))
))/binary>>/binary,
","/utf8>>,
<<<<" placeholder_style: "/utf8, Style_expr/binary>>/binary,
","/utf8>>,
Encode_line,
Slice_info_line,
<<" )"/utf8>>,
<<"}"/utf8>>]]
),
<<"\n"/utf8>>
).
-file("src/sqlode/codegen/queries.gleam", 157).
-spec render_query_info_literal(sqlode@model:parsed_query()) -> binary().
render_query_info_literal(Query) ->
<<<<<<<<<<<<<<<<"runtime.QueryInfo(name: \""/utf8,
(sqlode@codegen@common:escape_string(
erlang:element(2, Query)
))/binary>>/binary,
"\", sql: \""/utf8>>/binary,
(sqlode@codegen@common:escape_string(
erlang:element(5, Query)
))/binary>>/binary,
"\", command: runtime."/utf8>>/binary,
(sqlode@model:query_command_to_string(
erlang:element(4, Query)
))/binary>>/binary,
", param_count: "/utf8>>/binary,
(erlang:integer_to_binary(erlang:element(7, Query)))/binary>>/binary,
")"/utf8>>.
-file("src/sqlode/codegen/queries.gleam", 8).
-spec render(
sqlode@naming:naming_context(),
sqlode@model:sql_block(),
list(sqlode@model:analyzed_query())
) -> binary().
render(Naming_ctx, Block, Queries) ->
{sql_block, _, Engine, _, _, Gleam, _} = Block,
{gleam_output, Out, Runtime, _, _, _, _, _, _} = Gleam,
Module_path = sqlode@codegen@common:out_to_module_path(Out),
Emit_sql_as_comment = erlang:element(5, Gleam),
Has_slices = sqlode@codegen@common:queries_have_slices(Queries),
Style_expr = engine_placeholder_style_expr(Engine),
Query_functions = begin
_pipe = Queries,
_pipe@1 = gleam@list:map(
_pipe,
fun(_capture) ->
render_query_function(
Naming_ctx,
_capture,
Emit_sql_as_comment,
Style_expr
)
end
),
gleam@string:join(_pipe@1, <<"\n\n"/utf8>>)
end,
All_items = case Queries of
[] ->
<<"[]"/utf8>>;
_ ->
_pipe@2 = Queries,
_pipe@3 = gleam@list:map(
_pipe@2,
fun(Query) ->
render_query_info_literal(erlang:element(2, Query))
end
),
_pipe@4 = gleam@string:join(_pipe@3, <<", "/utf8>>),
(fun(Items) -> <<<<"["/utf8, Items/binary>>/binary, "]"/utf8>> end)(
_pipe@4
)
end,
Has_any_params = gleam@list:any(
Queries,
fun(Q) -> not gleam@list:is_empty(erlang:element(3, Q)) end
),
Imports = lists:append([case Has_slices of
true ->
[<<"import gleam/list"/utf8>>];
false ->
[]
end, [<<"import "/utf8,
(sqlode@codegen@common:runtime_import_path(Gleam))/binary>>], case Has_any_params of
true ->
[<<<<"import "/utf8, Module_path/binary>>/binary,
"/params"/utf8>>];
false ->
[]
end]),
gleam@string:join(
lists:append(
[[<<"// Code generated by sqlode. DO NOT EDIT."/utf8>>,
<<"// engine: "/utf8,
(sqlode@model:engine_to_string(Engine))/binary>>,
<<"// runtime: "/utf8,
(sqlode@model:runtime_to_string(Runtime))/binary>>,
<<""/utf8>>],
Imports,
[<<""/utf8>>,
<<"pub fn all() -> List(runtime.QueryInfo) {"/utf8>>,
<<" "/utf8, All_items/binary>>,
<<"}"/utf8>>,
<<""/utf8>>,
Query_functions]]
),
<<"\n"/utf8>>
).