Example #1
0
 /**
  * Queries archive tables for data and returns the result.
  * @param array|string $archiveNames
  * @param $archiveDataType
  * @param null|int $idSubtable
  * @return Archive\DataCollection
  */
 protected function get($archiveNames, $archiveDataType, $idSubtable = null)
 {
     if (!is_array($archiveNames)) {
         $archiveNames = array($archiveNames);
     }
     // apply idSubtable
     if ($idSubtable !== null && $idSubtable != self::ID_SUBTABLE_LOAD_ALL_SUBTABLES) {
         // this is also done in ArchiveSelector. It should be actually only done in ArchiveSelector but DataCollection
         // does require to have the subtableId appended. Needs to be changed in refactoring to have it only in one
         // place.
         $dataNames = array();
         foreach ($archiveNames as $name) {
             $dataNames[] = ArchiveSelector::appendIdsubtable($name, $idSubtable);
         }
     } else {
         $dataNames = $archiveNames;
     }
     $result = new Archive\DataCollection($dataNames, $archiveDataType, $this->params->getIdSites(), $this->params->getPeriods(), $defaultRow = null);
     $archiveIds = $this->getArchiveIds($archiveNames);
     if (empty($archiveIds)) {
         return $result;
     }
     $archiveData = ArchiveSelector::getArchiveData($archiveIds, $archiveNames, $archiveDataType, $idSubtable);
     $isNumeric = $archiveDataType == 'numeric';
     foreach ($archiveData as $row) {
         // values are grouped by idsite (site ID), date1-date2 (date range), then name (field name)
         $periodStr = $row['date1'] . ',' . $row['date2'];
         if ($isNumeric) {
             $row['value'] = $this->formatNumericValue($row['value']);
         } else {
             $result->addMetadata($row['idsite'], $periodStr, DataTable::ARCHIVED_DATE_METADATA_NAME, $row['ts_archived']);
         }
         $result->set($row['idsite'], $periodStr, $row['name'], $row['value']);
     }
     return $result;
 }