Example #1
0
def find_reference_event(reference_event):
    try:
        project_slug, event_id = reference_event.slug.split(":")
    except ValueError:
        raise InvalidSearchQuery("Invalid reference event")
    try:
        project = Project.objects.get(
            slug=project_slug,
            organization=reference_event.organization,
            status=ProjectStatus.VISIBLE,
        )
    except Project.DoesNotExist:
        raise InvalidSearchQuery("Invalid reference event")

    column_names = [
        c.value.discover_name
        for c in get_columns_from_aliases(reference_event.fields)
    ]
    # We don't need to run a query if there are no columns
    if not column_names:
        return None

    event = raw_query(
        selected_columns=column_names,
        filter_keys={
            "project_id": [project.id],
            "event_id": [event_id]
        },
        dataset=Dataset.Discover,
        limit=1,
    )
    if "error" in event or len(event["data"]) != 1:
        raise InvalidSearchQuery("Invalid reference event")

    return event["data"][0]
Example #2
0
def get_reference_event_conditions(organization, snuba_args, event_slug):
    """
    Returns a list of additional conditions/filter_keys to
    scope a query by the groupby fields using values from the reference event

    This is a key part of pagination in the event details modal and
    summary graph navigation.
    """
    groupby = snuba_args.get("groupby", [])
    columns = get_columns_from_aliases(groupby)
    field_names = [get_snuba_column_name(field) for field in groupby]

    # Fetch the reference event ensuring the fields in the groupby
    # clause are present.
    event_data = find_reference_event(organization, snuba_args, event_slug,
                                      columns)

    conditions = []
    tags = {}
    if "tags.key" in event_data and "tags.value" in event_data:
        tags = dict(zip(event_data["tags.key"], event_data["tags.value"]))

    for (i, field) in enumerate(groupby):
        match = TAG_KEY_RE.match(field_names[i])
        if match:
            value = tags.get(match.group(1), None)
        else:
            value = event_data.get(field_names[i], None)
            # If the value is a sequence use the first element as snuba
            # doesn't support `=` or `IN` operations on fields like exception_frames.filename
            if isinstance(value, (list, set)) and value:
                value = value.pop()
        if value:
            conditions.append([field, "=", value])

    return conditions