Commit | Line | Data |
ac93965c |
1 | package # Hide from PAUSE |
2 | DBIx::Class::SQLAHacks::MSSQL; |
3 | |
7275194d |
4 | use warnings; |
5 | use strict; |
6 | |
ac93965c |
7 | use base qw( DBIx::Class::SQLAHacks ); |
8 | use Carp::Clan qw/^DBIx::Class|^SQL::Abstract/; |
9 | |
7275194d |
10 | # an MSSQL-specific implementation of the Row-Number-Over limiting |
11 | # technique |
12 | |
13 | sub _MSRowNumberOver { |
584d2dd1 |
14 | my ($self, $sql, $order, $rows, $offset ) = @_; |
15 | |
7275194d |
16 | # get the order_by only |
17 | my $order_by = $self->_order_by( |
18 | (delete $order->{order_by}) || do { |
19 | |
20 | # no order was supplied - make something up: |
21 | my $rsrc = $self->{_dbic_rs_attrs}{_source_handle}->resolve; |
22 | if (my @pk = $rsrc->primary_columns) { |
23 | \@pk; |
24 | } |
25 | else { |
26 | [($rsrc->columns)[0]]; |
27 | } |
28 | } |
29 | ); |
30 | |
31 | # whatever is left |
32 | my $group_having = $self->_order_by($order); |
33 | |
34 | $sql = sprintf (<<'EOS', $order_by, $sql, $group_having, $offset + 1, $offset + $rows, ); |
584d2dd1 |
35 | |
7275194d |
36 | SELECT * FROM ( |
37 | SELECT orig_query.*, ROW_NUMBER() OVER(%s ) AS rno__row__index FROM (%s%s) orig_query |
38 | ) rno_subq WHERE rno__row__index BETWEEN %d AND %d |
584d2dd1 |
39 | |
7275194d |
40 | EOS |
584d2dd1 |
41 | |
7275194d |
42 | $sql =~ s/\s*\n\s*/ /g; # easier to read in the debugger |
584d2dd1 |
43 | return $sql; |
ac93965c |
44 | } |
45 | |
46 | 1; |