From cd42a1c644f027f0977cf038191e11a970f67cab Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 13 Dec 2021 19:26:06 +0530 Subject: [PATCH] Avoid parsing the undefined number sort key tweak for every undefined number --- src/calibre/db/fields.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/calibre/db/fields.py b/src/calibre/db/fields.py index 9fc05e0d7f..450550c5fa 100644 --- a/src/calibre/db/fields.py +++ b/src/calibre/db/fields.py @@ -6,6 +6,7 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' +import sys from threading import Lock from collections import defaultdict, Counter from functools import partial @@ -33,15 +34,15 @@ def sort_value_for_undefined_numbers(): if t == 'maximum': return float('inf') return float(t) - except: - print('***** Bad value in undefined sort number tweak', t) + except Exception: + print('***** Bad value in undefined sort number tweak', t, file=sys.stderr) return 0 -def numeric_sort_key(x): +def numeric_sort_key(defval, x): # It isn't clear whether this function can ever be called with a non-numeric # argument, but we check just in case - return x if type(x) in (int, float) else sort_value_for_undefined_numbers() + return x if type(x) in (int, float) else defval IDENTITY = lambda x: x @@ -75,7 +76,7 @@ class Field: if dt in {'int', 'float', 'rating'}: self._default_sort_key = sort_value_for_undefined_numbers() - self._sort_key = numeric_sort_key + self._sort_key = partial(numeric_sort_key, self._default_sort_key) elif dt == 'bool': self._default_sort_key = None self._sort_key = bool_sort_key(bools_are_tristate) @@ -247,6 +248,7 @@ class CompositeField(OneToOneField): composite_sort = m.get('display', {}).get('composite_sort', None) if composite_sort == 'number': self._default_sort_key = 0 + self._undefined_number_sort_key = sort_value_for_undefined_numbers() self._sort_key = self.number_sort_key elif composite_sort == 'date': self._default_sort_key = UNDEFINED_DATE @@ -277,7 +279,7 @@ class CompositeField(OneToOneField): val = val[:(-2 if p > 1 else -1)].strip() val = atof(val) * p except (TypeError, AttributeError, ValueError, KeyError): - val = sort_value_for_undefined_numbers() + val = self._undefined_number_sort_key return val def date_sort_key(self, val):