]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/SearchIdx.pm
search: free up 'Q' prefix for a real unique identifier
[public-inbox.git] / lib / PublicInbox / SearchIdx.pm
index 9ba9437d59b9a0baf2631bbffdde7f021d58baa9..0ee077910c8b0d6f0ff7837d69250daf18e86037 100644 (file)
@@ -1,5 +1,5 @@
-# Copyright (C) 2015 all contributors <meta@public-inbox.org>
-# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt)
+# Copyright (C) 2015-2018 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 # based on notmuch, but with no concept of folders, files or flags
 #
 # Indexes mail with Xapian and our (SQLite-based) ::Msgmap for use
@@ -276,7 +276,7 @@ sub add_message {
                }
                $smsg = PublicInbox::SearchMsg->new($mime);
                my $doc = $smsg->{doc};
-               $doc->add_term('Q' . $mid);
+               $doc->add_term('XMID' . $mid);
 
                my $subj = $smsg->subject;
                if ($subj ne '') {
@@ -334,7 +334,7 @@ sub add_message {
                });
 
                link_message($self, $smsg, $old_tid);
-               $tg->index_text($mid, 1, 'XMID');
+               $tg->index_text($mid, 1, 'XM');
                $doc->set_data($smsg->to_doc_data($blob));
 
                if (my $altid = $self->{-altid}) {
@@ -366,8 +366,12 @@ sub remove_message {
        $mid = mid_clean($mid);
 
        eval {
-               $doc_id = $self->find_unique_doc_id('mid', $mid);
-               $db->delete_document($doc_id) if defined $doc_id;
+               $doc_id = $self->find_unique_doc_id('XMID' . $mid);
+               if (defined $doc_id) {
+                       $db->delete_document($doc_id);
+               } else {
+                       warn "cannot remove non-existent <$mid>\n";
+               }
        };
 
        if ($@) {
@@ -410,9 +414,8 @@ sub link_message {
 
        # last References should be IRT, but some mail clients do things
        # out of order, so trust IRT over References iff IRT exists
-       my @refs = ($hdr->header_raw('References'),
-                       $hdr->header_raw('In-Reply-To'));
-       @refs = ((join(' ', @refs)) =~ /<([^>]+)>/g);
+       my @refs = (($hdr->header_raw('References') || '') =~ /<([^>]+)>/g);
+       push(@refs, (($hdr->header_raw('In-Reply-To') || '') =~ /<([^>]+)>/g));
 
        my $tid;
        if (@refs) {
@@ -474,7 +477,12 @@ sub unindex_blob {
 
 sub index_mm {
        my ($self, $mime) = @_;
-       $self->{mm}->mid_insert(mid_clean(mid_mime($mime)));
+       my $mid = mid_clean(mid_mime($mime));
+       my $mm = $self->{mm};
+       my $num = $mm->mid_insert($mid);
+
+       # fallback to num_for since filters like RubyLang set the number
+       defined $num ? $num : $mm->num_for($mid);
 }
 
 sub unindex_mm {
@@ -675,7 +683,7 @@ sub create_ghost {
 
        my $tid = $self->next_thread_id;
        my $doc = Search::Xapian::Document->new;
-       $doc->add_term('Q' . $mid);
+       $doc->add_term('XMID' . $mid);
        $doc->add_term('G' . $tid);
        $doc->add_term('T' . 'ghost');