|
@@ -1,5 +1,6 @@
|
|
|
from dataclasses import asdict
|
|
|
from functools import partial
|
|
|
+from typing import List, Union
|
|
|
|
|
|
from sentry.api.event_search import AggregateFilter, SearchConfig, SearchValue, default_config
|
|
|
from sentry.api.event_search import parse_search_query as base_parse_query
|
|
@@ -63,7 +64,16 @@ def convert_user_value(value, projects, user, environments):
|
|
|
return [parse_user_value(username, user) for username in value]
|
|
|
|
|
|
|
|
|
-def convert_release_value(value, projects, user, environments):
|
|
|
+def convert_release_value(value, projects, user, environments) -> Union[str, List[str]]:
|
|
|
+ # TODO: This will make N queries. This should be ok, we don't typically have large
|
|
|
+ # lists of versions here, but we can look into batching it if needed.
|
|
|
+ releases = [parse_release(version, projects, environments) for version in value]
|
|
|
+ if len(releases) == 1:
|
|
|
+ return releases[0]
|
|
|
+ return releases
|
|
|
+
|
|
|
+
|
|
|
+def convert_first_release_value(value, projects, user, environments) -> List[str]:
|
|
|
# TODO: This will make N queries. This should be ok, we don't typically have large
|
|
|
# lists of versions here, but we can look into batching it if needed.
|
|
|
return [parse_release(version, projects, environments) for version in value]
|
|
@@ -84,7 +94,7 @@ value_converters = {
|
|
|
"assigned_to": convert_actor_or_none_value,
|
|
|
"bookmarked_by": convert_user_value,
|
|
|
"subscribed_by": convert_user_value,
|
|
|
- "first_release": convert_release_value,
|
|
|
+ "first_release": convert_first_release_value,
|
|
|
"release": convert_release_value,
|
|
|
"status": convert_status_value,
|
|
|
}
|
|
@@ -106,9 +116,13 @@ def convert_query_values(search_filters, projects, user, environments):
|
|
|
new_value = converter(
|
|
|
to_list(search_filter.value.raw_value), projects, user, environments
|
|
|
)
|
|
|
+ if isinstance(new_value, list):
|
|
|
+ operator = "IN" if search_filter.operator in EQUALITY_OPERATORS else "NOT IN"
|
|
|
+ else:
|
|
|
+ operator = "=" if search_filter.operator in EQUALITY_OPERATORS else "!="
|
|
|
search_filter = search_filter._replace(
|
|
|
value=SearchValue(new_value),
|
|
|
- operator="IN" if search_filter.operator in EQUALITY_OPERATORS else "NOT IN",
|
|
|
+ operator=operator,
|
|
|
)
|
|
|
elif isinstance(search_filter, AggregateFilter):
|
|
|
raise InvalidSearchQuery(
|