package CtrlO::DBIC::Cursor::RowCountStatistics;
use Class::Method::Modifiers;
+use CtrlO::DBIC::Cursor::RowCountStatistics::Storage;
+
use parent 'DBIx::Class::Storage::DBI::Cursor';
our $VERSION = '0.000001'; # 0.0.1
$VERSION = eval $VERSION;
+around new => sub {
+ my $orig = shift;
+ my ($class, $storage, @rest) = @_;
+ return $orig->(
+ $class,
+ CtrlO::DBIC::Cursor::RowCountStatistics::Storage->new($storage),
+ @rest,
+ );
+};
+
after next => sub {
my ($self) = @_;
$self->{_ctrlo_rcs_count}++
unless $self->{_done};
};
+around all => sub {
+ my $orig = shift;
+ my ($self) = @_;
+ my @rows = $orig->(@_);
+ $self->_emit_query_complete(scalar(@rows));
+ return @rows;
+};
+
before __finish_sth => sub {
my ($self) = @_;
my $sql = $self->sth->{Statement};
+ $self->_emit_query_complete($self->{_ctrlo_rcs_count} || 0);
+};
+
+sub _emit_query_complete {
+ my ($self, $count) = @_;
$self->storage->debugobj->query_complete(
- $self->{_ctrlo_rcs_count} || 0,
- $sql,
+ $count,
+ $self->storage->_cached_sql,
# TODO pass bind params
) if $self->storage->debug;
-};
+}
1;
--- /dev/null
+use strict;
+use warnings;
+
+package CtrlO::DBIC::Cursor::RowCountStatistics::Storage;
+use Class::Method::Modifiers;
+
+sub new {
+ my ($class, $original) = @_;
+ return bless {
+ original => $original,
+ }, $class;
+}
+
+sub _cached_sql {
+ my ($self) = @_;
+ return $self->{cached_sql};
+}
+
+sub throw_exception {
+ my $self = shift;
+ return $self->{original}->throw_exception(@_);
+}
+
+sub _select {
+ my $self = shift;
+ my @res = $self->{original}->_select(@_);
+ $self->{cached_sql} = $res[1]{Statement};
+ return @res;
+}
+
+sub debug {
+ my $self = shift;
+ return $self->{original}->debug(@_);
+}
+
+sub debugobj {
+ my $self = shift;
+ return $self->{original}->debugobj(@_);
+}
+
+1;
my $rs = $schema->resultset('Test');
-subtest 'simple' => sub {
+subtest 'count with ->next' => sub {
local @_COMPLETE;
$rs->create({ id => $_ }) for 1..10;
do {
$rs->delete;
};
+subtest 'count with ->all' => sub {
+ local @_COMPLETE;
+ $rs->create({ id => $_ }) for 1..10;
+ do {
+ my $rows = $rs->search_rs;
+ is ref($rows->cursor), 'CtrlO::DBIC::Cursor::RowCountStatistics',
+ 'resultset cursor';
+ my @all = $rows->all;
+ };
+ is scalar(@_COMPLETE), 1, 'single complete call';
+ is $_COMPLETE[0][0], 10, 'full count';
+ $rs->delete;
+};
+
subtest 'empty' => sub {
local @_COMPLETE;
do {