DBIx-Class-Helper-WindowFunctions
view release on metacpan or search on metacpan
lib/DBIx/Class/Helper/WindowFunctions.pm view on Meta::CPAN
package DBIx::Class::Helper::WindowFunctions;
# ABSTRACT: Add support for window functions and aggregate filters to DBIx::Class
use v5.14;
use warnings;
use parent 'DBIx::Class::ResultSet';
use Ref::Util qw/ is_plain_arrayref is_plain_hashref /;
# RECOMMEND PREREQ: Ref::Util::XS
use namespace::clean;
our $VERSION = 'v0.6.0';
sub _resolved_attrs {
my $rs = $_[0];
my $attrs = $rs->{attrs};
my $sqla = $rs->result_source->storage->sql_maker;
foreach my $attr (qw/ select +select /) {
my $sel = $attrs->{$attr} or next;
my @sel;
foreach my $col ( @{ is_plain_arrayref($sel) ? $sel : [$sel] } ) {
push @sel, $col;
next unless is_plain_hashref($col);
my $as = delete $col->{'-as'};
my $over = delete $col->{'-over'};
my $filter = delete $col->{'-filter'};
next unless $over || $filter;
my ( $sql, @bind ) = $sqla->_recurse_fields($col);
if ($over) {
$rs->throw_exception('-over must be a hashref')
unless is_plain_hashref($over);
my ( $part_sql, @part_bind ) =
$sqla->_recurse_fields( $over->{partition_by} );
if ($part_sql) {
$part_sql = $sqla->_sqlcase('partition by ') . $part_sql;
}
my @filter_bind;
if ( defined $filter ) {
$rs->throw_exception('-filter must be an arrayref or hashref')
unless is_plain_arrayref($filter)
or is_plain_hashref($filter);
@filter_bind = $sqla->_recurse_where($filter);
my $clause = shift @filter_bind;
$sql .= $sqla->_sqlcase(' filter (where ') . $clause . ')';
}
my ( $order_sql, @order_bind ) =
$sqla->_order_by( $over->{order_by} );
$sql .= $sqla->_sqlcase(' over (') . $part_sql . $order_sql . ')';
if ($as) {
$sql .= $sqla->_sqlcase(' as ') . $sqla->_quote($as);
}
( run in 0.734 second using v1.01-cache-2.11-cpan-39bf76dae61 )