diff options
author | Eric Wong <e@80x24.org> | 2021-04-23 07:22:01 -0400 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2021-04-23 20:55:38 +0000 |
commit | aaa4b3a3fd2d7805afd412b3de2fca07a5e8898e (patch) | |
tree | 79264102d4305a395df554af0fb31ca702fdbc30 /lib/PublicInbox/SearchIdx.pm | |
parent | 0831cd4c510deb97e755aa09a808bcf5f9e9deeb (diff) | |
download | public-inbox-aaa4b3a3fd2d7805afd412b3de2fca07a5e8898e.tar.gz |
This saves some work and makes it easier to set volatile metadata on a message at import time.
Diffstat (limited to 'lib/PublicInbox/SearchIdx.pm')
-rw-r--r-- | lib/PublicInbox/SearchIdx.pm | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/lib/PublicInbox/SearchIdx.pm b/lib/PublicInbox/SearchIdx.pm index ca1f3588..f066cc92 100644 --- a/lib/PublicInbox/SearchIdx.pm +++ b/lib/PublicInbox/SearchIdx.pm @@ -567,16 +567,39 @@ sub set_vmd { $self->{xdb}->replace_document($docid, $doc); } +sub apply_vmd_mod ($$) { + my ($doc, $vmd_mod) = @_; + my $updated = 0; + my @x = @VMD_MAP; + while (my ($field, $pfx) = splice(@x, 0, 2)) { + # field: "label" or "kw" + for my $val (@{$vmd_mod->{"-$field"} // []}) { + eval { + $doc->remove_term($pfx . $val); + ++$updated; + }; + } + for my $val (@{$vmd_mod->{"+$field"} // []}) { + $doc->add_boolean_term($pfx . $val); + ++$updated; + } + } + $updated; +} + sub add_vmd { my ($self, $docid, $vmd) = @_; begin_txn_lazy($self); my $doc = _get_doc($self, $docid) or return; my @x = @VMD_MAP; + my $updated = 0; while (my ($field, $pfx) = splice(@x, 0, 2)) { my $add = $vmd->{$field} // next; $doc->add_boolean_term($pfx . $_) for @$add; + $updated += scalar(@$add); } - $self->{xdb}->replace_document($docid, $doc); + $updated += apply_vmd_mod($doc, $vmd); + $self->{xdb}->replace_document($docid, $doc) if $updated; } sub remove_vmd { @@ -601,21 +624,7 @@ sub update_vmd { my ($self, $docid, $vmd_mod) = @_; begin_txn_lazy($self); my $doc = _get_doc($self, $docid) or return; - my $updated = 0; - my @x = @VMD_MAP; - while (my ($field, $pfx) = splice(@x, 0, 2)) { - # field: "label" or "kw" - for my $val (@{$vmd_mod->{"-$field"} // []}) { - eval { - $doc->remove_term($pfx . $val); - ++$updated; - }; - } - for my $val (@{$vmd_mod->{"+$field"} // []}) { - $doc->add_boolean_term($pfx . $val); - ++$updated; - } - } + my $updated = apply_vmd_mod($doc, $vmd_mod); $self->{xdb}->replace_document($docid, $doc) if $updated; $updated; } |