|
@@ -1,12 +1,11 @@
|
|
|
from __future__ import absolute_import
|
|
|
|
|
|
from rest_framework.exceptions import PermissionDenied
|
|
|
-from copy import copy
|
|
|
|
|
|
-from sentry import eventstore, features
|
|
|
+from sentry import eventstore
|
|
|
from sentry.api.bases import OrganizationEndpoint, OrganizationEventsError
|
|
|
from sentry.api.event_search import (
|
|
|
- get_snuba_query_args,
|
|
|
+ get_filter,
|
|
|
resolve_field_list,
|
|
|
InvalidSearchQuery,
|
|
|
get_reference_event_conditions,
|
|
@@ -24,10 +23,17 @@ class OrganizationEventsEndpointBase(OrganizationEndpoint):
|
|
|
def get_snuba_query_args(self, request, organization, params):
|
|
|
query = request.GET.get("query")
|
|
|
try:
|
|
|
- snuba_args = get_snuba_query_args(query=query, params=params)
|
|
|
+ filter = get_filter(query, params)
|
|
|
except InvalidSearchQuery as exc:
|
|
|
raise OrganizationEventsError(exc.message)
|
|
|
|
|
|
+ snuba_args = {
|
|
|
+ "start": filter.start,
|
|
|
+ "end": filter.end,
|
|
|
+ "conditions": filter.conditions,
|
|
|
+ "filter_keys": filter.filter_keys,
|
|
|
+ }
|
|
|
+
|
|
|
sort = request.GET.getlist("sort")
|
|
|
if sort:
|
|
|
snuba_args["orderby"] = sort
|
|
@@ -57,14 +63,6 @@ class OrganizationEventsEndpointBase(OrganizationEndpoint):
|
|
|
snuba_args, reference_event_id
|
|
|
)
|
|
|
|
|
|
- # TODO(lb): remove once boolean search is fully functional
|
|
|
- has_boolean_op_flag = features.has(
|
|
|
- "organizations:boolean-search", organization, actor=request.user
|
|
|
- )
|
|
|
- if snuba_args.pop("has_boolean_terms", False) and not has_boolean_op_flag:
|
|
|
- raise OrganizationEventsError(
|
|
|
- "Boolean search operator OR and AND not allowed in this search."
|
|
|
- )
|
|
|
return snuba_args
|
|
|
|
|
|
def get_snuba_query_args_legacy(self, request, organization):
|
|
@@ -90,18 +88,16 @@ class OrganizationEventsEndpointBase(OrganizationEndpoint):
|
|
|
|
|
|
query = request.GET.get("query")
|
|
|
try:
|
|
|
- snuba_args = get_snuba_query_args(query=query, params=params)
|
|
|
+ _filter = get_filter(query, params)
|
|
|
except InvalidSearchQuery as exc:
|
|
|
raise OrganizationEventsError(exc.message)
|
|
|
|
|
|
- # TODO(lb): remove once boolean search is fully functional
|
|
|
- has_boolean_op_flag = features.has(
|
|
|
- "organizations:boolean-search", organization, actor=request.user
|
|
|
- )
|
|
|
- if snuba_args.pop("has_boolean_terms", False) and not has_boolean_op_flag:
|
|
|
- raise OrganizationEventsError(
|
|
|
- "Boolean search operator OR and AND not allowed in this search."
|
|
|
- )
|
|
|
+ snuba_args = {
|
|
|
+ "start": _filter.start,
|
|
|
+ "end": _filter.end,
|
|
|
+ "conditions": _filter.conditions,
|
|
|
+ "filter_keys": _filter.filter_keys,
|
|
|
+ }
|
|
|
|
|
|
# 'legacy' endpoints cannot access transactions dataset.
|
|
|
# as they often have assumptions about which columns are returned.
|
|
@@ -110,6 +106,7 @@ class OrganizationEventsEndpointBase(OrganizationEndpoint):
|
|
|
raise OrganizationEventsError(
|
|
|
"Invalid query. You cannot reference non-events data in this endpoint."
|
|
|
)
|
|
|
+
|
|
|
return snuba_args
|
|
|
|
|
|
def next_event_id(self, snuba_args, event):
|
|
@@ -117,10 +114,7 @@ class OrganizationEventsEndpointBase(OrganizationEndpoint):
|
|
|
Returns the next event ID if there is a subsequent event matching the
|
|
|
conditions provided. Ignores the project_id.
|
|
|
"""
|
|
|
- conditions = self._apply_start_and_end(snuba_args)
|
|
|
- next_event = eventstore.get_next_event_id(
|
|
|
- event, conditions=conditions, filter_keys=snuba_args["filter_keys"]
|
|
|
- )
|
|
|
+ next_event = eventstore.get_next_event_id(event, filter=self._get_filter(snuba_args))
|
|
|
|
|
|
if next_event:
|
|
|
return next_event[1]
|
|
@@ -130,21 +124,19 @@ class OrganizationEventsEndpointBase(OrganizationEndpoint):
|
|
|
Returns the previous event ID if there is a previous event matching the
|
|
|
conditions provided. Ignores the project_id.
|
|
|
"""
|
|
|
- conditions = self._apply_start_and_end(snuba_args)
|
|
|
- prev_event = eventstore.get_prev_event_id(
|
|
|
- event, conditions=conditions, filter_keys=snuba_args["filter_keys"]
|
|
|
- )
|
|
|
+ prev_event = eventstore.get_prev_event_id(event, filter=self._get_filter(snuba_args))
|
|
|
|
|
|
if prev_event:
|
|
|
return prev_event[1]
|
|
|
|
|
|
- def _apply_start_and_end(self, snuba_args):
|
|
|
- conditions = copy(snuba_args["conditions"])
|
|
|
- if "start" in snuba_args:
|
|
|
- conditions.append(["timestamp", ">=", snuba_args["start"]])
|
|
|
- if "end" in snuba_args:
|
|
|
- conditions.append(["timestamp", "<=", snuba_args["end"]])
|
|
|
- return conditions
|
|
|
+ def _get_filter(self, snuba_args):
|
|
|
+ return eventstore.Filter(
|
|
|
+ conditions=snuba_args["conditions"],
|
|
|
+ start=snuba_args.get("start", None),
|
|
|
+ end=snuba_args.get("end", None),
|
|
|
+ project_ids=snuba_args["filter_keys"].get("project_id", None),
|
|
|
+ group_ids=snuba_args["filter_keys"].get("issue", None),
|
|
|
+ )
|
|
|
|
|
|
def oldest_event_id(self, snuba_args, event):
|
|
|
"""
|