1 package Data::Query::Renderer::SQL::Slice::SubqueryRemap;
3 use Data::Query::ExprHelpers;
6 sub _subquery_remap_select {
7 my ($self, $orig_select) = @_;
10 my $default_inside_alias;
12 my @inside_select_list = map {
15 } elsif (is_Identifier) {
16 my @el = @{$_->{elements}};
17 if (@el == 2 and $el[0] eq ($default_inside_alias ||= $el[0])) {
20 Alias(join('__', @el), $_);
23 Alias(sprintf("GENSYM__%03i",++$gensym_count), $_);
25 } @{$orig_select->{select}};
27 my @outside_select_list = map {
33 } @inside_select_list;
36 inside_select_list => \@inside_select_list,
37 outside_select_list => \@outside_select_list,
38 default_inside_alias => $default_inside_alias,
43 my ($self, $orig_select) = @_;
46 my %select_remap = $self->_subquery_remap_select($orig_select);
48 my $default_inside_alias = $select_remap{default_inside_alias};
49 my @inside_select_list = @{$select_remap{inside_select_list}};
50 my @outside_select_list = @{$select_remap{outside_select_list}};
53 if (is_Alias and is_Identifier $_->{from}) {
54 +(join('.',@{$_->{from}{elements}}) => Identifier($_->{to}))
55 } elsif (is_Identifier) {
56 +(join('.',@{$_->{elements}}) => $_)
60 } @inside_select_list;
64 my $order = $orig_select->{from};
65 while (is_Order $order) {
66 push @inside_order, $order;
67 $order = $order->{from};
72 my $order_gensym_count;
73 my @outside_order = map {
75 if (is_Identifier $by) {
76 $default_inside_alias ||= $by->{elements}[0]
77 if @{$by->{elements}} == 2;
79 = $alias_map{join('.', @{$by->{elements}})}
82 @{$by->{elements}} == 2
83 and $by->{elements}[0] eq $default_inside_alias
85 push @inside_select_list, $by;
88 my $name = sprintf("ORDER__BY__%03i",++$order_gensym_count);
89 push @inside_select_list, Alias($name, $by);
93 Order($mapped_by, $_->{reverse});
95 die "XXX not implemented yet";
99 $default_inside_alias ||= 'me';
102 inside_select_list => \@inside_select_list,
103 outside_select_list => \@outside_select_list,
104 inside_order => \@inside_order,
105 outside_order => \@outside_order,
106 default_inside_alias => $default_inside_alias,
107 inner_body => $inner_body,