unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
From: david@tethera.net
To: notmuch@notmuchmail.org
Cc: David Bremner <bremner@unb.ca>
Subject: [PATCH] notmuch-query.el: new file to support access to the notmuch database.
Date: Sun, 20 Dec 2009 16:31:21 -0400	[thread overview]
Message-ID: <1261341081-26479-1-git-send-email-david@tethera.net> (raw)
In-Reply-To: <1261234524-25522-2-git-send-email-david@tethera.net>

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 4853 bytes --]

From: David Bremner <bremner@unb.ca>

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 <http://www.gnu.org/licenses/>.
+;
+; Authors: David Bremner <david@tethera.net>
+
+(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

  parent reply	other threads:[~2009-12-20 20:31 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-12-13 23:21 RFC: output json from notmuch? David Bremner
2009-12-13 23:26 ` David Bremner
2009-12-14  0:05   ` Scott Robinson
2009-12-14  0:42     ` David Bremner
2009-12-14 22:41       ` Carl Worth
2009-12-14 22:34     ` Carl Worth
2009-12-14  0:07 ` Marten Veldthuis
2009-12-14 22:30 ` Carl Worth
2009-12-14 23:10   ` David Bremner
2009-12-18  5:33     ` [PATCH] JSON output for notmuch-search and notmuch-show Scott Robinson
2009-12-18 12:59       ` [PATCH] Add an "--output=(json|text|)" command-line option to both " david
2009-12-18 17:33         ` Carl Worth
2009-12-18 18:45           ` Scott Robinson
2009-12-19  0:36           ` David Bremner
2009-12-23  5:58             ` Carl Worth
2009-12-19 14:55           ` Prototype of --show option to control what is shown david
2009-12-19 14:55             ` [PATCH 1/3] rename option to select output format to --format from --output david
2009-12-19 14:55               ` [PATCH 2/3] notmuch-show.c: make calls to format functions conditional david
2009-12-19 14:55                 ` [PATCH 3/3] notmuch-show.c: prototype tabular output format, with output control david
2010-03-09 19:51                   ` Carl Worth
2010-03-09 20:19                     ` David Bremner
2010-03-10  9:25                       ` Carl Worth
2010-03-10 15:34                         ` David Bremner
2009-12-20 20:31               ` david [this message]
2009-12-21 17:21                 ` [PATCH] notmuch-query.el: new file to support access to the notmuch database Carl Worth
2009-12-21 18:01                   ` David Bremner
2010-02-24 12:52                 ` [PATCH v2] " david
2010-04-05 16:46                   ` [PATCH v3] " david
2010-04-05 16:59                     ` David Edmondson
2010-04-05 18:13                     ` Carl Worth
2010-02-23 19:56         ` [PATCH] Add an "--output=(json|text|)" command-line option to both notmuch-search and notmuch-show Carl Worth
2010-02-23 21:00           ` JSON output as default [was: Re: [PATCH] Add an "--output=(json|text|)" command-line option...] Jameson Rollins
2010-02-23 23:35             ` Carl Worth
2010-02-24 13:54               ` Sebastian Spaeth
2009-12-18 17:31       ` [PATCH] JSON output for notmuch-search and notmuch-show Carl Worth
2009-12-18 18:47         ` Scott Robinson
2009-12-23  5:48           ` Carl Worth
2009-12-31  8:54             ` Scott Robinson
2009-12-31 12:49               ` David Bremner
2009-12-25 12:53           ` David Bremner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://notmuchmail.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1261341081-26479-1-git-send-email-david@tethera.net \
    --to=david@tethera.net \
    --cc=bremner@unb.ca \
    --cc=notmuch@notmuchmail.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).