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) {
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});
}
}
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);
}