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 F125341ED73 for ; Sat, 14 Jan 2012 16:17:39 -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 dvBJNufrmKC8 for ; Sat, 14 Jan 2012 16:17:38 -0800 (PST) Received: from dmz-mailsec-scanner-7.mit.edu (DMZ-MAILSEC-SCANNER-7.MIT.EDU [18.7.68.36]) by olra.theworths.org (Postfix) with ESMTP id 7E6D441ED6C for ; Sat, 14 Jan 2012 16:17:38 -0800 (PST) X-AuditID: 12074424-b7fae6d000000906-cb-4f121b219632 Received: from mailhub-auth-4.mit.edu ( [18.7.62.39]) by dmz-mailsec-scanner-7.mit.edu (Symantec Messaging Gateway) with SMTP id A0.27.02310.12B121F4; Sat, 14 Jan 2012 19:17:38 -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 q0F0Hbu8032304; Sat, 14 Jan 2012 19:17:37 -0500 Received: from drake.mit.edu (26-4-180.dynamic.csail.mit.edu [18.26.4.180]) (authenticated bits=0) (User authenticated as amdragon@ATHENA.MIT.EDU) by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id q0F0HZv7027543 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT); Sat, 14 Jan 2012 19:17:36 -0500 (EST) Received: from amthrax by drake.mit.edu with local (Exim 4.77) (envelope-from ) id 1RmDmx-0004Rx-O7; Sat, 14 Jan 2012 19:17:35 -0500 From: Austin Clements To: notmuch@notmuchmail.org Subject: [PATCH v3 1/2] lib: Add support for automatically excluding tags from queries Date: Sat, 14 Jan 2012 19:17:33 -0500 Message-Id: <1326586654-16840-2-git-send-email-amdragon@mit.edu> X-Mailer: git-send-email 1.7.7.3 In-Reply-To: <1326586654-16840-1-git-send-email-amdragon@mit.edu> References: <1326496024-14403-1-git-send-email-amdragon@mit.edu> <1326586654-16840-1-git-send-email-amdragon@mit.edu> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrIIsWRmVeSWpSXmKPExsUixG6nrqskLeRvsH4eq0XTdGeLPfu8LK7f nMnswOxx9zSXx637r9k9nq26xRzAHMVlk5Kak1mWWqRvl8CVsaC7l63gm0LFlY7LLA2MV6W6 GDk5JARMJC5dOMcIYYtJXLi3ng3EFhLYxyjx6rJaFyMXkL2BUaKndTlU4jiTxOY3cRCJ+YwS h18+BetmE9CQ2LZ/OZgtIiAtsfPubFYQm1nAUeLnvYdgtrBAmMSVCY/BalgEVCW275rD0sXI wcEr4CBxd4MyxBEKEudWn2MHsTmBWucc6GIEKRESKJe4di9sAiP/AkaGVYyyKblVurmJmTnF qcm6xcmJeXmpRbrmermZJXqpKaWbGMEh5aKyg7H5kNIhRgEORiUeXsksAX8h1sSy4srcQ4yS HExKorz2UkL+QnxJ+SmVGYnFGfFFpTmpxYcYJTiYlUR4F7AC5XhTEiurUovyYVLSHCxK4rwa Wu/8hATSE0tSs1NTC1KLYLIyHBxKEry+IEMFi1LTUyvSMnNKENJMHJwgw3mAhtuC1PAWFyTm FmemQ+RPMSpKifMGgSQEQBIZpXlwvbCYf8UoDvSKMK8jSBUPMF3Adb8CGswENLgshQ9kcEki QkqqgXHPe5HEl0GZmxyC3O32xm/tTLc2ajnVPcvgB8eLJ9tbuwu/n0xYdGTdggKvW0sZvl7s ehzyT3AOv9qRk4wtcW6vTrR3XD4rcEYhzWJu0p/3Oj946wx+/1qv+4CzrJOPXzWK9x8X6+7/ s/30Nu3yXq58bUGuRUyY8OrVu76WZ7+b8UGKPfH49atKLMUZiYZazEXFiQDUwZCU1AIAAA== 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: Sun, 15 Jan 2012 00:17:40 -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-private.h | 2 +- lib/notmuch.h | 6 ++++++ lib/query.cc | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletions(-) diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h index 60a932f..7bf153e 100644 --- a/lib/notmuch-private.h +++ b/lib/notmuch-private.h @@ -458,7 +458,7 @@ typedef struct _notmuch_string_node { struct _notmuch_string_node *next; } notmuch_string_node_t; -typedef struct _notmuch_string_list { +typedef struct visible _notmuch_string_list { int length; notmuch_string_node_t *head; notmuch_string_node_t **tail; 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