X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSQLAHacks%2FOracleJoins.pm;h=8e88fc19daf3d5a287a50c71f824ce2be44b167a;hb=4a233f3019d2baa4bf2abee0c873c74d5cdf3a11;hp=cd5feaaa05f5bcfedcfab50f7da390c67c9d28a7;hpb=855c6fd0a7864a9453e07f103cfdfdd5054afebf;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/SQLAHacks/OracleJoins.pm b/lib/DBIx/Class/SQLAHacks/OracleJoins.pm index cd5feaa..8e88fc1 100644 --- a/lib/DBIx/Class/SQLAHacks/OracleJoins.pm +++ b/lib/DBIx/Class/SQLAHacks/OracleJoins.pm @@ -1,170 +1,9 @@ package # Hide from PAUSE DBIx::Class::SQLAHacks::OracleJoins; -use base qw( DBIx::Class::SQLAHacks ); +use warnings; +use strict; -sub select { - my ($self, $table, $fields, $where, $order, @rest) = @_; - - if (ref($table) eq 'ARRAY') { - $where = $self->_oracle_joins($where, @{ $table }); - } - - return $self->SUPER::select($table, $fields, $where, $order, @rest); -} - -sub _recurse_from { - my ($self, $from, @join) = @_; - - my @sqlf = $self->_make_as($from); - - foreach my $j (@join) { - my ($to, $on) = @{ $j }; - - if (ref $to eq 'ARRAY') { - push (@sqlf, $self->_recurse_from(@{ $to })); - } - else { - push (@sqlf, $self->_make_as($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. - 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} =~ /left/i - && $to_jt->{-join_type} !~ /inner/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"; - } - } -} +use base qw( DBIx::Class::SQLMaker::OracleJoins ); 1; - -=pod - -=head1 NAME - -DBIx::Class::SQLAHacks::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. (See: -http://scsys.co.uk:8001/7495) - -=head1 SYNOPSIS - -Not intended for use directly; used as the sql_maker_class for schemas and components. - -=head1 DESCRIPTION - -Implements pre-ANSI joins specified in the where clause. Instead of: - - SELECT x FROM y JOIN z ON y.id = z.id - -It will write: - - SELECT x FROM y, z WHERE y.id = z.id - -It should properly support left joins, and right joins. Full outer joins are -not possible due to the fact that Oracle requires the entire query be written -to union the results of a left and right join, and by the time this module is -called to create the where query and table definition part of the sql query, -it's already too late. - -=head1 METHODS - -=over - -=item select ($\@$;$$@) - -Replaces DBIx::Class::SQLAHacks'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 ($$$@) - -Creates the left/right relationship in the where query. - -=back - -=head1 BUGS - -Does not support full outer joins. -Probably lots more. - -=head1 SEE ALSO - -=over - -=item L - Storage class using this - -=item L - Parent module - -=item L - Duh - -=back - -=head1 AUTHOR - -Justin Wheeler C<< >> - -=head1 CONTRIBUTORS - -David Jack Olrik C<< >> - -=head1 LICENSE - -This module is licensed under the same terms as Perl itself. - -=cut -