X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FSearchIdx.pm;h=7d46489c00202d19cde1d203e18c5c34f26559b6;hb=5be0cb101bab44167a78af7a2d167f254c95bdb3;hp=3f9331211ad8e5388ab175979d4b2ec3eaa12368;hpb=e7d13d7bc4a7b1e990602e796b7c2acbddb99a7b;p=public-inbox.git diff --git a/lib/PublicInbox/SearchIdx.pm b/lib/PublicInbox/SearchIdx.pm index 3f933121..7d46489c 100644 --- a/lib/PublicInbox/SearchIdx.pm +++ b/lib/PublicInbox/SearchIdx.pm @@ -597,6 +597,29 @@ sub remove_vmd { $self->{xdb}->replace_document($docid, $doc) if $replace; } +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; + } + } + $self->{xdb}->replace_document($docid, $doc) if $updated; + $updated; +} + sub xdb_remove { my ($self, @docids) = @_; $self->begin_txn_lazy;