Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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))
Ejemplo n.º 3
0
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)
Ejemplo n.º 5
0
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
    ]
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
def convert_release_value(value, projects, user, environments):
    return parse_release(value, projects, environments)