def get(self, request: Request, organization) -> Response: if not self.has_feature(request, organization): return Response(status=404) try: params = self.get_snuba_params(request, organization) except NoProjects: return Response([]) maybe_aggregate = request.GET.get("field") if not maybe_aggregate: raise ParseError(detail="No column selected") if not is_function(maybe_aggregate): raise ParseError(detail="Functions may only be given") referrer = request.GET.get("referrer") referrer = (referrer if referrer in ALLOWED_EVENTS_GEO_REFERRERS else "api.organization-events-geo") def data_fn(offset, limit): return discover.query( selected_columns=["geo.country_code", maybe_aggregate], query=f"{request.GET.get('query', '')} has:geo.country_code", params=params, offset=offset, limit=limit, referrer=referrer, use_aggregate_conditions=True, orderby=self.get_orderby(request) or maybe_aggregate, use_snql=features.has("organizations:discover-use-snql", organization, actor=request.user), ) with self.handle_query_errors(): # We don't need pagination, so we don't include the cursor headers return Response( self.handle_results_with_meta( request, organization, params["project_id"], # Expect Discover query output to be at most 251 rows, which corresponds # to the number of possible two-letter country codes as defined in ISO 3166-1 alpha-2. # # There are 250 country codes from sentry/static/app/data/countryCodesMap.tsx # plus events with no assigned country code. data_fn( 0, self.get_per_page(request, default_per_page=251, max_per_page=251)), ))
def is_real_column(col): """ Return true if col corresponds to an actual column to be fetched (not an aggregate function or field alias) """ if is_function(col): return False if col in FIELD_ALIASES: return False return True