Added as_sql and as_subselect as wrappers around as_query
Rob Kinyon [Fri, 13 Feb 2009 19:43:12 +0000 (19:43 +0000)]
lib/DBIx/Class/ResultSet.pm
lib/DBIx/Class/ResultSetColumn.pm
t/resultset/as_query.t

index edd9bd3..f717435 100644 (file)
@@ -1723,7 +1723,54 @@ Returns the SQL query and bind vars associated with the invocant.
 
 =cut
 
-sub as_query { return shift->cursor->as_query }
+sub as_query { return shift->cursor->as_query(@_) }
+
+=head2 as_subselect
+
+=over 4
+
+=item Arguments: none
+
+=item Return Value: \[ $sql, @bind ]
+
+=back
+
+Returns the SQL query and bind vars associated with the invocant.
+
+The SQL will be wrapped in parentheses, ready for use as a subselect.
+
+=cut
+
+sub as_subselect {
+  my $self = shift;
+  my $arr = ${$self->as_query(@_)};
+  $arr->[0] = '( ' . $arr->[0] . ' )';
+  return \$arr;
+}
+
+=head2 as_query
+
+=over 4
+
+=item Arguments: none
+
+=item Return Value: $sql
+
+=back
+
+Returns the SQL query associated with the invocant. All bind vars
+will have been bound using C<< DBI->quote() >>.
+
+=cut
+
+sub as_sql {
+  my $self = shift;
+  my $arr = ${$self->as_query(@_)};
+  my $sql = shift @$arr;
+  my $dbh = $self->result_source->schema->storage->dbh;
+  $sql =~ s/\?/$dbh->quote((shift @$arr)->[1])/eg;
+  return $sql
+}
 
 =head2 find_or_new
 
index 78fd44a..5e8e727 100644 (file)
@@ -70,6 +70,53 @@ Returns the SQL query and bind vars associated with the invocant.
 
 sub as_query { return shift->_resultset->as_query }
 
+=head2 as_subselect
+
+=over 4
+
+=item Arguments: none
+
+=item Return Value: \[ $sql, @bind ]
+
+=back
+
+Returns the SQL query and bind vars associated with the invocant.
+
+The SQL will be wrapped in parentheses, ready for use as a subselect.
+
+=cut
+
+sub as_subselect {
+  my $self = shift;
+  my $arr = ${$self->as_query(@_)};
+  $arr->[0] = '( ' . $arr->[0] . ' )';
+  return \$arr;
+}
+
+=head2 as_query
+
+=over 4
+
+=item Arguments: none
+
+=item Return Value: $sql
+
+=back
+
+Returns the SQL query associated with the invocant. All bind vars
+will have been bound using C<< DBI->quote() >>.
+
+=cut
+
+sub as_sql {
+  my $self = shift;
+  my $arr = ${$self->as_query(@_)};
+  my $sql = shift @$arr;
+  my $dbh = $self->_resultset->result_source->schema->storage->dbh;
+  $sql =~ s/\?/$dbh->quote((shift @$arr)->[1])/eg;
+  return $sql
+}
+
 =head2 next
 
 =over 4
index 5211637..97dd3e4 100644 (file)
@@ -52,23 +52,24 @@ $art_rs = $art_rs->search({ rank => 2 });
   );
 }
 
+{my $sql = $art_rs->as_sql; warn "$sql\n";}
+
 my $rscol = $art_rs->get_column( 'charfield' );
 
 {
-  my $arr = $rscol->as_query;
+  my $arr = $rscol->as_subselect;
   my ($query, @bind) = @{$$arr};
 
   is_same_sql_bind(
     $query, \@bind,
-    "SELECT me.charfield FROM artist me WHERE ( ( ( rank = ? ) AND ( name = ? ) ) )",
+    "( SELECT me.charfield FROM artist me WHERE ( ( ( rank = ? ) AND ( name = ? ) ) ) )",
     [ [ rank => 2 ], [ name => 'Billy Joel' ] ],
   );
 }
+{my $sql = $rscol->as_sql; warn "$sql\n";}
 
 my $cdrs2 = $cdrs->search({
-  artist_id => {
-    -in => $art_rs->get_column( 'id' )->as_query,
-  },
+  artist_id => $art_rs->get_column( 'id' )->as_query,
 });
 warn Dumper $cdrs2->as_query;
 __END__