X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FSearchIdx.pm;h=3596972faa962ebec1160a51f1cbdbf9cd799b98;hb=fad9acd35e56a289ade90a62d056b2a6663d448c;hp=3412a615b66c3bdc2fd2897ad3c5ac6b2010287f;hpb=35ff6bb106909b1c1232666a9792156dfa398ea8;p=public-inbox.git diff --git a/lib/PublicInbox/SearchIdx.pm b/lib/PublicInbox/SearchIdx.pm index 3412a615..3596972f 100644 --- a/lib/PublicInbox/SearchIdx.pm +++ b/lib/PublicInbox/SearchIdx.pm @@ -76,7 +76,8 @@ sub new { if ($version == 1) { $self->{lock_path} = "$mainrepo/ssoma.lock"; my $dir = $self->xdir; - $self->{over} = PublicInbox::OverIdx->new("$dir/over.sqlite3"); + $self->{over_ro} = $self->{over} = + PublicInbox::OverIdx->new("$dir/over.sqlite3"); } elsif ($version == 2) { defined $part or die "partition is required for v2\n"; # partition is a number @@ -282,9 +283,14 @@ sub add_message { $smsg->{lines} = $mime->body_raw =~ tr!\n!\n!; defined $bytes or $bytes = length($mime->as_string); $smsg->{bytes} = $bytes; + add_val($doc, PublicInbox::Search::TS(), $smsg->ts); - my $yyyymmdd = strftime('%Y%m%d', gmtime($smsg->ds)); - add_val($doc, PublicInbox::Search::YYYYMMDD, $yyyymmdd); + my @ds = gmtime($smsg->ds); + my $yyyymmdd = strftime('%Y%m%d', @ds); + add_val($doc, PublicInbox::Search::YYYYMMDD(), $yyyymmdd); + my $dt = strftime('%Y%m%d%H%M%S', @ds); + add_val($doc, PublicInbox::Search::DT(), $dt); + my @vals = ($smsg->{ts}, $smsg->{ds}); my $tg = $self->term_generator; @@ -334,7 +340,7 @@ sub add_message { }); # populates smsg->references for smsg->to_doc_data - my $refs = parse_references($smsg); + my $refs = parse_references($smsg, $mid0, $mids); my $data = $smsg->to_doc_data($oid, $mid0); foreach my $mid (@$mids) { $tg->index_text($mid, 1, 'XM'); @@ -355,7 +361,7 @@ sub add_message { utf8::encode($data); $data = compress($data); - my @vals = ($smsg->ts, $num, $mids, $refs, $xpath, $data); + push @vals, $num, $mids, $refs, $xpath, $data; $self->{over}->add_over(\@vals); $doc->add_boolean_term('Q' . $_) foreach @$mids; $doc->add_boolean_term('XNUM' . $num) if defined $num; @@ -463,22 +469,23 @@ sub term_generator { # write-only $self->{term_generator} = $tg; } -sub parse_references ($) { - my ($smsg) = @_; +sub parse_references ($$$) { + my ($smsg, $mid0, $mids) = @_; my $mime = $smsg->{mime}; my $hdr = $mime->header_obj; my $refs = references($hdr); + push(@$refs, @$mids) if scalar(@$mids) > 1; return $refs if scalar(@$refs) == 0; - # prevent circular references via References here: - my %mids = map { $_ => 1 } @{mids($hdr)}; + # prevent circular references here: + my %seen = ( $mid0 => 1 ); my @keep; foreach my $ref (@$refs) { if (length($ref) > PublicInbox::MID::MAX_MID_SIZE) { warn "References: <$ref> too long, ignoring\n"; next; } - next if $mids{$ref}; + next if $seen{$ref}++; push @keep, $ref; } $smsg->{references} = '<'.join('> <', @keep).'>' if @keep;