newdb: Fix bools_are_tristate preference not being respected when sorting

This commit is contained in:
Kovid Goyal 2013-08-24 16:59:49 +05:30
parent d056f8fed7
commit 7214608282
3 changed files with 18 additions and 8 deletions

View File

@ -286,14 +286,15 @@ class Cache(object):
''' '''
with self.write_lock: with self.write_lock:
self.backend.read_tables() self.backend.read_tables()
bools_are_tristate = self.backend.prefs['bools_are_tristate']
for field, table in self.backend.tables.iteritems(): for field, table in self.backend.tables.iteritems():
self.fields[field] = create_field(field, table) self.fields[field] = create_field(field, table, bools_are_tristate)
if table.metadata['datatype'] == 'composite': if table.metadata['datatype'] == 'composite':
self.composites[field] = self.fields[field] self.composites[field] = self.fields[field]
self.fields['ondevice'] = create_field('ondevice', self.fields['ondevice'] = create_field('ondevice',
VirtualTable('ondevice')) VirtualTable('ondevice'), bools_are_tristate)
for name, field in self.fields.iteritems(): for name, field in self.fields.iteritems():
if name[0] == '#' and name.endswith('_index'): if name[0] == '#' and name.endswith('_index'):

View File

@ -26,7 +26,7 @@ class Field(object):
is_many_many = False is_many_many = False
is_composite = False is_composite = False
def __init__(self, name, table): def __init__(self, name, table, bools_are_tristate):
self.name, self.table = name, table self.name, self.table = name, table
dt = self.metadata['datatype'] dt = self.metadata['datatype']
self.has_text_data = dt in {'text', 'comments', 'series', 'enumeration'} self.has_text_data = dt in {'text', 'comments', 'series', 'enumeration'}
@ -43,6 +43,10 @@ class Field(object):
self._default_sort_key = 0 self._default_sort_key = 0
elif dt == 'bool': elif dt == 'bool':
self._default_sort_key = None self._default_sort_key = None
if bools_are_tristate:
self._sort_key = lambda x:{True: 1, False: 2, None: 3}.get(x, 3)
else:
self._sort_key = lambda x:{True: 1, False: 2, None: 2}.get(x, 2)
elif dt == 'datetime': elif dt == 'datetime':
self._default_sort_key = UNDEFINED_DATE self._default_sort_key = UNDEFINED_DATE
if tweaks['sort_dates_using_visible_fields']: if tweaks['sort_dates_using_visible_fields']:
@ -248,7 +252,7 @@ class CompositeField(OneToOneField):
class OnDeviceField(OneToOneField): class OnDeviceField(OneToOneField):
def __init__(self, name, table): def __init__(self, name, table, bools_are_tristate):
self.name = name self.name = name
self.book_on_device_func = None self.book_on_device_func = None
self.is_multiple = False self.is_multiple = False
@ -565,7 +569,7 @@ class TagsField(ManyToManyField):
ans.append(c) ans.append(c)
return ans return ans
def create_field(name, table): def create_field(name, table, bools_are_tristate):
cls = { cls = {
ONE_ONE: OneToOneField, ONE_ONE: OneToOneField,
MANY_ONE: ManyToOneField, MANY_ONE: ManyToOneField,
@ -585,5 +589,5 @@ def create_field(name, table):
cls = CompositeField cls = CompositeField
elif table.metadata['datatype'] == 'series': elif table.metadata['datatype'] == 'series':
cls = SeriesField cls = SeriesField
return cls(name, table) return cls(name, table, bools_are_tristate)

View File

@ -125,7 +125,7 @@ class ReadingTest(BaseTest):
def test_sorting(self): # {{{ def test_sorting(self): # {{{
'Test sorting' 'Test sorting'
cache = self.init_cache(self.library_path) cache = self.init_cache()
for field, order in { for field, order in {
'title' : [2, 1, 3], 'title' : [2, 1, 3],
'authors': [2, 1, 3], 'authors': [2, 1, 3],
@ -147,7 +147,7 @@ class ReadingTest(BaseTest):
'#rating':[3, 2, 1], '#rating':[3, 2, 1],
'#series':[3, 2, 1], '#series':[3, 2, 1],
'#tags':[3, 2, 1], '#tags':[3, 2, 1],
'#yesno':[3, 1, 2], '#yesno':[2, 1, 3],
'#comments':[3, 2, 1], '#comments':[3, 2, 1],
}.iteritems(): }.iteritems():
x = list(reversed(order)) x = list(reversed(order))
@ -189,6 +189,11 @@ class ReadingTest(BaseTest):
c2 = self.init_cache() c2 = self.init_cache()
self.assertEqual([3, 2, 1], c2.multisort([('pubdate', True)])) self.assertEqual([3, 2, 1], c2.multisort([('pubdate', True)]))
# Test bool sorting when not tristate
cache.set_pref('bools_are_tristate', False)
c2 = self.init_cache()
self.assertEqual([2, 3, 1], c2.multisort([('#yesno', True), ('id', False)]))
# }}} # }}}
def test_get_metadata(self): # {{{ def test_get_metadata(self): # {{{