DBIx::RoboQuery::ResultSet - Configure the results to get what you want
version 0.030
my $resultset = DBIx::RoboQuery::ResultSet->new($query, {opt => 'val'}); # or use $query->resultset $resultset->execute; my @columns = $resultset->columns; my $records = $resultset->hash; # like DBI/fetchall_hashref # or $resultset->array # like DBI/fetchall_arrayref
This is the companion to DBIx::RoboQuery. Most things about the ResultSet can be configured on the query. The ResultSet provides easy access to information about the query and results.
See "SYNOPSIS" in DBIx::RoboQuery for a more thorough example.
DBIx::RoboQuery::ResultSet->new($query, opt => 'val'); # Can also be instantiated from a query object: DBIx::RoboQuery->new(sql => $sql)->resultset(opt => 'val');
The first argument should be a DBIx::RoboQuery instance.
The remaining arguments should be a hash or hashref of options. These options will be checked in the passed hash[ref] first. If they do not exist, they will be looked for on the query object.
my $dbh = DBI->connect(); $query = DBIx::RoboQuery->new(sql => $sql, dbh => $dbh); # These two invocations will produce the same result: # The 1st call sets 'dbh' explicitly. # The 2nd call will find the 'dbh' attribute on $query. DBIx::RoboQuery::ResultSet->new($query, dbh => $dbh); DBIx::RoboQuery::ResultSet->new($query);
See "new" in DBIx::RoboQuery for the list of options.
NOTE: The constructor will call $query->sql() (and cache the result) to ensure that the query is fully configured before copying some of its attributes to the new resultset object.
$query->sql()
my $array_of_hashes = $resultset->array; # or an array of arrays if 'default_slice' is set to an arrayref
Calls fetchall_arrayref(@_) on the DBI statement handle (passing any supplied arguments).
Like fetchall_arrayref, this method will take a slice as the first argument.
fetchall_arrayref
* NOTE * : Unlike fetchall_arrayref, With no arguments, or if the first argument is undefined, the method will act as if passed an empty hash ref.
To send the maximum number of desired rows it must be passed as the second argument.
$resultset->array(); # default is an array of hashrefs $resultset->array({}); # same as above $resultset->array([]); # array of arrays $resultset->array([0]); # array of arrays with only first column $resultset->array({k=>1}); # array of hashes with only column 'k' $resultset->array({}, 5); # array of hashrefs, no more than 5 $resultset->array([], 5); # array of arrayrefs, no more than 5
To Reiterate : This method takes the same two possible arguments as "fetchall_arrayref" in DBI. However, if no arguments are supplied, an empty {} will be sent to fetchall_arrayref to make it return an array of hash refs.
{}
If this deviation is undesired, you can set default_slice to [] to return to the DBI default. Like many options this can be set on the query or the resultset.
default_slice
[]
DBIx::RoboQuery->new(default_slice => [], %opts);
See "bound_params" in DBIx::RoboQuery.
See "bound_values" in DBIx::RoboQuery.
my @columns = $resultset->columns;
Return the columns of the result set.
This includes key and non-key columns and excludes dropped columns.
This is only useful after the query has been executed (and will croak if it has not been).
croak
my @columns = $resultset->drop_columns;
Return a list of the column names being dropped (ignored) from the result set.
$resultset->execute();
Execute the query against the dbh.
query
dbh
my $hash_of_hashes = $resultset->hash;
Returns a tree of hashrefs like "fetchall_hashref" in DBI.
Records will be stored (and considered unique) according to the key_columns attribute. If more than one record has the same values for key_columns the last record from the database will be returned.
key_columns
The preferences attribute can be used to determine which record to select instead of simply the last one received. See "preference" for more information, or "prefer" in DBIx::RoboQuery for how to write and store the preference rules.
preferences
An error is thrown if key_columns is empty. "fetchall_hashref" in DBI doesn't check the length of key_columns. An empty array ends up returning a single hash (the last row) instead of the hash tree which can be very confusing and surely is not desired. There are more efficient ways to get the last row if that's really all you want.
my @keys = $resultset->key_columns;
Return a list of the primary key columns from the query.
The key_columns attribute should be set on the query object. This read-only accessor is provided here for convenience and consistency with the other column attributes.
my @other = $resultset->non_key_columns;
Return a list of the other columns from the query.
Excludes key columns and dropped columns.
$resultset->preference($record1, $record2);
This is used internally by the "hash" method to determine which record it should choose when multiple records have the same key value(s).
When "fetchall_hashref" in DBI encounters multiple records having the same key field(s), the last encountered record is the one saved to the hash and returned.
This "last one in wins" logic is preserved in this method for any records that cannot be determined by the specified preference rules.
See "prefer" in DBIx::RoboQuery for details on specifying record preferences.
my $query = $resultset->query;
Returns the query object (in case you lost it).
Returns the number of rows returned via "array" or "hash". It will return -1 until after one of those methods have been called.
-1
For "array" this is the same as scalar @$rows.
scalar @$rows
For "hash" it is the number of (non-duplicate) rows (which would be harder to count manually from the hash tree).
Returns a hashref of timing info (the length of time each operation took in fractional seconds).
Keys include:
prepare - Prepare the statement
prepare
execute - Execute the statement
execute
fetch - Fetch (and transform) all the records
fetch
total - Sum of all times
total
While there is some error checking, the module probably assumes you're setting "RaiseError" in DBI to true on your dbh.
If you don't use "RaiseError" in DBI, and you experience problems, please let me know (submit a patch or a bug report).
Evaluate preference for "array" if key_columns is set?
Randy Stauner <rwstauner@cpan.org>
This software is copyright (c) 2010 by Randy Stauner.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
To install DBIx::RoboQuery, copy and paste the appropriate command in to your terminal.
cpanm
cpanm DBIx::RoboQuery
CPAN shell
perl -MCPAN -e shell install DBIx::RoboQuery
For more information on module installation, please visit the detailed CPAN module installation guide.