about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2023-10-02 14:58:07 +0000
committerEric Wong <e@80x24.org>2023-10-02 19:45:51 +0000
commitb8f767e7aecb1c5e54f6dcf60f90491cdfde0624 (patch)
tree1dd7a1d9327c12203d3661d537d6219736274b41
parent1ff2be2d0df428f27022487d7ac4941b7a592168 (diff)
downloadpublic-inbox-b8f767e7aecb1c5e54f6dcf60f90491cdfde0624.tar.gz
When using isearch (that is v1/v2 inbox relying on extindex
for search), there's actually no guarantee that IMAP UIDs
are in the correct order with regard to Xapian docids.

Thus we must iterate through every UID(num) to see if it's
suitable to display in a saved search.  The old grep filter
(before commit a6fe84489127) was not effective since it
didn't account for the mset->items correspondence.

Fortunately, this bug merely manifests in reduced performance
as of a6fe84489127.  Prior to that, it could cause incorrect
keywords and labels to be applied.

Unfortunately, this behavior is hard-to-test so no test case
is included.

Followup-to: a6fe84489127 (lei up: fix missing -t/--threads matches w/ saved search)
-rw-r--r--lib/PublicInbox/LeiXSearch.pm3
1 files changed, 2 insertions, 1 deletions
diff --git a/lib/PublicInbox/LeiXSearch.pm b/lib/PublicInbox/LeiXSearch.pm
index 5f105567..4e0849e8 100644
--- a/lib/PublicInbox/LeiXSearch.pm
+++ b/lib/PublicInbox/LeiXSearch.pm
@@ -211,9 +211,10 @@ sub query_one_mset { # for --threads and l2m w/o sort
                         }
                 } else {
                         $first_ids = $ids;
-                        my @items = $mset->items;
+                        my @items = $mset->items; # parallel with @$ids
                         for my $n (@$ids) {
                                 my $mitem = $items[$i++];
+                                next if $n <= $min;
                                 my $smsg = $over->get_art($n) or next;
                                 next if $smsg->{bytes} == 0;
                                 mitem_kw($srch, $smsg, $mitem, $fl) if $can_kw;