rename $sql to $code in Perl renderer
[dbsrgits/Data-Query.git] / lib / Data / Query / Renderer / SQL / Naive.pm
index 96abe9c..a84981b 100644 (file)
@@ -2,12 +2,11 @@ package Data::Query::Renderer::SQL::Naive;
 
 use strictures 1;
 
-sub intersperse { my $i = shift; my @i = map +($_, $i), @_; pop @i; @i }
-
 use SQL::ReservedWords;
 use Data::Query::ExprHelpers;
 
 use Moo;
+use namespace::clean;
 
 has reserved_ident_parts => (
   is => 'ro', default => sub {
@@ -144,7 +143,7 @@ sub _render_operator {
 sub _maybe_parenthesise {
   my ($self, $dq) = @_;
   for ($dq) {
-    return is_Select() || is_Group() || is_Slice()
+    return is_Select() || is_Group() || is_Slice() || is_Having()
       ? [ '(', $self->_render($dq), ')' ]
       : $self->_render($dq);
   }
@@ -234,7 +233,7 @@ sub _handle_op_type_between {
   if (@args == 3) {
     my ($lhs, $rhs1, $rhs2) = (map $self->_maybe_parenthesise($_), @args);
     [ '(', $lhs, $op_name, $rhs1, 'AND', $rhs2, ')' ];
-  } elsif (@args == 2 and is_Literal $args[1]->{type}) {
+  } elsif (@args == 2 and is_Literal $args[1]) {
     my ($lhs, $rhs) = (map $self->_render($_), @args);
     [ '(', $lhs, $op_name, $rhs, ')' ];
   } else {
@@ -313,7 +312,7 @@ sub _render_alias {
   }
   return [
     $self->_maybe_parenthesise($dq->{from}),
-    $as || ' ',
+    $as || '',
     $self->_render_identifier({ elements => [ $dq->{to} ] })
   ];
 }
@@ -337,18 +336,9 @@ sub _render_literal {
 sub _render_join {
   my ($self, $dq) = @_;
   my ($left, $right) = @{$dq}{qw(left right)};
-  my $join = do {
-    if ($dq->{outer}) {
-      $self->_format_keyword(uc($dq->{outer}).' JOIN');
-    } elsif ($dq->{on}) {
-      $self->_format_keyword('JOIN');
-    } else {
-      ','
-    }
-  };
   my $rhs = $self->_render($right);
   [
-    $self->_render($left), $join,
+    $self->_render($left), $self->_format_join_keyword($dq),
     (is_Join($right) ? ('(', $rhs, ')') : $rhs),
     ($dq->{on}
       ? ($self->_format_keyword('ON'), $self->_render($dq->{on}))
@@ -356,9 +346,24 @@ sub _render_join {
   ];
 }
 
+sub _format_join_keyword {
+  my ($self, $dq) = @_;
+  if ($dq->{outer}) {
+    $self->_format_keyword(uc($dq->{outer}).' JOIN');
+  } elsif ($dq->{on}) {
+    $self->_format_keyword('JOIN');
+  } else {
+    ','
+  }
+}
+
 sub _render_where {
   my ($self, $dq) = @_;
   my ($from, $where) = @{$dq}{qw(from where)};
+  while (is_Where $from) {
+    $where = Operator({ 'SQL.Naive' => 'AND' }, [ $from->{where}, $where ]);
+    $from = $from->{from};
+  }
   my $keyword = (is_Group($from) ? 'HAVING' : 'WHERE');
   [
     ($from ? $self->_render($from) : ()),
@@ -367,14 +372,24 @@ sub _render_where {
   ]
 }
 
-sub _render_order {
+sub _order_chunk {
   my ($self, $dq) = @_;
-  my @ret = (
-    $self->_format_keyword('ORDER BY'),
+  return +(
     $self->_render($dq->{by}),
     ($dq->{reverse}
       ? $self->_format_keyword('DESC')
-      : ())
+      : ()),
+    ($dq->{nulls} && $dq->{nulls} =~ /^(first|last)$/i
+      ? $self->_format_keyword('NULLS '.$dq->{nulls})
+      : ()),
+  );
+}
+
+sub _render_order {
+  my ($self, $dq) = @_;
+  my @ret = (
+    $self->_format_keyword('ORDER BY'),
+    $self->_order_chunk($dq),
   );
   my $from;
   while ($from = $dq->{from}) {
@@ -382,10 +397,7 @@ sub _render_order {
     $dq = $from;
     push @ret, (
       ',',
-      $self->_render($dq->{by}),
-      ($dq->{reverse}
-        ? $self->_format_keyword('DESC')
-        : ())
+      $self->_order_chunk($dq),
     );
   }
   unshift @ret, $self->_render($from) if $from;
@@ -454,11 +466,13 @@ sub _render_insert {
     ($names
       ? ('(', intersperse(',', map $self->_render($_), @$names), ')')
       : ()),
-    $self->_format_keyword('VALUES'),
-    intersperse(',',
-      map [ '(', intersperse(',', map $self->_render($_), @$_), ')' ],
-        @$values
-    ),
+    (@$values && @{$values->[0]}
+      ? ($self->_format_keyword('VALUES'),
+         intersperse(',',
+           map [ '(', intersperse(',', map $self->_render($_), @$_), ')' ],
+             @$values
+         ))
+      : ($self->_insert_default_values)),
     ($returning
       ? ($self->_format_keyword('RETURNING'),
          intersperse(',', map $self->_render($_), @$returning))
@@ -466,4 +480,9 @@ sub _render_insert {
   ];
 }
 
+sub _insert_default_values {
+  my ($self) = @_;
+  $self->_format_keyword('DEFAULT VALUES'),
+}
+
 1;