-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), <<<<<<<>/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.