diff options
author | Eric Wong <e@80x24.org> | 2015-08-28 00:00:47 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2015-08-28 00:53:19 +0000 |
commit | 11820f6911d21ee1326d52d99a28063acf872911 (patch) | |
tree | aa589de457cb2dcc9edeea54aac1c23e589aa52f /lib/PublicInbox/SearchMsg.pm | |
parent | e822f34e206e86e1e2e1aa9617e193d72224de5e (diff) | |
download | public-inbox-11820f6911d21ee1326d52d99a28063acf872911.tar.gz |
A document may have many terms, so this hurts performance if we blindly iterate. Unfortunately, we can't rely on the order of the termlist just yet, either, so we must repeatedly restart the search for now until we're ready to bump schema versions.
Diffstat (limited to 'lib/PublicInbox/SearchMsg.pm')
-rw-r--r-- | lib/PublicInbox/SearchMsg.pm | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/lib/PublicInbox/SearchMsg.pm b/lib/PublicInbox/SearchMsg.pm index a9f3180b..4ad8a0c9 100644 --- a/lib/PublicInbox/SearchMsg.pm +++ b/lib/PublicInbox/SearchMsg.pm @@ -110,7 +110,6 @@ sub references_sorted { sub ensure_metadata { my ($self) = @_; my $doc = $self->{doc}; - my $i = $doc->termlist_begin; my $end = $doc->termlist_end; unless (defined $PFX2TERM_RE) { @@ -118,12 +117,17 @@ sub ensure_metadata { $PFX2TERM_RE = qr/\A($or)/; } - for (; $i != $end; $i->inc) { - my $val = $i->get_termname; + while (my ($pfx, $field) = each %PublicInbox::Search::PFX2TERM_RMAP) { + # ideally we'd move this out of the loop: + my $i = $doc->termlist_begin; - if ($val =~ s/$PFX2TERM_RE//o) { - my $field = $PublicInbox::Search::PFX2TERM_RMAP{$1}; - $self->{$field} = $val; + $i->skip_to($pfx); + if ($i != $end) { + my $val = $i->get_termname; + + if ($val =~ s/$PFX2TERM_RE//o) { + $self->{$field} = $val; + } } } } |