multisort: Sort only once on any given field

This commit is contained in:
Kovid Goyal 2013-08-29 12:33:25 +05:30
parent c16d95877e
commit c10d73e5c6

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, traceback, random, shutil, re import os, traceback, random, shutil, re, operator
from io import BytesIO from io import BytesIO
from collections import defaultdict from collections import defaultdict
from functools import wraps from functools import wraps
@ -23,7 +23,7 @@ from calibre.db.errors import NoSuchFormat
from calibre.db.fields import create_field, IDENTITY from calibre.db.fields import create_field, IDENTITY
from calibre.db.search import Search from calibre.db.search import Search
from calibre.db.tables import VirtualTable from calibre.db.tables import VirtualTable
from calibre.db.write import get_series_values from calibre.db.write import get_series_values, uniq
from calibre.db.lazy import FormatMetadata, FormatsList, ProxyMetadata from calibre.db.lazy import FormatMetadata, FormatsList, ProxyMetadata
from calibre.ebooks import check_ebook_format from calibre.ebooks import check_ebook_format
from calibre.ebooks.metadata import string_to_authors, author_to_author_sort, get_title_sort_pat from calibre.ebooks.metadata import string_to_authors, author_to_author_sort, get_title_sort_pat
@ -830,6 +830,9 @@ class Cache(object):
return skf return skf
return func return func
# Sort only once on any given field
fields = uniq(fields, operator.itemgetter(0))
if len(fields) == 1: if len(fields) == 1:
return sorted(ids_to_sort, key=sort_key_func(fields[0][0]), return sorted(ids_to_sort, key=sort_key_func(fields[0][0]),
reverse=not fields[0][1]) reverse=not fields[0][1])