lib/PublicInbox/ExtMsg.pm | 2 +- lib/PublicInbox/Search.pm | 14 ++++++++++++-- lib/PublicInbox/SearchIdx.pm | 10 ++++++---- diff --git a/lib/PublicInbox/ExtMsg.pm b/lib/PublicInbox/ExtMsg.pm index 4e31ef0f37c178208d1d0b2b9d07d56c8d0f251e..90d68db8fd68ac7bbe8cafca3f7ded8c645c8781 100644 --- a/lib/PublicInbox/ExtMsg.pm +++ b/lib/PublicInbox/ExtMsg.pm @@ -46,7 +46,7 @@ return; } # try to find the URL with Xapian to avoid forking - my $doc_id = eval { $s->find_unique_doc_id('XMID' . $mid) }; + my $doc_id = eval { $s->find_first_doc_id('XMID' . $mid) }; if ($@) { # xapian not configured properly for this repo push @nox, $other; diff --git a/lib/PublicInbox/Search.pm b/lib/PublicInbox/Search.pm index 3ec96ca93a35fc966166c3c08ebb872cf3fb27d1..33a1f2d3f36100e6871bb7a4d7599fa63deb3fa0 100644 --- a/lib/PublicInbox/Search.pm +++ b/lib/PublicInbox/Search.pm @@ -56,7 +56,7 @@ thread => 'G', # newsGroup (or similar entity - e.g. a web forum name) ); my %bool_pfx_external = ( - mid => 'XMID', # uniQue id (Message-ID) + mid => 'XMID', # Message-ID (full/exact) ); my %prob_prefix = ( @@ -285,7 +285,7 @@ sub lookup_message { my ($self, $mid) = @_; $mid = mid_clean($mid); - my $doc_id = $self->find_unique_doc_id('XMID' . $mid); + my $doc_id = $self->find_first_doc_id('XMID' . $mid); my $smsg; if (defined $doc_id) { # raises on error: @@ -325,6 +325,16 @@ my ($self, $termval) = @_; my $db = $self->{xdb}; ($db->postlist_begin($termval), $db->postlist_end($termval)); +} + +sub find_first_doc_id { + my ($self, $termval) = @_; + + my ($begin, $end) = $self->find_doc_ids($termval); + + return undef if $begin->equal($end); # not found + + $begin->get_docid; } # normalize subjects so they are suitable as pathnames for URLs diff --git a/lib/PublicInbox/SearchIdx.pm b/lib/PublicInbox/SearchIdx.pm index fa5057fd6851b5f668ead4b84b5b0ff46f8c0325..265403a30664ee8a3000d8c64372f98656dd4564 100644 --- a/lib/PublicInbox/SearchIdx.pm +++ b/lib/PublicInbox/SearchIdx.pm @@ -366,11 +366,13 @@ my $doc_id; $mid = mid_clean($mid); eval { - $doc_id = $self->find_unique_doc_id('XMID' . $mid); - if (defined $doc_id) { - $db->delete_document($doc_id); - } else { + my ($head, $tail) = $self->find_doc_ids('XMID' . $mid); + if ($head->equal($tail)) { warn "cannot remove non-existent <$mid>\n"; + } + for (; $head != $tail; $head->inc) { + my $docid = $head->get_docid; + $db->delete_document($docid); } };