mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Searching done
This commit is contained in:
parent
268342b9ae
commit
acf4811fb6
@ -7,7 +7,7 @@ __license__ = 'GPL v3'
|
|||||||
__copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>'
|
__copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>'
|
||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
import os
|
import os, traceback
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from functools import wraps, partial
|
from functools import wraps, partial
|
||||||
|
|
||||||
@ -18,6 +18,7 @@ from calibre.db.tables import VirtualTable
|
|||||||
from calibre.db.lazy import FormatMetadata, FormatsList
|
from calibre.db.lazy import FormatMetadata, FormatsList
|
||||||
from calibre.ebooks.metadata.book.base import Metadata
|
from calibre.ebooks.metadata.book.base import Metadata
|
||||||
from calibre.utils.date import now
|
from calibre.utils.date import now
|
||||||
|
from calibre.utils.icu import sort_key
|
||||||
|
|
||||||
def api(f):
|
def api(f):
|
||||||
f.is_cache_api = True
|
f.is_cache_api = True
|
||||||
@ -67,6 +68,36 @@ class Cache(object):
|
|||||||
lock = self.read_lock if ira else self.write_lock
|
lock = self.read_lock if ira else self.write_lock
|
||||||
setattr(self, name, wrap_simple(lock, func))
|
setattr(self, name, wrap_simple(lock, func))
|
||||||
|
|
||||||
|
self.initialize_dynamic()
|
||||||
|
|
||||||
|
def initialize_dynamic(self):
|
||||||
|
# Reconstruct the user categories, putting them into field_metadata
|
||||||
|
# Assumption is that someone else will fix them if they change.
|
||||||
|
self.field_metadata.remove_dynamic_categories()
|
||||||
|
for user_cat in sorted(self.pref('user_categories', {}).iterkeys(), key=sort_key):
|
||||||
|
cat_name = '@' + user_cat # add the '@' to avoid name collision
|
||||||
|
self.field_metadata.add_user_category(label=cat_name, name=user_cat)
|
||||||
|
|
||||||
|
# add grouped search term user categories
|
||||||
|
muc = frozenset(self.pref('grouped_search_make_user_categories', []))
|
||||||
|
for cat in sorted(self.pref('grouped_search_terms', {}).iterkeys(), key=sort_key):
|
||||||
|
if cat in muc:
|
||||||
|
# There is a chance that these can be duplicates of an existing
|
||||||
|
# user category. Print the exception and continue.
|
||||||
|
try:
|
||||||
|
self.field_metadata.add_user_category(label=u'@' + cat, name=cat)
|
||||||
|
except:
|
||||||
|
traceback.print_exc()
|
||||||
|
|
||||||
|
# TODO: Saved searches
|
||||||
|
# if len(saved_searches().names()):
|
||||||
|
# self.field_metadata.add_search_category(label='search', name=_('Searches'))
|
||||||
|
|
||||||
|
self.field_metadata.add_grouped_search_terms(
|
||||||
|
self.pref('grouped_search_terms', {}))
|
||||||
|
|
||||||
|
self._search_api.change_locations(self.field_metadata.get_search_terms())
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def field_metadata(self):
|
def field_metadata(self):
|
||||||
return self.backend.field_metadata
|
return self.backend.field_metadata
|
||||||
@ -319,8 +350,8 @@ class Cache(object):
|
|||||||
return ans
|
return ans
|
||||||
|
|
||||||
@read_api
|
@read_api
|
||||||
def pref(self, name):
|
def pref(self, name, default=None):
|
||||||
return self.backend.prefs[name]
|
return self.backend.prefs.get(name, default)
|
||||||
|
|
||||||
@api
|
@api
|
||||||
def get_metadata(self, book_id,
|
def get_metadata(self, book_id,
|
||||||
|
@ -650,7 +650,7 @@ class Parser(SearchQueryParser):
|
|||||||
|
|
||||||
class Search(object):
|
class Search(object):
|
||||||
|
|
||||||
def __init__(self, all_search_locations):
|
def __init__(self, all_search_locations=()):
|
||||||
self.all_search_locations = all_search_locations
|
self.all_search_locations = all_search_locations
|
||||||
self.date_search = DateSearch()
|
self.date_search = DateSearch()
|
||||||
self.num_search = NumericSearch()
|
self.num_search = NumericSearch()
|
||||||
|
@ -222,13 +222,13 @@ class ReadingTest(BaseTest):
|
|||||||
'title:="Title One"', 'title:~title', '#enum:=one', '#enum:tw',
|
'title:="Title One"', 'title:~title', '#enum:=one', '#enum:tw',
|
||||||
'#enum:false', '#enum:true', 'series:one', 'tags:one', 'tags:true',
|
'#enum:false', '#enum:true', 'series:one', 'tags:one', 'tags:true',
|
||||||
'tags:false', '2', 'one', '20.02', '"publisher one"',
|
'tags:false', '2', 'one', '20.02', '"publisher one"',
|
||||||
|
'"my comments one"',
|
||||||
|
|
||||||
# User categories
|
# User categories
|
||||||
# '@Good Authors:One',
|
'@Good Authors:One', '@Good Series.good tags:two',
|
||||||
|
|
||||||
# TODO: Tests for searching the size column and
|
# TODO: Tests for searching the size column and
|
||||||
# cover:true|false
|
# cover:true|false
|
||||||
# TODO: Tests for user categories searching
|
|
||||||
)}
|
)}
|
||||||
old = None
|
old = None
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user