restore debolaz's cleanup patch since it's not what I thought it was and probably...
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / Oracle / WhereJoins.pm
index 2ba6815..730c73b 100644 (file)
@@ -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__