Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

265 lines (241 sloc) 7.954 kb
<?php
/**
* Piwik - Open source web analytics
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html Gpl v3 or later
* @version $Id$
*
* @category Piwik
* @package Piwik
*/
/**
* The archive object is used to query specific data for a day or a period of statistics for a given website.
*
* Example:
* <pre>
* $archive = Piwik_Archive::build($idSite = 1, $period = 'week', '2008-03-08' );
* $dataTable = $archive->getDataTable('Provider_hostnameExt');
* $dataTable->queueFilter('ReplaceColumnNames');
* return $dataTable;
* </pre>
*
* Example bis:
* <pre>
* $archive = Piwik_Archive::build($idSite = 3, $period = 'day', $date = 'today' );
* $nbVisits = $archive->getNumeric('nb_visits');
* return $nbVisits;
* </pre>
*
* If the requested statistics are not yet processed, Archive uses ArchiveProcessing to archive the statistics.
*
* @package Piwik
* @subpackage Piwik_Archive
*/
abstract class Piwik_Archive
{
/**
* When saving DataTables in the DB, we sometimes replace the columns name by these IDs so we save up lots of bytes
* Eg. INDEX_NB_UNIQ_VISITORS is an integer: 4 bytes, but 'nb_uniq_visitors' is 16 bytes at least
* (in php it's actually even much more)
*
*/
const INDEX_NB_UNIQ_VISITORS = 1;
const INDEX_NB_VISITS = 2;
const INDEX_NB_ACTIONS = 3;
const INDEX_MAX_ACTIONS = 4;
const INDEX_SUM_VISIT_LENGTH = 5;
const INDEX_BOUNCE_COUNT = 6;
const INDEX_NB_VISITS_CONVERTED = 7;
const INDEX_NB_CONVERSIONS = 8;
const INDEX_REVENUE = 9;
const INDEX_GOALS = 10;
const INDEX_SUM_DAILY_NB_UNIQ_VISITORS = 11;
const INDEX_GOAL_NB_CONVERSIONS = 1;
const INDEX_GOAL_REVENUE = 2;
public static $mappingFromIdToName = array(
Piwik_Archive::INDEX_NB_UNIQ_VISITORS => 'nb_uniq_visitors',
Piwik_Archive::INDEX_NB_VISITS => 'nb_visits',
Piwik_Archive::INDEX_NB_ACTIONS => 'nb_actions',
Piwik_Archive::INDEX_MAX_ACTIONS => 'max_actions',
Piwik_Archive::INDEX_SUM_VISIT_LENGTH => 'sum_visit_length',
Piwik_Archive::INDEX_BOUNCE_COUNT => 'bounce_count',
Piwik_Archive::INDEX_NB_VISITS_CONVERTED => 'nb_visits_converted',
Piwik_Archive::INDEX_NB_CONVERSIONS => 'nb_conversions',
Piwik_Archive::INDEX_REVENUE => 'revenue',
Piwik_Archive::INDEX_GOALS => 'goals',
Piwik_Archive::INDEX_SUM_DAILY_NB_UNIQ_VISITORS => 'sum_daily_nb_uniq_visitors',
);
public static $mappingFromIdToNameGoal = array(
Piwik_Archive::INDEX_GOAL_NB_CONVERSIONS => 'nb_conversions',
Piwik_Archive::INDEX_GOAL_REVENUE => 'revenue',
);
/*
* string indexed column name => Integer indexed column name
*/
public static $mappingFromNameToId = array(
'nb_uniq_visitors' => Piwik_Archive::INDEX_NB_UNIQ_VISITORS,
'nb_visits' => Piwik_Archive::INDEX_NB_VISITS,
'nb_actions' => Piwik_Archive::INDEX_NB_ACTIONS,
'max_actions' => Piwik_Archive::INDEX_MAX_ACTIONS,
'sum_visit_length' => Piwik_Archive::INDEX_SUM_VISIT_LENGTH,
'bounce_count' => Piwik_Archive::INDEX_BOUNCE_COUNT,
'nb_visits_converted' => Piwik_Archive::INDEX_NB_VISITS_CONVERTED,
'nb_conversions' => Piwik_Archive::INDEX_NB_CONVERSIONS,
'revenue' => Piwik_Archive::INDEX_REVENUE,
'goals' => Piwik_Archive::INDEX_GOALS,
'sum_daily_nb_uniq_visitors' => Piwik_Archive::INDEX_SUM_DAILY_NB_UNIQ_VISITORS,
);
/**
* Website Piwik_Site
*
* @var Piwik_Site
*/
protected $site = null;
/**
* Stores the already built archives.
* Act as a big caching array
*
* @var array of Piwik_Archive
*/
static protected $alreadyBuilt = array();
/**
* Builds an Archive object or returns the same archive if previously built.
*
* @param string|int idSite integer, or comma separated list of integer
* @param string|Piwik_Date $date 'YYYY-MM-DD' or magic keywords 'today' @see Piwik_Date::factory()
* @param string $period 'week' 'day' etc.
*
* @return Piwik_Archive
*/
static public function build($idSite, $period, $strDate )
{
if($idSite === 'all')
{
$sites = Piwik_SitesManager_API::getInstance()->getSitesIdWithAtLeastViewAccess();
}
else
{
$sites = Piwik_Site::getIdSitesFromIdSitesString($idSite);
}
// idSite=1,3 or idSite=all
if( count($sites) > 1
|| $idSite === 'all' )
{
$archive = new Piwik_Archive_Array_IndexedBySite($sites, $period, $strDate);
}
// if a period date string is detected: either 'last30', 'previous10' or 'YYYY-MM-DD,YYYY-MM-DD'
elseif(is_string($strDate)
&& (
preg_match('/^(last|previous){1}([0-9]*)$/', $strDate, $regs)
|| preg_match('/^([0-9]{4}-[0-9]{1,2}-[0-9]{1,2}),([0-9]{4}-[0-9]{1,2}-[0-9]{1,2})$/', $strDate, $regs)
)
)
{
$oSite = new Piwik_Site($idSite);
$archive = new Piwik_Archive_Array_IndexedByDate($oSite, $period, $strDate);
}
// case we request a single archive
else
{
if(is_string($strDate))
{
$oDate = Piwik_Date::factory($strDate);
}
else
{
$oDate = $strDate;
}
$date = $oDate->toString();
if(isset(self::$alreadyBuilt[$idSite][$date][$period]))
{
return self::$alreadyBuilt[$idSite][$date][$period];
}
$oPeriod = Piwik_Period::factory($period, $oDate);
$archive = new Piwik_Archive_Single();
$archive->setPeriod($oPeriod);
$archive->setSite(new Piwik_Site($idSite));
$archiveJustProcessed = $archive->prepareArchive();
//we don't cache the archives just processed, the datatable were freed from memory
if(!$archiveJustProcessed)
{
self::$alreadyBuilt[$idSite][$date][$period] = $archive;
}
}
return $archive;
}
abstract public function prepareArchive();
/**
* Returns the value of the element $name from the current archive
* The value to be returned is a numeric value and is stored in the archive_numeric_* tables
*
* @param string $name For example Referers_distinctKeywords
* @return float|int|false False if no value with the given name
*/
abstract public function getNumeric( $name );
/**
* Returns the value of the element $name from the current archive
*
* The value to be returned is a blob value and is stored in the archive_numeric_* tables
*
* It can return anything from strings, to serialized PHP arrays or PHP objects, etc.
*
* @param string $name For example Referers_distinctKeywords
* @return mixed False if no value with the given name
*/
abstract public function getBlob( $name );
/**
*
* @return Piwik_DataTable
*/
abstract public function getDataTableFromNumeric( $fields );
/**
* This method will build a dataTable from the blob value $name in the current archive.
*
* For example $name = 'Referers_searchEngineByKeyword' will return a Piwik_DataTable containing all the keywords
* If a idSubTable is given, the method will return the subTable of $name
*
* @param string $name
* @param int $idSubTable or null if requesting the parent table
* @return Piwik_DataTable
* @throws exception If the value cannot be found
*/
abstract public function getDataTable( $name, $idSubTable = null );
/**
* Same as getDataTable() except that it will also load in memory
* all the subtables for the DataTable $name.
* You can then access the subtables by using the Piwik_DataTable_Manager getTable()
*
* @param string $name
* @param int $idSubTable or null if requesting the parent table
* @return Piwik_DataTable
*/
abstract public function getDataTableExpanded($name, $idSubTable = null);
/**
* Sets the site
*
* @param Piwik_Site $site
*/
public function setSite( Piwik_Site $site )
{
$this->site = $site;
}
/**
* Gets the site
*
* @param Piwik_Site $site
*/
public function getSite()
{
return $this->site;
}
/**
* Returns the Id site associated with this archive
*
* @return int
*/
public function getIdSite()
{
return $this->site->getId();
}
}
Jump to Line
Something went wrong with that request. Please try again.