Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id C53D1429E25 for ; Fri, 13 Jan 2012 15:07:12 -0800 (PST) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Spam-Flag: NO X-Spam-Score: -0.7 X-Spam-Level: X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5 tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Mydmqg6Okl-D for ; Fri, 13 Jan 2012 15:07:11 -0800 (PST) Received: from dmz-mailsec-scanner-5.mit.edu (DMZ-MAILSEC-SCANNER-5.MIT.EDU [18.7.68.34]) by olra.theworths.org (Postfix) with ESMTP id A1677429E3C for ; Fri, 13 Jan 2012 15:07:11 -0800 (PST) X-AuditID: 12074422-b7fd66d0000008f9-b8-4f10b91f58a5 Received: from mailhub-auth-1.mit.edu ( [18.9.21.35]) by dmz-mailsec-scanner-5.mit.edu (Symantec Messaging Gateway) with SMTP id 12.66.02297.F19B01F4; Fri, 13 Jan 2012 18:07:11 -0500 (EST) Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103]) by mailhub-auth-1.mit.edu (8.13.8/8.9.2) with ESMTP id q0DN7AJ5023160; Fri, 13 Jan 2012 18:07:10 -0500 Received: from drake.mit.edu (26-4-166.dynamic.csail.mit.edu [18.26.4.166]) (authenticated bits=0) (User authenticated as amdragon@ATHENA.MIT.EDU) by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id q0DN79GN028778 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT); Fri, 13 Jan 2012 18:07:10 -0500 (EST) Received: from amthrax by drake.mit.edu with local (Exim 4.77) (envelope-from ) id 1RlqDF-0003lw-Od; Fri, 13 Jan 2012 18:07:09 -0500 From: Austin Clements To: notmuch@notmuchmail.org Subject: [PATCH v2 2/3] lib: Add support for automatically excluding tags from queries Date: Fri, 13 Jan 2012 18:07:03 -0500 Message-Id: <1326496024-14403-3-git-send-email-amdragon@mit.edu> X-Mailer: git-send-email 1.7.7.3 In-Reply-To: <1326496024-14403-1-git-send-email-amdragon@mit.edu> References: <1326258173-21163-1-git-send-email-amdragon@mit.edu> <1326496024-14403-1-git-send-email-amdragon@mit.edu> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrKIsWRmVeSWpSXmKPExsUixCmqrCu/U8Df4O0KDoum6c4We/Z5WVy/ OZPZgdnj7mkuj1v3X7N7PFt1izmAOYrLJiU1J7MstUjfLoErY9O9FraCPzIV17uXsTYw7hfv YuTkkBAwkei/1cgEYYtJXLi3nq2LkYtDSGAfo0TjwWVQzgZGiderNkA5x5kklq/8wArhzGeU +LwHpIeTg01AQ2Lb/uWMILaIgLTEzruzWUFsZgFHiZ/3HoLZwgJhEv2/N7CD2CwCqhJN77rB 4rwCDhJLl12EukNB4tzqc2A1nEC9f191gs0UEiiXWHxkDeMERv4FjAyrGGVTcqt0cxMzc4pT k3WLkxPz8lKLdE31cjNL9FJTSjcxgkKL3UVpB+PPg0qHGAU4GJV4eAtzBPyFWBPLiitzDzFK cjApifI+2AYU4kvKT6nMSCzOiC8qzUktPsQowcGsJMIrZQqU401JrKxKLcqHSUlzsCiJ86pr vfMTEkhPLEnNTk0tSC2CycpwcChJ8O7aAdQoWJSanlqRlplTgpBm4uAEGc4DNHwRSA1vcUFi bnFmOkT+FKOilDhvCkhCACSRUZoH1wuL/VeM4kCvCPMeAKniAaYNuO5XQIOZgAaXpfCBDC5J REhJNTCyRsibJLxpTZH02nN0S9MptqD8Sx0y+v8tbj7vND12JqGB0Wjz1ajd13bfnrL9vLd5 D0PVs7upvTN32bz8s/1tS4lWQmiT04zJH0U2GTOdmNgtdGv/rzezfKKfvl5TXryXRcno193U RZqh6c+SL03f9Vf5V83n8vyTFdPtNymbJ+3NVJpr3CamxFKckWioxVxUnAgARPgbqdgCAAA= X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 13 Jan 2012 23:07:13 -0000 This is useful for tags like "deleted" and "spam" that people generally want to exclude from query results. These exclusions will be overridden if a tag is explicitly mentioned in a query. --- lib/notmuch.h | 6 ++++++ lib/query.cc | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 0 deletions(-) diff --git a/lib/notmuch.h b/lib/notmuch.h index 9f23a10..7929fe7 100644 --- a/lib/notmuch.h +++ b/lib/notmuch.h @@ -457,6 +457,12 @@ notmuch_query_set_sort (notmuch_query_t *query, notmuch_sort_t sort); notmuch_sort_t notmuch_query_get_sort (notmuch_query_t *query); +/* Add a tag that will be excluded from the query results by default. + * This exclusion will be overridden if this tag appears explicitly in + * the query. */ +void +notmuch_query_add_tag_exclude (notmuch_query_t *query, const char *tag); + /* Execute a query for threads, returning a notmuch_threads_t object * which can be used to iterate over the results. The returned threads * object is owned by the query and as such, will only be valid until diff --git a/lib/query.cc b/lib/query.cc index b6c0f12..0b36602 100644 --- a/lib/query.cc +++ b/lib/query.cc @@ -27,6 +27,7 @@ struct _notmuch_query { notmuch_database_t *notmuch; const char *query_string; notmuch_sort_t sort; + notmuch_string_list_t *exclude_terms; }; typedef struct _notmuch_mset_messages { @@ -76,6 +77,8 @@ notmuch_query_create (notmuch_database_t *notmuch, query->sort = NOTMUCH_SORT_NEWEST_FIRST; + query->exclude_terms = _notmuch_string_list_create (query); + return query; } @@ -97,6 +100,13 @@ notmuch_query_get_sort (notmuch_query_t *query) return query->sort; } +void +notmuch_query_add_tag_exclude (notmuch_query_t *query, const char *tag) +{ + char *term = talloc_asprintf (query, "%s%s", _find_prefix ("tag"), tag); + _notmuch_string_list_append (query->exclude_terms, term); +} + /* We end up having to call the destructors explicitly because we had * to use "placement new" in order to initialize C++ objects within a * block that we allocated with talloc. So C++ is making talloc @@ -112,6 +122,27 @@ _notmuch_messages_destructor (notmuch_mset_messages_t *messages) return 0; } +/* Return a query that does not match messages with the excluded tags + * registered with the query. Any tags that explicitly appear in + * xquery will not be excluded. */ +static Xapian::Query +_notmuch_exclude_tags (notmuch_query_t *query, Xapian::Query xquery) +{ + for (notmuch_string_node_t *term = query->exclude_terms->head; term; + term = term->next) { + Xapian::TermIterator it = xquery.get_terms_begin (); + Xapian::TermIterator end = xquery.get_terms_end (); + for (; it != end; it++) { + if ((*it).compare (term->string) == 0) + break; + } + if (it == end) + xquery = Xapian::Query (Xapian::Query::OP_AND_NOT, + xquery, Xapian::Query (term->string)); + } + return xquery; +} + notmuch_messages_t * notmuch_query_search_messages (notmuch_query_t *query) { @@ -157,6 +188,8 @@ notmuch_query_search_messages (notmuch_query_t *query) mail_query, string_query); } + final_query = _notmuch_exclude_tags (query, final_query); + enquire.set_weighting_scheme (Xapian::BoolWeight()); switch (query->sort) { @@ -436,6 +469,8 @@ notmuch_query_count_messages (notmuch_query_t *query) mail_query, string_query); } + final_query = _notmuch_exclude_tags (query, final_query); + enquire.set_weighting_scheme(Xapian::BoolWeight()); enquire.set_docid_order(Xapian::Enquire::ASCENDING); -- 1.7.7.3