Modified Cursor to use COUNT(*) for count if possible
Matt S Trout [Sun, 31 Jul 2005 22:56:09 +0000 (22:56 +0000)]
lib/DBIx/Class/Cursor.pm
lib/DBIx/Class/Table.pm

index d492ebb..b28bf27 100644 (file)
@@ -7,13 +7,14 @@ use overload
         fallback => 1;
 
 sub new {
-  my ($it_class, $db_class, $sth, $args, $cols) = @_;
+  my ($it_class, $db_class, $sth, $args, $cols, $attrs) = @_;
   $sth->execute(@{$args || []}) unless $sth->{Active};
   my $new = {
     class => $db_class,
     sth => $sth,
     cols => $cols,
-    args => $args };
+    args => $args,
+    attrs => $attrs };
   return bless ($new, $it_class);
 }
 
@@ -26,7 +27,18 @@ sub next {
 }
 
 sub count {
-  return scalar $_[0]->all; # So inefficient
+  my ($self) = @_;
+  if (my $cond = $self->{attrs}->{where}) {
+    my $class = $self->{class};
+    my $sth = $class->_get_sth( 'select', [ 'COUNT(*)' ],
+                                  $class->_table_name, $cond);
+    $sth->execute(@{$self->{args} || []});
+    my ($count) = $sth->fetchrow_array;
+    $sth->finish;
+    return $count;
+  } else {
+    return scalar $_[0]->all; # So inefficient
+  }
 }
 
 sub all {
index d7d67a8..6caae42 100644 (file)
@@ -162,15 +162,15 @@ sub retrieve_from_sql {
   my @cols = $class->_select_columns($attrs);
   my $sth = $class->_get_sth( 'select', \@cols, $class->_table_name, $cond);
   #warn "$cond @vals";
-  return $class->sth_to_objects($sth, \@vals, \@cols);
+  return $class->sth_to_objects($sth, \@vals, \@cols, { where => $cond });
 }
 
 sub sth_to_objects {
-  my ($class, $sth, $args, $cols) = @_;
+  my ($class, $sth, $args, $cols, $attrs) = @_;
   my @cols = ((ref $cols eq 'ARRAY') ? @$cols : @{$sth->{NAME_lc}} );
   my $cursor_class = $class->_cursor_class;
   eval "use $cursor_class;";
-  my $cursor = $cursor_class->new($class, $sth, $args, \@cols);
+  my $cursor = $cursor_class->new($class, $sth, $args, \@cols, $attrs);
   return (wantarray ? $cursor->all : $cursor);
 }