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 release_filter_converter(builder: QueryBuilder, search_filter: SearchFilter) -> WhereType: """Parse releases for potential aliases like `latest`""" if search_filter.value.is_wildcard(): operator = search_filter.operator value = search_filter.value else: operator_conversions = {"=": "IN", "!=": "NOT IN"} operator = operator_conversions.get(search_filter.operator, search_filter.operator) value = SearchValue( reduce( lambda x, y: x + y, [ parse_release( v, builder.params["project_id"], builder.params.get("environment_objects"), builder.params.get("organization_id"), ) for v in to_list(search_filter.value.value) ], [], ) ) return builder._default_filter_converter(SearchFilter(search_filter.key, operator, value))
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. releases = set() for version in value: releases.update(parse_release(version, projects, environments)) return list(releases)
def convert_release_value(value, projects, user, environments): return parse_release(value, projects, environments)
def convert_release_value(value, projects, user, environments): # 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 ]
def format_search_filter(term, params): projects_to_filter = [ ] # Used to avoid doing multiple conditions on project ID conditions = [] group_ids = None name = term.key.name value = term.value.value if name in (PROJECT_ALIAS, PROJECT_NAME_ALIAS): if term.operator == "=" and value == "": raise InvalidSearchQuery( "Invalid query for 'has' search: 'project' cannot be empty.") slugs = to_list(value) projects = { p.slug: p.id for p in Project.objects.filter( id__in=params.get("project_id", []), slug__in=slugs) } missing = [slug for slug in slugs if slug not in projects] if missing and term.operator in EQUALITY_OPERATORS: raise InvalidSearchQuery( f"Invalid query. Project(s) {', '.join(missing)} do not exist or are not actively selected." ) project_ids = list(sorted(projects.values())) if project_ids: # Create a new search filter with the correct values term = SearchFilter( SearchKey("project_id"), term.operator, SearchValue( project_ids if term.is_in_filter else project_ids[0]), ) converted_filter = convert_search_filter_to_snuba_query(term) if converted_filter: if term.operator in EQUALITY_OPERATORS: projects_to_filter = project_ids conditions.append(converted_filter) elif name == ISSUE_ID_ALIAS and value != "": # A blank term value means that this is a has filter group_ids = to_list(value) elif name == ISSUE_ALIAS: operator = term.operator value = to_list(value) # `unknown` is a special value for when there is no issue associated with the event group_short_ids = [v for v in value if v and v != "unknown"] filter_values = ["" for v in value if not v or v == "unknown"] if group_short_ids and params and "organization_id" in params: try: groups = Group.objects.by_qualified_short_id_bulk( params["organization_id"], group_short_ids, ) except Exception: raise InvalidSearchQuery( f"Invalid value '{group_short_ids}' for 'issue:' filter") else: filter_values.extend(sorted([g.id for g in groups])) term = SearchFilter( SearchKey("issue.id"), operator, SearchValue( filter_values if term.is_in_filter else filter_values[0]), ) converted_filter = convert_search_filter_to_snuba_query(term) conditions.append(converted_filter) elif (name == RELEASE_ALIAS and params and (value == "latest" or term.is_in_filter and any(v == "latest" for v in value))): value = [ parse_release( v, params["project_id"], params.get("environment_objects"), params.get("organization_id"), ) for v in to_list(value) ] converted_filter = convert_search_filter_to_snuba_query( SearchFilter( term.key, term.operator, SearchValue(value if term.is_in_filter else value[0]), )) if converted_filter: conditions.append(converted_filter) else: converted_filter = convert_search_filter_to_snuba_query(term, params=params) if converted_filter: conditions.append(converted_filter) return conditions, projects_to_filter, group_ids