makes search_related on extended rels without the optimized version work. involves...
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / SQLMaker.pm
index 287dcc8..3cd017d 100644 (file)
@@ -183,7 +183,7 @@ sub select {
   if ($limit) {
     # this is legacy code-flow from SQLA::Limit, it is not set in stone
 
-    ($sql, @bind) = $self->next::method ($table, $fields, $where);
+    ($sql, @bind) = $self->__overriden_select($table, $fields, $where);
 
     my $limiter =
       $self->can ('emulate_limit')  # also backcompat hook from SQLA::Limit
@@ -199,7 +199,7 @@ sub select {
     $sql = $self->$limiter ($sql, $rs_attrs, $limit, $offset);
   }
   else {
-    ($sql, @bind) = $self->next::method ($table, $fields, $where, $rs_attrs);
+    ($sql, @bind) = $self->__overriden_select($table, $fields, $where, $rs_attrs);
   }
 
   push @{$self->{where_bind}}, @bind;
@@ -213,6 +213,25 @@ sub select {
   return wantarray ? ($sql, @all_bind) : $sql;
 }
 
+sub __overriden_select {
+  my $self   = shift;
+  my ($table, @bind)  = $self->_table(shift);
+  my $fields = shift || '*';
+  my $where  = shift;
+  my $order  = shift;
+
+  my($where_sql, @morebind) = $self->where($where, $order);
+  push @bind, @morebind;
+
+  my $f = (ref $fields eq 'ARRAY') ? join ', ', map { $self->_quote($_) } @$fields
+                                   : $fields;
+  my $sql = join(' ', $self->_sqlcase('select'), $f,
+                      $self->_sqlcase('from'),   $table)
+          . $where_sql;
+
+  return wantarray ? ($sql, @bind) : $sql;
+}
+
 sub _assemble_binds {
   my $self = shift;
   return map { @{ (delete $self->{"${_}_bind"}) || [] } } (qw/select from where group having order/);
@@ -378,7 +397,7 @@ sub _generate_join_clause {
 
 sub _recurse_from {
   my ($self, $from, @join) = @_;
-  my @sqlf;
+  my (@sqlf, @binds);
   push @sqlf, $self->_from_chunk_to_sql($from);
 
   for (@join) {
@@ -397,13 +416,17 @@ sub _recurse_from {
     push @sqlf, $self->_generate_join_clause( $join_type );
 
     if (ref $to eq 'ARRAY') {
-      push(@sqlf, '(', $self->_recurse_from(@$to), ')');
+      my ($sql, @local_bind) = $self->_recurse_from(@$to);
+      push(@sqlf, '(', $sql , ')');
+      push @binds, @local_bind;
     } else {
       push(@sqlf, $self->_from_chunk_to_sql($to));
     }
-    push(@sqlf, ' ON ', $self->_join_condition($on));
+    my ($sql, @local_bind) = $self->_join_condition($on);
+    push(@sqlf, ' ON ', $sql);
+    push @binds, @local_bind;
   }
-  return join('', @sqlf);
+  return join('', @sqlf), @binds;
 }
 
 sub _from_chunk_to_sql {
@@ -450,9 +473,16 @@ sub _join_condition {
         my $x = '= '.$self->_quote($v); $j{$_} = \$x;
       }
     };
-    return scalar($self->_recurse_where(\%j));
+    return $self->_recurse_where(\%j);
   } elsif (ref $cond eq 'ARRAY') {
-    return join(' OR ', map { $self->_join_condition($_) } @$cond);
+    my @parts;
+    my @binds;
+    foreach my $c (@$cond) {
+      my ($sql, @bind) = $self->_join_condition($c);
+      push @binds, @bind;
+      push @parts, $sql;
+    }
+    return join(' OR ', @parts), @binds;
   } else {
     croak "Can't handle this yet!";
   }