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 2EE0C431FC3 for ; Sun, 20 Dec 2009 12:31:46 -0800 (PST) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org 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 G2+nb504FIiW for ; Sun, 20 Dec 2009 12:31:45 -0800 (PST) Received: from pivot.cs.unb.ca (pivot.cs.unb.ca [131.202.240.57]) by olra.theworths.org (Postfix) with ESMTP id 3429C431FBF for ; Sun, 20 Dec 2009 12:31:45 -0800 (PST) Received: from fctnnbsc30w-142167182194.pppoe-dynamic.high-speed.nb.bellaliant.net ([142.167.182.194] helo=localhost) by pivot.cs.unb.ca with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.69) (envelope-from ) id 1NMSRM-00083k-2B; Sun, 20 Dec 2009 16:31:44 -0400 Received: from bremner by localhost with local (Exim 4.71) (envelope-from ) id 1NMSRG-0006tn-Hr; Sun, 20 Dec 2009 16:31:38 -0400 From: david@tethera.net To: notmuch@notmuchmail.org Date: Sun, 20 Dec 2009 16:31:21 -0400 Message-Id: <1261341081-26479-1-git-send-email-david@tethera.net> X-Mailer: git-send-email 1.6.5.7 In-Reply-To: <1261234524-25522-2-git-send-email-david@tethera.net> References: <1261234524-25522-2-git-send-email-david@tethera.net> X-Sender-Verified: bremner@pivot.cs.unb.ca Cc: David Bremner Subject: [notmuch] [PATCH] notmuch-query.el: new file to support access to the notmuch database. X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.12 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, 20 Dec 2009 20:31:46 -0000 From: David Bremner Initially this file provides one main function notmuch-query-get-threads, which takes a set of search terms, and returns a parsed set of matching threads as a lisp data structure. A set of notmuch-query-map-* functions are provided to help map functions over the data structure. The function notmuch-query-get-message-ids uses this machinery to get the set of message-ids matching a query. This patch relies on the json patch of <1261141195-5469-1-git-send-email-david@tethera.net> and the argument parsing patch 1261234524-25522-2-git-send-email-david@tethera.net, although the latter would be trivial to avoid, by replace --format with --output in the file. --- This patch is the start of a new emacs api built on top of the json output. It roughly mimics the notion of returning lists of messages and traversing them as used in the C code. If nothing else, the docstring for notmuch-query-get-threads provides some documentation explaining the structure of the json output by Scott's patch. I'd be interested if people who have extremely large threads find it annoyingly slow. The plan (subject to change as always) is to allow the api functions (currently only notmuch-query-get-message-ids) to pass options to the invokation of "notmuch show" to trim down the json output (i.e. omit message bodies). The parsing and traversal code should all unaffected by this change. In theory. I didn't know if you (Carl) want to do copyright assignment, or just the GPL license headers are enough. I don't mind pretty much any variation. notmuch-query.el | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 89 insertions(+), 0 deletions(-) create mode 100644 notmuch-query.el diff --git a/notmuch-query.el b/notmuch-query.el new file mode 100644 index 0000000..5911fa6 --- /dev/null +++ b/notmuch-query.el @@ -0,0 +1,89 @@ +; notmuch.el --- run notmuch within emacs +; +; Copyright © David Bremner +; +; This file is part of Notmuch. +; +; Notmuch is free software: you can redistribute it and/or modify it +; under the terms of the GNU General Public License as published by +; the Free Software Foundation, either version 3 of the License, or +; (at your option) any later version. +; +; Notmuch is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +; General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with Notmuch. If not, see . +; +; Authors: David Bremner + +(require 'json) + +(defun notmuch-query-get-threads (search-terms &rest options) + "Return a list of threads of messages matching SEARCH-TERMS. + +A thread is a forest or list of trees. A tree is a two element +list where the first element is a message, and the second element +is a possibly empty forest of replies. +" + (let ((args (append '("show" "--format=json") search-terms)) + (json-object-type 'plist) + (json-array-type 'list) + (json-false 'nil)) + (with-temp-buffer + (progn + (apply 'call-process (append (list notmuch-command nil t nil) args)) + (goto-char (point-min)) + (json-read))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Mapping functions across collections of messages. + +(defun notmuch-query-map-aux (mapper function seq) + "private function to do the actual mapping and flattening" + + (apply 'append + (mapcar + (lambda (tree) + (funcall mapper fn tree)) + seq))) + + +(defun notmuch-query-map-threads (fn threads) + "apply FN to every thread in THREADS. Flatten results to a list. + +See the function notmuch-query-get-threads for more information." + + (notmuch-query-map-aux 'notmuch-query-map-forest fn threads)) + + +(defun notmuch-query-map-forest (fn forest) + "apply function to every message in a forest. Flatten results to a list. + +See the function notmuch-query-get-threads for more information. +" + + (notmuch-query-map-aux 'notmuch-query-map-tree fn forest)) + + +(defun notmuch-query-map-tree (fn tree) + "Apply function FN to every message in TREE. Flatten results to a list + +See the function notmuch-query-get-threads for more information." + + (cons (funcall fn (car tree)) (notmuch-query-map-forest fn (cadr tree)))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Predefined queries + +(defun notmuch-query-get-message-ids (search-terms) + "Return a list of message-ids of messages that match SEARCH-TERMS" + + (notmuch-query-map-threads + (lambda (msg) (plist-get msg :id)) + (notmuch-query-get-threads search-terms))) + +(provide 'notmuch-query) \ No newline at end of file -- 1.6.5.7