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);
 }