Aniki

 view release on metacpan or  search on metacpan

lib/Aniki/Plugin/SQLPager.pm  view on Meta::CPAN

package Aniki::Plugin::SQLPager;
use 5.014002;

use namespace::autoclean;
use Mouse::Role;

requires qw/select_by_sql select_named/;
with qw/Aniki::Plugin::PagerInjector/;

sub select_by_sql_with_pager {
    my ($self, $sql, $bind, $opt) = @_;
    $opt //= {};

    my $page = $opt->{page} or Carp::croak("required parameter: page");
    my $rows = $opt->{rows} or Carp::croak("required parameter: rows");

    my $limit  = $rows + 1;
    my $offset = $rows * ($page - 1);
    if ($opt->{no_offset}) {
        $sql .= sprintf ' LIMIT %d', $limit;
    }
    else {
        $sql .= sprintf ' LIMIT %d OFFSET %d', $limit, $offset;
    }

    my $result = $self->select_by_sql($sql, $bind, $opt);
    return $self->inject_pager_to_result($result => $opt);
}

sub select_named_with_pager {
    my ($self, $sql, $bind, $opt) = @_;
    $opt //= {};

    my $page = $opt->{page} or Carp::croak("required parameter: page");
    my $rows = $opt->{rows} or Carp::croak("required parameter: rows");

    my $limit  = $rows + 1;
    my $offset = $rows * ($page - 1);
    if ($opt->{no_offset}) {
        $sql .= sprintf ' LIMIT %d', $limit;
    }
    else {
        $sql .= sprintf ' LIMIT %d OFFSET %d', $limit, $offset;
    }

    my $result = $self->select_named($sql, $bind, $opt);
    return $self->inject_pager_to_result($result => $opt);
}

1;
__END__

=pod

=for stopwords sql

=encoding utf-8

=head1 NAME

Aniki::Plugin::SQLPager - SELECT sql with pager

=head1 SYNOPSIS



( run in 1.468 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )