force , as multop, switch order_by
[scpubgit/Q-Branch.git] / lib / SQL / Abstract.pm
index ca4b54f..3f982b3 100644 (file)
@@ -202,6 +202,8 @@ sub new {
     -or => '_expand_op_andor',
     -nest => '_expand_nest',
     -bind => sub { shift; +{ @_ } },
+    -in => '_expand_in',
+    -not_in => '_expand_in',
   };
 
   $opt{expand_op} = {
@@ -242,6 +244,7 @@ sub new {
     ),
     (not => '_render_op_not'),
     (map +($_ => '_render_op_andor'), qw(and or)),
+    ',' => '_render_op_multop',
   };
 
   return bless \%opt, $class;
@@ -992,7 +995,10 @@ sub _expand_between {
 }
 
 sub _expand_in {
-  my ($self, $op, $vv, $k) = @_;
+  my ($self, $raw, $vv, $k) = @_;
+  $k = shift @{$vv = [ @$vv ]} unless defined $k;
+  local our $Cur_Col_Meta = $k;
+  my $op = $self->_normalize_op($raw);
   if (my $literal = is_literal_value($vv)) {
     my ($sql, @bind) = @$literal;
     my $opened_sql = $self->_open_outer_paren($sql);
@@ -1009,8 +1015,7 @@ sub _expand_in {
   ;
   puke("Argument passed to the '${\uc($op)}' operator can not be undefined")
     if !defined($vv);
-  my @rhs = map $self->_expand_expr($_),
-              map { ref($_) ? $_ : { -bind => [ $k, $_ ] } }
+  my @rhs = map $self->expand_expr($_, -value),
               map { defined($_) ? $_: puke($undef_err) }
                 (ref($vv) eq 'ARRAY' ? @$vv : $vv);
   return $self->${\($op =~ /^not/ ? 'sqltrue' : 'sqlfalse')} unless @rhs;
@@ -1273,7 +1278,7 @@ sub _expand_order_by {
               ),
                 map $self->expand_expr($_, -ident),
                 map ref($_) eq 'ARRAY' ? @$_ : $_, @to_expand;
-    return (@exp > 1 ? { -list => \@exp } : $exp[0]);
+    return (@exp > 1 ? { -op => [ ',', @exp ] } : $exp[0]);
   };
 
   local @{$self->{expand}}{qw(-asc -desc)} = (($expander) x 2);
@@ -1312,8 +1317,9 @@ sub _chunkify_order_by {
     if $expanded->{-ident} or @{$expanded->{-literal}||[]} == 1;
 
   for ($expanded) {
-    if (ref() eq 'HASH' and my $l = $_->{-list}) {
-      return map $self->_chunkify_order_by($_), @$l;
+    if (ref() eq 'HASH' and $_->{-op} and $_->{-op}[0] eq ',') {
+      my ($comma, @list) = @{$_->{-op}};
+      return map $self->_chunkify_order_by($_), @list;
     }
     return [ $self->render_aqt($_) ];
   }