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", 79).
-spec get_leftmost_word(caffeine_lang@cql@parser:exp()) -> gleam@option:option(binary()).
get_leftmost_word(Exp) ->
case Exp of
{primary, {primary_word, {word, W}}} ->
{some, W};
{primary, {primary_exp, Inner_exp}} ->
get_leftmost_word(Inner_exp);
{operator_expr, Left, _, _} ->
get_leftmost_word(Left)
end.
-file("src/caffeine_lang/cql/generator.gleam", 88).
-spec all_divisions(caffeine_lang@cql@parser:exp()) -> boolean().
all_divisions(Exp) ->
case Exp of
{primary, _} ->
true;
{operator_expr, Left, Right, 'div'} ->
all_divisions(Left) andalso all_divisions(Right);
_ ->
false
end.
-file("src/caffeine_lang/cql/generator.gleam", 65).
-spec is_path_expression(caffeine_lang@cql@parser:exp()) -> boolean().
is_path_expression(Exp) ->
case get_leftmost_word(Exp) of
{some, W} ->
case gleam_stdlib:string_ends_with(W, <<":"/utf8>>) of
true ->
all_divisions(Exp);
false ->
false
end;
none ->
false
end.
-file("src/caffeine_lang/cql/generator.gleam", 159).
-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", 153).
-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", 166).
-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", 98).
-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", 131).
-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", 107).
-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);
{_, _} ->
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.