File Coverage

blib/lib/DBIx/Class/Helper/WindowFunctions.pm
Criterion Covered Total %
statement 29 42 69.0
branch 4 14 28.5
condition n/a
subroutine 7 7 100.0
pod n/a
total 40 63 63.4


line stmt bran cond sub pod time code
1             package DBIx::Class::Helper::WindowFunctions;
2              
3             # ABSTRACT: Add support for window functions to DBIx::Class
4              
5 1     1   542 use v5.10;
  1         5  
6              
7 1     1   6 use strict;
  1         3  
  1         20  
8 1     1   6 use warnings;
  1         2  
  1         42  
9              
10 1     1   6 use parent 'DBIx::Class::ResultSet';
  1         3  
  1         6  
11              
12 1     1   80 use Ref::Util qw/ is_plain_arrayref is_plain_hashref /;
  1         2  
  1         74  
13              
14             # RECOMMEND PREREQ: Ref::Util::XS
15              
16 1     1   11 use namespace::clean;
  1         2  
  1         27  
17              
18             our $VERSION = 'v0.3.0';
19              
20              
21             sub _resolved_attrs {
22 4     4   47 my $rs = $_[0];
23 4         9 my $attrs = $rs->{attrs};
24              
25 4         26 my $sqla = $rs->result_source->storage->sql_maker;
26              
27 4         291 foreach my $attr (qw/ select +select /) {
28              
29 8 100       29 my $sel = $attrs->{$attr} or next;
30 4         10 my @sel;
31              
32 4 50       10 foreach my $col ( @{ is_plain_arrayref($sel) ? $sel : [$sel] } ) {
  4         21  
33              
34 4         14 push @sel, $col;
35              
36 4 50       18 next unless is_plain_hashref($col);
37              
38 0         0 my $as = delete $col->{'-as'};
39 0 0       0 my $over = delete $col->{'-over'} or next;
40              
41 0 0       0 $rs->throw_exception('-over must be a hashref')
42             unless is_plain_hashref($over);
43              
44 0         0 my ( $sql, @bind ) = $sqla->_recurse_fields($col);
45              
46             my ( $part_sql, @part_bind ) =
47 0         0 $sqla->_recurse_fields( $over->{partition_by} );
48 0 0       0 if ($part_sql) {
49 0         0 $part_sql = $sqla->_sqlcase('partition by ') . $part_sql;
50             }
51              
52             my ( $order_sql, @order_bind ) =
53 0         0 $sqla->_order_by( $over->{order_by} );
54              
55 0         0 $sql .= $sqla->_sqlcase(' over (') . $part_sql . $order_sql . ')';
56 0 0       0 if ($as) {
57 0         0 $sql .= $sqla->_sqlcase(' as ') . $sqla->_quote($as);
58             }
59              
60 0         0 push @bind, @part_bind, @order_bind;
61              
62 0         0 $sel[-1] = \[ $sql, @bind ];
63              
64             }
65              
66 4         15 $attrs->{$attr} = \@sel;
67              
68             }
69              
70 4         15 return $rs->next::method;
71             }
72              
73              
74             1;
75              
76             __END__