public function testBuildWithOrder()
 {
     $table = array(array('a' => 'a', 'b' => 'b', 'c' => 'c'), array('a' => 'A', 'b' => 'B', 'c' => 'C'));
     $headers = array('a' => 'Alpha', 'b' => 'Bravo', 'c' => 'Charly');
     $statsTableBuilder = new StatsTableBuilder($table, $headers, array(Format::STRING, Format::STRING));
     $statsTable = $statsTableBuilder->build(array('c', 'a'));
     $this->assertEquals(array('c' => 'Charly', 'a' => 'Alpha'), $statsTable->getHeaders());
 }
Example #2
0
 /**
  * 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);
 }