From 3d4ed2e459c543f5c6fd9db615cd61d81584553f Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 25 Apr 2023 11:02:55 +0000 Subject: [PATCH] cindex: simplify store_repo 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 9aefa3319..671134bf6 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); } } -- 2.47.2