From: Eric Wong <e@80x24.org>
To: meta@public-inbox.org
Subject: [PATCH 1/2] searchview: support negative offsets to reverse ordering
Date: Sat, 15 Jun 2019 20:23:41 +0000 [thread overview]
Message-ID: <20190615202342.7730-2-e@80x24.org> (raw)
In-Reply-To: <20190615202342.7730-1-e@80x24.org>
Taking a hint from Perl array access, we'll allow negative
offsets for the 'o' parameter and to reverse the sort order.
---
lib/PublicInbox/SearchView.pm | 55 +++++++++++++++++++++++++----------
1 file changed, 40 insertions(+), 15 deletions(-)
diff --git a/lib/PublicInbox/SearchView.pm b/lib/PublicInbox/SearchView.pm
index b089de9..f0d803e 100644
--- a/lib/PublicInbox/SearchView.pm
+++ b/lib/PublicInbox/SearchView.pm
@@ -34,14 +34,21 @@ sub sres_top_html {
my $q = PublicInbox::SearchQuery->new($ctx->{qp});
my $x = $q->{x};
my $query = $q->{'q'};
+ my $o = $q->{o};
+ my $asc;
+ if ($o < 0) {
+ $asc = 1;
+ $o = -($o + 1); # so [-1] is the last element, like Perl lists
+ }
my $code = 200;
# double the limit for expanded views:
my $opts = {
limit => $q->{l},
- offset => $q->{o},
+ offset => $o,
mset => 1,
relevance => $q->{r},
+ asc => $asc,
};
my ($mset, $total, $err, $cb);
retry:
@@ -184,29 +191,47 @@ sub search_nav_top {
sub search_nav_bot {
my ($mset, $q) = @_;
my $total = $mset->get_matches_estimated;
- my $o = $q->{o};
my $l = $q->{l};
- my $end = $o + $mset->size;
- my $beg = $o + 1;
my $rv = '</pre><hr><pre id=t>';
+ my $o = $q->{o};
+ my $off = $o < 0 ? -($o + 1) : $o;
+ my $end = $off + $mset->size;
+ my $beg = $off + 1;
+
if ($beg <= $end) {
$rv .= "Results $beg-$end of $total";
$rv .= ' (estimated)' if $end != $total;
} else {
$rv .= "No more results, only $total";
}
- my $n = $o + $l;
+ my ($next, $join, $prev);
- if ($n < $total) {
- my $qs = $q->qs_html(o => $n, l => $l);
- $rv .= qq{ <a\nhref="?$qs"\nrel=next>next</a>}
- }
- if ($o > 0) {
- $rv .= $n < $total ? '/' : ' ';
- my $p = $o - $l;
- my $qs = $q->qs_html(o => ($p > 0 ? $p : 0));
- $rv .= qq{<a\nhref="?$qs"\nrel=prev>prev</a>};
+ if ($o >= 0) { # sort descending
+ my $n = $o + $l;
+ if ($n < $total) {
+ $next = $q->qs_html(o => $n, l => $l);
+ }
+ if ($o > 0) {
+ $join = $n < $total ? '/' : ' ';
+ my $p = $o - $l;
+ $prev = $q->qs_html(o => ($p > 0 ? $p : 0));
+ }
+ } else { # o < 0, sort ascending
+ my $n = $o - $l;
+
+ if (-$n < $total) {
+ $next = $q->qs_html(o => $n, l => $l);
+ }
+ if ($o < -1) {
+ $join = -$n < $total ? '/' : ' ';
+ my $p = $o + $l;
+ $prev = $q->qs_html(o => ($p < 0 ? $p : 0));
+ }
}
+
+ $rv .= qq{ <a\nhref="?$next"\nrel=next>next</a>} if $next;
+ $rv .= $join if $join;
+ $rv .= qq{<a\nhref="?$prev"\nrel=prev>prev</a>} if $prev;
$rv .= '</pre>';
}
@@ -313,7 +338,7 @@ sub new {
bless {
q => $qp->{'q'},
x => $qp->{x} || '',
- o => (($qp->{o} || '0') =~ /([0-9]+)/),
+ o => (($qp->{o} || '0') =~ /(-?[0-9]+)/),
l => $l,
r => (defined $r && $r ne '0'),
}, $class;
--
EW
next prev parent reply other threads:[~2019-06-15 20:23 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-15 20:23 [PATCH 0/2] support reversing search results Eric Wong
2019-06-15 20:23 ` Eric Wong [this message]
2019-06-15 20:23 ` [PATCH 2/2] searchview: add link at bottom to reverse results Eric Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://public-inbox.org/README
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190615202342.7730-2-e@80x24.org \
--to=e@80x24.org \
--cc=meta@public-inbox.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/public-inbox.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).