diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 7b4c66c8b8..8365cfe773 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -254,6 +254,12 @@ class ResultCache(SearchQueryParser): # {{{ if field_metadata[key]['datatype'] == 'composite': self.composites.append((key, field_metadata[key]['rec_index'])) + self.enumerations = [] + for key in field_metadata: + if field_metadata[key]['datatype'] == 'enumeration': + self.enumerations.append((field_metadata[key]['display']['enum_values'][0], + field_metadata[key]['rec_index'])) + def __getitem__(self, row): return self._data[self._map_filtered[row]] @@ -691,6 +697,10 @@ class ResultCache(SearchQueryParser): # {{{ mi = db.get_metadata(id, index_is_id=True) for k,c in self.composites: self._data[id][c] = mi.get(k, None) + if len(self.enumerations) > 0: + for v,c in self.enumerations: + if self._data[id][c] is None: + self._data[id][c] = v except IndexError: return None try: @@ -711,6 +721,10 @@ class ResultCache(SearchQueryParser): # {{{ mi = db.get_metadata(id, index_is_id=True) for k,c in self.composites: self._data[id][c] = mi.get(k) + if len(self.enumerations) > 0: + for v,c in self.self._data[id][c]: + if self._data[id][c] is None: + self._data[id][c] = v self._map[0:0] = ids self._map_filtered[0:0] = ids @@ -740,6 +754,10 @@ class ResultCache(SearchQueryParser): # {{{ mi = db.get_metadata(item[0], index_is_id=True) for k,c in self.composites: item[c] = mi.get(k) + if len(self.enumerations) > 0: + for v,c in self.enumerations: + if item[c] is None: + item[c] = v self._map = [i[0] for i in self._data if i is not None] if field is not None: diff --git a/src/calibre/library/custom_columns.py b/src/calibre/library/custom_columns.py index 9444746c2a..dc3a67e860 100644 --- a/src/calibre/library/custom_columns.py +++ b/src/calibre/library/custom_columns.py @@ -525,30 +525,18 @@ class CustomColumns(object): display = data['display'] table, lt = self.custom_table_names(data['num']) if data['normalized']: - if data['datatype'] == 'enumeration': - query = '%s.value' - line = ''' - val_for_enum(\' - SELECT {table}.value FROM {lt} - AS link INNER JOIN {table} ON(link.value={table}.id) - WHERE link.book=?\', - \'{default}\', books.id) custom_{num} - '''.format(lt=lt, table=table, - default=data['display']['enum_values'][0], - num=data['num']) - else: - query = '%s.value' - if data['is_multiple']: - query = 'group_concat(%s.value, "|")' - if not display.get('sort_alpha', False): - query = 'sort_concat(link.id, %s.value)' - line = '''(SELECT {query} FROM {lt} AS link INNER JOIN - {table} ON(link.value={table}.id) WHERE link.book=books.id) - custom_{num} - '''.format(query=query%table, lt=lt, table=table, num=data['num']) - if data['datatype'] == 'series': - line += ''',(SELECT extra FROM {lt} WHERE {lt}.book=books.id) - custom_index_{num}'''.format(lt=lt, num=data['num']) + query = '%s.value' + if data['is_multiple']: + query = 'group_concat(%s.value, "|")' + if not display.get('sort_alpha', False): + query = 'sort_concat(link.id, %s.value)' + line = '''(SELECT {query} FROM {lt} AS link INNER JOIN + {table} ON(link.value={table}.id) WHERE link.book=books.id) + custom_{num} + '''.format(query=query%table, lt=lt, table=table, num=data['num']) + if data['datatype'] == 'series': + line += ''',(SELECT extra FROM {lt} WHERE {lt}.book=books.id) + custom_index_{num}'''.format(lt=lt, num=data['num']) else: line = ''' (SELECT value FROM {table} WHERE book=books.id) custom_{num} diff --git a/src/calibre/library/sqlite.py b/src/calibre/library/sqlite.py index 9682bd7ec6..7a86447090 100644 --- a/src/calibre/library/sqlite.py +++ b/src/calibre/library/sqlite.py @@ -115,18 +115,6 @@ def pynocase(one, two, encoding='utf-8'): pass return cmp(one.lower(), two.lower()) -def enum_col_value(select, def_val, id, conn=None): - try: - v = conn.get(select, (id,), all=False) - if v is None: - v = def_val - except Exception, e: - if DEBUG: - print 'enum_col_value failed' - print e - v = def_val - return v - def load_c_extensions(conn, debug=DEBUG): try: conn.enable_load_extension(True) @@ -176,8 +164,6 @@ class DBThread(Thread): self.conn.create_function('author_to_author_sort', 1, _author_to_author_sort) self.conn.create_function('uuid4', 0, lambda : str(uuid.uuid4())) - self.conn.create_function('val_for_enum', 3, - partial(enum_col_value, conn=self.conn)) # Dummy functions for dynamically created filters self.conn.create_function('books_list_filter', 1, lambda x: 1)