mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
newdb: Enable sorting on the marked field for the find duplicated plugin
This commit is contained in:
parent
6cffe0d105
commit
2831d39da4
@ -781,7 +781,7 @@ class Cache(object):
|
|||||||
return ret
|
return ret
|
||||||
|
|
||||||
@read_api
|
@read_api
|
||||||
def multisort(self, fields, ids_to_sort=None):
|
def multisort(self, fields, ids_to_sort=None, virtual_fields=None):
|
||||||
'''
|
'''
|
||||||
Return a list of sorted book ids. If ids_to_sort is None, all book ids
|
Return a list of sorted book ids. If ids_to_sort is None, all book ids
|
||||||
are returned.
|
are returned.
|
||||||
@ -794,6 +794,7 @@ class Cache(object):
|
|||||||
else ids_to_sort)
|
else ids_to_sort)
|
||||||
get_metadata = self._get_proxy_metadata
|
get_metadata = self._get_proxy_metadata
|
||||||
lang_map = self.fields['languages'].book_value_map
|
lang_map = self.fields['languages'].book_value_map
|
||||||
|
virtual_fields = virtual_fields or {}
|
||||||
|
|
||||||
fm = {'title':'sort', 'authors':'author_sort'}
|
fm = {'title':'sort', 'authors':'author_sort'}
|
||||||
|
|
||||||
@ -801,8 +802,12 @@ class Cache(object):
|
|||||||
'Handle series type fields'
|
'Handle series type fields'
|
||||||
idx = field + '_index'
|
idx = field + '_index'
|
||||||
is_series = idx in self.fields
|
is_series = idx in self.fields
|
||||||
|
try:
|
||||||
ans = self.fields[fm.get(field, field)].sort_keys_for_books(
|
ans = self.fields[fm.get(field, field)].sort_keys_for_books(
|
||||||
get_metadata, lang_map, all_book_ids,)
|
get_metadata, lang_map, all_book_ids)
|
||||||
|
except KeyError:
|
||||||
|
ans = virtual_fields[fm.get(field, field)].sort_keys_for_books(
|
||||||
|
get_metadata, lang_map, all_book_ids)
|
||||||
if is_series:
|
if is_series:
|
||||||
idx_ans = self.fields[idx].sort_keys_for_books(
|
idx_ans = self.fields[idx].sort_keys_for_books(
|
||||||
get_metadata, lang_map, all_book_ids)
|
get_metadata, lang_map, all_book_ids)
|
||||||
|
@ -511,3 +511,14 @@ class ReadingTest(BaseTest):
|
|||||||
|
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
|
def test_marked_field(self): # {{{
|
||||||
|
' Test the marked field '
|
||||||
|
db = self.init_legacy()
|
||||||
|
db.set_marked_ids({3:1, 2:3})
|
||||||
|
ids = [1,2,3]
|
||||||
|
db.multisort([('marked', True)], only_ids=ids)
|
||||||
|
self.assertListEqual([1, 3, 2], ids)
|
||||||
|
db.multisort([('marked', False)], only_ids=ids)
|
||||||
|
self.assertListEqual([2, 3, 1], ids)
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
@ -30,6 +30,9 @@ class MarkedVirtualField(object):
|
|||||||
for book_id in candidates:
|
for book_id in candidates:
|
||||||
yield self.marked_ids.get(book_id, default_value), {book_id}
|
yield self.marked_ids.get(book_id, default_value), {book_id}
|
||||||
|
|
||||||
|
def sort_keys_for_books(self, get_metadata, lang_map, all_book_ids):
|
||||||
|
return {bid:self.marked_ids.get(bid, None) for bid in all_book_ids}
|
||||||
|
|
||||||
class TableRow(object):
|
class TableRow(object):
|
||||||
|
|
||||||
def __init__(self, book_id, view):
|
def __init__(self, book_id, view):
|
||||||
@ -219,7 +222,7 @@ class View(object):
|
|||||||
if not fields:
|
if not fields:
|
||||||
fields = [('timestamp', False)]
|
fields = [('timestamp', False)]
|
||||||
|
|
||||||
sorted_book_ids = self.cache.multisort(fields, ids_to_sort=only_ids)
|
sorted_book_ids = self.cache.multisort(fields, ids_to_sort=only_ids, virtual_fields={'marked':MarkedVirtualField(self.marked_ids)})
|
||||||
if only_ids is None:
|
if only_ids is None:
|
||||||
self._map = tuple(sorted_book_ids)
|
self._map = tuple(sorted_book_ids)
|
||||||
if len(self._map_filtered) == len(self._map):
|
if len(self._map_filtered) == len(self._map):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user