mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-08 18:54:09 -04:00
Add 'is_csp' (is colon separated pair) attribute to field_metadata. Make get_categories and searching use it.
This commit is contained in:
parent
82af1ac792
commit
ffbab9ab52
@ -455,6 +455,7 @@ class ResultCache(SearchQueryParser): # {{{
|
|||||||
valq_mkind, valq = self._matchkind(query)
|
valq_mkind, valq = self._matchkind(query)
|
||||||
|
|
||||||
loc = self.field_metadata[location]['rec_index']
|
loc = self.field_metadata[location]['rec_index']
|
||||||
|
split_char = self.field_metadata[location]['is_multiple']
|
||||||
for id_ in candidates:
|
for id_ in candidates:
|
||||||
item = self._data[id_]
|
item = self._data[id_]
|
||||||
if item is None:
|
if item is None:
|
||||||
@ -465,7 +466,7 @@ class ResultCache(SearchQueryParser): # {{{
|
|||||||
matches.add(id_)
|
matches.add(id_)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
pairs = [p.strip() for p in item[loc].split(',')]
|
pairs = [p.strip() for p in item[loc].split(split_char)]
|
||||||
for pair in pairs:
|
for pair in pairs:
|
||||||
parts = pair.split(':')
|
parts = pair.split(':')
|
||||||
if len(parts) != 2:
|
if len(parts) != 2:
|
||||||
@ -569,12 +570,13 @@ class ResultCache(SearchQueryParser): # {{{
|
|||||||
return self.get_numeric_matches(location, query[1:],
|
return self.get_numeric_matches(location, query[1:],
|
||||||
candidates, val_func=vf)
|
candidates, val_func=vf)
|
||||||
|
|
||||||
# special case: identifiers. isbn is a special case within the case
|
# special case: colon-separated fields such as identifiers. isbn
|
||||||
if location == 'identifiers':
|
# is a special case within the case
|
||||||
if original_location == 'isbn':
|
if fm['is_csp']:
|
||||||
return self.get_keypair_matches('identifiers',
|
if location == 'identifiers' and original_location == 'isbn':
|
||||||
'=isbn:'+query, candidates)
|
return self.get_keypair_matches('identifiers',
|
||||||
return self.get_keypair_matches(location, query, candidates)
|
'=isbn:'+query, candidates)
|
||||||
|
return self.get_keypair_matches(location, query, candidates)
|
||||||
|
|
||||||
# check for user categories
|
# check for user categories
|
||||||
if len(location) >= 2 and location.startswith('@'):
|
if len(location) >= 2 and location.startswith('@'):
|
||||||
|
@ -1273,7 +1273,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
|
|||||||
for category in tb_cats.keys():
|
for category in tb_cats.keys():
|
||||||
cat = tb_cats[category]
|
cat = tb_cats[category]
|
||||||
if not cat['is_category'] or cat['kind'] in ['user', 'search'] \
|
if not cat['is_category'] or cat['kind'] in ['user', 'search'] \
|
||||||
or category in ['news', 'formats', 'identifiers']:
|
or category in ['news', 'formats'] or cat['is_csp']:
|
||||||
continue
|
continue
|
||||||
# Get the ids for the item values
|
# Get the ids for the item values
|
||||||
if not cat['is_custom']:
|
if not cat['is_custom']:
|
||||||
|
@ -80,6 +80,8 @@ class FieldMetadata(dict):
|
|||||||
|
|
||||||
rec_index: the index of the field in the db metadata record.
|
rec_index: the index of the field in the db metadata record.
|
||||||
|
|
||||||
|
is_csp: field contains colon-separated pairs. Must also be text, is_multiple
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
VALID_DATA_TYPES = frozenset([None, 'rating', 'text', 'comments', 'datetime',
|
VALID_DATA_TYPES = frozenset([None, 'rating', 'text', 'comments', 'datetime',
|
||||||
@ -98,7 +100,8 @@ class FieldMetadata(dict):
|
|||||||
'name':_('Authors'),
|
'name':_('Authors'),
|
||||||
'search_terms':['authors', 'author'],
|
'search_terms':['authors', 'author'],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':True}),
|
'is_category':True,
|
||||||
|
'is_csp': False}),
|
||||||
('series', {'table':'series',
|
('series', {'table':'series',
|
||||||
'column':'name',
|
'column':'name',
|
||||||
'link_column':'series',
|
'link_column':'series',
|
||||||
@ -109,7 +112,8 @@ class FieldMetadata(dict):
|
|||||||
'name':_('Series'),
|
'name':_('Series'),
|
||||||
'search_terms':['series'],
|
'search_terms':['series'],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':True}),
|
'is_category':True,
|
||||||
|
'is_csp': False}),
|
||||||
('formats', {'table':None,
|
('formats', {'table':None,
|
||||||
'column':None,
|
'column':None,
|
||||||
'datatype':'text',
|
'datatype':'text',
|
||||||
@ -118,7 +122,8 @@ class FieldMetadata(dict):
|
|||||||
'name':_('Formats'),
|
'name':_('Formats'),
|
||||||
'search_terms':['formats', 'format'],
|
'search_terms':['formats', 'format'],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':True}),
|
'is_category':True,
|
||||||
|
'is_csp': False}),
|
||||||
('publisher', {'table':'publishers',
|
('publisher', {'table':'publishers',
|
||||||
'column':'name',
|
'column':'name',
|
||||||
'link_column':'publisher',
|
'link_column':'publisher',
|
||||||
@ -129,7 +134,8 @@ class FieldMetadata(dict):
|
|||||||
'name':_('Publishers'),
|
'name':_('Publishers'),
|
||||||
'search_terms':['publisher'],
|
'search_terms':['publisher'],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':True}),
|
'is_category':True,
|
||||||
|
'is_csp': False}),
|
||||||
('rating', {'table':'ratings',
|
('rating', {'table':'ratings',
|
||||||
'column':'rating',
|
'column':'rating',
|
||||||
'link_column':'rating',
|
'link_column':'rating',
|
||||||
@ -140,7 +146,8 @@ class FieldMetadata(dict):
|
|||||||
'name':_('Ratings'),
|
'name':_('Ratings'),
|
||||||
'search_terms':['rating'],
|
'search_terms':['rating'],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':True}),
|
'is_category':True,
|
||||||
|
'is_csp': False}),
|
||||||
('news', {'table':'news',
|
('news', {'table':'news',
|
||||||
'column':'name',
|
'column':'name',
|
||||||
'category_sort':'name',
|
'category_sort':'name',
|
||||||
@ -150,7 +157,8 @@ class FieldMetadata(dict):
|
|||||||
'name':_('News'),
|
'name':_('News'),
|
||||||
'search_terms':[],
|
'search_terms':[],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':True}),
|
'is_category':True,
|
||||||
|
'is_csp': False}),
|
||||||
('tags', {'table':'tags',
|
('tags', {'table':'tags',
|
||||||
'column':'name',
|
'column':'name',
|
||||||
'link_column': 'tag',
|
'link_column': 'tag',
|
||||||
@ -161,7 +169,8 @@ class FieldMetadata(dict):
|
|||||||
'name':_('Tags'),
|
'name':_('Tags'),
|
||||||
'search_terms':['tags', 'tag'],
|
'search_terms':['tags', 'tag'],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':True}),
|
'is_category':True,
|
||||||
|
'is_csp': False}),
|
||||||
('identifiers', {'table':None,
|
('identifiers', {'table':None,
|
||||||
'column':None,
|
'column':None,
|
||||||
'datatype':'text',
|
'datatype':'text',
|
||||||
@ -170,7 +179,8 @@ class FieldMetadata(dict):
|
|||||||
'name':_('Identifiers'),
|
'name':_('Identifiers'),
|
||||||
'search_terms':['identifiers', 'identifier', 'isbn'],
|
'search_terms':['identifiers', 'identifier', 'isbn'],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':True}),
|
'is_category':True,
|
||||||
|
'is_csp': True}),
|
||||||
('author_sort',{'table':None,
|
('author_sort',{'table':None,
|
||||||
'column':None,
|
'column':None,
|
||||||
'datatype':'text',
|
'datatype':'text',
|
||||||
@ -179,7 +189,8 @@ class FieldMetadata(dict):
|
|||||||
'name':None,
|
'name':None,
|
||||||
'search_terms':['author_sort'],
|
'search_terms':['author_sort'],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':False}),
|
'is_category':False,
|
||||||
|
'is_csp': False}),
|
||||||
('au_map', {'table':None,
|
('au_map', {'table':None,
|
||||||
'column':None,
|
'column':None,
|
||||||
'datatype':'text',
|
'datatype':'text',
|
||||||
@ -188,7 +199,8 @@ class FieldMetadata(dict):
|
|||||||
'name':None,
|
'name':None,
|
||||||
'search_terms':[],
|
'search_terms':[],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':False}),
|
'is_category':False,
|
||||||
|
'is_csp': False}),
|
||||||
('comments', {'table':None,
|
('comments', {'table':None,
|
||||||
'column':None,
|
'column':None,
|
||||||
'datatype':'text',
|
'datatype':'text',
|
||||||
@ -196,7 +208,9 @@ class FieldMetadata(dict):
|
|||||||
'kind':'field',
|
'kind':'field',
|
||||||
'name':_('Comments'),
|
'name':_('Comments'),
|
||||||
'search_terms':['comments', 'comment'],
|
'search_terms':['comments', 'comment'],
|
||||||
'is_custom':False, 'is_category':False}),
|
'is_custom':False,
|
||||||
|
'is_category':False,
|
||||||
|
'is_csp': False}),
|
||||||
('cover', {'table':None,
|
('cover', {'table':None,
|
||||||
'column':None,
|
'column':None,
|
||||||
'datatype':'int',
|
'datatype':'int',
|
||||||
@ -205,7 +219,8 @@ class FieldMetadata(dict):
|
|||||||
'name':None,
|
'name':None,
|
||||||
'search_terms':['cover'],
|
'search_terms':['cover'],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':False}),
|
'is_category':False,
|
||||||
|
'is_csp': False}),
|
||||||
('id', {'table':None,
|
('id', {'table':None,
|
||||||
'column':None,
|
'column':None,
|
||||||
'datatype':'int',
|
'datatype':'int',
|
||||||
@ -214,7 +229,8 @@ class FieldMetadata(dict):
|
|||||||
'name':None,
|
'name':None,
|
||||||
'search_terms':[],
|
'search_terms':[],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':False}),
|
'is_category':False,
|
||||||
|
'is_csp': False}),
|
||||||
('last_modified', {'table':None,
|
('last_modified', {'table':None,
|
||||||
'column':None,
|
'column':None,
|
||||||
'datatype':'datetime',
|
'datatype':'datetime',
|
||||||
@ -223,7 +239,8 @@ class FieldMetadata(dict):
|
|||||||
'name':_('Date'),
|
'name':_('Date'),
|
||||||
'search_terms':['last_modified'],
|
'search_terms':['last_modified'],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':False}),
|
'is_category':False,
|
||||||
|
'is_csp': False}),
|
||||||
('ondevice', {'table':None,
|
('ondevice', {'table':None,
|
||||||
'column':None,
|
'column':None,
|
||||||
'datatype':'text',
|
'datatype':'text',
|
||||||
@ -232,7 +249,8 @@ class FieldMetadata(dict):
|
|||||||
'name':_('On Device'),
|
'name':_('On Device'),
|
||||||
'search_terms':['ondevice'],
|
'search_terms':['ondevice'],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':False}),
|
'is_category':False,
|
||||||
|
'is_csp': False}),
|
||||||
('path', {'table':None,
|
('path', {'table':None,
|
||||||
'column':None,
|
'column':None,
|
||||||
'datatype':'text',
|
'datatype':'text',
|
||||||
@ -241,7 +259,8 @@ class FieldMetadata(dict):
|
|||||||
'name':None,
|
'name':None,
|
||||||
'search_terms':[],
|
'search_terms':[],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':False}),
|
'is_category':False,
|
||||||
|
'is_csp': False}),
|
||||||
('pubdate', {'table':None,
|
('pubdate', {'table':None,
|
||||||
'column':None,
|
'column':None,
|
||||||
'datatype':'datetime',
|
'datatype':'datetime',
|
||||||
@ -250,7 +269,8 @@ class FieldMetadata(dict):
|
|||||||
'name':_('Published'),
|
'name':_('Published'),
|
||||||
'search_terms':['pubdate'],
|
'search_terms':['pubdate'],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':False}),
|
'is_category':False,
|
||||||
|
'is_csp': False}),
|
||||||
('series_index',{'table':None,
|
('series_index',{'table':None,
|
||||||
'column':None,
|
'column':None,
|
||||||
'datatype':'float',
|
'datatype':'float',
|
||||||
@ -259,7 +279,8 @@ class FieldMetadata(dict):
|
|||||||
'name':None,
|
'name':None,
|
||||||
'search_terms':['series_index'],
|
'search_terms':['series_index'],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':False}),
|
'is_category':False,
|
||||||
|
'is_csp': False}),
|
||||||
('sort', {'table':None,
|
('sort', {'table':None,
|
||||||
'column':None,
|
'column':None,
|
||||||
'datatype':'text',
|
'datatype':'text',
|
||||||
@ -268,7 +289,8 @@ class FieldMetadata(dict):
|
|||||||
'name':_('Title Sort'),
|
'name':_('Title Sort'),
|
||||||
'search_terms':['title_sort'],
|
'search_terms':['title_sort'],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':False}),
|
'is_category':False,
|
||||||
|
'is_csp': False}),
|
||||||
('size', {'table':None,
|
('size', {'table':None,
|
||||||
'column':None,
|
'column':None,
|
||||||
'datatype':'float',
|
'datatype':'float',
|
||||||
@ -277,7 +299,8 @@ class FieldMetadata(dict):
|
|||||||
'name':_('Size (MB)'),
|
'name':_('Size (MB)'),
|
||||||
'search_terms':['size'],
|
'search_terms':['size'],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':False}),
|
'is_category':False,
|
||||||
|
'is_csp': False}),
|
||||||
('timestamp', {'table':None,
|
('timestamp', {'table':None,
|
||||||
'column':None,
|
'column':None,
|
||||||
'datatype':'datetime',
|
'datatype':'datetime',
|
||||||
@ -286,7 +309,8 @@ class FieldMetadata(dict):
|
|||||||
'name':_('Date'),
|
'name':_('Date'),
|
||||||
'search_terms':['date'],
|
'search_terms':['date'],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':False}),
|
'is_category':False,
|
||||||
|
'is_csp': False}),
|
||||||
('title', {'table':None,
|
('title', {'table':None,
|
||||||
'column':None,
|
'column':None,
|
||||||
'datatype':'text',
|
'datatype':'text',
|
||||||
@ -295,7 +319,8 @@ class FieldMetadata(dict):
|
|||||||
'name':_('Title'),
|
'name':_('Title'),
|
||||||
'search_terms':['title'],
|
'search_terms':['title'],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':False}),
|
'is_category':False,
|
||||||
|
'is_csp': False}),
|
||||||
('uuid', {'table':None,
|
('uuid', {'table':None,
|
||||||
'column':None,
|
'column':None,
|
||||||
'datatype':'text',
|
'datatype':'text',
|
||||||
@ -304,7 +329,8 @@ class FieldMetadata(dict):
|
|||||||
'name':None,
|
'name':None,
|
||||||
'search_terms':[],
|
'search_terms':[],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':False}),
|
'is_category':False,
|
||||||
|
'is_csp': False}),
|
||||||
]
|
]
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
@ -433,7 +459,7 @@ class FieldMetadata(dict):
|
|||||||
return l
|
return l
|
||||||
|
|
||||||
def add_custom_field(self, label, table, column, datatype, colnum, name,
|
def add_custom_field(self, label, table, column, datatype, colnum, name,
|
||||||
display, is_editable, is_multiple, is_category):
|
display, is_editable, is_multiple, is_category, is_csp):
|
||||||
key = self.custom_field_prefix + label
|
key = self.custom_field_prefix + label
|
||||||
if key in self._tb_cats:
|
if key in self._tb_cats:
|
||||||
raise ValueError('Duplicate custom field [%s]'%(label))
|
raise ValueError('Duplicate custom field [%s]'%(label))
|
||||||
@ -446,7 +472,7 @@ class FieldMetadata(dict):
|
|||||||
'colnum':colnum, 'display':display,
|
'colnum':colnum, 'display':display,
|
||||||
'is_custom':True, 'is_category':is_category,
|
'is_custom':True, 'is_category':is_category,
|
||||||
'link_column':'value','category_sort':'value',
|
'link_column':'value','category_sort':'value',
|
||||||
'is_editable': is_editable,}
|
'is_csp' : is_csp, 'is_editable': is_editable,}
|
||||||
self._add_search_terms_to_map(key, [key])
|
self._add_search_terms_to_map(key, [key])
|
||||||
self.custom_label_to_key_map[label] = key
|
self.custom_label_to_key_map[label] = key
|
||||||
if datatype == 'series':
|
if datatype == 'series':
|
||||||
@ -458,7 +484,7 @@ class FieldMetadata(dict):
|
|||||||
'colnum':None, 'display':{},
|
'colnum':None, 'display':{},
|
||||||
'is_custom':False, 'is_category':False,
|
'is_custom':False, 'is_category':False,
|
||||||
'link_column':None, 'category_sort':None,
|
'link_column':None, 'category_sort':None,
|
||||||
'is_editable': False,}
|
'is_editable': False, 'is_csp': False}
|
||||||
self._add_search_terms_to_map(key, [key])
|
self._add_search_terms_to_map(key, [key])
|
||||||
self.custom_label_to_key_map[label+'_index'] = key
|
self.custom_label_to_key_map[label+'_index'] = key
|
||||||
|
|
||||||
@ -507,7 +533,7 @@ class FieldMetadata(dict):
|
|||||||
'datatype':None, 'is_multiple':None,
|
'datatype':None, 'is_multiple':None,
|
||||||
'kind':'user', 'name':name,
|
'kind':'user', 'name':name,
|
||||||
'search_terms':st, 'is_custom':False,
|
'search_terms':st, 'is_custom':False,
|
||||||
'is_category':True}
|
'is_category':True, 'is_csp': False}
|
||||||
self._add_search_terms_to_map(label, st)
|
self._add_search_terms_to_map(label, st)
|
||||||
|
|
||||||
def add_search_category(self, label, name):
|
def add_search_category(self, label, name):
|
||||||
@ -516,8 +542,8 @@ class FieldMetadata(dict):
|
|||||||
self._tb_cats[label] = {'table':None, 'column':None,
|
self._tb_cats[label] = {'table':None, 'column':None,
|
||||||
'datatype':None, 'is_multiple':None,
|
'datatype':None, 'is_multiple':None,
|
||||||
'kind':'search', 'name':name,
|
'kind':'search', 'name':name,
|
||||||
'search_terms':[], 'is_custom':False,
|
'search_terms':[], 'is_custom':False,
|
||||||
'is_category':True}
|
'is_category':True, 'is_csp': False}
|
||||||
|
|
||||||
def set_field_record_index(self, label, index, prefer_custom=False):
|
def set_field_record_index(self, label, index, prefer_custom=False):
|
||||||
if prefer_custom:
|
if prefer_custom:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user