kill vestigial _expand_noop method
[scpubgit/Q-Branch.git] / lib / SQL / Abstract.pm
index 70ff3ea..476ca94 100644 (file)
@@ -139,19 +139,9 @@ sub is_plain_value ($) {
 
 our %Defaults = (
   expand => {
-    not => '_expand_not',
     bool => '_expand_bool',
-    and => '_expand_op_andor',
-    or => '_expand_op_andor',
-    nest => '_expand_nest',
-    bind => '_expand_bind',
-    in => '_expand_in',
-    not_in => '_expand_in',
     row => '_expand_row',
-    between => '_expand_between',
-    not_between => '_expand_between',
     op => '_expand_op',
-    (map +($_ => '_expand_op_is'), ('is', 'is_not')),
     func => '_expand_func',
     values => '_expand_values',
   },
@@ -167,7 +157,8 @@ our %Defaults = (
     'value' => '_expand_value',
   },
   render => {
-    (map +($_, "_render_$_"), qw(op func bind ident literal row values)),
+    (map +($_, "_render_$_"),
+      qw(op func bind ident literal row values keyword)),
   },
   render_op => {
     (map +($_ => '_render_op_between'), 'between', 'not_between'),
@@ -481,7 +472,7 @@ sub _render_insert_clause_fields {
 
 sub _render_insert_clause_target {
   my ($self, undef, $from) = @_;
-  $self->join_query_parts(' ', $self->format_keyword('insert into'), $from);
+  $self->join_query_parts(' ', { -keyword => 'insert into' }, $from);
 }
 
 sub _render_insert_clause_from {
@@ -560,7 +551,7 @@ sub update {
 
 sub _render_update_clause_target {
   my ($self, undef, $target) = @_;
-  $self->join_query_parts(' ', $self->format_keyword('update'), $target);
+  $self->join_query_parts(' ', { -keyword => 'update' }, $target);
 }
 
 sub _update_set_values {
@@ -745,7 +736,7 @@ sub _expand_delete_clause_returning {
 
 sub _render_delete_clause_target {
    my ($self, undef, $from) = @_;
-   $self->join_query_parts(' ', $self->format_keyword('delete from'), $from);
+   $self->join_query_parts(' ', { -keyword => 'delete from' }, $from);
 }
 
 #======================================================================
@@ -848,7 +839,7 @@ sub _render_statement {
         my $r = $self->render_aqt($clause_expr, 1);
         next unless defined $r->[0] and length $r->[0];
         $self->join_query_parts(' ',
-          $self->format_keyword($clause),
+          { -keyword => $clause },
           $r
         );
       }
@@ -998,23 +989,26 @@ sub _expand_hashpair_op {
 
   my $op = $self->_normalize_op($k);
 
-  { # Old SQLA compat
+  my $wsop = join(' ', split '_', $op);
 
-    my $op = join(' ', split '_', $op);
+  my $is_special = List::Util::first { $wsop =~ $_->{regex} }
+                     @{$self->{special_ops}};
+
+  { # Old SQLA compat
 
     # the old special op system requires illegality for top-level use
 
     if (
       (our $Expand_Depth) == 1
       and (
-        List::Util::first { $op =~ $_->{regex} } @{$self->{special_ops}}
+        $is_special
         or (
           $self->{disable_old_special_ops}
-          and List::Util::first { $op =~ $_->{regex} } @BUILTIN_SPECIAL_OPS
+          and List::Util::first { $wsop =~ $_->{regex} } @BUILTIN_SPECIAL_OPS
         )
       )
     ) {
-      puke "Illegal use of top-level '-$op'"
+      puke "Illegal use of top-level '-$wsop'"
     }
   }
 
@@ -1022,6 +1016,10 @@ sub _expand_hashpair_op {
     return $self->$exp($op, $v);
   }
 
+  if ($self->{render}{$op}) {
+    return { "-${op}" => $v };
+  }
+
   # Ops prefixed with -not_ get converted
 
   if (my ($rest) = $op =~/^not_(.*)$/) {
@@ -1042,36 +1040,30 @@ sub _expand_hashpair_op {
     }
   }
 
-  # an explicit node type is currently assumed to be expanded (this is almost
-  # certainly wrong and there should be expansion anyway)
-
-  if ($self->{render}{$op}) {
-    return { $k => $v };
-  }
+  my $type = $is_special || $self->{render_op}{$op} ? -op : -func;
 
-  my $type = $self->{unknown_unop_always_func} ? -func : -op;
+  if ($self->{restore_old_unop_handling}) {
 
-  { # Old SQLA compat
+    # Old SQLA compat
 
     if (
       ref($v) eq 'HASH'
       and keys %$v == 1
       and (keys %$v)[0] =~ /^-/
+      and not $self->{render_op}{$op}
+      and not $is_special
     ) {
-      $type = (
-        (List::Util::first { $op =~ $_->{regex} } @{$self->{special_ops}})
-          ? -op
-          : -func
-      )
+      $type = -func;
+    } else {
+      $type = -op;
     }
   }
 
-  return +{ $type => [
-    $op,
-    ($type eq -func and ref($v) eq 'ARRAY')
-      ? map $self->_expand_expr($_), @$v
-      : $self->_expand_expr($v)
-  ] };
+  if ($type eq -func and ref($v) eq 'ARRAY') {
+    return $self->_expand_expr({ -func => [ $op, @$v ] });
+  }
+
+  return $self->_expand_expr({ $type => [ $op, $v ] });
 }
 
 sub _expand_hashpair_cmp {
@@ -1205,10 +1197,6 @@ sub _expand_value {
   +{ -bind => [ our $Cur_Col_Meta, $_[2] ] };
 }
 
-sub _expand_not {
-  +{ -op => [ 'not', $_[0]->_expand_expr($_[2]) ] };
-}
-
 sub _expand_row {
   my ($self, undef, $args) = @_;
   +{ -row => [ map $self->expand_expr($_), @$args ] };
@@ -1313,7 +1301,7 @@ sub _expand_between {
   return +{ -op => [
     $op,
     $self->expand_expr(ref($k) ? $k : { -ident => $k }),
-    @rhs
+    map $self->expand_expr($_, -value), @rhs
   ] }
 }
 
@@ -1364,11 +1352,6 @@ sub _expand_nest {
   return $self->_expand_expr($v);
 }
 
-sub _expand_bind {
-  my ($self, undef, $bind) = @_;
-  return { -bind => $bind };
-}
-
 sub _expand_values {
   my ($self, undef, $values) = @_;
   return { -values => [
@@ -1381,12 +1364,12 @@ sub _expand_values {
 }
 
 sub _recurse_where {
-  my ($self, $where, $logic) = @_;
+  my ($self, $where) = @_;
 
   # Special case: top level simple string treated as literal
 
   my $where_exp = (ref($where)
-                    ? $self->_expand_expr($where, $logic)
+                    ? $self->_expand_select_clause_where(undef, $where)
                     : { -literal => [ $where ] });
 
   # dispatch expanded expression
@@ -1406,7 +1389,7 @@ sub _recurse_where {
 sub _render_ident {
   my ($self, undef, $ident) = @_;
 
-  return [ $self->_convert($self->_quote($ident)) ];
+  return [ $self->_quote($ident) ];
 }
 
 sub _render_row {
@@ -1433,7 +1416,7 @@ sub _render_func {
 
 sub _render_bind {
   my ($self, undef, $bind) = @_;
-  return [ $self->_convert('?'), $self->_bindtype(@$bind) ];
+  return [ '?', $self->_bindtype(@$bind) ];
 }
 
 sub _render_literal {
@@ -1442,6 +1425,13 @@ sub _render_literal {
   return $literal;
 }
 
+sub _render_keyword {
+  my ($self, undef, $keyword) = @_;
+  return [ $self->_sqlcase(
+    ref($keyword) ? $$keyword : join ' ', split '_', $keyword
+  ) ];
+}
+
 sub _render_op {
   my ($self, undef, $v) = @_;
   my ($op, @args) = @$v;
@@ -1486,11 +1476,11 @@ sub _render_op_between {
         unless $low->{-literal};
       $low;
     } else {
-      +($low, $self->format_keyword('and'), $high);
+      +($low, { -keyword => 'and' }, $high);
     }
   };
   return $self->join_query_parts(' ',
-    '(', $left, $self->format_keyword($op), @rh, ')',
+    '(', $left, { -keyword => $op }, @rh, ')',
   );
 }
 
@@ -1500,7 +1490,7 @@ sub _render_op_in {
 
   return $self->join_query_parts(' ',
     $lhs,
-    $self->format_keyword($op),
+    { -keyword => $op },
     $self->join_query_parts(' ',
       '(',
       $self->join_query_parts(', ', @rhs),
@@ -1527,7 +1517,7 @@ sub _render_op_multop {
   return $self->render_aqt($parts[0]) if @parts == 1;
   my $join = ($op eq ','
                 ? ', '
-                :  ' '.$self->format_keyword($op).' '
+                : { -keyword => " ${op} " }
              );
   return $self->join_query_parts($join, @parts);
 }
@@ -1535,7 +1525,7 @@ sub _render_op_multop {
 sub _render_values {
   my ($self, undef, $values) = @_;
   my $inner = $self->join_query_parts(' ',
-    $self->format_keyword('values'),
+    { -keyword => 'values' },
     $self->join_query_parts(', ',
       ref($values) eq 'ARRAY' ? @$values : $values
     ),
@@ -1547,6 +1537,9 @@ sub _render_values {
 
 sub join_query_parts {
   my ($self, $join, @parts) = @_;
+  if (ref($join) eq 'HASH') {
+    $join = $self->render_aqt($join)->[0];
+  }
   my @final = map +(
     ref($_) eq 'HASH'
       ? $self->render_aqt($_)
@@ -1569,15 +1562,21 @@ sub _render_unop_paren {
 
 sub _render_unop_prefix {
   my ($self, $op, $v) = @_;
+  my $op_sql = $self->{restore_old_unop_handling}
+                 ? $self->_sqlcase($op)
+                 : { -keyword => $op };
   return $self->join_query_parts(' ',
-    $self->_sqlcase($op), $v->[0]
+    ($self->{restore_old_unop_handling}
+      ? $self->_sqlcase($op)
+      : { -keyword => \$op }),
+    $v->[0]
   );
 }
 
 sub _render_unop_postfix {
   my ($self, $op, $v) = @_;
   return $self->join_query_parts(' ',
-    $v->[0], $self->format_keyword($op),
+    $v->[0], { -keyword => $op },
   );
 }
 
@@ -1771,7 +1770,7 @@ sub _convert {
   #my ($self, $arg) = @_;
   if (my $conv = $_[0]->{convert_where}) {
     return @{ $_[0]->join_query_parts('',
-      $_[0]->format_keyword($conv),
+      $_[0]->_sqlcase($conv),
       '(' , $_[1] , ')'
     ) };
   }
@@ -1802,23 +1801,6 @@ sub _assert_bindval_matches_bindtype {
   }
 }
 
-sub _join_sql_clauses {
-  my ($self, $logic, $clauses_aref, $bind_aref) = @_;
-
-  if (@$clauses_aref > 1) {
-    my $join  = " " . $self->_sqlcase($logic) . " ";
-    my $sql = '( ' . join($join, @$clauses_aref) . ' )';
-    return ($sql, @$bind_aref);
-  }
-  elsif (@$clauses_aref) {
-    return ($clauses_aref->[0], @$bind_aref); # no parentheses
-  }
-  else {
-    return (); # if no SQL, ignore @$bind_aref
-  }
-}
-
-
 # Fix SQL case, if so requested
 sub _sqlcase {
   # LDNOTE: if $self->{case} is true, then it contains 'lower', so we
@@ -1826,8 +1808,6 @@ sub _sqlcase {
   return $_[0]->{case} ? $_[1] : uc($_[1]);
 }
 
-sub format_keyword { $_[0]->_sqlcase(join ' ', split '_', $_[1]) }
-
 #======================================================================
 # DISPATCHING FROM REFKIND
 #======================================================================