diff --git a/djaosdb/caosdb_client.py b/djaosdb/caosdb_client.py index 02f6bd0e56a94ff716ad678cc4d983dffcdc967e..662cf9415f07000d083d36e72b9e535bb9b2e820 100644 --- a/djaosdb/caosdb_client.py +++ b/djaosdb/caosdb_client.py @@ -36,12 +36,16 @@ class CountResult(Result): def __iter__(self): return iter(self._results) -def _sort_key(x, field): - return str(x[field] or "") +def _sort_key(x, field, names): + res = x[field] or "" + if res in names: + res = names[res] + return str(res) class FindResult(Result): - def __init__(self, rows, columns, sort=None, limit=None, skip=None): + def __init__(self, rows, columns, sort=None, limit=None, skip=None, + record_types=None, connection=None): super(FindResult, self).__init__() self._sort = sort @@ -52,9 +56,13 @@ class FindResult(Result): if columns is not None: if sort: fkey = list(sort)[0] + names = {} + if record_types is not None and fkey in record_types: + names = connection.list_record_names(fkey) + reverse = sort[fkey] < 0 named_columns = [dict(zip(columns, row)) for row in rows] - named_columns.sort(key=lambda x: _sort_key(x, fkey), reverse=reverse) + named_columns.sort(key=lambda x: _sort_key(x, fkey, names), reverse=reverse) self._results = named_columns[skip:upper] else: self._results = [] @@ -232,7 +240,8 @@ class DefaultCaosDBClientDelegate: res = self._find(record_type, *args, **kwargs) projection = kwargs["projection"] rows = self._get_property_values(res, projection) - return FindResult(rows, projection, sort, limit, skip) + return FindResult(rows, projection, sort, limit, skip, + record_types=self.cached_record_types, connection=self) def find_auth(self, record_type, *args, **kwargs): if record_type == "caosdb_auth_user": @@ -246,6 +255,10 @@ class DefaultCaosDBClientDelegate: return FindResult(rows, columns) return FindResult([], []) + def list_record_names(self, record_type): + res = self._query(f"SELECT name FROM RECORD '{record_type}'") + return {e.id: e.name for e in res if e.name is not None} + def list_record_type_names(self): res = self._query("SELECT name FROM RECORDTYPE") return [e.name for e in res if e.name is not None] + ["caosdb_auth_user"] @@ -364,7 +377,9 @@ class DefaultCaosDBClientDelegate: if count: return CountResult(res, count) rows = self._get_property_values(res, projection) - return FindResult(rows, projection, sort, limit, skip) + return FindResult(rows, projection, sort, limit, skip, + record_types=self.cached_record_types, + connection=self) def _generate_query(self, record_type, sort, projection, filter, count): prefix = 'FIND'