public function aggregate(StatsTableBuilder $statsTable) { $column = $statsTable->getColumn($this->columnName)->getValues(); $sum = array_sum($column); $count = count($column); return $count ? $sum / $count : 0; }
public function testBuilder() { $table = array('2014-01-01' => array('hits' => 10, 'subscribers' => 5), '2014-01-02' => array('hits' => 30, 'subscribers' => 9), '2014-01-03' => array('hits' => 0, 'subscribers' => 0)); $statsTable = new StatsTableBuilder($table); $ratioBuilder = new RatioColumnBuilder('subscribers', 'hits', 'N/A'); $statsTable->addDynamicColumn('ratio', $ratioBuilder, 'Ratio'); $ratioData = array('2014-01-01' => 0.5, '2014-01-02' => 0.3, '2014-01-03' => 'N/A'); $ratioColumn = new StatsColumnBuilder($ratioData, 'Ratio'); $this->assertEquals($ratioColumn, $statsTable->getColumn('ratio')); }
public function test() { $table = array('2014-01-01' => array('hits' => 10, 'subscribers' => 5), '2014-01-02' => array('hits' => 30, 'subscribers' => 9), '2014-01-03' => array('hits' => 0, 'subscribers' => 0)); $statsTable = new StatsTableBuilder($table); $sumBuilder = new SumColumnBuilder(array('subscribers', 'hits')); $statsTable->addDynamicColumn('sum', $sumBuilder, 'Sum'); $sumData = array('2014-01-01' => 15, '2014-01-02' => 39, '2014-01-03' => 0); $sumColumn = new StatsColumnBuilder($sumData, 'Sum'); $this->assertEquals($sumColumn, $statsTable->getColumn('sum')); }
public function buildColumnValues(StatsTableBuilder $statsTable) { $column = array(); $columnsValues = array_map(function ($columnName) use($statsTable) { return $statsTable->getColumn($columnName)->getValues(); }, $this->columns); foreach ($statsTable->getIndexes() as $index) { $lineValues = array_map(function ($array) use($index) { return $array[$index]; }, $columnsValues); $column[$index] = array_sum($lineValues); } return $column; }
public function buildColumnValues(StatsTableBuilder $statsTable) { $values = array(); foreach ($statsTable->getIndexes() as $index) { // Recreate line $line = array(); foreach ($statsTable->getColumns() as $columnName => $column) { $columnValues = $column->getValues(); $line = array_merge($line, array($columnName => $columnValues[$index])); } $values[$index] = call_user_func_array($this->callback, array($line)); } return $values; }
public function aggregate(StatsTableBuilder $statsTable) { $column = $statsTable->getColumn($this->columnName)->getValues(); return count($column); }
public function testGroupBy() { $table = array(array('tag' => 'one', 'subtag' => 'morning', 'hits' => 2), array('tag' => 'one', 'subtag' => 'afternoon', 'hits' => 3), array('tag' => 'two', 'subtag' => 'morning', 'hits' => 4)); $statsTableBuilder = new StatsTableBuilder($table, array('tag' => 'Tag', 'subtag' => 'When', 'hits' => 'Hits'), array('tag' => Format::STRING, 'subtag' => Format::STRING, 'hits' => Format::INTEGER), array('tag' => new StaticAggregation('Tag'), 'subtag' => new StaticAggregation('Sub tag'), 'hits' => new SumAggregation('hits', Format::INTEGER))); $groupedByStatsTableBuilder = $statsTableBuilder->groupBy(array('tag'), array('subtag')); $this->assertEquals(2, count($groupedByStatsTableBuilder->getColumns())); $this->assertEquals(array('one', 'two'), $groupedByStatsTableBuilder->getColumn('tag')->getValues()); $this->assertEquals(array(5, 4), $groupedByStatsTableBuilder->getColumn('hits')->getValues()); $this->assertEquals('Tag', $groupedByStatsTableBuilder->getColumn('tag')->getAggregation()->aggregate($groupedByStatsTableBuilder)); $this->assertEquals(9, $groupedByStatsTableBuilder->getColumn('hits')->getAggregation()->aggregate($groupedByStatsTableBuilder)); }
/** * Do a groupBy on columns, using aggregations to aggregate data per line * * @param string|array $columns Columns to aggregate * @param array $excludeColumns Irrelevant columns to exclude * * @return StatsTableBuilder */ public function groupBy($columns, array $excludeColumns = array()) { $groupedData = array(); $statsTable = $this->build(); foreach ($statsTable->getData() as $line) { $key = join('-_##_-', array_map(function ($c) use($line) { return $line[$c]; }, $columns)); $groupedData[$key][] = $line; } $filterLine = function ($line) use($excludeColumns) { foreach ($excludeColumns as $c) { unset($line[$c]); } return $line; }; $headers = $filterLine(array_map(function (StatsColumnBuilder $c) { return $c->getHeaderName(); }, $this->columns)); $formats = $filterLine(array_map(function (StatsColumnBuilder $c) { return $c->getFormat(); }, $this->columns)); $aggregations = $filterLine(array_map(function (StatsColumnBuilder $c) { return $c->getAggregation(); }, $this->columns)); $metaData = $filterLine(array_map(function (StatsColumnBuilder $c) { return $c->getMetaData(); }, $this->columns)); $data = array(); foreach ($groupedData as $lines) { $tmpAggregations = $aggregations; // Add static aggragation for group by fields foreach ($columns as $column) { $oneLine = current($lines); $value = $oneLine[$column]; $tmpAggregations[$column] = new StaticAggregation($value, Format::STRING); } $tmpTableBuilder = new StatsTableBuilder(array_map($filterLine, $lines), $headers, $formats, $tmpAggregations, array(), array(), null, $metaData); $tmpTable = $tmpTableBuilder->build(); $data[] = $tmpTable->getAggregations(); } return new StatsTableBuilder($data, $headers, $formats, $aggregations, array(), array(), null, $metaData); }