Skip to content
Extraits de code Groupes Projets
Valider 5ff42da3 rédigé par Benaka Moorthi's avatar Benaka Moorthi
Parcourir les fichiers

Refs #4041, added parameter to Archive::getDataTableExpanded so entire tree...

Refs #4041, added  parameter to Archive::getDataTableExpanded so entire tree will not be created if not necessary.
parent 5be3fbf2
Branches
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -251,15 +251,17 @@ class Archive ...@@ -251,15 +251,17 @@ class Archive
* Manager::getTable() function. * Manager::getTable() function.
* *
* @param string $name The name of the record to get. * @param string $name The name of the record to get.
* @param int|string|null $idSubtable The subtable ID (if any) or self::ID_SUBTABLE_LOAD_ALL_SUBTABLES if requesting every datatable. * @param int|string|null $idSubtable The subtable ID (if any) or self::ID_SUBTABLE_LOAD_ALL_SUBTABLES
* if requesting every datatable.
* @param int|null $depth The maximum number of subtable levels to load. If null, all levels are loaded.
* @param bool $addMetadataSubtableId Whether to add the DB subtable ID as metadata to each datatable, * @param bool $addMetadataSubtableId Whether to add the DB subtable ID as metadata to each datatable,
* or not. * or not.
* @return DataTable * @return DataTable
*/ */
public function getDataTableExpanded($name, $idSubtable = null, $addMetadataSubtableId = true) public function getDataTableExpanded($name, $idSubtable = null, $depth = null, $addMetadataSubtableId = true)
{ {
$data = $this->get($name, 'blob', self::ID_SUBTABLE_LOAD_ALL_SUBTABLES); $data = $this->get($name, 'blob', self::ID_SUBTABLE_LOAD_ALL_SUBTABLES);
return $data->getExpandedDataTable($this->getResultIndices(), $idSubtable, $addMetadataSubtableId); return $data->getExpandedDataTable($this->getResultIndices(), $idSubtable, $depth, $addMetadataSubtableId);
} }
/** /**
...@@ -291,7 +293,8 @@ class Archive ...@@ -291,7 +293,8 @@ class Archive
* @param int|null $idSubtable * @param int|null $idSubtable
* @return DataTable|DataTable\Map * @return DataTable|DataTable\Map
*/ */
public static function getDataTableFromArchive($name, $idSite, $period, $date, $segment, $expanded, $idSubtable = null) public static function getDataTableFromArchive($name, $idSite, $period, $date, $segment, $expanded,
$idSubtable = null, $depth = null)
{ {
Piwik::checkUserHasViewAccess($idSite); Piwik::checkUserHasViewAccess($idSite);
$archive = Archive::build($idSite, $period, $date, $segment); $archive = Archive::build($idSite, $period, $date, $segment);
...@@ -300,7 +303,7 @@ class Archive ...@@ -300,7 +303,7 @@ class Archive
} }
if ($expanded) { if ($expanded) {
$dataTable = $archive->getDataTableExpanded($name, $idSubtable); $dataTable = $archive->getDataTableExpanded($name, $idSubtable, $depth);
} else { } else {
$dataTable = $archive->getDataTable($name, $idSubtable); $dataTable = $archive->getDataTable($name, $idSubtable);
} }
......
...@@ -234,7 +234,7 @@ class DataCollection ...@@ -234,7 +234,7 @@ class DataCollection
* @throws Exception * @throws Exception
* @return DataTable|DataTable\Map * @return DataTable|DataTable\Map
*/ */
public function getExpandedDataTable($resultIndices, $idSubTable = null, $addMetadataSubTableId = false) public function getExpandedDataTable($resultIndices, $idSubTable = null, $depth = null, $addMetadataSubTableId = false)
{ {
if ($this->dataType != 'blob') { if ($this->dataType != 'blob') {
throw new Exception("DataCollection: cannot call getExpandedDataTable with " throw new Exception("DataCollection: cannot call getExpandedDataTable with "
...@@ -248,7 +248,7 @@ class DataCollection ...@@ -248,7 +248,7 @@ class DataCollection
$dataTableFactory = new DataTableFactory( $dataTableFactory = new DataTableFactory(
$this->dataNames, 'blob', $this->sitesId, $this->periods, $this->defaultRow); $this->dataNames, 'blob', $this->sitesId, $this->periods, $this->defaultRow);
$dataTableFactory->expandDataTable($addMetadataSubTableId); $dataTableFactory->expandDataTable($depth, $addMetadataSubTableId);
$dataTableFactory->useSubtable($idSubTable); $dataTableFactory->useSubtable($idSubTable);
$index = $this->getArray($resultIndices); $index = $this->getArray($resultIndices);
......
...@@ -15,8 +15,6 @@ use Piwik\Site; ...@@ -15,8 +15,6 @@ use Piwik\Site;
use Piwik\DataTable; use Piwik\DataTable;
use Piwik\DataTable\Row; use Piwik\DataTable\Row;
const FIX_ME_OMG = 'this is a warning and reminder to fix this code ';
/** /**
* Creates a DataTable or Set instance based on an array * Creates a DataTable or Set instance based on an array
* index created by DataCollection. * index created by DataCollection.
...@@ -52,6 +50,14 @@ class DataTableFactory ...@@ -52,6 +50,14 @@ class DataTableFactory
*/ */
private $addMetadataSubtableId = false; private $addMetadataSubtableId = false;
/**
* The maximum number of subtable levels to create when creating an expanded
* DataTable.
*
* @var int
*/
private $maxSubtableDepth = null;
/** /**
* @see DataCollection::$sitesId. * @see DataCollection::$sitesId.
*/ */
...@@ -96,9 +102,10 @@ class DataTableFactory ...@@ -96,9 +102,10 @@ class DataTableFactory
* database to the in-memory DataTables as * database to the in-memory DataTables as
* metadata or not. * metadata or not.
*/ */
public function expandDataTable($addMetadataSubtableId = false) public function expandDataTable($maxSubtableDepth = null, $addMetadataSubtableId = false)
{ {
$this->expandDataTable = true; $this->expandDataTable = true;
$this->maxSubtableDepth = $maxSubtableDepth;
$this->addMetadataSubtableId = $addMetadataSubtableId; $this->addMetadataSubtableId = $addMetadataSubtableId;
} }
...@@ -292,9 +299,7 @@ class DataTableFactory ...@@ -292,9 +299,7 @@ class DataTableFactory
// would break. // would break.
if (count($this->dataNames) == 1) { if (count($this->dataNames) == 1) {
$name = reset($this->dataNames); $name = reset($this->dataNames);
$table->addRow(new Row(array( $table->addRow(new Row(array(Row::COLUMNS => array($name => 0))));
Row::COLUMNS => array($name => 0)
)));
} }
} }
...@@ -329,8 +334,19 @@ class DataTableFactory ...@@ -329,8 +334,19 @@ class DataTableFactory
* with blob values. This should hold every subtable blob for * with blob values. This should hold every subtable blob for
* the loaded DataTable. * the loaded DataTable.
*/ */
private function setSubtables($dataTable, $blobRow) private function setSubtables($dataTable, $blobRow, $treeLevel = 0)
{ {
if ($this->maxSubtableDepth
&& $treeLevel >= $this->maxSubtableDepth
) {
// unset the subtables so DataTableManager doesn't throw
foreach ($dataTable->getRows() as $row) {
$row->removeSubtable();
}
return;
}
$dataName = reset($this->dataNames); $dataName = reset($this->dataNames);
foreach ($dataTable->getRows() as $row) { foreach ($dataTable->getRows() as $row) {
...@@ -342,7 +358,7 @@ class DataTableFactory ...@@ -342,7 +358,7 @@ class DataTableFactory
$blobName = $dataName . "_" . $sid; $blobName = $dataName . "_" . $sid;
if (isset($blobRow[$blobName])) { if (isset($blobRow[$blobName])) {
$subtable = DataTable::fromSerializedArray($blobRow[$blobName]); $subtable = DataTable::fromSerializedArray($blobRow[$blobName]);
$this->setSubtables($subtable, $blobRow); $this->setSubtables($subtable, $blobRow, $treeLevel + 1);
// we edit the subtable ID so that it matches the newly table created in memory // we edit the subtable ID so that it matches the newly table created in memory
// NB: we dont overwrite the datatableid in the case we are displaying the table expanded. // NB: we dont overwrite the datatableid in the case we are displaying the table expanded.
...@@ -366,9 +382,7 @@ class DataTableFactory ...@@ -366,9 +382,7 @@ class DataTableFactory
$periods = $this->periods; $periods = $this->periods;
$table->filter(function ($table) use ($periods) { $table->filter(function ($table) use ($periods) {
$table->metadata['site'] = new Site($table->metadata['site']); $table->metadata['site'] = new Site($table->metadata['site']);
$table->metadata['period'] = empty($periods[$table->metadata['period']]) $table->metadata['period'] = $periods[$table->metadata['period']];
? FIX_ME_OMG
: $periods[$table->metadata['period']];
}); });
} }
...@@ -381,12 +395,9 @@ class DataTableFactory ...@@ -381,12 +395,9 @@ class DataTableFactory
*/ */
private function prettifyIndexLabel($labelType, $label) private function prettifyIndexLabel($labelType, $label)
{ {
if (empty($this->periods[$label])) {
return $label; // BAD BUG FIXME
}
if ($labelType == 'period') { // prettify period labels if ($labelType == 'period') { // prettify period labels
return $this->periods[$label]->getPrettyString(); return $this->periods[$label]->getPrettyString();
} }
return $label; return $label;
} }
} }
\ No newline at end of file
...@@ -165,7 +165,7 @@ class Period extends ArchiveProcessor ...@@ -165,7 +165,7 @@ class Period extends ArchiveProcessor
$table->setColumnAggregationOperations($columnAggregationOperations); $table->setColumnAggregationOperations($columnAggregationOperations);
} }
$data = $this->archiver->getDataTableExpanded($name, $idSubTable = null, $addMetadataSubtableId = false); $data = $this->archiver->getDataTableExpanded($name, $idSubTable = null, $depth = null, $addMetadataSubtableId = false);
if ($data instanceof DataTable\Map) { if ($data instanceof DataTable\Map) {
foreach ($data->getArray() as $date => $tableToSum) { foreach ($data->getArray() as $date => $tableToSum) {
$table->addDataTable($tableToSum); $table->addDataTable($tableToSum);
......
...@@ -122,9 +122,11 @@ class Piwik_Actions_API ...@@ -122,9 +122,11 @@ class Piwik_Actions_API
* *
* @return DataTable|DataTable\Map * @return DataTable|DataTable\Map
*/ */
public function getPageUrls($idSite, $period, $date, $segment = false, $expanded = false, $idSubtable = false) public function getPageUrls($idSite, $period, $date, $segment = false, $expanded = false, $idSubtable = false,
$depth = false)
{ {
$dataTable = Archive::getDataTableFromArchive('Actions_actions_url', $idSite, $period, $date, $segment, $expanded, $idSubtable); $dataTable = Archive::getDataTableFromArchive(
'Actions_actions_url', $idSite, $period, $date, $segment, $expanded, $idSubtable, $depth);
$this->filterPageDatatable($dataTable); $this->filterPageDatatable($dataTable);
$this->filterActionsDataTable($dataTable, $expanded); $this->filterActionsDataTable($dataTable, $expanded);
return $dataTable; return $dataTable;
......
...@@ -88,6 +88,14 @@ class Test_Piwik_Integration_FlattenReports extends IntegrationTestCase ...@@ -88,6 +88,14 @@ class Test_Piwik_Integration_FlattenReports extends IntegrationTestCase
'testSuffix' => '_expandedSubtable', 'testSuffix' => '_expandedSubtable',
'otherRequestParameters' => array('expanded' => '1'))); 'otherRequestParameters' => array('expanded' => '1')));
// test expanded=1 & depth=1
$return[] = array('Actions.getPageUrls', array('idSite' => $idSite,
'date' => $dateTime,
'periods' => array('week'),
'testSuffix' => '_expandedWithDepth',
'otherRequestParameters' => array('expanded' => '1',
'depth' => '1')));
// test flat=1 w/ filter_pattern_recursive // test flat=1 w/ filter_pattern_recursive
$return[] = array('Actions.getPageUrls', array('idSite' => $idSite, $return[] = array('Actions.getPageUrls', array('idSite' => $idSite,
'date' => $dateTime, 'date' => $dateTime,
......
<?xml version="1.0" encoding="utf-8" ?>
<result>
<row>
<label>dir1</label>
<nb_visits>6</nb_visits>
<nb_hits>6</nb_hits>
<sum_time_spent>0</sum_time_spent>
<nb_hits_with_time_generation>6</nb_hits_with_time_generation>
<min_time_generation>0.1</min_time_generation>
<max_time_generation>0.6</max_time_generation>
<entry_nb_visits>2</entry_nb_visits>
<entry_nb_actions>6</entry_nb_actions>
<entry_sum_visit_length>2</entry_sum_visit_length>
<entry_bounce_count>0</entry_bounce_count>
<exit_nb_visits>2</exit_nb_visits>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>0%</bounce_rate>
<exit_rate>33%</exit_rate>
<avg_time_generation>0.3</avg_time_generation>
<subtable>
<row>
<label>sub</label>
<nb_visits>6</nb_visits>
<nb_hits>6</nb_hits>
<sum_time_spent>0</sum_time_spent>
<nb_hits_with_time_generation>6</nb_hits_with_time_generation>
<min_time_generation>0.1</min_time_generation>
<max_time_generation>0.6</max_time_generation>
<entry_nb_visits>2</entry_nb_visits>
<entry_nb_actions>6</entry_nb_actions>
<entry_sum_visit_length>2</entry_sum_visit_length>
<entry_bounce_count>0</entry_bounce_count>
<exit_nb_visits>2</exit_nb_visits>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>0%</bounce_rate>
<exit_rate>33%</exit_rate>
<avg_time_generation>0.3</avg_time_generation>
</row>
</subtable>
</row>
<row>
<label>dir2</label>
<nb_visits>6</nb_visits>
<nb_hits>6</nb_hits>
<sum_time_spent>0</sum_time_spent>
<nb_hits_with_time_generation>6</nb_hits_with_time_generation>
<min_time_generation>0.2</min_time_generation>
<max_time_generation>1.2</max_time_generation>
<entry_nb_visits>2</entry_nb_visits>
<entry_nb_actions>6</entry_nb_actions>
<entry_sum_visit_length>2</entry_sum_visit_length>
<entry_bounce_count>0</entry_bounce_count>
<exit_nb_visits>2</exit_nb_visits>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>0%</bounce_rate>
<exit_rate>33%</exit_rate>
<avg_time_generation>0.6</avg_time_generation>
<subtable>
<row>
<label>sub</label>
<nb_visits>6</nb_visits>
<nb_hits>6</nb_hits>
<sum_time_spent>0</sum_time_spent>
<nb_hits_with_time_generation>6</nb_hits_with_time_generation>
<min_time_generation>0.2</min_time_generation>
<max_time_generation>1.2</max_time_generation>
<entry_nb_visits>2</entry_nb_visits>
<entry_nb_actions>6</entry_nb_actions>
<entry_sum_visit_length>2</entry_sum_visit_length>
<entry_bounce_count>0</entry_bounce_count>
<exit_nb_visits>2</exit_nb_visits>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>0%</bounce_rate>
<exit_rate>33%</exit_rate>
<avg_time_generation>0.6</avg_time_generation>
</row>
</subtable>
</row>
<row>
<label>dir3</label>
<nb_visits>6</nb_visits>
<nb_hits>6</nb_hits>
<sum_time_spent>0</sum_time_spent>
<nb_hits_with_time_generation>6</nb_hits_with_time_generation>
<min_time_generation>0.3</min_time_generation>
<max_time_generation>1.8</max_time_generation>
<entry_nb_visits>2</entry_nb_visits>
<entry_nb_actions>6</entry_nb_actions>
<entry_sum_visit_length>2</entry_sum_visit_length>
<entry_bounce_count>0</entry_bounce_count>
<exit_nb_visits>2</exit_nb_visits>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>0%</bounce_rate>
<exit_rate>33%</exit_rate>
<avg_time_generation>0.9</avg_time_generation>
<subtable>
<row>
<label>sub</label>
<nb_visits>6</nb_visits>
<nb_hits>6</nb_hits>
<sum_time_spent>0</sum_time_spent>
<nb_hits_with_time_generation>6</nb_hits_with_time_generation>
<min_time_generation>0.3</min_time_generation>
<max_time_generation>1.8</max_time_generation>
<entry_nb_visits>2</entry_nb_visits>
<entry_nb_actions>6</entry_nb_actions>
<entry_sum_visit_length>2</entry_sum_visit_length>
<entry_bounce_count>0</entry_bounce_count>
<exit_nb_visits>2</exit_nb_visits>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>0%</bounce_rate>
<exit_rate>33%</exit_rate>
<avg_time_generation>0.9</avg_time_generation>
</row>
</subtable>
</row>
<row>
<label>sub</label>
<nb_visits>1</nb_visits>
<nb_hits>1</nb_hits>
<sum_time_spent>0</sum_time_spent>
<nb_hits_with_time_generation>0</nb_hits_with_time_generation>
<min_time_generation />
<max_time_generation>0</max_time_generation>
<entry_nb_visits>1</entry_nb_visits>
<entry_nb_actions>1</entry_nb_actions>
<entry_sum_visit_length>0</entry_sum_visit_length>
<entry_bounce_count>1</entry_bounce_count>
<exit_nb_visits>1</exit_nb_visits>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>100%</bounce_rate>
<exit_rate>100%</exit_rate>
<avg_time_generation>0</avg_time_generation>
<subtable>
<row>
<label>dir</label>
<nb_visits>1</nb_visits>
<nb_hits>1</nb_hits>
<sum_time_spent>0</sum_time_spent>
<nb_hits_with_time_generation>0</nb_hits_with_time_generation>
<min_time_generation />
<max_time_generation>0</max_time_generation>
<entry_nb_visits>1</entry_nb_visits>
<entry_nb_actions>1</entry_nb_actions>
<entry_sum_visit_length>0</entry_sum_visit_length>
<entry_bounce_count>1</entry_bounce_count>
<exit_nb_visits>1</exit_nb_visits>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>100%</bounce_rate>
<exit_rate>100%</exit_rate>
<avg_time_generation>0</avg_time_generation>
</row>
</subtable>
</row>
</result>
\ No newline at end of file
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter