X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FCDBICompat%2FImaDBI.pm;h=d0f16f206113e8dbc8cae99da5dd626c8425f8e7;hb=12bbb33986a29dc27dd3e2b9d082a87f50124ec1;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..d0f16f2 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 }; + } + die "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); }