Data-Tabular

 view release on metacpan or  search on metacpan

lib/Data/Tabular/Table/Group.pm  view on Meta::CPAN

# Copyright (C) 2003-2007, G. Allen Morris III, all rights reserved

use strict;

package
    Data::Tabular::Table::Group;

use base 'Data::Tabular::Table';

use Data::Tabular::Group::Interface;

sub new
{
    my $class = shift;
    bless { @_ }, $class;
}

sub _row_count
{
    my $self = shift;

    die;
}

sub sum_list
{
    my $self = shift;
    $self->group->sum_list;
}

sub column_sum
{
    my $self = shift;
    my $column_name = shift;
    my $ret;
    if ($ret = $self->{memo}->{$column_name}) {
        return $ret;
    }
    my $formula = '=SUM(';
    my $sum = 0;
    my @rows;
    for my $row ($self->raw_rows) {
        push(@rows, $row->id());
	my $next = $row->get($column_name);
	if (UNIVERSAL::isa($next, 'Data::Tabular::Formula')) {
die;
	    $next = $next->{html};
	}
	$sum += $next;
    }
    require Data::Tabular::Type::Formula;

    $ret = Data::Tabular::Type::Formula->new(
        data => $sum,
	type => 'sum',
	column => $column_name,
	rows => \@rows,
    );

    $self->{memo}->{$column_name} = $ret;
    $ret;
}

sub column_average
{
    my $self = shift;
    my $column_name = shift;
    my $ret;
    if ($ret = $self->{memoa}->{$column_name}) {
        return $ret;
    }
    my $formula = '=SUM(';
    my $sum = 0;
    my @rows;
    my $count = 0;
    for my $row ($self->raw_rows) {
        push(@rows, $row->id());
	my $next = $row->get($column_name);
	if (UNIVERSAL::isa($next, 'Data::Tabular::Formula')) {
die;
	    $next = $next->{html};
	}
	$sum += $next;
	$count++;
    }
    require Data::Tabular::Type::Formula;

    $ret = Data::Tabular::Type::Formula->new(
        data => $sum / $count,
	count => $count,
	type => 'avg',
	column => $column_name,
	rows => \@rows,
    );

    $self->{memoa}->{$column_name} = $ret;
    $ret;
}

sub group
{
    my $self = shift;
    $self->{group};
}

sub headers
{
    my $self = shift;
    $self->group->headers;
}

sub all_headers
{
    my $self = shift;

    $self->group->headers;
}

sub raw_rows
{
    my $self = shift;
    my @ret = ();

    for my $value (@{$self->{data}}) {
	next unless $value;
	if ($value->isa(__PACKAGE__)) {
	    push(@ret, $value->raw_rows);
	} else {
	    push(@ret, $value);
	}
    }
    @ret;



( run in 0.806 second using v1.01-cache-2.11-cpan-39bf76dae61 )