3 class SQL::Abstract::Compat {
5 use Moose::Util::TypeConstraints;
6 use MooseX::Types::Moose qw/Str ScalarRef ArrayRef HashRef/;
7 use SQL::Abstract::Types::Compat ':all';
8 use SQL::Abstract::Types qw/AST/;
9 use SQL::Abstract::AST::v1;
10 use Data::Dump qw/pp/;
11 use Devel::PartialDump qw/dump/;
14 class_type 'SQL::Abstract';
26 isa => 'SQL::Abstract',
27 clearer => 'clear_visitor',
29 builder => '_build_visitor',
33 method select(Str|ArrayRef|ScalarRef $from, ArrayRef|Str $fields,
42 } ( is_Str($fields) ? $fields : @$fields )
44 tablespec => $self->tablespec($from)
48 $ast->{where} = $self->recurse_where($where)
51 return ($self->visitor->dispatch($ast), $self->visitor->binds);
54 method where(WhereType $where,
60 my $ast = $self->recurse_where($where);
61 $ret .= "WHERE " . $self->visitor->_expr($ast);
67 method _build_visitor() {
68 return SQL::Abstract->create(1);
73 return { -type => 'name', args => [ @_ ] };
76 method tablespec(Str|ArrayRef|ScalarRef $from) {
77 return $self->mk_name($from)
81 method recurse_where(WhereType $ast, LogicEnum $logic?) returns (AST) {
82 return $self->recurse_where_hash($logic || 'AND', $ast) if is_HashRef($ast);
83 return $self->recurse_where_array($logic || 'OR', $ast) if is_ArrayRef($ast);
84 croak "Unknown where clause type " . dump($ast);
87 method recurse_where_hash(LogicEnum $logic, HashRef $ast) returns (AST) {
95 while (my ($key,$value) = each %$ast) {
96 if ($key =~ /^-(or|and)$/) {
97 my $val = $self->recurse_where($value, uc $1);
98 if ($val->{op} eq $ret->{op}) {
99 push @args, @{$val->{args}};
107 push @args, $self->field($key, $value);
110 return $args[0] if @args == 1;
115 method recurse_where_array(LogicEnum $logic, ArrayRef $ast) returns (AST) {
124 while (my $key = shift @nodes) {
125 if ($key =~ /^-(or|and)$/) {
126 my $value = shift @nodes
127 or confess "missing value after $key at " . dump($ast);
129 my $val = $self->recurse_where($value, uc $1);
130 if ($val->{op} eq $ret->{op}) {
131 push @args, @{$val->{args}};
139 push @args, $self->recurse_where($key);
142 return $args[0] if @args == 1;
147 method field(Str $key, $value) returns (AST) {
152 { -type => 'name', args => [$key] }
156 if (is_HashRef($value)) {
157 my ($op, @rest) = keys %$value;
158 confess "Don't know how to handle " . dump($value) . " (too many keys)"
161 # TODO: Validate the op?
162 if ($op =~ /^-([a-z_]+)$/i) {
165 if (is_ArrayRef($value->{$op})) {
166 push @{$ret->{args}}, $self->value($_)
167 for @{$value->{$op}};
175 push @{$ret->{args}}, $self->value($value->{$op});
178 elsif (is_ArrayRef($value)) {
179 # Return an or clause, sort of.
188 { -type => 'name', args => [$key] },
196 push @{$ret->{args}}, $self->value($value);
202 method value($value) returns (AST) {
203 return { -type => 'value', value => $value }
206 confess "Don't know how to handle terminal value " . dump($value);
214 SQL::Abstract::Compant - compatibility layer for SQL::Abstrct v 1.xx
218 This class attempts to maintain the original behaviour of version 1 of
219 SQL::Abstract. It does this by internally converting to an AST and then using
220 the standard AST visitor.
222 If so desired, you can get hold of this transformed AST somehow. This is aimed
223 at libraries such as L<DBIx::Class> that use SQL::Abstract-style arrays or
224 hashes as part of their public interface.
228 Ash Berlin C<< <ash@cpan.org> >>