Fix trailing whitespace
[dbsrgits/Data-Query.git] / lib / Data / Query / Renderer / SQL / Slice / SubqueryRemap.pm
index 092d726..26ee629 100644 (file)
@@ -3,7 +3,7 @@ package Data::Query::Renderer::SQL::Slice::SubqueryRemap;
 use Data::Query::ExprHelpers;
 use Moo::Role;
 
-sub _subquery_remap {
+sub _subquery_remap_select {
   my ($self, $orig_select) = @_;
 
   my $gensym_count;
@@ -24,16 +24,6 @@ sub _subquery_remap {
     }
   } @{$orig_select->{select}};
 
-  my %alias_map = map {
-    if (is_Alias and is_Identifier $_->{from}) {
-      +(join('.',@{$_->{from}{elements}}) => Identifier($_->{to}))
-    } elsif (is_Identifier) {
-      +(join('.',@{$_->{elements}}) => $_)
-    } else {
-      +()
-    }
-  } @inside_select_list;
-
   my @outside_select_list = map {
     if (is_Alias) {
       Identifier($_->{to});
@@ -42,6 +32,39 @@ sub _subquery_remap {
     }
   } @inside_select_list;
 
+  return (
+    inside_select_list => \@inside_select_list,
+    outside_select_list => \@outside_select_list,
+    default_inside_alias => $default_inside_alias||'me',
+  );
+}
+
+sub _subquery_remap {
+  my ($self, $orig_select) = @_;
+
+  my $gensym_count;
+  my %select_remap = $self->_subquery_remap_select($orig_select);
+
+  my $default_inside_alias = $select_remap{default_inside_alias};
+  my @inside_select_list = @{$select_remap{inside_select_list}};
+  my @outside_select_list = @{$select_remap{outside_select_list}};
+
+  my %alias_map = map {
+    if (is_Alias and is_Identifier $_->{from}) {
+      +(
+        join('.',@{$_->{from}{elements}}) => Identifier($_->{to}),
+        $_->{from}{elements}[-1] => Identifier($_->{to}),
+      )
+    } elsif (is_Identifier) {
+      +(
+        join('.',@{$_->{elements}}) => $_,
+        $_->{elements}[-1] => $_,
+      )
+    } else {
+      +()
+    }
+  } @inside_select_list;
+
   my @inside_order;
   my $inner_body = do {
     my $order = $orig_select->{from};
@@ -73,9 +96,11 @@ sub _subquery_remap {
                   Identifier($name);
                 }
               };
-      Order($mapped_by, $_->{reverse});
+      Order($mapped_by, $_->{reverse}, $_->{nulls});
     } else {
-      die "XXX not implemented yet";
+      my $name = sprintf("ORDER__BY__%03i",++$order_gensym_count);
+      push @inside_select_list, Alias($name, $by);
+      Order(Identifier($name), $_->{reverse}, $_->{nulls});
     }
   } @inside_order;