]> Sergey Matveev's repositories - public-inbox.git/commitdiff
lei lcat: use single queue for ordering
authorEric Wong <e@80x24.org>
Tue, 21 Sep 2021 07:41:52 +0000 (07:41 +0000)
committerEric Wong <e@80x24.org>
Tue, 21 Sep 2021 19:18:35 +0000 (19:18 +0000)
If lcat-ing multiple argument types (blobs vs folders),
maintain the original order of the arguments instead of
dumping all blobs before folder contents.

lib/PublicInbox/LeiLcat.pm
lib/PublicInbox/LeiXSearch.pm

index ccb1823d8824b0a32b80db979aa9528dd1d46e9f..1a4a988edba71e1e07f0a6962fcef115f81948c4 100644 (file)
@@ -21,7 +21,7 @@ sub lcat_folder ($$$) {
        } else {
                for my $f (@$folders) {
                        my $fid = $lms->fid_for($f);
-                       push @{$lei->{lcat_fid}}, $fid;
+                       push @{$lei->{lcat_todo}}, { fid => $fid };
                }
        }
 }
@@ -31,10 +31,9 @@ sub lcat_imap_uri ($$) {
        my $lms = $lei->lms or return;
        # cf. LeiXsearch->lcat_dump
        if (defined $uri->uid) {
-               my @oidhex = $lms->imap_oidhex($lei, $uri);
-               push @{$lei->{lcat_blob}}, @oidhex;
+               push @{$lei->{lcat_todo}}, $lms->imap_oidhex($lei, $uri);
        } elsif (defined(my $fid = $lms->fid_for($$uri))) {
-               push @{$lei->{lcat_fid}}, $fid;
+               push @{$lei->{lcat_todo}}, { fid => $fid };
        } else {
                lcat_folder($lei, $lms, $$uri);
        }
@@ -46,10 +45,10 @@ sub extract_1 ($$) {
                my $u = $1;
                require PublicInbox::URIimap;
                lcat_imap_uri($lei, PublicInbox::URIimap->new($u));
-               '""'; # blank query, using {lcat_blob} or {lcat_fid}
+               '""'; # blank query, using {lcat_todo}
        } elsif ($x =~ m!\b(maildir:.+)!i) {
                lcat_folder($lei, undef, $1);
-               '""'; # blank query, using {lcat_blob} or {lcat_fid}
+               '""'; # blank query, using {lcat_todo}
        } elsif ($x =~ m!\b([a-z]+?://\S+)!i) {
                my $u = $1;
                $u =~ s/[\>\]\)\,\.\;]+\z//;
@@ -82,7 +81,7 @@ sub extract_1 ($$) {
        } elsif ($x =~ /\bid:(\S+)/) { # notmuch convention
                "mid:$1";
        } elsif ($x =~ /\bblob:([0-9a-f]{7,})\b/) {
-               push @{$lei->{lcat_blob}}, $1; # cf. LeiToMail->wq_atexit_child
+               push @{$lei->{lcat_todo}}, $1; # cf. LeiToMail->wq_atexit_child
                '""'; # blank query
        } else {
                undef;
index 756183a9b8e3f6e29f32e5d2ec6bdc7f5c5be3e4..3ce8f32d6d6acef4a01b79e26305c17f609d9210 100644 (file)
@@ -570,7 +570,7 @@ sub do_query {
        @$end = ();
        $self->{opt_threads} = $lei->{opt}->{threads};
        $self->{opt_sort} = $lei->{opt}->{'sort'};
-       $self->{-do_lcat} = $lei->{lcat_blob} // $lei->{lcat_fid};
+       $self->{-do_lcat} = !!(delete $lei->{lcat_todo});
        if ($l2m) {
                $l2m->net_merge_all_done unless $lei->{auth};
        } else {
@@ -646,13 +646,13 @@ sub lcat_dump { # via wq_io_do
                        $git->cat_async($smsg->{blob}, \&_lcat2smsg, $smsg);
                };
        }
-       for my $oid (@{$lei->{lcat_blob} // []}) {
-               $each_smsg->({ blob => $oid, pct => 100 });
-       }
-       if (my $fids = delete $lei->{lcat_fid}) {
-               my $lms = $lei->{lse}->lms;
-               for my $fid (@$fids) {
-                       $lms->each_src({fid => $fid}, \&_lcat_i, $each_smsg);
+       my $lms;
+       for my $ent (@{$lei->{lcat_todo}}) {
+               if (ref $ent eq 'HASH') { # { fid => $fid ,.. }
+                       $lms //= $lei->{lse}->lms;
+                       $lms->each_src($ent, \&_lcat_i, $each_smsg);
+               } else { # oidhex
+                       $each_smsg->({ blob => $ent, pct => 100 });
                }
        }
        $git->async_wait_all;