X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSQLMaker%2FOracleJoins.pm;h=e645382c1ecf36552fb71e531c6f342a10b7c02b;hb=0488c7e1294791e01dc75dfe633454d0f4201384;hp=3bc8ec913a8af65d9c368366840ea93cf615af28;hpb=4c2b30d6e53cd05e570ad112e87ad6f96355f695;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/SQLMaker/OracleJoins.pm b/lib/DBIx/Class/SQLMaker/OracleJoins.pm index 3bc8ec9..e645382 100644 --- a/lib/DBIx/Class/SQLMaker/OracleJoins.pm +++ b/lib/DBIx/Class/SQLMaker/OracleJoins.pm @@ -1,87 +1,13 @@ -package # Hide from PAUSE - DBIx::Class::SQLMaker::OracleJoins; +package DBIx::Class::SQLMaker::OracleJoins; -use base qw( DBIx::Class::SQLMaker::Oracle ); -use Carp::Clan qw/^DBIx::Class|^SQL::Abstract/; - -sub select { - my ($self, $table, $fields, $where, $rs_attrs, @rest) = @_; - - if (ref($table) eq 'ARRAY') { - $where = $self->_oracle_joins($where, @{ $table }); - } - - return $self->SUPER::select($table, $fields, $where, $rs_attrs, @rest); -} - -sub _recurse_from { - my ($self, $from, @join) = @_; - - my @sqlf = $self->_from_chunk_to_sql($from); - - for (@join) { - my ($to, $on) = @$_; - - if (ref $to eq 'ARRAY') { - push (@sqlf, $self->_recurse_from(@{ $to })); - } - else { - push (@sqlf, $self->_from_chunk_to_sql($to)); - } - } - - return join q{, }, @sqlf; -} - -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->_recurse_oracle_joins($where, @{ $to }); - } - - my $to_jt = ref $to eq 'ARRAY' ? $to->[0] : $to; - my $left_join = q{}; - my $right_join = q{}; - - if (ref $to_jt eq 'HASH' and exists $to_jt->{-join_type}) { - #TODO: Support full outer joins -- this would happen much earlier in - #the sequence since oracle 8's full outer join syntax is best - #described as INSANE. - croak "Can't handle full outer joins in Oracle 8 yet!\n" - if $to_jt->{-join_type} =~ /full/i; +use warnings; +use strict; +use Module::Runtime (); - $left_join = q{(+)} if $to_jt->{-join_type} =~ /left/i - && $to_jt->{-join_type} !~ /inner/i; - - $right_join = q{(+)} if $to_jt->{-join_type} =~ /right/i - && $to_jt->{-join_type} !~ /inner/i; - } +use base qw( DBIx::Class::SQLMaker::Oracle ); - foreach my $lhs (keys %{ $on }) { - $where->{$lhs . $left_join} = \"= $on->{ $lhs }$right_join"; - } - } +sub _build_base_renderer_class { + Module::Runtime::use_module('DBIx::Class::SQLMaker::Renderer::OracleJoins'); } 1; @@ -94,9 +20,8 @@ DBIx::Class::SQLMaker::OracleJoins - Pre-ANSI Joins-via-Where-Clause Syntax =head1 PURPOSE -This module was originally written to support Oracle < 9i where ANSI joins -weren't supported at all, but became the module for Oracle >= 8 because -Oracle's optimising of ANSI joins is horrible. +This module is used with Oracle < 9.0 due to lack of support for standard +ANSI join syntax. =head1 SYNOPSIS @@ -122,25 +47,16 @@ it's already too late. =over -=item select ($\@$;$$@) - -Replaces DBIx::Class::SQLMaker's select() method, which calls _oracle_joins() -to modify the column and table list before calling SUPER::select(). - -=item _recurse_from ($$\@) - -Recursive subroutine that builds the table list. - -=item _oracle_joins ($$$@) +=item select -Creates the left/right relationship in the where query. +Overrides DBIx::Class::SQLMaker's select() method, which calls _oracle_joins() +to modify the column and table list before calling next::method(). =back =head1 BUGS -Does not support full outer joins. -Probably lots more. +Does not support full outer joins (however neither really does DBIC itself) =head1 SEE ALSO