(core) Respect sort_by in lookupOne, and allow reverse sorting

Summary:
Ensure that `lookupOne` (via `RecordSet.get_one`) pays attention to the `sort_by` parameter by picking the first of its sorted list of row IDs.

Allow specifying reverse sort order in `sort_by` by adding `"-"` before the column ID.

Suggested in https://grist.slack.com/archives/C0234CPPXPA/p1665756041063079

Test Plan: Extended Python lookup test

Reviewers: jarek

Reviewed By: jarek

Differential Revision: https://phab.getgrist.com/D3675
This commit is contained in:
Alex Hall
2022-10-24 11:09:44 +02:00
parent 0c82b746d0
commit 89259371a5
3 changed files with 47 additions and 6 deletions

View File

@@ -505,8 +505,15 @@ class Table(object):
lookup_map = self._get_lookup_map(col_ids)
row_id_set, rel = lookup_map.do_lookup(key)
if sort_by:
row_ids = sorted(row_id_set,
key=lambda r: column.SafeSortKey(self._get_col_value(sort_by, r, rel)))
if not isinstance(sort_by, six.string_types):
raise TypeError("sort_by must be a column ID (string)")
reverse = sort_by.startswith("-")
sort_col = sort_by.lstrip("-")
row_ids = sorted(
row_id_set,
key=lambda r: column.SafeSortKey(self._get_col_value(sort_col, r, rel)),
reverse=reverse,
)
else:
row_ids = sorted(row_id_set)
return self.RecordSet(row_ids, rel, group_by=kwargs, sort_by=sort_by)