]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
cindex: simplify store_repo
authorEric Wong <e@80x24.org>
Tue, 25 Apr 2023 11:02:55 +0000 (11:02 +0000)
committerEric Wong <e@80x24.org>
Tue, 25 Apr 2023 20:58:31 +0000 (20:58 +0000)
It's easier to just create a new Xapian::Document and
replace it rather than to load and edit it.  I don't
know if there's any performance difference one way or
the other, but fewer branches helps with maintainability
and smaller optree size to lower memory use and startup
speed.

lib/PublicInbox/CodeSearchIdx.pm

index 9aefa3319bc565ee2ee2fd63c211fc26fd9c0a49..671134bf6ee7111ed5b8c89ecb1e21479a23c722 100644 (file)
@@ -146,29 +146,18 @@ sub progress {
 sub store_repo { # wq_do - returns docid
        my ($self, $repo) = @_;
        $self->begin_txn_lazy;
-       my $xdb = $self->{xdb};
-       for (@{$repo->{to_delete}}) { $xdb->delete_document($_) } # XXX needed?
-       if (defined $repo->{docid}) {
-               my $doc = $self->get_doc($repo->{docid}) //
-                       die "$repo->{git_dir} doc #$repo->{docid} gone";
-               add_val($doc, PublicInbox::CodeSearch::CT, $repo->{ct});
-               my %new = map { $_ => undef } @{$repo->{roots}};
-               my $old = xap_terms('G', $doc);
-               delete @new{keys %$old};
-               $doc->add_boolean_term('G'.$_) for keys %new;
-               delete @$old{@{$repo->{roots}}};
-               $doc->remove_term('G'.$_) for keys %$old;
-               $doc->set_data($repo->{fp});
-               $xdb->replace_document($repo->{docid}, $doc);
-               $repo->{docid}
+       $self->{xdb}->delete_document($_) for @{$repo->{to_delete}};
+       my $doc = $PublicInbox::Search::X{Document}->new;
+       add_val($doc, PublicInbox::CodeSearch::CT, $repo->{ct});
+       $doc->add_boolean_term("P$repo->{git_dir}");
+       $doc->add_boolean_term('T'.'r');
+       $doc->add_boolean_term('G'.$_) for @{$repo->{roots}};
+       $doc->set_data($repo->{fp}); # \n delimited
+       if ($repo->{docid}) {
+               $self->{xdb}->replace_document($repo->{docid}, $doc);
+               $repo->{docid};
        } else {
-               my $new = $PublicInbox::Search::X{Document}->new;
-               add_val($new, PublicInbox::CodeSearch::CT, $repo->{ct});
-               $new->add_boolean_term("P$repo->{git_dir}");
-               $new->add_boolean_term('T'.'r');
-               $new->add_boolean_term('G'.$_) for @{$repo->{roots}};
-               $new->set_data($repo->{fp}); # \n delimited
-               $xdb->add_document($new);
+               $self->{xdb}->add_document($doc);
        }
 }