- my ($off) = (($ctx->{cgi}->param('o') || '0') =~ /(\d+)/);
- $ctx->{order} = [];
- $ctx->{subjs} = {};
- $ctx->{latest} = {};
- my $max = 25;
- my %opts = ( offset => $off, limit => $max * 4 );
- while (scalar @{$ctx->{order}} < $max) {
- my $sres = $ctx->{srch}->query('', \%opts);
- my $nr = scalar @{$sres->{msgs}} or last;
- $sres = load_results($sres);
- walk_thread(thread_results($sres), $ctx, *add_topic);
- $opts{offset} += $nr;
+ my $t = $ctx->{qp}->{t} || '';
+ my $lim = 200; # this is our window
+ my $opts = { limit => $lim };
+ my ($after, $before);
+
+ # Xapian uses '..' but '-' is perhaps friendier to URL linkifiers
+ # if only $after exists "YYYYMMDD.." because "." could be skipped
+ # if interpreted as an end-of-sentence
+ $t =~ s/\A(\d{8,14})-// and $after = str2ts($1);
+ $t =~ /\A(\d{8,14})\z/ and $before = str2ts($1);
+
+ my $ibx = $ctx->{-inbox};
+ my $msgs = $ibx->recent($opts, $after, $before);
+ my $nr = scalar @$msgs;
+ if ($nr < $lim && defined($after)) {
+ $after = $before = undef;
+ $msgs = $ibx->recent($opts);
+ $nr = scalar @$msgs;
+ }
+ my $more = $nr == $lim;
+ my ($newest, $oldest);
+ if ($nr) {
+ $newest = $msgs->[0]->{ts};
+ $oldest = $msgs->[-1]->{ts};
+ # if we only had $after, our SQL query in ->recent ordered
+ if ($newest < $oldest) {
+ ($oldest, $newest) = ($newest, $oldest);
+ $more = 0 if defined($after) && $after < $oldest;
+ }
+ }
+ if (defined($oldest) && $more) {
+ my $s = ts2str($oldest);
+ $ctx->{next_page} = qq!<a\nhref="?t=$s"\nrel=next>next</a>!;
+ }
+ if (defined($newest) && (defined($before) || defined($after))) {
+ my $s = ts2str($newest);
+ $ctx->{prev_page} = qq!<a\nhref="?t=$s-"\nrel=prev>prev</a>!;