cleanup multop rendering
[scpubgit/Q-Branch.git] / lib / SQL / Abstract.pm
index 975c313..6b6f8c0 100644 (file)
@@ -233,7 +233,7 @@ sub new {
     (map +($_ => '_render_unop_postfix'),
       'is_null', 'is_not_null', 'asc', 'desc',
     ),
-    (not => '_render_op_not'),
+    (not => '_render_unop_paren'),
     (map +($_ => '_render_op_andor'), qw(and or)),
     ',' => '_render_op_multop',
   };
@@ -1130,18 +1130,20 @@ sub _render_op {
 
     my $op = join(' ', split '_', $op);
 
-    my $us = List::Util::first { $op =~ $_->{regex} } @{$self->{special_ops}};
-    if ($us and @args > 1) {
+    my $ss = List::Util::first { $op =~ $_->{regex} } @{$self->{special_ops}};
+    if ($ss and @args > 1) {
       puke "Special op '${op}' requires first value to be identifier"
         unless my ($ident) = map $_->{-ident}, grep ref($_) eq 'HASH', $args[0];
       my $k = join(($self->{name_sep}||'.'), @$ident);
       local our $Expand_Depth = 1;
-      return $self->${\($us->{handler})}($k, $op, $args[1]);
+      return $self->${\($ss->{handler})}($k, $op, $args[1]);
     }
     if (my $us = List::Util::first { $op =~ $_->{regex} } @{$self->{unary_ops}}) {
       return $self->${\($us->{handler})}($op, $args[0]);
     }
-
+    if ($ss) {
+      return $self->_render_unop_paren($op, \@args);
+    }
   }
   if (@args == 1) {
     return $self->_render_unop_prefix($op, \@args);
@@ -1200,7 +1202,7 @@ sub _render_op_andor {
   my @parts = grep length($_->[0]), map [ $self->render_aqt($_) ], @$args;
   return '' unless @parts;
   return @{$parts[0]} if @parts == 1;
-  my ($sql, @bind) = $self->_render_op_multop($op, $args);
+  my ($sql, @bind) = $self->_join_parts(' '.$self->_sqlcase($op).' ', @parts);
   return '( '.$sql.' )', @bind;
 }
 
@@ -1209,16 +1211,22 @@ sub _render_op_multop {
   my @parts = grep length($_->[0]), map [ $self->render_aqt($_) ], @$args;
   return '' unless @parts;
   return @{$parts[0]} if @parts == 1;
-  my ($final_sql) = join(
-    ($op eq ',' ? '' : ' ').$self->_sqlcase(join ' ', split '_', $op).' ',
-    map $_->[0], @parts
-  );
+  my $join = ($op eq ','
+                ? ', '
+                :  ' '.$self->_sqlcase(join ' ', split '_', $op).' '
+             );
+  return $self->_join_parts($join, @parts);
+}
+
+sub _join_parts {
+  my ($self, $join, @parts) = @_;
   return (
-    $final_sql,
+    join($join, map $_->[0], @parts),
     map @{$_}[1..$#$_], @parts
   );
 }
-sub _render_op_not {
+
+sub _render_unop_paren {
   my ($self, $op, $v) = @_;
   my ($sql, @bind) = $self->_render_unop_prefix($op, $v);
   return "(${sql})", @bind;