X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FOracle%2FWhereJoins.pm;h=730c73b7339fa8c45d0ce3ef6f4dd2cff15671b9;hb=a89c6fc05a07aac7f7b4c2b115a12e10aab7fd05;hp=2ba681582952c85c59c5d72472dfb7d590851ad5;hpb=9382ad0721370b25b9b93d78c76ecab0b46cc74e;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Oracle/WhereJoins.pm b/lib/DBIx/Class/Storage/DBI/Oracle/WhereJoins.pm index 2ba6815..730c73b 100644 --- a/lib/DBIx/Class/Storage/DBI/Oracle/WhereJoins.pm +++ b/lib/DBIx/Class/Storage/DBI/Oracle/WhereJoins.pm @@ -5,15 +5,20 @@ use base qw( DBIx::Class::Storage::DBI::Oracle::Generic ); use strict; use warnings; +__PACKAGE__->sql_maker_class('DBIC::SQL::Abstract::Oracle'); + BEGIN { - package DBIC::SQL::Abstract::Oracle; + package # Hide from PAUSE + DBIC::SQL::Abstract::Oracle; use base qw( DBIC::SQL::Abstract ); sub select { my ($self, $table, $fields, $where, $order, @rest) = @_; - $self->_oracle_joins($where, @{ $table }); + if (ref($table) eq 'ARRAY') { + $where = $self->_oracle_joins($where, @{ $table }); + } return $self->SUPER::select($table, $fields, $where, $order, @rest); } @@ -39,12 +44,29 @@ BEGIN { sub _oracle_joins { my ($self, $where, $from, @join) = @_; + my $join_where = {}; + $self->_recurse_oracle_joins($join_where, $from, @join); + if (keys %$join_where) { + if (!defined($where)) { + $where = $join_where; + } else { + if (ref($where) eq 'ARRAY') { + $where = { -or => $where }; + } + $where = { -and => [ $join_where, $where ] }; + } + } + return $where; + } + + sub _recurse_oracle_joins { + my ($self, $where, $from, @join) = @_; foreach my $j (@join) { my ($to, $on) = @{ $j }; if (ref $to eq 'ARRAY') { - $self->_oracle_joins($where, @{ $to }); + $self->_recurse_oracle_joins($where, @{ $to }); } my $to_jt = ref $to eq 'ARRAY' ? $to->[0] : $to; @@ -58,32 +80,20 @@ BEGIN { die "Can't handle full outer joins in Oracle 8 yet!\n" if $to_jt->{-join_type} =~ /full/i; - $left_join = q{(+)} if $to_jt->{-join_type} =~ /right/i + $left_join = q{(+)} if $to_jt->{-join_type} =~ /left/i && $to_jt->{-join_type} !~ /inner/i; - $right_join = q{(+)} if $to_jt->{-join_type} =~ /left/i + $right_join = q{(+)} if $to_jt->{-join_type} =~ /right/i && $to_jt->{-join_type} !~ /inner/i; } foreach my $lhs (keys %{ $on }) { - $where->{$lhs . $left_join} = \" = $on->{ $lhs }$right_join"; + $where->{$lhs . $left_join} = \"= $on->{ $lhs }$right_join"; } } } } -sub sql_maker { - my ($self) = @_; - - unless ($self->_sql_maker) { - $self->_sql_maker( - new DBIC::SQL::Abstract::Oracle( $self->_sql_maker_args ) - ); - } - - return $self->_sql_maker; -} - 1; __END__