Ejemplo n.º 1
0
 /**
  * Creates a new DataTable with some metadata set. Sets the following metadata:
  * - 'site' => Piwik_Site instance for this archive
  * - 'period' => Piwik_Period instance for this archive
  * - 'timestamp' => the timestamp of the first date in this archive
  *
  * @param bool $isSimple Whether the DataTable should be a DataTable_Simple
  *                       instance or not.
  * @return Piwik_DataTable
  */
 public function makeDataTable($isSimple = false)
 {
     if ($isSimple) {
         $result = new Piwik_DataTable_Simple();
     } else {
         $result = new Piwik_DataTable();
     }
     $result->setMetadata('site', $this->getSite());
     $result->setMetadata('period', $this->getPeriod());
     $result->setMetadata('timestamp', $this->getTimestampStartDate());
     return $result;
 }
Ejemplo n.º 2
0
 /**
  * Returns a DataTable that has the name '$name' from the current Archive.
  * If $idSubTable is specified, returns the subDataTable called '$name_$idSubTable'
  *
  * @param string  $name
  * @param int     $idSubTable  optional id SubDataTable
  * @return Piwik_DataTable
  */
 public function getDataTable($name, $idSubTable = null)
 {
     if (!is_null($idSubTable)) {
         $name .= "_{$idSubTable}";
     }
     $this->setRequestedReport($name);
     $data = $this->get($name, 'blob', $tsArchived);
     $table = new Piwik_DataTable();
     if ($data !== false) {
         $table->addRowsFromSerializedArray($data);
         $table->setMetadata(Piwik_DataTable::ARCHIVED_DATE_METADATA_NAME, $tsArchived);
     }
     if ($data === false && $idSubTable !== null) {
         // This is not expected, but somehow happens in some unknown cases and very rarely.
         // Do not throw error in this case
         //throw new Exception("not expected");
         return new Piwik_DataTable();
     }
     return $table;
 }
Ejemplo n.º 3
0
 /**
  * Returns datatable describing the number of visits for each day of the week.
  * 
  * @param string $idSite The site ID. Cannot refer to multiple sites.
  * @param string $period The period type: day, week, year, range...
  * @param string $date The start date of the period. Cannot refer to multiple dates.
  * @param string $segment The segment.
  * @return Piwik_DataTable
  */
 public function getByDayOfWeek($idSite, $period, $date, $segment = false)
 {
     Piwik::checkUserHasViewAccess($idSite);
     // disabled for multiple sites/dates
     if (Piwik_Archive::isMultipleSites($idSite)) {
         throw new Exception("VisitTime.getByDayOfWeek does not support multiple sites.");
     }
     if (Piwik_Archive::isMultiplePeriod($date, $period)) {
         throw new Exception("VisitTime.getByDayOfWeek does not support multiple dates.");
     }
     // metrics to query
     $metrics = Piwik_ArchiveProcessing::getCoreMetrics();
     // get metric data for every day within the supplied period
     $oSite = new Piwik_Site($idSite);
     $oPeriod = Piwik_Archive::makePeriodFromQueryParams($oSite, $period, $date);
     $dateRange = $oPeriod->getDateStart()->toString() . ',' . $oPeriod->getDateEnd()->toString();
     $archive = Piwik_Archive::build($idSite, 'day', $dateRange, $segment);
     $dataTable = $archive->getDataTableFromNumeric($metrics)->mergeChildren();
     // if there's no data for this report, don't bother w/ anything else
     if ($dataTable->getRowsCount() == 0) {
         return $dataTable;
     }
     // group by the day of the week (see below for dayOfWeekFromDate function)
     $dataTable->filter('GroupBy', array('label', 'Piwik_VisitTime_dayOfWeekFromDate'));
     // create new datatable w/ empty rows, then add calculated datatable
     $rows = array();
     foreach (array(1, 2, 3, 4, 5, 6, 7) as $day) {
         $rows[] = array('label' => $day, 'nb_visits' => 0);
     }
     $result = new Piwik_DataTable();
     $result->addRowsFromSimpleArray($rows);
     $result->addDataTable($dataTable);
     // set day of week integer as metadata
     $result->filter('ColumnCallbackAddMetadata', array('label', 'day_of_week'));
     // translate labels
     $result->filter('ColumnCallbackReplace', array('label', 'Piwik_VisitTime_translateDayOfWeek'));
     // set datatable metadata for period start & finish
     $result->setMetadata('date_start', $oPeriod->getDateStart());
     $result->setMetadata('date_end', $oPeriod->getDateEnd());
     return $result;
 }
Ejemplo n.º 4
0
 /**
  * Sets the total evolution metadata for a datatable returned by $this->buildDataTable
  * given data for the last period.
  * 
  * @param Piwik_DataTable $dataTable
  * @param Piwik_DataTable $pastData
  * @param array $apiMetrics Metrics info.
  */
 private function setPastDataMetadata($dataTable, $pastData, $apiMetrics)
 {
     if ($dataTable instanceof Piwik_DataTable_Array) {
         $pastArray = $pastData->getArray();
         foreach ($dataTable->getArray() as $subTable) {
             $this->setPastDataMetadata($subTable, current($pastArray), $apiMetrics);
             next($pastArray);
         }
     } else {
         // calculate total visits/actions/revenue for past data
         $this->setMetricsTotalsMetadata($pastData, $apiMetrics);
         foreach ($apiMetrics as $label => $metricInfo) {
             // get the names of metadata to set
             $totalMetadataName = self::getTotalMetadataName($label);
             $lastPeriodTotalMetadataName = self::getLastPeriodMetadataName($totalMetadataName);
             $totalEvolutionMetadataName = self::getTotalMetadataName($metricInfo[self::METRIC_EVOLUTION_COL_NAME_KEY]);
             // set last period total
             $pastTotal = $pastData->getMetadata($totalMetadataName);
             $dataTable->setMetadata($lastPeriodTotalMetadataName, $pastTotal);
             // calculate & set evolution
             $currentTotal = $dataTable->getMetadata($totalMetadataName);
             $evolution = Piwik_MultiSites_CalculateEvolutionFilter::calculate($currentTotal, $pastTotal);
             $dataTable->setMetadata($totalEvolutionMetadataName, $evolution);
         }
     }
 }