Collection
view release on metacpan or search on metacpan
lib/Collection/AutoSQL.pm view on Meta::CPAN
return { $inserted_id => $self->fetch_one($inserted_id) };
}
sub _delete {
my $self = shift;
my $table_name = $self->_table_name();
my $field = $self->_key_field;
return [] unless scalar @_;
my $str = "DELETE FROM $table_name WHERE $field IN ("
. join( ",", qw/?/ x @_ ) . ")";
$self->_query_dbh( $str, @_ );
return \@_;
}
sub _fetch_ids {
my $self = shift;
my $dbh = $self->_dbh();
my $table_name = $self->_table_name();
my $field = $self->_key_field;
my $query = "SELECT $field FROM $table_name";
return $dbh->selectcol_arrayref($query);
}
#__flow_sql__ $sql_query,[values for sql_query], $on_page_count, $page_num
sub __flow_sql__ {
my $self = shift;
my $flow = shift;
my $query = shift;
my $params = shift; #[array]
my $bulk = shift;
my $one_page = shift;
my $dbh = $self->_dbh();
my $field = $self->_key_field;
my $page = $one_page || 0;
my $count = 0;
my $flow_res;
do {
my $query_limit =
( ($self->{dbtype}|| '' ) eq 'pg')
? "$query limit $bulk offset " . ( $page * $bulk )
: "$query limit " . ( $page * $bulk ) . ", $bulk";
my $res = $dbh->selectcol_arrayref( $query_limit, {}, @$params );
$count = scalar(@$res);
$flow_res =
$flow->_flow( map { $self->after_load( { $field => $_ } )->{$field} }
@$res );
$page++;
} until $count < $bulk or defined($one_page) or $flow_res;
return undef;
}
=head2 list_ids [ flow=>$Flow],
Return list of ids
params:
flow - Flow:: object for streaming results
onpage - [pagination] count of ids on page
page - [pagination] requested page ( depend on onpage)
exp - ref to expression for select
desc - revert sorting ([1,0])
where - custom where if needed, instead expr ['where sring', $query_param1,..]
query - custom query
uniq - set uniq flag ( eq GROUP BY (key) )
order - ORDER BY field
return:
[array] - array of ids
if used C<flow> param:
"string" - if error
undef - ok
expamles:
$c->list_ids() #return [array of ids]
$c->list_ids(flow=>$flow, exp=>{ type=>"t1", "date<"=>12341241 },
page=>2, onpage=>10, desc=>1 )
=cut
sub list_ids {
my $self = shift;
my %args = @_;
# return array ref by default
return $self->_fetch_ids unless scalar(@_);
my @query_param = ();
my $where;
if ( my $custom_where = $args{'where'} ) {
( $where, @query_param ) = @{$custom_where};
}
elsif ( my $exp = $args{'expr'} ) {
( $where, @query_param ) = $self->_prepare_where($exp);
}
#make query
my $dbh = $self->_dbh();
my $table_name = $self->_table_name();
my $field = $self->_key_field;
my $query = $args{query} || "SELECT $field FROM $table_name";
$query .= " where $where" if $where;
if ($args{uniq}) {
#strip dups
$query .= " group by $field";
}
my $onpage = $args{onpage} || 10000;
#add order by
if ( my $orderby = $args{order} ) {
$query .= " ORDER BY $orderby";
}
#change sorting
$query .= " DESC" if $args{desc};
( run in 1.525 second using v1.01-cache-2.11-cpan-140bd7fdf52 )