about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2015-08-28 00:00:47 +0000
committerEric Wong <e@80x24.org>2015-08-28 00:53:19 +0000
commit11820f6911d21ee1326d52d99a28063acf872911 (patch)
treeaa589de457cb2dcc9edeea54aac1c23e589aa52f
parente822f34e206e86e1e2e1aa9617e193d72224de5e (diff)
downloadpublic-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.
-rw-r--r--lib/PublicInbox/SearchMsg.pm16
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;
+                        }
                 }
         }
 }