]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/SearchIdx.pm
searchidx: warn about vivifying multiple ghosts
[public-inbox.git] / lib / PublicInbox / SearchIdx.pm
index 3d80b002f709448776aada0b03033ebf38a9bad4..446cfb0d50afd8be723a24c4f6f5751de80ba548 100644 (file)
@@ -134,7 +134,9 @@ sub add_values ($$) {
        my $lines = $values->[PublicInbox::Search::LINES];
        add_val($doc, PublicInbox::Search::LINES, $lines);
 
-       my $yyyymmdd = strftime('%Y%m%d', gmtime($ts));
+       my $ds = $values->[PublicInbox::Search::DS];
+       add_val($doc, PublicInbox::Search::DS, $ds);
+       my $yyyymmdd = strftime('%Y%m%d', gmtime($ds));
        add_val($doc, PublicInbox::Search::YYYYMMDD, $yyyymmdd);
 }
 
@@ -298,7 +300,7 @@ sub add_message {
                }
 
                my $lines = $mime->body_raw =~ tr!\n!\n!;
-               my @values = ($smsg->ts, $num, $bytes, $lines);
+               my @values = ($smsg->ds, $num, $bytes, $lines, $smsg->ts);
                add_values($doc, \@values);
 
                my $tg = $self->term_generator;
@@ -350,7 +352,7 @@ sub add_message {
 
                # populates smsg->references for smsg->to_doc_data
                my $refs = parse_references($smsg);
-               $mid0 = $mids->[0] unless defined $mid0;
+               $mid0 = $mids->[0] unless defined $mid0; # v1 compatibility
                my $data = $smsg->to_doc_data($oid, $mid0);
                foreach my $mid (@$mids) {
                        $tg->index_text($mid, 1, 'XM');
@@ -367,10 +369,12 @@ sub add_message {
                        }
                }
 
+               $self->delete_article($num) if defined $num; # for reindexing
                if ($skel) {
                        push @values, $mids, $xpath, $data;
                        $skel->index_skeleton(\@values);
                        $doc->add_boolean_term('Q' . $_) foreach @$mids;
+                       $doc->add_boolean_term('XNUM' . $num) if defined $num;
                        $doc_id = $self->{xdb}->add_document($doc);
                } else {
                        $doc_id = link_and_save($self, $doc, $mids, $refs,
@@ -419,6 +423,16 @@ sub remove_message {
        }
 }
 
+sub delete_article {
+       my ($self, $num) = @_;
+       my $ndel = 0;
+       batch_do($self, 'XNUM' . $num, sub {
+               my ($ids) = @_;
+               $ndel += scalar @$ids;
+               $self->{xdb}->delete_document($_) for @$ids;
+       });
+}
+
 # MID is a hint in V2
 sub remove_by_oid {
        my ($self, $oid, $mid) = @_;
@@ -547,6 +561,10 @@ sub link_and_save {
                        1;
                });
        }
+       if ($vivified > 1) {
+               my $id = '<'.join('> <', @$mids).'>';
+               warn "BUG: vivified multiple ($vivified) ghosts for $id\n";
+       }
        # not really important, but we return any vivified ghost docid, here:
        return $doc_id if defined $doc_id;
        link_doc($self, $doc, $refs, $old_tid);