Example #1
0
 /** 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
 }
Example #2
0
 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;
 }