Drop the storage of thread ID(s) in a value.
authorCarl Worth <cworth@cworth.org>
Sun, 25 Oct 2009 07:25:59 +0000 (00:25 -0700)
committerCarl Worth <cworth@cworth.org>
Sun, 25 Oct 2009 07:31:20 +0000 (00:31 -0700)
Now that we are iterating over the thread terms instead, we can
drop this redundant storage (which should shrink our database a
tiny bit).

database.cc
message.cc
notmuch-private.h

index aaad710552f9d4c496098ea19945f9f6b8ab1d26..751e2d99c86ce3c2753bb75d3897f2603daadd9f 100644 (file)
@@ -192,26 +192,34 @@ find_unique_document (notmuch_database_t *notmuch,
     return NOTMUCH_PRIVATE_STATUS_SUCCESS;
 }
 
+/* XXX: Should rewrite this to accept a notmuch_message_t* instead of
+ * a Xapian:Document and then we could just use
+ * notmuch_message_get_thread_ids instead of duplicating its logic
+ * here. */
 static void
 insert_thread_id (GHashTable *thread_ids, Xapian::Document doc)
 {
     string value_string;
-    const char *value, *id, *comma;
-
-    value_string = doc.get_value (NOTMUCH_VALUE_THREAD);
-    value = value_string.c_str();
-    if (strlen (value)) {
-       id = value;
-       while (*id) {
-           comma = strchr (id, ',');
-           if (comma == NULL)
-               comma = id + strlen (id);
-           g_hash_table_insert (thread_ids,
-                                strndup (id, comma - id), NULL);
-           id = comma;
-           if (*id)
-               id++;
-       }
+    Xapian::TermIterator i;
+    const char *prefix_str = _find_prefix ("thread");
+    char prefix;
+
+    assert (strlen (prefix_str) == 1);
+
+    prefix = *prefix_str;
+
+    i = doc.termlist_begin ();
+    i.skip_to (prefix_str);
+
+    while (1) {
+       if (i == doc.termlist_end ())
+           break;
+       value_string = *i;
+       if (value_string.empty () || value_string[0] != prefix)
+           break;
+       g_hash_table_insert (thread_ids,
+                            strdup (value_string.c_str () + 1), NULL);
+       i++;
     }
 }
 
index 1d9dfedaaa223b63823a5c731d029c6e0a28b5f4..80832cae6a8c9f5ba1061b60f6991020c7a859bd 100644 (file)
@@ -292,26 +292,7 @@ void
 _notmuch_message_add_thread_id (notmuch_message_t *message,
                                const char *thread_id)
 {
-    std::string id_str;
-
     _notmuch_message_add_term (message, "thread", thread_id);
-
-    id_str = message->doc.get_value (NOTMUCH_VALUE_THREAD);
-
-    if (id_str.empty ()) {
-       message->doc.add_value (NOTMUCH_VALUE_THREAD, thread_id);
-    } else {
-       size_t pos;
-
-       /* Think about using a hash here if there's any performance
-        * problem. */
-       pos = id_str.find (thread_id);
-       if (pos == std::string::npos) {
-           id_str.append (",");
-           id_str.append (thread_id);
-           message->doc.add_value (NOTMUCH_VALUE_THREAD, id_str);
-       }
-    }
 }
 
 static void
@@ -351,7 +332,6 @@ _notmuch_message_ensure_thread_id (notmuch_message_t *message)
 
     thread_id_generate (&thread_id);
     _notmuch_message_add_term (message, "thread", thread_id.str);
-    message->doc.add_value (NOTMUCH_VALUE_THREAD, thread_id.str);
 }
 
 /* Synchronize changes made to message->doc out into the database. */
index 602d1a9ece954905c468934e25e8563bbb35f3db..1302cd30b7eea0480bc2aae11fa9ff0a276b703d 100644 (file)
@@ -40,6 +40,7 @@ NOTMUCH_BEGIN_DECLS
 #include <fcntl.h>
 #include <unistd.h>
 #include <ctype.h>
+#include <assert.h>
 
 #include <talloc.h>
 
@@ -71,8 +72,7 @@ NOTMUCH_BEGIN_DECLS
 
 typedef enum {
     NOTMUCH_VALUE_TIMESTAMP = 0,
-    NOTMUCH_VALUE_MESSAGE_ID,
-    NOTMUCH_VALUE_THREAD
+    NOTMUCH_VALUE_MESSAGE_ID
 } notmuch_value_t;
 
 /* Xapian (with flint backend) complains if we provide a term longer