From 70ecb8829f8161ede22fcb38274c6e57a9819b98 Mon Sep 17 00:00:00 2001 From: Bruno Wagner Date: Fri, 17 Oct 2014 14:58:19 +0200 Subject: #102 #113 Sorting through search, and ignoring duplicate results on searches --- service/pixelated/adapter/search.py | 11 +++++++---- service/pixelated/controllers/mails_controller.py | 1 - service/test/integration/search_test.py | 11 +++++++++++ service/test/support/integration_helper.py | 2 ++ 4 files changed, 20 insertions(+), 5 deletions(-) (limited to 'service') diff --git a/service/pixelated/adapter/search.py b/service/pixelated/adapter/search.py index a187b444..237a4fcb 100644 --- a/service/pixelated/adapter/search.py +++ b/service/pixelated/adapter/search.py @@ -21,6 +21,7 @@ from whoosh.fields import * from whoosh.qparser import QueryParser from whoosh import sorting from pixelated.support.functional import unique +import dateutil.parser class SearchEngine(object): @@ -94,6 +95,7 @@ class SearchEngine(object): cc=ID(stored=False), bcc=ID(stored=False), subject=TEXT(stored=False), + date=TEXT(stored=False, sortable=True), body=TEXT(stored=False), tag=KEYWORD(stored=True, commas=True), flags=KEYWORD(stored=True, commas=True), @@ -115,6 +117,7 @@ class SearchEngine(object): index_data = { 'sender': unicode(header.get('from', '')), 'subject': unicode(header.get('subject', '')), + 'date': unicode(header.get('date', '')), 'to': unicode(header.get('to', '')), 'cc': unicode(header.get('cc', '')), 'bcc': unicode(header.get('bcc', '')), @@ -144,8 +147,8 @@ class SearchEngine(object): def _search_all_mails(self, query): with self._index.searcher() as searcher: - results = searcher.search(query, limit=None) - return [mail['ident'] for mail in results] + results = searcher.search(query, sortedby='date', limit=None) + return {mail['ident'] for mail in results} def _paginated_search_mails(self, query, window, page): page = int(page) if int(page) > 1 else 1 @@ -153,8 +156,8 @@ class SearchEngine(object): with self._index.searcher() as searcher: tags_facet = sorting.FieldFacet('tag', allow_overlap=True, maptype=sorting.Count) - results = searcher.search_page(query, page, pagelen=window, groupedby=tags_facet) - return [mail['ident'] for mail in results], sum(results.results.groups().values()) + results = searcher.search_page(query, page, pagelen=window, groupedby=tags_facet, sortedby='date') + return {mail['ident'] for mail in results}, sum(results.results.groups().values()) def prepare_query(self, query): query = ( diff --git a/service/pixelated/controllers/mails_controller.py b/service/pixelated/controllers/mails_controller.py index 6e971dcd..b850d24d 100644 --- a/service/pixelated/controllers/mails_controller.py +++ b/service/pixelated/controllers/mails_controller.py @@ -31,7 +31,6 @@ class MailsController: def mails(self, _request=request): mail_ids, total = self._search_engine.search(_request.args.get('q'), _request.args.get('w'), _request.args.get('p')) mails = self._mail_service.mails(mail_ids) - mails = sorted(mails, key=lambda mail: dateparser.parse(mail.date), reverse=True) response = { "stats": { diff --git a/service/test/integration/search_test.py b/service/test/integration/search_test.py index ac91f0b0..735f8b8d 100644 --- a/service/test/integration/search_test.py +++ b/service/test/integration/search_test.py @@ -108,3 +108,14 @@ class SearchTest(unittest.TestCase, SoledadTestBase): for tag in tags_count: if tag['name'] == mailbox: return tag['counts'] + + def test_order_by_date(self): + input_mail = MailBuilder().with_date('2014-10-15T15:15').build_input_mail() + input_mail2 = MailBuilder().with_date('2014-10-15T15:14').build_input_mail() + + self.add_mail_to_inbox(input_mail) + self.add_mail_to_inbox(input_mail2) + + results = self.get_mails_by_tag('inbox') + self.assertEqual(results[0].ident, input_mail2.ident) + self.assertEqual(results[1].ident, input_mail.ident) diff --git a/service/test/support/integration_helper.py b/service/test/support/integration_helper.py index e6d9b96f..c3233daa 100644 --- a/service/test/support/integration_helper.py +++ b/service/test/support/integration_helper.py @@ -118,6 +118,8 @@ class MailBuilder: for status in Status.from_flags(flags): self.mail['status'].append(status) + def with_date(self, date_string): + self.mail['header']['date'] = date_string return self def with_ident(self, ident): -- cgit v1.2.3