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]
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