Searching done

This commit is contained in:
Kovid Goyal 2013-01-21 15:26:31 +05:30
parent 268342b9ae
commit acf4811fb6
3 changed files with 37 additions and 6 deletions

View File

@ -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,

View File

@ -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()

View File

@ -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