3 class SQL::Abstract::AST::Compat {
5 use MooseX::Types::Moose qw/ArrayRef HashRef Str ScalarRef/;
6 use SQL::Abstract::Types qw/AST/;
7 use SQL::Abstract::Types::Compat ':all';
8 use Devel::PartialDump qw/dump/;
19 method generate(WhereType $ast) returns (AST) {
20 return $self->recurse_where($ast);
23 method recurse_where(WhereType $ast, LogicEnum $logic?) returns (AST) {
24 return $self->recurse_where_hash($logic || 'AND', $ast) if is_HashRef($ast);
25 return $self->recurse_where_array($logic || 'OR', $ast) if is_ArrayRef($ast);
26 croak "Unknown where clause type " . dump($ast);
29 method recurse_where_hash(LogicEnum $logic, HashRef $ast) returns (AST) {
37 while (my ($key,$value) = each %$ast) {
38 if ($key =~ /^-(or|and)$/) {
39 my $val = $self->recurse_where($value, uc $1);
40 if ($val->{op} eq $ret->{op}) {
41 push @args, @{$val->{args}};
49 push @args, $self->field($key, $value);
52 return $args[0] if @args == 1;
57 method recurse_where_array(LogicEnum $logic, ArrayRef $ast) returns (AST) {
66 while (my $key = shift @nodes) {
67 if ($key =~ /^-(or|and)$/) {
68 my $value = shift @nodes
69 or confess "missing value after $key at " . dump($ast);
71 my $val = $self->recurse_where($value, uc $1);
72 if ($val->{op} eq $ret->{op}) {
73 push @args, @{$val->{args}};
81 push @args, $self->recurse_where($key);
84 return $args[0] if @args == 1;
89 method field(Str $key, $value) returns (AST) {
94 { -type => 'name', args => [$key] }
99 push @{$ret->{args}}, { -type => 'value', value => $value };
112 SQL::Abstract::AST::Compat - v1.xx AST -> v2 AST visitor
116 The purpose of this module is to take the where clause arguments from version
117 1.x of SQL::Abstract, and turn it into a proper, explicit AST, suitable for use
118 in the rest of the code.
120 Please note that this module does not have the same interface as other
125 Ash Berlin C<< <ash@cpan.org> >>