X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FLeiQuery.pm;h=7456f7f98e212bbba3295b1484ba0a13bcd8c620;hb=3052acd27f3119510b3efa33d77b610d6c4f1c85;hp=5376c7f8db5b97f48f3fb505b03e34890d064e3e;hpb=7c6aa5d7504c6bcc48cd45b9e9109a4e7fa16357;p=public-inbox.git diff --git a/lib/PublicInbox/LeiQuery.pm b/lib/PublicInbox/LeiQuery.pm index 5376c7f8..7456f7f9 100644 --- a/lib/PublicInbox/LeiQuery.pm +++ b/lib/PublicInbox/LeiQuery.pm @@ -12,19 +12,48 @@ sub prep_ext { # externals_each callback $lxs->prepare_external($loc) unless $exclude->{$loc}; } -sub _start_query { +sub _start_query { # used by "lei q" and "lei up" my ($self) = @_; + PublicInbox::LeiOverview->new($self) or return; + my $opt = $self->{opt}; + my ($xj, $mj) = split(/,/, $opt->{jobs} // ''); + if (defined($xj) && $xj ne '' && $xj !~ /\A[1-9][0-9]*\z/) { + return $self->fail("`$xj' search jobs must be >= 1"); + } + my $lxs = $self->{lxs}; + $xj ||= $lxs->concurrency($opt); # allow: "--jobs ,$WRITER_ONLY" + my $nproc = $lxs->detect_nproc // 1; # don't memoize, schedtool(1) exists + $xj = $nproc if $xj > $nproc; + $lxs->{-wq_nr_workers} = $xj; + if (defined($mj) && $mj !~ /\A[1-9][0-9]*\z/) { + return $self->fail("`$mj' writer jobs must be >= 1"); + } + my $l2m = $self->{l2m}; + if ($l2m && ($opt->{'import-remote'} //= 1) | + # we use \1 (a ref) to distinguish between + # user-supplied and default value + (($opt->{'import-before'} //= \1) ? 1 : 0)) { + $self->_lei_store(1)->write_prepare($self); + } + $l2m and $l2m->{-wq_nr_workers} = $mj // do { + $mj = POSIX::lround($nproc * 3 / 4); # keep some CPU for git + $mj <= 0 ? 1 : $mj; + }; + + # descending docid order is cheapest, MUA controls sorting order + $self->{mset_opt}->{relevance} //= -2 if $l2m || $opt->{threads}; if ($self->{net}) { require PublicInbox::LeiAuth; $self->{auth} = PublicInbox::LeiAuth->new } - $self->{lxs}->do_query($self); + $lxs->do_query($self); } sub qstr_add { # PublicInbox::InputPipe::consume callback for --stdin my ($self) = @_; # $_[1] = $rbuf if (defined($_[1])) { $_[1] eq '' and return eval { + $self->{mset_opt}->{q_raw} = $self->{mset_opt}->{qstr}; $self->{lse}->query_approxidate($self->{lse}->git, $self->{mset_opt}->{qstr}); _start_query($self); @@ -86,34 +115,10 @@ sub lxs_prepare { sub lei_q { my ($self, @argv) = @_; require PublicInbox::LeiOverview; - require PublicInbox::V2Writable; PublicInbox::Config->json; # preload before forking - PublicInbox::LeiOverview->new($self) or return; my $lxs = lxs_prepare($self) or return; $self->ale->refresh_externals($lxs); my $opt = $self->{opt}; - my ($xj, $mj) = split(/,/, $opt->{jobs} // ''); - if (defined($xj) && $xj ne '' && $xj !~ /\A[1-9][0-9]*\z/) { - return $self->fail("`$xj' search jobs must be >= 1"); - } - $xj ||= $lxs->concurrency($opt); # allow: "--jobs ,$WRITER_ONLY" - my $nproc = $lxs->detect_nproc // 1; # don't memoize, schedtool(1) exists - $xj = $nproc if $xj > $nproc; - $lxs->{-wq_nr_workers} = $xj; - if (defined($mj) && $mj !~ /\A[1-9][0-9]*\z/) { - return $self->fail("`$mj' writer jobs must be >= 1"); - } - if ($self->{l2m} && ($opt->{'import-remote'} //= 1) | - # we use \1 (a ref) to distinguish between - # user-supplied and default value - (($opt->{'import-before'} //= \1) ? 1 : 0)) { - $self->_lei_store(1)->write_prepare($self); - } - $self->{l2m} and $self->{l2m}->{-wq_nr_workers} = $mj // do { - $mj = POSIX::lround($nproc * 3 / 4); # keep some CPU for git - $mj <= 0 ? 1 : $mj; - }; - my %mset_opt = map { $_ => $opt->{$_} } qw(threads limit offset); $mset_opt{asc} = $opt->{'reverse'} ? 1 : 0; $mset_opt{limit} //= 10000; @@ -128,8 +133,6 @@ sub lei_q { die "unrecognized --sort=$sort\n"; } } - # descending docid order - $mset_opt{relevance} //= -2 if $opt->{threads}; $self->{mset_opt} = \%mset_opt; if ($opt->{stdin}) { @@ -140,6 +143,7 @@ no query allowed on command-line with --stdin PublicInbox::InputPipe::consume($self->{0}, \&qstr_add, $self); return; } + $mset_opt{q_raw} = \@argv; $mset_opt{qstr} = $self->{lse}->query_argv_to_string($self->{lse}->git, \@argv); _start_query($self);