Port more of the back-compat tests
[dbsrgits/SQL-Abstract-2.0-ish.git] / lib / SQL / Abstract / AST / Compat.pm
index 9159048..4093bc2 100644 (file)
@@ -16,8 +16,35 @@ class SQL::Abstract::AST::Compat {
     default => 'AND'
   );
 
-  method generate(WhereType $ast) returns (AST) {
-    return $self->recurse_where($ast);
+  sub mk_name {
+    shift;
+    return { -type => 'name', args => [ @_ ] };
+  }
+
+  method select(Str|ArrayRef|ScalarRef $from, ArrayRef|Str $fields,
+                WhereType $where?,
+                WhereType $order?)
+  {
+    my $ast = {
+      -type => 'select',
+      columns => [ 
+        map {
+          $self->mk_name($_)
+        } ( is_Str($fields) ? $fields : @$fields )
+      ],
+      tablespec => $self->tablespec($from)
+    };
+
+
+    $ast->{where} = $self->recurse_where($where)
+      if defined $where;
+
+    return $ast;
+  }
+
+  method tablespec(Str|ArrayRef|ScalarRef $from) {
+    return $self->mk_name($from)
+      if is_Str($from);
   }
 
   method recurse_where(WhereType $ast, LogicEnum $logic?) returns (AST) {
@@ -100,7 +127,20 @@ class SQL::Abstract::AST::Compat {
       confess "Don't know how to handle " . dump($value) . " (too many keys)"
         if @rest;
 
-      $ret->{op} = $op;
+      # TODO: Validate the op?
+      if ($op =~ /^-([a-z_]+)$/i) {
+        $ret->{op} = lc $1;
+
+        if (is_ArrayRef($value->{$op})) {
+          push @{$ret->{args}}, $self->value($_)
+            for @{$value->{$op}};
+          return $ret;
+        }
+      }
+      else {
+        $ret->{op} = $op;
+      }
+
       push @{$ret->{args}}, $self->value($value->{$op});
 
     }
@@ -129,12 +169,10 @@ class SQL::Abstract::AST::Compat {
   }
 
   method value($value) returns (AST) {
-    if (is_Str($value)) {
-      return { -type => 'value', value => $value };
-    }
-    else {
-      confess "Don't know how to handle " . dump($value);
-    }
+    return { -type => 'value', value => $value }
+      if is_Str($value);
+
+    confess "Don't know how to handle terminal value " . dump($value);
   }