From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.2 required=3.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id E59361F62B for ; Wed, 24 Apr 2024 01:34:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1713922461; bh=4BY1aVyOdYpngealr/VozafGllTgohPBLX7K9ViD0pM=; h=From:To:Subject:Date:In-Reply-To:References:From; b=hnH4exblk8q4isZyqJlgW7W+9JWNq9YOFqTMYA9QGOqNmFMxS8+oGclKkHWkvnug+ 5W48Id/3UXKZeOotReVPY3cEWaVJ47uHY2pz/1/IDLs9OpnF3rjW438TmReJukd4br k59amo33L3Z2vrgKXbB5Rm4ajoG5MOU7S0d8vwNc= From: Eric Wong To: spew@80x24.org Subject: [PATCH 6/8] mset: mbox Date: Wed, 24 Apr 2024 01:34:18 +0000 Message-ID: <20240424013420.476353-6-e@80x24.org> In-Reply-To: <20240424013420.476353-1-e@80x24.org> References: <20240424013420.476353-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: --- lib/PublicInbox/Mbox.pm | 58 ++++++++++++++++++++++-------------- lib/PublicInbox/Search.pm | 2 ++ lib/PublicInbox/xap_helper.h | 7 +++++ 3 files changed, 44 insertions(+), 23 deletions(-) diff --git a/lib/PublicInbox/Mbox.pm b/lib/PublicInbox/Mbox.pm index ac565df9..e58fb4b6 100644 --- a/lib/PublicInbox/Mbox.pm +++ b/lib/PublicInbox/Mbox.pm @@ -213,14 +213,36 @@ sub results_thread_cb { } } +sub mbox_qry_cb { # async_mset cb + my ($ctx, $opt, $q, $mset, $err) = @_; + my $wcb = delete $ctx->{wcb}; + if ($err) { + warn "E: $err"; + return $wcb->([500, [qw(Content-Type text/plain)], + [ "Internal server error\n" ]]) + } + $opt->{offset} = $mset->size or + return $wcb->([404, [qw(Content-Type text/plain)], + ["No results found\n"]]); + $ctx->{ids} = $ctx->{srch}->mset_to_artnums($mset, $opt); + my @cb_fn; + if ($q->{t} && $ctx->{srch}->has_threadid) { + @cb_fn = (\&results_thread_cb, "results-thread-$ctx->{query}"); + } else { + @cb_fn = (\&results_cb, "results-$ctx->{query}"); + } + require PublicInbox::MboxGz; + my $res = PublicInbox::MboxGz::mbox_gz($ctx, @cb_fn); + ref($res) eq 'CODE' ? $res->($wcb) : $wcb->($res); +} + sub mbox_all { my ($ctx, $q) = @_; - my $q_string = $q->{'q'}; - return mbox_all_ids($ctx) if $q_string !~ /\S/; - my $srch = $ctx->{ibx}->isrch or + my $qstr = $q->{'q'}; + return mbox_all_ids($ctx) if $qstr !~ /\S/; + my $srch = $ctx->{srch} = $ctx->{ibx}->isrch or return PublicInbox::WWW::need($ctx, 'Search'); - - my $qopts = $ctx->{qopts} = { relevance => -2 }; # ORDER BY docid DESC + my $opt = $ctx->{qopts} = { relevance => -2 }; # ORDER BY docid DESC # {threadid} limits results to a given thread # {threads} collapses results from messages in the same thread, @@ -230,25 +252,15 @@ sub mbox_all { $ctx->{ibx}->{isrch}->{es}->over : $ctx->{ibx}->over) or return PublicInbox::WWW::need($ctx, 'Overview'); - $qopts->{threadid} = $over->mid2tid($ctx->{mid}); - } - $qopts->{threads} = 1 if $q->{t}; - $srch->query_approxidate($ctx->{ibx}->git, $q_string); - my $mset = $srch->mset($q_string, $qopts); - $qopts->{offset} = $mset->size or - return [404, [qw(Content-Type text/plain)], - ["No results found\n"]]; - $ctx->{query} = $q_string; - $ctx->{ids} = $srch->mset_to_artnums($mset, $qopts); - require PublicInbox::MboxGz; - my $fn; - if ($q->{t} && $srch->has_threadid) { - $fn = 'results-thread-'.$q_string; - PublicInbox::MboxGz::mbox_gz($ctx, \&results_thread_cb, $fn); - } else { - $fn = 'results-'.$q_string; - PublicInbox::MboxGz::mbox_gz($ctx, \&results_cb, $fn); + $opt->{threadid} = $over->mid2tid($ctx->{mid}); } + $opt->{threads} = 1 if $q->{t}; + $srch->query_approxidate($ctx->{ibx}->git, $qstr); + $ctx->{query} = $qstr; + sub { + $ctx->{wcb} = $_[0]; # PSGI server supplied write cb + $srch->async_mset($qstr, $opt, \&mbox_qry_cb, $ctx, $opt, $q); + }; } 1; diff --git a/lib/PublicInbox/Search.pm b/lib/PublicInbox/Search.pm index f29555d1..5c417be3 100644 --- a/lib/PublicInbox/Search.pm +++ b/lib/PublicInbox/Search.pm @@ -449,9 +449,11 @@ sub xh_opt ($) { push @ret, '-a'; } elsif ($rel == 0) { push @ret, '-k', $opt->{sort_col} // TS; + push @ret, '-a' if $opt->{asc}; } else { # rel > 0 push @ret, '-r'; push @ret, '-k', $opt->{sort_col} // TS; + push @ret, '-a' if $opt->{asc}; } push @ret, '-t' if $opt->{threads}; push @ret, '-T', $opt->{threadid} if defined $opt->{threadid}; diff --git a/lib/PublicInbox/xap_helper.h b/lib/PublicInbox/xap_helper.h index 88693741..5a89544a 100644 --- a/lib/PublicInbox/xap_helper.h +++ b/lib/PublicInbox/xap_helper.h @@ -224,6 +224,13 @@ static Xapian::MSet mail_mset(struct req *req, const char *qry_str) qry = Xapian::Query(Xapian::Query::OP_FILTER, qry, Xapian::Query(req->Oeidx_key)); } + // TODO: uid_range + if (req->threadid != ULLONG_MAX) { + std::string tid = Xapian::sortable_serialise(req->threadid); + qry = Xapian::Query(Xapian::Query::OP_FILTER, qry, + Xapian::Query(Xapian::Query::OP_VALUE_RANGE, THREADID, + tid, tid)); + } Xapian::Enquire enq = prep_enquire(req); enq.set_query(qry); // THREADID is a CPP macro defined on CLI (see) XapHelperCxx.pm