X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FMiscSearch.pm;h=5fb47d03dbcc143d95bd695f83dde1fc10bf3580;hb=HEAD;hp=6b575b0da083246bbc2c0e0fe7a9104a1af2bed4;hpb=520be116e8a686cb223b48fad1de29201dee45be;p=public-inbox.git diff --git a/lib/PublicInbox/MiscSearch.pm b/lib/PublicInbox/MiscSearch.pm index 6b575b0d..5fb47d03 100644 --- a/lib/PublicInbox/MiscSearch.pm +++ b/lib/PublicInbox/MiscSearch.pm @@ -1,4 +1,4 @@ -# Copyright (C) 2020-2021 all contributors +# Copyright (C) all contributors # License: AGPL-3.0+ # read-only counterpart to MiscIdx @@ -11,6 +11,8 @@ my $json; # Xapian value columns: our $MODIFIED = 0; our $UIDVALIDITY = 1; # (created time) +our $ART_MIN = 2; # NNTP article number +our $ART_MAX = 3; # NNTP article number # avoid conflicting with message Search::prob_prefix for UI/UX reasons my %PROB_PREFIX = ( @@ -81,55 +83,19 @@ sub mset { retry_reopen($self, \&misc_enquire_once, $qr, $opt); } -sub ibx_matches_once { # retry_reopen callback - my ($self, $qr, $by_newsgroup) = @_; - # double in case no newsgroups are configured: - my $limit = scalar(keys %$by_newsgroup) * 2; - my $opt = { limit => $limit, offset => 0, relevance => -1 }; - my $ret = {}; # newsgroup => $ibx of matches - while (1) { - my $mset = misc_enquire_once($self, $qr, $opt); - for my $mi ($mset->items) { - my ($eidx_key) = xap_terms('Q', $mi->get_document); - if (defined($eidx_key)) { - if (my $ibx = $by_newsgroup->{$eidx_key}) { - $ret->{$eidx_key} = $ibx; - } - } else { - warn <get_docid} has no `Q' (eidx_key) term -EOF - } - } - my $nr = $mset->size; - return $ret if $nr < $limit; - $opt->{offset} += $nr; - } -} - -# returns a newsgroup => PublicInbox::Inbox mapping -sub newsgroup_matches { - my ($self, $qs, $pi_cfg) = @_; - my $qp = $self->{qp} //= mi_qp_new($self); - $qs .= ' type:inbox'; - my $qr = $qp->parse_query($qs, $PublicInbox::Search::QP_FLAGS); - retry_reopen($self, \&ibx_matches_once, $qr, $pi_cfg->{-by_newsgroup}); -} - sub ibx_data_once { my ($self, $ibx) = @_; my $xdb = $self->{xdb}; my $term = 'Q'.$ibx->eidx_key; # may be {inboxdir}, so private my $head = $xdb->postlist_begin($term); my $tail = $xdb->postlist_end($term); - if ($head != $tail) { - my $doc = $xdb->get_document($head->get_docid); - $ibx->{uidvalidity} //= int_val($doc, $UIDVALIDITY); - $ibx->{-modified} = int_val($doc, $MODIFIED); - $doc->get_data; - } else { - undef; - } + return if $head == $tail; + my $doc = $xdb->get_document($head->get_docid); + $ibx->{uidvalidity} //= int_val($doc, $UIDVALIDITY); + $ibx->{-modified} = int_val($doc, $MODIFIED); + $ibx->{-art_min} = int_val($doc, $ART_MIN); + $ibx->{-art_max} = int_val($doc, $ART_MAX); + $doc->get_data; } sub doc2ibx_cache_ent { # @_ == ($self, $doc) OR ($doc) @@ -144,6 +110,8 @@ sub doc2ibx_cache_ent { # @_ == ($self, $doc) OR ($doc) { uidvalidity => int_val($doc, $UIDVALIDITY), -modified => int_val($doc, $MODIFIED), + -art_min => int_val($doc, $ART_MIN), # may be undef + -art_max => int_val($doc, $ART_MAX), # may be undef # extract description from manifest.js.gz epoch description description => $d };