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 79C06431FC2 for ; Thu, 30 May 2013 10:14:05 -0700 (PDT) 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 t5BhyrYwpLAh for ; Thu, 30 May 2013 10:13:59 -0700 (PDT) Received: from dmz-mailsec-scanner-6.mit.edu (dmz-mailsec-scanner-6.mit.edu [18.7.68.35]) by olra.theworths.org (Postfix) with ESMTP id 4F356431FC3 for ; Thu, 30 May 2013 10:13:47 -0700 (PDT) X-AuditID: 12074423-b7f826d000001438-3b-51a788ca245c Received: from mailhub-auth-1.mit.edu ( [18.9.21.35]) by dmz-mailsec-scanner-6.mit.edu (Symantec Messaging Gateway) with SMTP id B4.40.05176.AC887A15; Thu, 30 May 2013 13:13:46 -0400 (EDT) Received: from outgoing.mit.edu (outgoing-auth-1.mit.edu [18.9.28.11]) by mailhub-auth-1.mit.edu (8.13.8/8.9.2) with ESMTP id r4UHDgEo027510; Thu, 30 May 2013 13:13:43 -0400 Received: from drake.dyndns.org (c-76-21-105-205.hsd1.ca.comcast.net [76.21.105.205]) (authenticated bits=0) (User authenticated as amdragon@ATHENA.MIT.EDU) by outgoing.mit.edu (8.13.8/8.12.4) with ESMTP id r4UHDdS6009867 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT); Thu, 30 May 2013 13:13:41 -0400 Received: from amthrax by drake.dyndns.org with local (Exim 4.77) (envelope-from ) id 1Ui6Py-0005r8-II; Thu, 30 May 2013 13:13:38 -0400 From: Austin Clements To: notmuch@notmuchmail.org Subject: [PATCH v2 5/5] emacs: Use streaming S-expr parser for search Date: Thu, 30 May 2013 13:13:36 -0400 Message-Id: <1369934016-22308-6-git-send-email-amdragon@mit.edu> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1369934016-22308-1-git-send-email-amdragon@mit.edu> References: <1369934016-22308-1-git-send-email-amdragon@mit.edu> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrKIsWRmVeSWpSXmKPExsUixCmqrHuqY3mgwZ2zphar5/JYXL85k9ni zcp5rA7MHjtn3WX3OPx1IYvHs1W3mAOYo7hsUlJzMstSi/TtErgyns9VKrguX/H+8FXGBsa3 kl2MnBwSAiYSUyd/YYWwxSQu3FvP1sXIxSEksI9R4kzvDlYIZyOjxM+pj6Cc00wSLQ8vsIO0 CAnMZZR4+K4AxGYT0JDYtn85I4gtIiAtsfPubLCxzAJxElum/AeLCwu4Sty4tpYZxGYRUJVo P/+NCcTmFXCQeP3oMtQZihLdzyawgdicAo4SOyafZoXY5SBxae9XpgmM/AsYGVYxyqbkVunm JmbmFKcm6xYnJ+blpRbpmunlZpbopaaUbmIEhRa7i/IOxj8HlQ4xCnAwKvHwZiQtDxRiTSwr rsw9xCjJwaQkyru+FSjEl5SfUpmRWJwRX1Sak1p8iFGCg1lJhLfAGSjHm5JYWZValA+TkuZg URLnvZZy019IID2xJDU7NbUgtQgmK8PBoSTBe70dqFGwKDU9tSItM6cEIc3EwQkynAdo+AWQ Gt7igsTc4sx0iPwpRkUpcd77IAkBkERGaR5cLyz2XzGKA70izPsIpIoHmDbgul8BDWYCGvzE GmxwSSJCSqqBUdq82tf658mXUx+mT5nUmlwr5/h7rYXI/NDzCVMDU1rn6PBoSexoF13zfP7k urD+XClfyWgll1/5KcYc3O3Hv+wLy47seWs88bjzJdl2oZ0JZrtlKxNfu314WFid+y+nu+de y5ddjMuL+W41fVnAbhZh7PNbVMN7A+8c07lfp/PtnFB/vtxaiaU4I9FQi7moOBEA+jVCVdgC AAA= Cc: tomi.ollila@iki.fi 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: Thu, 30 May 2013 17:14:05 -0000 In addition to being the Right Thing to do, this noticeably improves the time taken to display the first page of search results, since it's roughly an order of magnitude faster than the JSON parser. Interestingly, it does *not* significantly improve the time to completely fill a large search buffer because for large search buffers, the cost of creating author invisibility overlays and inserting text (which slows down with more overlays) dominates. However, the time required to display the first page of results is generally more important to the user experience. --- emacs/notmuch.el | 13 +++---------- test/emacs | 10 +++------- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/emacs/notmuch.el b/emacs/notmuch.el index b8d9c44..5a8c957 100644 --- a/emacs/notmuch.el +++ b/emacs/notmuch.el @@ -58,6 +58,7 @@ (require 'notmuch-hello) (require 'notmuch-maildir-fcc) (require 'notmuch-message) +(require 'notmuch-parser) (defcustom notmuch-search-result-format `(("date" . "%12s ") @@ -809,13 +810,6 @@ non-authors is found, assume that all of the authors match." (setq notmuch-search-target-thread "found") (goto-char beg))))) -(defun notmuch-search-show-error (string &rest objects) - (save-excursion - (goto-char (point-max)) - (insert "Error: Unexpected output from notmuch search:\n") - (insert (apply #'format string objects)) - (insert "\n"))) - (defun notmuch-search-process-filter (proc string) "Process and filter the output of \"notmuch search\"" (let ((results-buf (process-buffer proc)) @@ -829,8 +823,7 @@ non-authors is found, assume that all of the authors match." (save-excursion (goto-char (point-max)) (insert string)) - (notmuch-json-parse-partial-list 'notmuch-search-show-result - 'notmuch-search-show-error + (notmuch-sexp-parse-partial-list 'notmuch-search-show-result results-buf))))) (defun notmuch-search-tag-all (&optional tag-changes) @@ -933,7 +926,7 @@ Other optional parameters are used as follows: (save-excursion (let ((proc (notmuch-start-notmuch "notmuch-search" buffer #'notmuch-search-process-sentinel - "search" "--format=json" "--format-version=1" + "search" "--format=sexp" "--format-version=1" (if oldest-first "--sort=oldest-first" "--sort=newest-first") diff --git a/test/emacs b/test/emacs index d38ae8c..7d42abf 100755 --- a/test/emacs +++ b/test/emacs @@ -856,7 +856,7 @@ test_expect_success "Rendering HTML mail with images" \ test_begin_subtest "Search handles subprocess error exit codes" cat > notmuch_fail < notmuch_fail <&2 echo This is another warning >&2 exit 0 @@ -903,8 +901,6 @@ test_emacs "(let ((notmuch-command \"$PWD/notmuch_fail\")) (test-output))" sed -i -e 's/^\[.*\]$/[XXX]/' ERROR test_expect_equal "$(cat OUTPUT; echo ---; cat MESSAGES; echo ---; cat ERROR)" "\ -Error: Unexpected output from notmuch search: -This is output End of search results. --- This is a warning (see *Notmuch errors* for more details) -- 1.7.10.4