Current section

Files

Jump to
caffeine_lang src caffeine_lang@cql@generator.erl
Raw

src/caffeine_lang@cql@generator.erl

-module(caffeine_lang@cql@generator).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/caffeine_lang/cql/generator.gleam").
-export([operator_to_datadog_query/1, exp_to_string/1, generate_datadog_query/1]).
-file("src/caffeine_lang/cql/generator.gleam", 84).
-spec is_path_component(binary()) -> boolean().
is_path_component(S) ->
Has_complete_braces = gleam_stdlib:contains_string(S, <<"{"/utf8>>) andalso gleam_stdlib:contains_string(
S,
<<"}"/utf8>>
),
(not gleam_stdlib:contains_string(S, <<"_"/utf8>>) andalso not gleam_stdlib:contains_string(
S,
<<" "/utf8>>
))
andalso not Has_complete_braces.
-file("src/caffeine_lang/cql/generator.gleam", 69).
-spec is_path_expression_helper(caffeine_lang@cql@parser:exp(), boolean()) -> boolean().
is_path_expression_helper(Exp, Is_leftmost) ->
case Exp of
{primary, {primary_word, {word, W}}} ->
case Is_leftmost andalso gleam_stdlib:string_ends_with(
W,
<<":"/utf8>>
) of
true ->
true;
false ->
is_path_component(W)
end;
{operator_expr, Left, Right, 'div'} ->
is_path_expression_helper(Left, Is_leftmost) andalso is_path_expression_helper(
Right,
false
);
_ ->
false
end.
-file("src/caffeine_lang/cql/generator.gleam", 65).
-spec is_path_expression(caffeine_lang@cql@parser:exp()) -> boolean().
is_path_expression(Exp) ->
is_path_expression_helper(Exp, true).
-file("src/caffeine_lang/cql/generator.gleam", 160).
-spec operator_precedence(caffeine_lang@cql@parser:operator()) -> integer().
operator_precedence(Op) ->
case Op of
add ->
1;
sub ->
1;
mul ->
2;
'div' ->
2
end.
-file("src/caffeine_lang/cql/generator.gleam", 154).
-spec needs_parentheses(
caffeine_lang@cql@parser:operator(),
caffeine_lang@cql@parser:operator()
) -> boolean().
needs_parentheses(Inner_op, Parent_op) ->
Inner_prec = operator_precedence(Inner_op),
Parent_prec = operator_precedence(Parent_op),
Inner_prec < Parent_prec.
-file("src/caffeine_lang/cql/generator.gleam", 167).
-spec operator_to_datadog_query(caffeine_lang@cql@parser:operator()) -> binary().
operator_to_datadog_query(Operator) ->
case Operator of
add ->
<<"+"/utf8>>;
sub ->
<<"-"/utf8>>;
mul ->
<<"*"/utf8>>;
'div' ->
<<"/"/utf8>>
end.
-file("src/caffeine_lang/cql/generator.gleam", 101).
-spec exp_to_string_no_spaces(caffeine_lang@cql@parser:exp()) -> binary().
exp_to_string_no_spaces(Exp) ->
case Exp of
{primary, {primary_word, {word, W}}} ->
W;
{operator_expr, Left, Right, 'div'} ->
<<<<(exp_to_string_no_spaces(Left))/binary, "/"/utf8>>/binary,
(exp_to_string_no_spaces(Right))/binary>>;
_ ->
exp_to_string(Exp)
end.
-file("src/caffeine_lang/cql/generator.gleam", 41).
-spec exp_to_string(caffeine_lang@cql@parser:exp()) -> binary().
exp_to_string(Exp) ->
case Exp of
{primary, Primary} ->
primary_to_string(Primary, none);
{operator_expr, Numerator, Denominator, Operator} ->
case {Operator, is_path_expression(Exp)} of
{'div', true} ->
exp_to_string_no_spaces(Exp);
{_, _} ->
Left = exp_to_string_with_context(
Numerator,
{some, Operator},
true
),
Right = exp_to_string_with_context(
Denominator,
{some, Operator},
false
),
Op = operator_to_datadog_query(Operator),
<<<<<<<<Left/binary, " "/utf8>>/binary, Op/binary>>/binary,
" "/utf8>>/binary,
Right/binary>>
end
end.
-file("src/caffeine_lang/cql/generator.gleam", 25).
-spec numerator_exp_to_datadog_query(caffeine_lang@cql@parser:exp()) -> binary().
numerator_exp_to_datadog_query(Exp) ->
case Exp of
{primary, {primary_exp, Exp@1}} ->
exp_to_string(Exp@1);
_ ->
exp_to_string(Exp)
end.
-file("src/caffeine_lang/cql/generator.gleam", 33).
-spec denominator_exp_to_datadog_query(caffeine_lang@cql@parser:exp()) -> binary().
denominator_exp_to_datadog_query(Exp) ->
case Exp of
{primary, {primary_exp, Exp@1}} ->
exp_to_string(Exp@1);
_ ->
exp_to_string(Exp)
end.
-file("src/caffeine_lang/cql/generator.gleam", 10).
-spec generate_datadog_query(caffeine_lang@cql@resolver:primitives()) -> binary().
generate_datadog_query(Primitive) ->
case Primitive of
{good_over_total, Numerator, Denominator} ->
<<<<<<<<<<<<<<"query {\n"/utf8, " numerator = \""/utf8>>/binary,
(numerator_exp_to_datadog_query(Numerator))/binary>>/binary,
"\"\n"/utf8>>/binary,
" denominator = \""/utf8>>/binary,
(denominator_exp_to_datadog_query(Denominator))/binary>>/binary,
"\"\n"/utf8>>/binary,
" }\n"/utf8>>
end.
-file("src/caffeine_lang/cql/generator.gleam", 132).
-spec primary_to_string(
caffeine_lang@cql@parser:primary(),
gleam@option:option(caffeine_lang@cql@parser:operator())
) -> binary().
primary_to_string(Primary, Parent_op) ->
case Primary of
{primary_word, Word} ->
erlang:element(2, Word);
{primary_exp, Exp} ->
Needs_parens = case {Exp, Parent_op} of
{_, none} ->
false;
{{primary, _}, _} ->
false;
{{operator_expr, _, _, Inner_op}, {some, Parent}} ->
needs_parentheses(Inner_op, Parent)
end,
case Needs_parens of
true ->
<<<<"("/utf8, (exp_to_string(Exp))/binary>>/binary,
")"/utf8>>;
false ->
exp_to_string(Exp)
end
end.
-file("src/caffeine_lang/cql/generator.gleam", 110).
-spec exp_to_string_with_context(
caffeine_lang@cql@parser:exp(),
gleam@option:option(caffeine_lang@cql@parser:operator()),
boolean()
) -> binary().
exp_to_string_with_context(Exp, Parent_op, _) ->
case Exp of
{primary, Primary} ->
primary_to_string(Primary, Parent_op);
{operator_expr, Numerator, Denominator, Operator} ->
case {Operator, is_path_expression(Exp)} of
{'div', true} ->
exp_to_string_no_spaces(Exp);
{_, _} ->
<<<<<<<<(exp_to_string_with_context(
Numerator,
{some, Operator},
true
))/binary,
" "/utf8>>/binary,
(operator_to_datadog_query(Operator))/binary>>/binary,
" "/utf8>>/binary,
(exp_to_string_with_context(
Denominator,
{some, Operator},
false
))/binary>>
end
end.