Skip to content

Commit

Permalink
new test + feat flag ish
Browse files Browse the repository at this point in the history
  • Loading branch information
kylemumma committed Apr 25, 2024
1 parent 17a9273 commit 2b453b5
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 7 deletions.
37 changes: 30 additions & 7 deletions snuba/query/conditions.py
Original file line number Diff line number Diff line change
Expand Up @@ -283,13 +283,16 @@ def combine_and_conditions(conditions: Sequence[Expression]) -> Expression:


def _combine_conditions(conditions: Sequence[Expression], function: str) -> Expression:
"""
Combine multiple independent conditions in a single function
representing an AND or an OR.
This is the inverse of get_first_level_conditions.
"""
flag = False
if flag:
return _combine_conditions_new(conditions, function)
else:
return _combine_conditions_old(conditions, function)

# TODO: Make BooleanFunctions an enum for stricter typing.

def _combine_conditions_new(
conditions: Sequence[Expression], function: str
) -> Expression:
assert function in (BooleanFunctions.AND, BooleanFunctions.OR)
assert len(conditions) > 0
if len(conditions) == 1:
Expand All @@ -304,7 +307,27 @@ def _combine_conditions(conditions: Sequence[Expression], function: str) -> Expr
for i in range(start, len(conditions) - 1, 2):
new_conds.append(binary_condition(function, conditions[i], conditions[i + 1]))

return _combine_conditions(new_conds, function)
return _combine_conditions_new(new_conds, function)


def _combine_conditions_old(
conditions: Sequence[Expression], function: str
) -> Expression:
"""
Combine multiple independent conditions in a single function
representing an AND or an OR.
This is the inverse of get_first_level_conditions.
"""

# TODO: Make BooleanFunctions an enum for stricter typing.
assert function in (BooleanFunctions.AND, BooleanFunctions.OR)
assert len(conditions) > 0
if len(conditions) == 1:
return conditions[0]

return binary_condition(
function, conditions[0], _combine_conditions_old(conditions[1:], function)
)


CONDITION_MATCH = Or(
Expand Down
33 changes: 33 additions & 0 deletions tests/query/parser/test_mql_query.py
Original file line number Diff line number Diff line change
Expand Up @@ -2804,3 +2804,36 @@ def test_recursion_error_query() -> None:
"offset": None,
}
res, _ = parse_mql_query(error_mql, context, get_dataset("generic_metrics"))


def test_recursion_error_query_tuple() -> None:
conds = " OR ".join(
[f'(release:"backend@{e}" AND project_id:1)' for e in range(1000)]
)
error_mql = (
"(sum(d:transactions/duration@millisecond) by (release, project_id) * 1000000.0){("
+ conds
+ ")}"
)
context = {
"start": "2024-04-08T05:48:00+00:00",
"end": "2024-04-08T06:49:00+00:00",
"rollup": {
"granularity": 60,
"interval": 60,
"orderby": None,
"with_totals": None,
},
"scope": {
"org_ids": [1],
"project_ids": [1],
"use_case_id": "'transactions'",
},
"indexer_mappings": {
"d:transactions/duration@millisecond": 9223372036854775909,
"transaction": 9223372036854776020,
},
"limit": 10000,
"offset": None,
}
res, _ = parse_mql_query(error_mql, context, get_dataset("generic_metrics"))

0 comments on commit 2b453b5

Please sign in to comment.