about summary refs log tree commit homepage
path: root/lib/PublicInbox/SearchIdx.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-04-23 07:22:01 -0400
committerEric Wong <e@80x24.org>2021-04-23 20:55:38 +0000
commitaaa4b3a3fd2d7805afd412b3de2fca07a5e8898e (patch)
tree79264102d4305a395df554af0fb31ca702fdbc30 /lib/PublicInbox/SearchIdx.pm
parent0831cd4c510deb97e755aa09a808bcf5f9e9deeb (diff)
downloadpublic-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.pm41
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;
 }