Skip to content

Commit c14e2e9

Browse files
committed
refactor
1 parent d2b17b6 commit c14e2e9

File tree

1 file changed

+34
-32
lines changed

1 file changed

+34
-32
lines changed

src/sentry/api/bases/organization_events.py

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from copy import deepcopy
44
from rest_framework.exceptions import PermissionDenied
55
import six
6+
from enum import Enum
67

78
from sentry import features
89
from sentry.api.bases import OrganizationEndpoint, OrganizationEventsError
@@ -28,6 +29,11 @@
2829
}
2930

3031

32+
class Direction(Enum):
33+
NEXT = 0
34+
PREV = 1
35+
36+
3137
class OrganizationEventsEndpointBase(OrganizationEndpoint):
3238

3339
def get_snuba_query_args(self, request, organization):
@@ -111,55 +117,51 @@ def get_snuba_query_args_v2(self, request, organization, params):
111117
'Boolean search operator OR and AND not allowed in this search.')
112118
return snuba_args
113119

114-
def next_event_id(self, request, organization, snuba_args, event):
120+
def next_event_id(self, *args):
115121
"""
116122
Returns the next event ID if there is a subsequent event matching the
117123
conditions provided
118124
"""
125+
return self._get_next_or_prev_id(Direction.NEXT, *args)
119126

120-
conditions = snuba_args['conditions'][:]
121-
conditions.extend([
122-
['timestamp', '>=', event.timestamp],
123-
[['timestamp', '>', event.timestamp], ['event_id', '>', event.event_id]]
124-
])
125-
126-
result = snuba.raw_query(
127-
start=max(event.datetime, snuba_args['start']),
128-
end=snuba_args['end'],
129-
selected_columns=['event_id'],
130-
conditions=conditions,
131-
filter_keys=snuba_args['filter_keys'],
132-
orderby=['timestamp', 'event_id'],
133-
limit=1,
134-
referrer='api.organization-events.next_event_id',
135-
)
136-
137-
if 'error' in result or len(result['data']) == 0:
138-
return None
139-
140-
return six.text_type(result['data'][0]['event_id'])
141-
142-
def prev_event_id(self, request, organization, snuba_args, event):
127+
def prev_event_id(self, *args):
143128
"""
144129
Returns the previous event ID if there is a previous event matching the
145130
conditions provided
146131
"""
132+
return self._get_next_or_prev_id(Direction.PREV, *args)
133+
134+
def _get_next_or_prev_id(self, direction, request, organization, snuba_args, event):
135+
if (direction == Direction.NEXT):
136+
time_condition = [
137+
['timestamp', '>=', event.timestamp],
138+
[['timestamp', '>', event.timestamp], ['event_id', '>', event.event_id]]
139+
]
140+
orderby = ['timestamp', 'event_id']
141+
start = max(event.datetime, snuba_args['start'])
142+
end = snuba_args['end']
143+
144+
else:
145+
time_condition = [
146+
['timestamp', '<=', event.timestamp],
147+
[['timestamp', '<', event.timestamp], ['event_id', '<', event.event_id]]
148+
]
149+
orderby = ['-timestamp', '-event_id']
150+
start = snuba_args['start']
151+
end = min(event.datetime, snuba_args['end'])
147152

148153
conditions = snuba_args['conditions'][:]
149-
conditions.extend([
150-
['timestamp', '<=', event.timestamp],
151-
[['timestamp', '<', event.timestamp], ['event_id', '<', event.event_id]]
152-
])
154+
conditions.extend(time_condition)
153155

154156
result = snuba.raw_query(
155-
start=snuba_args['start'],
156-
end=min(event.datetime, snuba_args['end']),
157+
start=start,
158+
end=end,
157159
selected_columns=['event_id'],
158160
conditions=conditions,
159161
filter_keys=snuba_args['filter_keys'],
160-
orderby=['-timestamp', '-event_id'],
162+
orderby=orderby,
161163
limit=1,
162-
referrer='api.organization-events.prev_event_id',
164+
referrer='api.organization-events.next-or-prev-id',
163165
)
164166

165167
if 'error' in result or len(result['data']) == 0:

0 commit comments

Comments
 (0)