[PATCH] WIP: remove all non-prefixed-terms (and stemmed versions)
authorDavid Bremner <david@tethera.net>
Sun, 14 Aug 2016 12:43:18 +0000 (21:43 +0900)
committerW. Trevor King <wking@tremily.us>
Sat, 20 Aug 2016 23:22:26 +0000 (16:22 -0700)
93/06ffe85afcb0b296b5e729df3e45120beed24c [new file with mode: 0644]

diff --git a/93/06ffe85afcb0b296b5e729df3e45120beed24c b/93/06ffe85afcb0b296b5e729df3e45120beed24c
new file mode 100644 (file)
index 0000000..32f97fb
--- /dev/null
@@ -0,0 +1,223 @@
+Return-Path: <bremner@tesseract.cs.unb.ca>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+ by arlo.cworth.org (Postfix) with ESMTP id CCD876DE81BA\r
+ for <notmuch@notmuchmail.org>; Sun, 14 Aug 2016 16:41:53 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at cworth.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: -0.001\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=-0.001 tagged_above=-999 required=5\r
+ tests=[AWL=-0.002, HEADER_FROM_DIFFERENT_DOMAINS=0.001]\r
+ autolearn=disabled\r
+Received: from arlo.cworth.org ([127.0.0.1])\r
+ by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024)\r
+ with ESMTP id sAEvMdRXwP9Q for <notmuch@notmuchmail.org>;\r
+ Sun, 14 Aug 2016 16:41:45 -0700 (PDT)\r
+Received: from fethera.tethera.net (fethera.tethera.net [198.245.60.197])\r
+ by arlo.cworth.org (Postfix) with ESMTPS id F08A56DEAEF3\r
+ for <notmuch@notmuchmail.org>; Sun, 14 Aug 2016 16:24:10 -0700 (PDT)\r
+Received: from remotemail by fethera.tethera.net with local (Exim 4.84_2)\r
+ (envelope-from <bremner@tesseract.cs.unb.ca>)\r
+ id 1bZ4lN-0005Jc-Ol; Sun, 14 Aug 2016 19:24:17 -0400\r
+Received: (nullmailer pid 9958 invoked by uid 1000);\r
+ Sun, 14 Aug 2016 12:43:42 -0000\r
+From: David Bremner <david@tethera.net>\r
+To: Daniel Kahn Gillmor <dkg@fifthhorseman.net>,\r
+ Notmuch Mail <notmuch@notmuchmail.org>\r
+Subject: [PATCH] WIP: remove all non-prefixed-terms (and stemmed versions)\r
+Date: Sun, 14 Aug 2016 21:43:18 +0900\r
+Message-Id: <1471178598-9639-1-git-send-email-david@tethera.net>\r
+X-Mailer: git-send-email 2.8.1\r
+In-Reply-To: <1467970047-8013-16-git-send-email-dkg@fifthhorseman.net>\r
+References: <1467970047-8013-16-git-send-email-dkg@fifthhorseman.net>\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.20\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+ <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <https://notmuchmail.org/mailman/options/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch/>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <https://notmuchmail.org/mailman/listinfo/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Sun, 14 Aug 2016 23:41:54 -0000\r
+\r
+The testing here is not really suitable for production, since we export\r
+a function just for testing.  It would be possible to modify the test\r
+framework to test functions in notmuch-private.h, but this was the quick\r
+and dirty solution.\r
+---\r
+\r
+dkg wrote:\r
+\r
+> I could find no way to distinguish terms which were added during\r
+>  indexing of the message body from other terms associated with the\r
+>  document.\r
+\r
+I think this does the trick. If it makes sense, I can polish it\r
+up. I'd appreciate any ideas about the right way to manage the\r
+testing.  We could either modify the test framework to test internal\r
+functions, or continue on testing only exported functions and the CLI.\r
+\r
+ lib/message.cc             | 33 ++++++++++++++++++++++\r
+ lib/notmuch-private.h      |  2 ++\r
+ lib/notmuch.h              |  4 +++\r
+ test/T650-message-terms.sh | 70 ++++++++++++++++++++++++++++++++++++++++++++++\r
+ 4 files changed, 109 insertions(+)\r
+ create mode 100755 test/T650-message-terms.sh\r
+\r
+diff --git a/lib/message.cc b/lib/message.cc\r
+index 9d3e807..9a9845a 100644\r
+--- a/lib/message.cc\r
++++ b/lib/message.cc\r
+@@ -577,6 +577,39 @@ _notmuch_message_remove_terms (notmuch_message_t *message, const char *prefix)\r
+     }\r
+ }\r
\r
++void notmuch_test_clear_terms(notmuch_message_t *message) {\r
++    _notmuch_message_remove_unprefixed_terms (message);\r
++    _notmuch_message_sync (message);\r
++}\r
++void\r
++_notmuch_message_remove_unprefixed_terms (notmuch_message_t *message)\r
++{\r
++    Xapian::TermIterator i;\r
++\r
++    for (i = message->doc.termlist_begin ();\r
++       i != message->doc.termlist_end () &&\r
++           ((*i).c_str ()[0] < 'A');\r
++           i++) {\r
++      try {\r
++          message->doc.remove_term ((*i));\r
++          message->modified = TRUE;\r
++      } catch (const Xapian::InvalidArgumentError) {\r
++          /* Ignore failure to remove non-existent term. */\r
++      }\r
++    }\r
++\r
++    /* We want to remove stemmed terms, but only those not from a\r
++       prefixed term */\r
++    for (i.skip_to ("Z["); i != message->doc.termlist_end (); i++) {\r
++      try {\r
++          message->doc.remove_term ((*i));\r
++          message->modified = TRUE;\r
++      } catch (const Xapian::InvalidArgumentError) {\r
++          /* Ignore failure to remove non-existent term. */\r
++      }\r
++    }\r
++}\r
++\r
+ /* Return true if p points at "new" or "cur". */\r
+ static bool is_maildir (const char *p)\r
+ {\r
+diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h\r
+index 65f7ead..646fc78 100644\r
+--- a/lib/notmuch-private.h\r
++++ b/lib/notmuch-private.h\r
+@@ -502,6 +502,8 @@ _notmuch_message_add_reply (notmuch_message_t *message,\r
+ notmuch_database_t *\r
+ _notmuch_message_database (notmuch_message_t *message);\r
\r
++void\r
++_notmuch_message_remove_unprefixed_terms (notmuch_message_t *message);\r
+ /* sha1.c */\r
\r
+ char *\r
+diff --git a/lib/notmuch.h b/lib/notmuch.h\r
+index e03a05d..e964b1a 100644\r
+--- a/lib/notmuch.h\r
++++ b/lib/notmuch.h\r
+@@ -1658,6 +1658,10 @@ notmuch_message_thaw (notmuch_message_t *message);\r
+ void\r
+ notmuch_message_destroy (notmuch_message_t *message);\r
\r
++/* for testing */\r
++\r
++void\r
++notmuch_test_clear_terms(notmuch_message_t *message);\r
+ /**\r
+  * @name Message Properties\r
+  *\r
+diff --git a/test/T650-message-terms.sh b/test/T650-message-terms.sh\r
+new file mode 100755\r
+index 0000000..553e95b\r
+--- /dev/null\r
++++ b/test/T650-message-terms.sh\r
+@@ -0,0 +1,70 @@\r
++#!/usr/bin/env bash\r
++test_description="message API"\r
++\r
++. ./test-lib.sh || exit 1\r
++\r
++add_email_corpus\r
++\r
++cat <<EOF > c_head\r
++#include <stdio.h>\r
++#include <string.h>\r
++#include <stdlib.h>\r
++#include <talloc.h>\r
++#include <notmuch-test.h>\r
++\r
++int main (int argc, char** argv)\r
++{\r
++   notmuch_database_t *db;\r
++   notmuch_message_t *message = NULL;\r
++   const char *val;\r
++   notmuch_status_t stat;\r
++\r
++   EXPECT0(notmuch_database_open (argv[1], NOTMUCH_DATABASE_MODE_READ_WRITE, &db));\r
++   EXPECT0(notmuch_database_find_message(db, "4EFC743A.3060609@april.org", &message));\r
++   if (message == NULL) {\r
++      fprintf (stderr, "unable to find message");\r
++      exit (1);\r
++   }\r
++EOF\r
++\r
++cat <<EOF > c_tail\r
++   EXPECT0(notmuch_database_destroy(db));\r
++}\r
++EOF\r
++\r
++add_email_corpus\r
++\r
++test_begin_subtest "check unique term"\r
++byid=$(notmuch count id:4EFC743A.3060609@april.org)\r
++byterm=$(notmuch count Boulogne)\r
++test_expect_equal "$byid" "$byterm"\r
++\r
++xapian-delve -1 -a ${MAIL_DIR}/.notmuch/xapian > BEFORE\r
++\r
++test_begin_subtest "clear non-prefixed terms from message"\r
++cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}\r
++{\r
++notmuch_test_clear_terms(message);\r
++}\r
++EOF\r
++byterm=$(notmuch count Boulogne)\r
++test_expect_equal 0 "$byterm"\r
++\r
++test_begin_subtest "check removed terms"\r
++xapian-delve -1 -a ${MAIL_DIR}/.notmuch/xapian > AFTER\r
++comm -2 -3 BEFORE AFTER | egrep '^Z?a' > REMOVED\r
++cat <<EOF > EXPECTED\r
++Zallan\r
++Zarch\r
++Zarch_packaging_standard\r
++Zarchlinux\r
++Zaur\r
++allan\r
++arch\r
++arch_packaging_standards\r
++archlinux\r
++aur\r
++EOF\r
++test_expect_equal_file EXPECTED REMOVED\r
++\r
++test_done\r
+-- \r
+2.8.1\r
+\r