summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lesana/collection.py12
-rw-r--r--lesana/command.py6
-rw-r--r--tests/test_collection.py12
3 files changed, 28 insertions, 2 deletions
diff --git a/lesana/collection.py b/lesana/collection.py
index 9c3ea07..2ade0be 100644
--- a/lesana/collection.py
+++ b/lesana/collection.py
@@ -330,7 +330,10 @@ class Collection(object):
for field in self.indexed_fields:
queryparser.add_prefix(field['name'], field['prefix'])
- query = queryparser.parse_query(querystring, self.PARSER_FLAGS)
+ if querystring == '*':
+ query = xapian.Query.MatchAll
+ else:
+ query = queryparser.parse_query(querystring, self.PARSER_FLAGS)
self._enquire = xapian.Enquire(cache)
self._enquire.set_query(query)
@@ -373,6 +376,13 @@ class Collection(object):
offset += pagesize
def get_all_documents(self):
+ """
+ Yield all documents in the collection.
+
+ Note that the results can't be sorted, even if the collection
+ has a default_sort; if you need sorted values you need to use a
+ regular search with a query of '*'
+ """
cache = self._get_cache()
postlist = cache.postlist("")
for post in postlist:
diff --git a/lesana/command.py b/lesana/command.py
index cb053eb..bf86b95 100644
--- a/lesana/command.py
+++ b/lesana/command.py
@@ -287,7 +287,11 @@ class Search(Command):
offset = self.args.offset or 0
pagesize = self.args.pagesize or 12
collection = self.collection_class(self.args.collection)
- if self.args.query == ['*']:
+ # sorted results require a less efficient full search rather
+ # than being able to use the list of all documents.
+ if self.args.query == ['*'] and not (
+ self.args.sort or collection.settings.default_sort
+ ):
results = collection.get_all_documents()
else:
collection.start_search(
diff --git a/tests/test_collection.py b/tests/test_collection.py
index 4c95c2b..1e37589 100644
--- a/tests/test_collection.py
+++ b/tests/test_collection.py
@@ -391,6 +391,18 @@ class testComplexCollection(unittest.TestCase):
self.assertEqual(matches[2].data['order'], 'charlie')
self.assertEqual(matches[3].data['order'], 'zucchini')
+ def test_search_all_documents_default_sort(self):
+ self.collection.start_search('*')
+ res = self.collection.get_search_results()
+ matches = list(res)
+ self.assertEqual(len(matches), 9)
+ for i in range(5):
+ self.assertEqual(matches[i].data['order'], None)
+ self.assertEqual(matches[5].data['order'], 'alpha')
+ self.assertEqual(matches[6].data['order'], 'charlie')
+ self.assertEqual(matches[7].data['order'], 'delta')
+ self.assertEqual(matches[8].data['order'], 'zucchini')
+
class testCollectionWithErrors(unittest.TestCase):
def setUp(self):