handle crack fueled inner function thing
[dbsrgits/SQL-Abstract.git] / lib / SQL / Abstract.pm
index 8843e51..eb6104c 100644 (file)
@@ -503,10 +503,19 @@ sub _recurse_where {
 sub _where_to_dq {
   my ($self, $where, $logic) = @_;
 
-  # dispatch on appropriate method according to refkind of $where
-  my $method = $self->_METHOD_FOR_refkind("_where_to_dq", $where);
-
-  return $self->$method($where, $logic);
+  if (ref($where) eq 'ARRAY') {
+    return $self->_where_to_dq_ARRAYREF($where, $logic);
+  } elsif (ref($where) eq 'HASH') {
+    return $self->_where_to_dq_HASHREF($where, $logic);
+  } elsif (
+    ref($where) eq 'SCALAR'
+    or (ref($where) eq 'REF' and ref($$where) eq 'ARRAY')
+  ) {
+    return $self->_literal_to_dq($$where);
+  } elsif (!ref($where) or Scalar::Util::blessed($where)) {
+    return $self->_value_to_dq($where);
+  }
+  die "Can't handle $where";
 }
 
 sub _where_to_dq_ARRAYREF {
@@ -538,16 +547,6 @@ sub _where_to_dq_ARRAYREF {
   };
 }
 
-sub _where_to_dq_ARRAYREFREF {
-  my ($self, $where) = @_;
-  return $self->_literal_to_dq($$where);
-}
-
-sub _where_to_dq_SCALARREF {
-  my ($self, $where) = @_;
-  return $self->_literal_to_dq($$where);
-}
-
 sub _where_to_dq_HASHREF {
   my ($self, $where, $logic) = @_;
 
@@ -644,12 +643,26 @@ sub _where_hashpair_to_dq {
         args => [ ref($v) ? $self->_where_to_dq($v) : $self->_ident_to_dq($v) ]
       };
     } else {
+      my @args = do {
+        if (ref($v) eq 'HASH' and keys(%$v) == 1 and (keys %$v)[0] =~ /-(.*)/) {
+          my ($inner) = values %$v;
+          +{
+            type => DQ_OPERATOR,
+            operator => { 'SQL.Naive' => uc($1) },
+            args => [ 
+              (map $self->_where_to_dq($_),
+                (ref($inner) eq 'ARRAY' ? @$inner : $inner))
+            ]
+          };
+        } else {
+          (map $self->_where_to_dq($_), (ref($v) eq 'ARRAY' ? @$v : $v))
+        }
+      };
       return +{
         type => DQ_OPERATOR,
         operator => { 'SQL.Naive' => 'apply' },
         args => [
-          $self->_ident_to_dq($op),
-          (map $self->_where_to_dq($_), (ref($v) eq 'ARRAY' ? @$v : $v))
+          $self->_ident_to_dq($op), @args
         ],
       };
     }