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 )