<?php /** * @package default * @copyright Copyright (c) 2010, The volkszaehler.org project * @license http://www.gnu.org/licenses/gpl.txt GNU Public License */ /* * This file is part of volkzaehler.org * * volkzaehler.org is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * volkzaehler.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with volkszaehler.org. If not, see <http://www.gnu.org/licenses/>. */ namespace Volkszaehler\Interpreter\Iterator; use Volkszaehler\Util; use Doctrine\DBAL; /** * @author Steffen Vogel <info@steffenvogel.de> * @package default */ class DataAggregationIterator implements \Iterator, \Countable { protected $current; protected $key; // key protected $size; // total readings in PDOStatement protected $iterator; // subiterator /** * Constructor * * @param \PDOStatement $stmt * @param integer $size * @param integer $tuples */ public function __construct(\PDOStatement $stmt, $size, $tuples) { $this->iterator = new DataIterator($stmt, $size); $this->packageSize = floor($size / $tuples); $this->size = (int) $tuples; } /** * Aggregate data */ public function next() { $current = array(0, 0, 0); for ($i = 0; $i < $this->packageSize && $this->iterator->valid(); $i++, $this->iterator->next()) { $tuple = $this->iterator->current(); $current[0] = $tuple[0]; $current[1] += $tuple[1]; $current[2] += $tuple[2]; } $this->current = $current; $this->key++; } public function rewind() { $this->iterator->rewind(); // skip first readings to get an even divisor $skip = count($this->iterator) - count($this) * $this->packageSize; for ($i = 0; $i < $skip; $i++) { $this->iterator->next(); } $this->next(); } public function valid() { return $this->key <= $this->size; } /** * Getter & setter */ public function getPackageSize() { return $this->packageSize; } public function count() { return $this->size; } public function key() { return $this->key; } public function current() { return $this->current; } } ?>