Skip to content

Commit 48e31d0

Browse files
committed
feat(events-v2): Support ordering by a list of fields
1 parent b38dc9a commit 48e31d0

File tree

3 files changed

+53
-8
lines changed

3 files changed

+53
-8
lines changed

src/sentry/api/bases/organization_events.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ def get_snuba_query_args_v2(self, request, organization, params):
123123
if groupby:
124124
snuba_args['groupby'] = groupby
125125

126-
orderby = request.GET.get('orderby')
126+
orderby = request.GET.getlist('orderby')
127127
if orderby:
128128
snuba_args['orderby'] = orderby
129129

src/sentry/utils/snuba.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ def zerofill(data, start, end, rollup, orderby):
264264
else:
265265
rv.append({'time': key})
266266

267-
if orderby.startswith('-'):
267+
if len(orderby) > 0 and orderby[0].startswith('-'):
268268
return list(reversed(rv))
269269

270270
return rv
@@ -456,12 +456,19 @@ def handle_condition(cond):
456456
kwargs['having'] = having
457457

458458
if orderby:
459-
order_by_column = orderby.lstrip('-')
460-
kwargs['orderby'] = u'{}{}'.format(
461-
'-' if orderby.startswith('-') else '',
462-
order_by_column if order_by_column in derived_columns else get_snuba_column_name(
463-
order_by_column)
464-
) or None
459+
if orderby is None:
460+
orderby = []
461+
orderby = orderby if isinstance(orderby, (list, tuple)) else [orderby]
462+
translated_orderby = []
463+
464+
for field_with_order in orderby:
465+
field = field_with_order.lstrip('-')
466+
translated_orderby.append(u'{}{}'.format(
467+
'-' if field_with_order.startswith('-') else '',
468+
field if field in derived_columns else get_snuba_column_name(field)
469+
))
470+
471+
kwargs['orderby'] = translated_orderby
465472

466473
kwargs['arrayjoin'] = arrayjoin_map.get(arrayjoin, arrayjoin)
467474

tests/snuba/api/endpoints/test_organization_events_v2.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,44 @@ def test_groupby(self):
203203
assert response.data[1]['project.id'] == project.id
204204
assert response.data[1]['issue.id'] == groups[1].id
205205

206+
def test_orderby(self):
207+
self.login_as(user=self.user)
208+
project = self.create_project()
209+
self.store_event(
210+
data={
211+
'event_id': 'a' * 32,
212+
'timestamp': self.two_min_ago,
213+
},
214+
project_id=project.id,
215+
)
216+
self.store_event(
217+
data={
218+
'event_id': 'b' * 32,
219+
'timestamp': self.min_ago,
220+
},
221+
project_id=project.id,
222+
)
223+
self.store_event(
224+
data={
225+
'event_id': 'c' * 32,
226+
'timestamp': self.min_ago,
227+
},
228+
project_id=project.id,
229+
)
230+
with self.feature('organizations:events-v2'):
231+
response = self.client.get(
232+
self.url,
233+
format='json',
234+
data={
235+
'field': ['id'],
236+
'orderby': ['-timestamp', '-id']
237+
},
238+
)
239+
240+
assert response.data[0]['id'] == 'c' * 32
241+
assert response.data[1]['id'] == 'b' * 32
242+
assert response.data[2]['id'] == 'a' * 32
243+
206244
def test_special_fields(self):
207245
self.login_as(user=self.user)
208246
project = self.create_project()

0 commit comments

Comments
 (0)