user/dev discussion of public-inbox itself
 help / color / Atom feed
* [PATCH 0/2] support reversing search results
@ 2019-06-15 20:23 Eric Wong
  2019-06-15 20:23 ` [PATCH 1/2] searchview: support negative offsets to reverse ordering Eric Wong
  2019-06-15 20:23 ` [PATCH 2/2] searchview: add link at bottom to reverse results Eric Wong
  0 siblings, 2 replies; 3+ messages in thread
From: Eric Wong @ 2019-06-15 20:23 UTC (permalink / raw)
  To: meta

Occasionally it might be useful to show the oldest messages
matching a given search term (e.g. filename or an alternative
to "git blame").

Allowing a negative offset to reverse results seems to work
without increasing query parameter count (adding a new parameter
would be cache-unfriendly due to even less consistent ordering).

Reversing is now exposed at the bottom of the search results
page; since the top of the page is too cluttered.

Eric Wong (2):
  searchview: support negative offsets to reverse ordering
  searchview: add link at bottom to reverse results

 lib/PublicInbox/SearchView.pm | 59 +++++++++++++++++++++++++----------
 t/psgi_v2.t                   |  2 +-
 2 files changed, 44 insertions(+), 17 deletions(-)

-- 
EW

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 1/2] searchview: support negative offsets to reverse ordering
  2019-06-15 20:23 [PATCH 0/2] support reversing search results Eric Wong
@ 2019-06-15 20:23 ` Eric Wong
  2019-06-15 20:23 ` [PATCH 2/2] searchview: add link at bottom to reverse results Eric Wong
  1 sibling, 0 replies; 3+ messages in thread
From: Eric Wong @ 2019-06-15 20:23 UTC (permalink / raw)
  To: meta

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


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 2/2] searchview: add link at bottom to reverse results
  2019-06-15 20:23 [PATCH 0/2] support reversing search results Eric Wong
  2019-06-15 20:23 ` [PATCH 1/2] searchview: support negative offsets to reverse ordering Eric Wong
@ 2019-06-15 20:23 ` Eric Wong
  1 sibling, 0 replies; 3+ messages in thread
From: Eric Wong @ 2019-06-15 20:23 UTC (permalink / raw)
  To: meta

I could not find a place to put the link the top without
making navigation too cluttered.  Putting it at the bottom
of the page seems reasonable...
---
 lib/PublicInbox/SearchView.pm | 4 +++-
 t/psgi_v2.t                   | 2 +-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/lib/PublicInbox/SearchView.pm b/lib/PublicInbox/SearchView.pm
index f0d803e..6f07279 100644
--- a/lib/PublicInbox/SearchView.pm
+++ b/lib/PublicInbox/SearchView.pm
@@ -232,7 +232,9 @@ sub search_nav_bot {
 	$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>';
+
+	my $rev = $q->qs_html(o => $o < 0 ? 0 : -1);
+	$rv .= qq{ | <a\nhref="?$rev">reverse results</a></pre>};
 }
 
 sub sort_relevance {
diff --git a/t/psgi_v2.t b/t/psgi_v2.t
index 5c358cd..b8062de 100644
--- a/t/psgi_v2.t
+++ b/t/psgi_v2.t
@@ -155,7 +155,7 @@ test_psgi(sub { $www->call(@_) }, sub {
 	$res = $cb->(GET('/v2test/?q=m:a-mid@b&x=t'));
 	is($res->code, 200, 'success with threaded search');
 	my $raw = $res->content;
-	ok($raw =~ s/\A.*>Results 1-3 of 3<//s, 'got all results');
+	ok($raw =~ s/\A.*>Results 1-3 of 3\b//s, 'got all results');
 	my @over = ($raw =~ m/\d{4}-\d+-\d+\s+\d+:\d+ (.+)$/gm);
 	is_deeply(\@over, [ '<a', '` <a', '` <a' ], 'threaded messages show up');
 
-- 
EW


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, back to index

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-15 20:23 [PATCH 0/2] support reversing search results Eric Wong
2019-06-15 20:23 ` [PATCH 1/2] searchview: support negative offsets to reverse ordering Eric Wong
2019-06-15 20:23 ` [PATCH 2/2] searchview: add link at bottom to reverse results Eric Wong

user/dev discussion of public-inbox itself

Archives are clonable:
	git clone --mirror https://public-inbox.org/meta
	git clone --mirror http://czquwvybam4bgbro.onion/meta
	git clone --mirror http://hjrcffqmbrq6wope.onion/meta
	git clone --mirror http://ou63pmih66umazou.onion/meta

Newsgroups are available over NNTP:
	nntp://news.public-inbox.org/inbox.comp.mail.public-inbox.meta
	nntp://ou63pmih66umazou.onion/inbox.comp.mail.public-inbox.meta
	nntp://czquwvybam4bgbro.onion/inbox.comp.mail.public-inbox.meta
	nntp://hjrcffqmbrq6wope.onion/inbox.comp.mail.public-inbox.meta
	nntp://news.gmane.org/gmane.mail.public-inbox.general

 note: .onion URLs require Tor: https://www.torproject.org/

AGPL code for this site: git clone https://public-inbox.org/ public-inbox