From 7c9b460f521c241194fbcaccddd00b44f45b8a3f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 25 Aug 2013 11:43:15 +0530 Subject: [PATCH] Fix sorting for is_multiple custom cols --- src/calibre/db/fields.py | 7 +++++++ src/calibre/db/tests/reading.py | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/src/calibre/db/fields.py b/src/calibre/db/fields.py index 88c6908de7..fc7bee2c51 100644 --- a/src/calibre/db/fields.py +++ b/src/calibre/db/fields.py @@ -205,9 +205,16 @@ class CompositeField(OneToOneField): self._default_sort_key = None self._bool_sort_key = bool_sort_key(bools_are_tristate) self._sort_key = self.bool_sort_key + elif self.splitter is not None: + self._default_sort_key = () + self._sort_key = self.multiple_sort_key else: self._sort_key = sort_key + def multiple_sort_key(self, val): + val = (sort_key(x.strip()) for x in (val or '').split(self.splitter)) + return tuple(sorted(val)) + def number_sort_key(self, val): try: p = 1 diff --git a/src/calibre/db/tests/reading.py b/src/calibre/db/tests/reading.py index f2ad7337b3..2dcd519cad 100644 --- a/src/calibre/db/tests/reading.py +++ b/src/calibre/db/tests/reading.py @@ -556,6 +556,7 @@ class ReadingTest(BaseTest): # }}} def test_composites(self): # {{{ + ' Test sorting and searching in composite columns ' from calibre.utils.date import parse_only_date as p cache = self.init_cache() cache.create_custom_column('mult', 'CC1', 'composite', True, display={'composite_template': 'b,a,c'}) @@ -565,6 +566,7 @@ class ReadingTest(BaseTest): cache.create_custom_column('ccdate', 'CC5', 'composite', False, display={'composite_template': '{pubdate:format_date(d-M-yy)}', 'composite_sort':'date'}) cache.create_custom_column('bool', 'CC6', 'composite', False, display={'composite_template': '{#yesno}', 'composite_sort':'bool'}) + cache.create_custom_column('ccm', 'CC7', 'composite', True, display={'composite_template': '{#tags}'}) cache = self.init_cache() # Test searching @@ -585,5 +587,9 @@ class ReadingTest(BaseTest): # Test bool sorting self.assertEqual([2, 1, 3], cache.multisort([('#bool', True)])) + + # Test is_multiple sorting + cache.set_field('#tags', {1:'b, a, c', 2:'a, b, c', 3:'a, c, b'}) + self.assertEqual([1, 2, 3], cache.multisort([('#ccm', True)])) # }}}