Add 'is_csp' (is colon separated pair) attribute to field_metadata. Make get_categories and searching use it.

This commit is contained in:
Charles Haley 2011-03-02 11:22:28 +00:00
parent 82af1ac792
commit ffbab9ab52
3 changed files with 65 additions and 37 deletions

View File

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

View File

@ -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']:

View File

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