nested where nodes
[dbsrgits/Data-Query.git] / lib / Data / Query / Renderer / SQL / Naive.pm
index 7485fba..19c2288 100644 (file)
@@ -8,8 +8,6 @@ use SQL::ReservedWords;
 use Data::Query::ExprHelpers;
 
 use Moo;
-no warnings;
-use warnings;
 
 has reserved_ident_parts => (
   is => 'ro', default => sub {
@@ -81,6 +79,9 @@ sub _flatten_structure {
 sub _format_keyword { $_[0]->lc_keywords ? lc($_[1]) : $_[1] }
 
 sub _render {
+  unless (ref($_[1]) eq 'HASH') {
+    die "Expected hashref, got ".(defined($_[1])?$_[1]:'undef');
+  }
   $_[0]->${\"_render_${\(lc($_[1]->{type})||'broken')}"}($_[1]);
 }
 
@@ -143,7 +144,7 @@ sub _render_operator {
 sub _maybe_parenthesise {
   my ($self, $dq) = @_;
   for ($dq) {
-    return is_Select() || is_Slice()
+    return is_Select() || is_Group() || is_Slice() || is_Having()
       ? [ '(', $self->_render($dq), ')' ]
       : $self->_render($dq);
   }
@@ -233,7 +234,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 {
@@ -312,7 +313,7 @@ sub _render_alias {
   }
   return [
     $self->_maybe_parenthesise($dq->{from}),
-    $as || ' ',
+    $as || '',
     $self->_render_identifier({ elements => [ $dq->{to} ] })
   ];
 }
@@ -358,6 +359,10 @@ sub _render_join {
 sub _render_where {
   my ($self, $dq) = @_;
   my ($from, $where) = @{$dq}{qw(from where)};
+  while (is_Where $from) {
+    $where = Operator({ 'SQL.Naive' => 'and' }, [ $where, $from->{where} ]);
+    $from = $from->{from};
+  }
   my $keyword = (is_Group($from) ? 'HAVING' : 'WHERE');
   [
     ($from ? $self->_render($from) : ()),