changed default behavior of DataController

This commit is contained in:
Steffen Vogel 2011-03-16 14:45:22 +01:00
parent 2fe3bc7f59
commit 71bfe883d6
3 changed files with 38 additions and 34 deletions

View file

@ -45,8 +45,8 @@ class DataIterator implements \Iterator, \Countable {
* Constructor
*
* @param \PDOStatement $stmt
* @param integer $size
* @param integer $tuples
* @param integer $rowCount total num of rows in $stmt
* @param integer $tupleCount set to NULL to get all rows
*/
public function __construct(\PDOStatement $stmt, $rowCount, $tupleCount) {
$this->rowCount = $rowCount;
@ -55,14 +55,17 @@ class DataIterator implements \Iterator, \Countable {
$this->stmt = $stmt;
$this->stmt->setFetchMode(\PDO::FETCH_NUM);
if ($this->rowCount > $this->tupleCount) { // sumarize
$this->packageSize = floor($this->rowCount / $this->tupleCount);
$this->tupleCount = floor($this->rowCount / $this->packageSize) + 1;
}
else { // passthrough
if (empty($this->tupleCount) || $this->rowCount < $this->tupleCount) { // get all rows
$this->packageSize = 1;
$this->tupleCount = $this->rowCount;
}
else { // sumarize
$this->packageSize = floor($this->rowCount / $this->tupleCount);
$this->tupleCount = floor($this->rowCount / $this->packageSize);
if (fmod($this->rowCount, $this->packageSize) > 0) {
$this->tupleCount++;
}
}
}
@ -102,7 +105,7 @@ class DataIterator implements \Iterator, \Countable {
}
public function valid() {
return $this->key < $this->tupleCount;
return $this->key <= $this->tupleCount;
}
/**

View file

@ -24,9 +24,7 @@
namespace Volkszaehler\Interpreter;
use Volkszaehler\Util;
use Volkszaehler\Interpreter\Iterator;
use Volkszaehler\Model;
use Doctrine\ORM\Query;
use Doctrine\ORM;
/**
@ -45,8 +43,8 @@ abstract class Interpreter {
protected $to;
protected $groupBy;
protected $rowCount = NULL;
protected $tupleCount = NULL;
protected $rowCount;
protected $tupleCount;
/**
* Constructor
@ -58,14 +56,11 @@ abstract class Interpreter {
*/
public function __construct(Model\Channel $channel, ORM\EntityManager $em, $from, $to, $tupleCount, $groupBy) {
$this->channel = $channel;
$this->tupleCount = $tupleCount;
$this->groupBy = $groupBy;
// get dbal connection from EntityManager
$this->conn = $em->getConnection();
$this->tupleCount = $tupleCount;
$this->from = $from;
$this->to = $to;
$this->conn = $em->getConnection(); // get dbal connection from EntityManager
// parse interval
if (isset($from)) {
@ -106,11 +101,16 @@ abstract class Interpreter {
// get total row count for grouping
$this->rowCount = $this->conn->fetchColumn($sql['rowCount'], array($this->channel->getId()), 0);
if ($this->rowCount > 0) {
// query for data
$stmt = $this->conn->executeQuery('SELECT ' . $sql['fields'] . $sql['from'] . $sql['where'] . $sql['groupBy'] . $sql['orderBy'], array($this->channel->getId()));
// query for data
$stmt = $this->conn->executeQuery('SELECT ' . $sql['fields'] . $sql['from'] . $sql['where'] . $sql['groupBy'] . $sql['orderBy'], array($this->channel->getId()));
return new DataIterator($stmt, $this->rowCount, $this->tupleCount);
return new DataIterator($stmt, $this->rowCount, $this->tupleCount);
}
else { // no data available
return new \EmptyIterator();
}
}
/**
@ -189,7 +189,7 @@ abstract class Interpreter {
* @return float
*/
protected static function parseDateTimeString($string, $now) {
if (ctype_digit($string)) {
if (ctype_digit($string)) { // handling as ms timestamp
return (float) $string;
}
elseif ($ts = strtotime($string, $now / 1000)) {
@ -205,6 +205,10 @@ abstract class Interpreter {
*/
public function getEntity() { return $this->channel; }
public function getRowCount() { return $this->rowCount; }
public function getTupleCount() { return $this->tupleCount; }
public function getFrom() { return $this->from; }
public function getTo() { return $this->to; }
}
?>

View file

@ -42,56 +42,53 @@ class MeterInterpreter extends Interpreter {
/**
* Calculates the consumption
*
* @return float total consumption in Wh
*/
public function getConsumption() {
if (is_null($this->tupleCount)) throw new \Exception('Data has to be processed first!');
return 1000 * $this->pulseCount / $this->resolution;
}
/**
* Get minimum
*
* @return array (0 => timestamp, 1 => value)
*/
public function getMin() {
if (is_null($this->tupleCount)) throw new \Exception('Data has to be processed first!');
return ($this->min) ? array_map('floatval', array_slice($this->min, 0 , 2)) : NULL;
}
/**
* Get maximum
*
* @return array (0 => timestamp, 1 => value)
*/
public function getMax() {
if (is_null($this->tupleCount)) throw new \Exception('Data has to be processed first!');
return ($this->max) ? array_map('floatval', array_slice($this->max, 0 , 2)) : NULL;
}
/**
* Get Average
* @return float
*
* @return float 3600: 3600 s/h; 1000: ms -> s
*/
public function getAverage() {
// 3600: 3600 s/h; 1000: ms -> s
return (3600 * 1000 * $this->getConsumption()) / ($this->to - $this->from);
}
/**
* Raw pulses to power conversion
*
* @todo untested
* @param $callback a callback called each iteration for output
* @return array with timestamp, values, and pulse count
*/
public function processData($callback) {
$tuples = array();
$pulses = parent::getData();
$this->resolution = $this->channel->getProperty('resolution');
$this->pulseCount = 0;
$tuples = array();
$last = $pulses->rewind();
$next = $pulses->next();