From: Rob Kinyon Date: Fri, 13 Feb 2009 19:43:12 +0000 (+0000) Subject: Added as_sql and as_subselect as wrappers around as_query X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=c7a9d1027d40e6b3275cb26db68141b152f3bd13;p=dbsrgits%2FDBIx-Class-Historic.git Added as_sql and as_subselect as wrappers around as_query --- diff --git a/lib/DBIx/Class/ResultSet.pm b/lib/DBIx/Class/ResultSet.pm index edd9bd3..f717435 100644 --- a/lib/DBIx/Class/ResultSet.pm +++ b/lib/DBIx/Class/ResultSet.pm @@ -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 diff --git a/lib/DBIx/Class/ResultSetColumn.pm b/lib/DBIx/Class/ResultSetColumn.pm index 78fd44a..5e8e727 100644 --- a/lib/DBIx/Class/ResultSetColumn.pm +++ b/lib/DBIx/Class/ResultSetColumn.pm @@ -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 diff --git a/t/resultset/as_query.t b/t/resultset/as_query.t index 5211637..97dd3e4 100644 --- a/t/resultset/as_query.t +++ b/t/resultset/as_query.t @@ -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__