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 | 33 +++++++++++---------------------
 1 file changed, 11 insertions(+), 22 deletions(-)

diff --git a/lib/PublicInbox/CodeSearchIdx.pm b/lib/PublicInbox/CodeSearchIdx.pm
index 9aefa331..671134bf 100644
--- a/lib/PublicInbox/CodeSearchIdx.pm
+++ b/lib/PublicInbox/CodeSearchIdx.pm
@@ -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);
        }
 }
 

Reply via email to