[CDBI] Group by and AbstractSearch

Brett Sanger swiftone at swiftone.org
Fri Oct 21 17:10:53 BST 2005


On Fri, Oct 21, 2005 at 07:48:00AM -0700, Bill Moseley wrote:
> > sub area_summary {
> >   my $self = shift;
> >   my $sql = SQL::Abstract->new();
> >   my ($where, @bind) = $sql->where(@_);
> >   return $self->sql_summarize($where)->select_val(@bind);
> > }
> 
> Doesn't select_val() return just one value?  Seem like in the case
> above you would define a TEMP column 'Count' and then search as
> normal with $class->search_summarize()

After some more doc reading, delving into the code, and some
experimentation:

search_summarize() wouldn't let me pass my arbitrary where clauses (it
accepts data for placeholders, but not string replacement)

sql_summarize() let's me pass along arbitrary string replacments, but
then I'm left with a statement handle. I can execute() it to fill my
placeholders, but then I'm outside my CDBI model.

By looking into how set_sql() works in CDBI, I came up with this which
appears to work just fine:

__PACKAGE__->set_sql( summarize =>  
  "select fips, provider_type, count(id) as Count  
  from __TABLE__
  %s
  group by fips, provider_type"
);

sub area_summary {
  my $self = shift;
  my $sql = SQL::Abstract->new();
  my ($where, @bind) = $sql->where(@_);
  return $self->sth_to_objects($self->sql_summarize($where), \@bind);
}

But again, I'm a little uncomfortable since sth_to_objects() is undocumented
(but not marked as internal)

Can someone provide me some info to say if this is the intended course or not?

-- 
SwiftOne  /  Brett Sanger
swiftone at swiftone.org   




More information about the ClassDBI mailing list