fix arrayref tables to use correct join generation style
[dbsrgits/SQL-Abstract.git] / lib / SQL / Abstract / Converter.pm
index b7380dd..0439b1c 100644 (file)
@@ -9,6 +9,7 @@ use Data::Query::Constants qw(
 );
 use Data::Query::ExprHelpers qw(perl_scalar_value);
 use Moo;
+use namespace::clean;
 
 has renderer_will_quote => (
   is => 'ro'
@@ -277,6 +278,9 @@ sub _where_to_dq {
 
   return undef unless defined($where);
 
+  # if we're given a simple string assume it's a literal
+  return $self->_literal_to_dq($where) if !ref($where);
+
   # turn the convert misfeature on - only used in WHERE clauses
   local $self->{where_convert} = $self->convert;
 
@@ -295,6 +299,8 @@ sub _expr_to_dq {
     or (ref($where) eq 'REF' and ref($$where) eq 'ARRAY')
   ) {
     return $self->_literal_to_dq($$where);
+  } elsif (ref($where) eq 'REF' and ref($$where) eq 'HASH') {
+    return $$where;
   } elsif (!ref($where) or Scalar::Util::blessed($where)) {
     return $self->_value_to_dq($where);
   }
@@ -547,7 +553,7 @@ sub _order_by_to_dq {
 
   my $dq = {
     type => DQ_ORDER,
-    ($dir ? (direction => $dir) : ()),
+    (defined($dir) ? (reverse => !!($dir =~ /desc/i)) : ()),
     ($from ? (from => $from) : ()),
   };
 
@@ -570,7 +576,23 @@ sub _order_by_to_dq {
   } elsif (ref($arg) eq 'REF' and ref($$arg) eq 'ARRAY') {
     $dq->{by} = $self->_literal_to_dq($$arg);
   } elsif (ref($arg) eq 'SCALAR') {
-    $dq->{by} = $self->_literal_to_dq($$arg);
+
+    # < mst> right, but if it doesn't match that, it goes "ok, right, not sure, 
+    #        totally leaving this untouched as a literal"
+    # < mst> so I -think- it's relatively robust
+    # < ribasushi> right, it's relatively safe then
+    # < ribasushi> is this regex centralized?
+    # < mst> it only exists in _order_by_to_dq in SQL::Abstract::Converter
+    # < mst> it only exists because you were kind enough to support new 
+    #        dbihacks crack combined with old literal order_by crack
+    # < ribasushi> heh :)
+
+    if (my ($ident, $dir) = $$arg =~ /^(\w+)(?:\s+(desc|asc))?$/i) {
+      $dq->{by} = $self->_ident_to_dq($ident);
+      $dq->{reverse} = 1 if $dir and lc($dir) eq 'desc';
+    } else {
+      $dq->{by} = $self->_literal_to_dq($$arg);
+    }
   } elsif (ref($arg) eq 'HASH') {
     my ($key, $val, @rest) = %$arg;
 
@@ -595,7 +617,8 @@ sub _table_to_dq {
     while (my $x = shift @f) {
       $dq = {
         type => DQ_JOIN,
-        join => [ $dq, $self->_table_to_dq($x) ]
+        left => $dq,
+        right => $self->_table_to_dq($x),
       };
     }
     $dq;