Current section

Files

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

src/deps@cql@generator.erl

-module(deps@cql@generator).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/deps/cql/generator.gleam").
-export([operator_to_datadog_query/1, exp_to_string/1, generate_datadog_query/1]).
-file("src/deps/cql/generator.gleam", 79).
-spec get_leftmost_word(deps@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/deps/cql/generator.gleam", 88).
-spec all_divisions(deps@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/deps/cql/generator.gleam", 65).
-spec is_path_expression(deps@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/deps/cql/generator.gleam", 142).
-spec operator_to_datadog_query(deps@cql@parser:operator()) -> binary().
operator_to_datadog_query(Operator) ->
case Operator of
add ->
<<"+"/utf8>>;
sub ->
<<"-"/utf8>>;
mul ->
<<"*"/utf8>>;
'div' ->
<<"/"/utf8>>
end.
-file("src/deps/cql/generator.gleam", 98).
-spec exp_to_string_no_spaces(deps@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/deps/cql/generator.gleam", 40).
-spec exp_to_string(deps@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/deps/cql/generator.gleam", 24).
-spec numerator_exp_to_datadog_query(deps@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/deps/cql/generator.gleam", 32).
-spec denominator_exp_to_datadog_query(deps@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/deps/cql/generator.gleam", 9).
-spec generate_datadog_query(deps@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/deps/cql/generator.gleam", 132).
-spec primary_to_string(
deps@cql@parser:primary(),
gleam@option:option(deps@cql@parser:operator())
) -> binary().
primary_to_string(Primary, _) ->
case Primary of
{primary_word, Word} ->
erlang:element(2, Word);
{primary_exp, Exp} ->
<<<<"("/utf8, (exp_to_string(Exp))/binary>>/binary, ")"/utf8>>
end.
-file("src/deps/cql/generator.gleam", 107).
-spec exp_to_string_with_context(
deps@cql@parser:exp(),
gleam@option:option(deps@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.