X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FCDBICompat%2FImaDBI.pm;h=22b7eff08a819eb257160fc420e31238a7c99790;hb=78bab9cad621ac5e3d1d12b02c41d662dec7a22a;hp=f702f14d516abf00babddd2cbc4e325339cfb321;hpb=ef29a097f034c0e4043011e7dda097a791d39c7d;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/CDBICompat/ImaDBI.pm b/lib/DBIx/Class/CDBICompat/ImaDBI.pm index f702f14..22b7eff 100644 --- a/lib/DBIx/Class/CDBICompat/ImaDBI.pm +++ b/lib/DBIx/Class/CDBICompat/ImaDBI.pm @@ -6,10 +6,49 @@ use warnings; use NEXT; use base qw/Class::Data::Inheritable/; +__PACKAGE__->mk_classdata('_transform_sql_handler_order' + => [ qw/TABLE ESSENTIAL JOIN/ ] ); + __PACKAGE__->mk_classdata('_transform_sql_handlers' => { - 'TABLE' => sub { return $_[0]->_table_name }, - 'ESSENTIAL' => sub { join(' ', $_[0]->columns('Essential')) }, + 'TABLE' => + sub { + my ($self, $class, $data) = @_; + return $class->_table_name unless $data; + my ($f_class, $alias) = split(/=/, $data); + $f_class ||= $class; + $self->{_aliases}{$alias} = $f_class; + return $f_class->_table_name." ${alias}"; + }, + 'ESSENTIAL' => + sub { + my ($self, $class, $data) = @_; + return join(' ', $class->columns('Essential')) unless $data; + return join(' ', $self->{_aliases}{$data}->columns('Essential')); + }, + 'JOIN' => + sub { + my ($self, $class, $data) = @_; + my ($from, $to) = split(/ /, $data); + my ($from_class, $to_class) = @{$self->{_aliases}}{$from, $to}; + my ($rel_obj) = grep { $_->{class} && $_->{class} eq $to_class } + values %{ $from_class->_relationships }; + unless ($rel_obj) { + ($from, $to) = ($to, $from); + ($from_class, $to_class) = ($to_class, $from_class); + ($rel_obj) = grep { $_->{class} && $_->{class} eq $to_class } + values %{ $from_class->_relationships }; + } + $self->throw( "No relationship to JOIN from ${from_class} to ${to_class}" ) + unless $rel_obj; + my $attrs = { + _aliases => { self => $from, foreign => $to }, + _action => 'join', + }; + my $join = $from_class->_cond_resolve($rel_obj->{cond}, $attrs); + return $join; + } + } ); sub db_Main { @@ -51,9 +90,10 @@ sub set_sql { sub transform_sql { my ($class, $sql, @args) = @_; my $table = $class->_table_name; - foreach my $key (keys %{ $class->_transform_sql_handlers }) { + my $attrs = { }; + foreach my $key (@{$class->_transform_sql_handler_order}) { my $h = $class->_transform_sql_handlers->{$key}; - $sql =~ s/__$key(?:\(([^\)]+)\))?__/$h->($class, $1)/eg; + $sql =~ s/__$key(?:\(([^\)]+)\))?__/$h->($attrs, $class, $1)/eg; } return sprintf($sql, @args); }