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 E0FA8429E38 for ; Tue, 10 Jan 2012 21:03:41 -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 vKE5RdBJtFMC for ; Tue, 10 Jan 2012 21:03:40 -0800 (PST) Received: from dmz-mailsec-scanner-2.mit.edu (DMZ-MAILSEC-SCANNER-2.MIT.EDU [18.9.25.13]) by olra.theworths.org (Postfix) with ESMTP id 7A6F0431FB6 for ; Tue, 10 Jan 2012 21:03:40 -0800 (PST) X-AuditID: 1209190d-b7fbf6d0000008ba-d5-4f0d182b2df9 Received: from mailhub-auth-4.mit.edu ( [18.7.62.39]) by dmz-mailsec-scanner-2.mit.edu (Symantec Messaging Gateway) with SMTP id 10.EF.02234.B281D0F4; Wed, 11 Jan 2012 00:03:40 -0500 (EST) Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103]) by mailhub-auth-4.mit.edu (8.13.8/8.9.2) with ESMTP id q0B53dj2002132; Wed, 11 Jan 2012 00:03:39 -0500 Received: from drake.mit.edu (209-6-116-242.c3-0.arl-ubr1.sbo-arl.ma.cable.rcn.com [209.6.116.242]) (authenticated bits=0) (User authenticated as amdragon@ATHENA.MIT.EDU) by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id q0B53bHc017226 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT); Wed, 11 Jan 2012 00:03:38 -0500 (EST) Received: from amthrax by drake.mit.edu with local (Exim 4.77) (envelope-from ) id 1RkqLZ-0005di-Qr; Wed, 11 Jan 2012 00:03:37 -0500 From: Austin Clements To: notmuch@notmuchmail.org Subject: [PATCH 2/3] lib: Add support for automatically excluding tags from queries Date: Wed, 11 Jan 2012 00:02:52 -0500 Message-Id: <1326258173-21163-3-git-send-email-amdragon@mit.edu> X-Mailer: git-send-email 1.7.7.3 In-Reply-To: <1326258173-21163-1-git-send-email-amdragon@mit.edu> References: <20120109043101.GH20796@mit.edu> <1326258173-21163-1-git-send-email-amdragon@mit.edu> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrIIsWRmVeSWpSXmKPExsUixG6nrqsjwetvMO8Mk8X1mzOZHRg9nq26 xRzAGMVlk5Kak1mWWqRvl8CVMX/yKZaCg9IV25d8ZmpgXCrWxcjJISFgInH57lVGCFtM4sK9 9WxdjFwcQgL7GCX+3GtnhXA2MEpcanwAlbnPJHFvyn6ozHxGie1d99lB+tkENCS27V8ONktE QFpi593ZQEUcHMwCIhLvZjKBhIUFgiUm3J7HAhJmEVCVWDo3FsTkFXCQ2HCGG+IIBYlzq8+B DeQUcJS4s2szWKeQQLJEe/8K5gmM/AsYGVYxyqbkVunmJmbmFKcm6xYnJ+blpRbpGunlZpbo paaUbmIEhQynJO8OxncHlQ4xCnAwKvHwGqTy+AuxJpYVV+YeYpTkYFIS5e0T4/UX4kvKT6nM SCzOiC8qzUktPsQowcGsJMKrmAVUzpuSWFmVWpQPk5LmYFES51XVeucnJJCeWJKanZpakFoE k5Xh4FCS4N0rDjRUsCg1PbUiLTOnBCHNxMEJMpwHaPgukBre4oLE3OLMdIj8KUZFKXHeXpCE AEgiozQPrhcW068YxYFeEeY9AFLFA0wHcN2vgAYzAQ3esg7k6uKSRISUVAPj4Z47S3edePo0 8GZuQlK/OF+9muyGZ9O0C32XNlmdDkyd611SltLGteD2rXLFVQe9Vc7uOvtX2u7IDItXoreS czZt+lLPX7Vwk9kqSa0G+R0Vb4wvrPvhk+D7t77ribNkwUIRk0ka//lEG6t+/FcImDk5Xef9 uuBX5S/Tz0eIGi27LmUxcfZ1JZbijERDLeai4kQADoSZJMQCAAA= 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: Wed, 11 Jan 2012 05:03:42 -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 | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 0 deletions(-) diff --git a/lib/notmuch.h b/lib/notmuch.h index 9f23a10..0a3ae2b 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 by default from the query results. + * 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..716db1c 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,25 @@ _notmuch_messages_destructor (notmuch_mset_messages_t *messages) return 0; } +static Xapian::Query +_notmuch_exclude_tags (notmuch_query_t *query, Xapian::Query xquery) +{ + Xapian::TermIterator end = xquery.get_terms_end (); + + for (notmuch_string_node_t *term = query->exclude_terms->head; term; + term = term->next) { + Xapian::TermIterator it = xquery.get_terms_begin (); + for (; it != end; it++) { + if (*it == term->string) + 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 +186,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 +467,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