1 package Data::Query::Renderer::SQL::Slice::RowNumberOver;
3 use Data::Query::Constants;
4 use Data::Query::ExprHelpers;
7 with 'Data::Query::Renderer::SQL::Slice::SubqueryRemap';
9 sub slice_stability { }
13 die "Slice's inner is not a Select"
14 unless (my $orig_select = $dq->{from})->{type} eq DQ_SELECT;
16 my %remapped = $self->_subquery_remap($orig_select);
18 my @inside_select_list = @{$remapped{inside_select_list}};
19 my @outside_select_list = @{$remapped{outside_select_list}};
20 my @inside_order = @{$remapped{inside_order}};
21 my @outside_order = @{$remapped{outside_order}};
22 my $default_inside_alias = $remapped{default_inside_alias};
23 my $inner_body = $remapped{inner_body};
25 my $rno_name = 'rno__row__index';
27 my $order = compose { Order($b->{by}, $b->{reverse}, $a) }
28 @outside_order, undef;
30 my $rno_node = Alias($rno_name, $self->_rno_literal($order));
32 my $limit_plus_offset = +{
33 %{$dq->{limit}}, value => ($dq->{limit}{value}||0) + ($dq->{offset}{value}||0)
37 %{$dq->{limit}}, value => ($dq->{offset}{value}||0)+1
40 return $self->_render(
42 \@outside_select_list,
45 { 'SQL.Naive' => 'AND' },
48 { 'SQL.Naive' => '>=' },
49 [ Identifier($rno_name), $offset_plus ],
52 { 'SQL.Naive' => '<=' },
53 [ Identifier($rno_name), $limit_plus_offset ],
58 $default_inside_alias,
60 [ @outside_select_list, $rno_node ],
62 $default_inside_alias,
76 my ($self, $order) = @_;
77 my ($order_str, @order_bind) = (
79 ? @{$self->render($order)}
85 literal => "ROW_NUMBER() OVER( $order_str )",
86 values => \@order_bind