From 4341f5f7750a34986b3ef3a82851dc27f39d084e Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Tue, 14 Dec 2021 14:30:55 +0100
Subject: [PATCH] Fix sorting with names

---
 djaosdb/caosdb_client.py | 27 +++++++++++++++++++++------
 1 file changed, 21 insertions(+), 6 deletions(-)

diff --git a/djaosdb/caosdb_client.py b/djaosdb/caosdb_client.py
index 02f6bd0..662cf94 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'
-- 
GitLab