Hatena::Groupasakura

浅倉卓司@blog風味? このページをアンテナに追加 RSSフィード

Error : RSSが取得できませんでした。

2006-03-27(Mon)

Class::DBI::Plugin::AggregateFunction

| 14:10 |  Class::DBI::Plugin::AggregateFunction - 浅倉卓司@blog風味? を含むブックマーク  Class::DBI::Plugin::AggregateFunction - 浅倉卓司@blog風味? のブックマークコメント

 というわけでClass::DBI::Plugin::AggregateFunctionも作りました。

 SQL::Abstractを利用していて、Class::DBI::AbstractSearch風になってます。

 ベースクラスを識別してClass::DBI::Sweetの時は上のを使うようにしたほうがいいのかな、と思いつつ。似てるけど別物だしなぁ……。


ソースコード

package Class::DBI::Plugin::AggregateFunction;
use strict;
use vars qw/$VERSION @EXPORT @EXPORT_OK/;
$VERSION = '0.01';

use Exporter::Lite;
@EXPORT = qw/mk_aggregate_function/;

sub mk_aggregate_function {
    my $class = shift;
    my ($aggregate_func, $alias) = @_;
    $alias ||= $aggregate_func;

    $class->set_sql( "Retrieve_$aggregate_func" => <<__SQL__ );
  SELECT $aggregate_func( %s )
  FROM   __TABLE__
  WHERE  %s
__SQL__

    no strict 'refs';
    *{"$class\::$alias"} = sub {
	my $proto = shift;
	my $class = ref($proto) || $proto;
	my $aggregate_column = shift;

	my $where = (ref $_[0]) ? $_[0]          : { @_ };
	my $attr  = (ref $_[0]) ? $_[1]          : undef;

	my $sql = SQL::Abstract->new(%$attr);
	my($phrase, @bind) = $sql->where($where);
	$phrase =~ s/^\s*WHERE\s*//i;

	my $sql_method = "sql_Retrieve_$aggregate_func";
	my $sth = $class->$sql_method( $aggregate_column, $phrase );

	return $sth->select_val( @bind );
    }
}

1;
__END__
=head1 NAME

Class::DBI::Plugin::AggregateFunction

=head1 SYNOPSYS

  package MyData::CD;
  use base qw/Class::DBI/;
  use Class::DBI::Plugin::AggregateFunction;
  __PACKAGE__->mk_aggregate_function('sum');
  __PACKAGE__->mk_aggregate_function( max => 'maximum');

  package main;
  # SELECT MAX(price) FROM __TABLE__
  my $max = MyData::CD->maximum( 'price' );

  # SELECT SUM(price) FROM __TABLE__ WHERE artist = 'foo'
  my $sum = MyData::CD->sum( 'price', artist => 'foo' );

=head1 DESCRIPTION

 Class::DBIを使ったテーブルで簡単に集約関数が使えるようになります。

=cut
トラックバック - http://asakura.g.hatena.ne.jp/asakura-t/20060327
2004 | 01 | 02 | 03 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 08 | 09 | 10 | 11 | 12 |
2007 | 02 | 03 | 04 | 05 | 06 | 07 | 10 | 11 | 12 |
2008 | 02 | 03 | 04 | 06 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 02 | 03 | 04 | 05 | 07 | 08 | 10 | 11 | 12 |
2013 | 01 | 05 | 07 |
2014 | 01 | 02 |
2016 | 01 |
2017 | 01 | 05 |