/** Add value to counter. If counter not exists set counter to value. Save to database. * @param Date $day - counter date * @param string $name - counter name * @param int|float $value - number to add * @throws ArgumentTypeException * @throws SystemException */ public function addCounter(Date $day, $name, $value) { if (!is_string($name)) { throw new ArgumentTypeException('name', 'string'); } if (!is_numeric($value)) { throw new ArgumentTypeException('value', 'numeric'); } if (($id = $this->id) === null) { throw new SystemException('Cannot add counter without context!'); } static $types; if (!$types) { $types = CounterManager::getTypes(); } if (!($type = $types[$name])) { throw new SystemException('Undefined counter type!'); } if (!$type['ACTIVE']) { return; } // save to database $primary = array('DAY' => $day, 'CONTEXT_ID' => $id, 'NAME' => $name); $data = array('VALUE' => new DB\SqlExpression('?# + ?f', 'VALUE', $value)); $result = ContextCounterDayTable::update($primary, $data); if ($result->getAffectedRowsCount() === 0) { try { $result = ContextCounterDayTable::add($primary + array('VALUE' => $value)); } catch (DB\SqlQueryException $e) { $result = ContextCounterDayTable::update($primary, $data); } } $result->isSuccess(); // TODO isSuccess }
public function getCounters(array $parameters = array()) { $query = new Query(Internals\ContextCounterDayTable::getEntity()); if ($filter = $parameters['filter']) { $query->setFilter($filter); } $i = 0; foreach ($this->attributes as $name => $value) { self::setAttributeFilter($query, '_conversion_attribute_' . ++$i . '_', $name, $value); } $query->registerRuntimeField(null, new ExpressionField('VALUE_SUM', 'SUM(%s)', array('VALUE'))); $splitNames = array(); if ($split = $parameters['split']) { if (!is_array($split)) { throw new ArgumentTypeException('parameters[split]', 'array'); } foreach ($split as $name => $value) { switch ($name) { case 'ATTRIBUTE_NAME': if (!is_string($value)) { throw new ArgumentTypeException('parameters[split][ATTRIBUTE_NAME]', 'string'); } self::setAttributeFilter($query, 'split_attribute', $value); $query->addGroup('split_attribute.VALUE'); $query->addSelect('split_attribute.VALUE', 'ATTRIBUTE_VALUE'); $splitNames[] = 'ATTRIBUTE_VALUE'; break; default: throw new ArgumentTypeException('parameters[split][' . $name . ']', 'not implemented'); } } } $query->addGroup('NAME'); $query->addSelect('NAME'); $query->addSelect('VALUE_SUM'); $result = $query->exec(); // return $result->fetchAll(); $counters = array(); while ($row = $result->fetch()) { $level =& $counters; foreach ($splitNames as $name) { if (!($level =& $level[$row[$name]])) { $level = array(); } } $level[$row['NAME']] = $row['VALUE_SUM']; } return $counters; }