Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Steur <thomas.steur@gmail.com>2015-03-04 02:00:31 +0300
committerThomas Steur <thomas.steur@gmail.com>2015-03-09 06:13:18 +0300
commit3c3a11b6948a9b4a32f0fa2bc9e40c6ecf2177b9 (patch)
treed26f85111435f25ffb758912c844218f8feb99e4 /core/Plugin/Visualization.php
parentc1eb5d6d0887b21a132ba09c826f4c94b9e05424 (diff)
Run queued filters after generic filters making visualizations much faster.
Diffstat (limited to 'core/Plugin/Visualization.php')
-rw-r--r--core/Plugin/Visualization.php139
1 files changed, 96 insertions, 43 deletions
diff --git a/core/Plugin/Visualization.php b/core/Plugin/Visualization.php
index 15b468e362..3d48c24d15 100644
--- a/core/Plugin/Visualization.php
+++ b/core/Plugin/Visualization.php
@@ -10,6 +10,8 @@
namespace Piwik\Plugin;
use Piwik\API\DataTablePostProcessor;
+use Piwik\API\Proxy;
+use Piwik\API\ResponseBuilder;
use Piwik\Common;
use Piwik\DataTable;
use Piwik\Date;
@@ -23,6 +25,8 @@ use Piwik\Plugins\API\API as ApiApi;
use Piwik\Plugins\PrivacyManager\PrivacyManager;
use Piwik\View;
use Piwik\ViewDataTable\Manager as ViewDataTableManager;
+use Piwik\Plugin\Manager as PluginManager;
+use Piwik\API\Request as ApiRequest;
/**
* The base class for report visualizations that output HTML and use JavaScript.
@@ -173,8 +177,7 @@ class Visualization extends ViewDataTable
try {
$this->beforeLoadDataTable();
-
- $this->loadDataTableFromAPI(array('disable_generic_filters' => 1, 'format_metrics' => 0));
+ $this->loadDataTableFromAPI();
$this->postDataTableLoadedFromAPI();
$requestPropertiesAfterLoadDataTable = $this->requestConfig->getProperties();
@@ -233,6 +236,35 @@ class Visualization extends ViewDataTable
return $view;
}
+ /**
+ * @internal
+ */
+ protected function loadDataTableFromAPI()
+ {
+ if (!is_null($this->dataTable)) {
+ // data table is already there
+ // this happens when setDataTable has been used
+ return $this->dataTable;
+ }
+
+ // we build the request (URL) to call the API
+ $request = $this->buildApiRequestArray();
+
+ $module = $this->requestConfig->getApiModuleToRequest();
+ $method = $this->requestConfig->getApiMethodToRequest();
+
+ PluginManager::getInstance()->checkIsPluginActivated($module);
+
+ $class = ApiRequest::getClassNameAPI($module);
+ $dataTable = Proxy::getInstance()->call($class, $method, $request);
+
+ $response = new ResponseBuilder($format = 'original', $request);
+ $response->disableSendHeader();
+ $response->disableDataTablePostProcessor();
+
+ $this->dataTable = $response->getResponse($dataTable, $module, $method);
+ }
+
private function getReportMetadata()
{
$request = $this->request->getRequestArray() + $_GET + $_POST;
@@ -255,11 +287,16 @@ class Visualization extends ViewDataTable
$this->config->footer_icons = ViewDataTableManager::configureFooterIcons($this);
}
- if (!\Piwik\Plugin\Manager::getInstance()->isPluginActivated('Goals')) {
+ if (!$this->isPluginActivated('Goals')) {
$this->config->show_goals = false;
}
}
+ private function isPluginActivated($pluginName)
+ {
+ return PluginManager::getInstance()->isPluginActivated($pluginName);
+ }
+
/**
* Assigns a template variable making it available in the Twig template specified by
* {@link TEMPLATE_FILE}.
@@ -357,48 +394,39 @@ class Visualization extends ViewDataTable
private function applyFilters()
{
- list($priorityFilters, $otherFilters) = $this->config->getFiltersToRun();
+ $postProcessor = $this->makeDataTablePostProcessor(); // must be created after requestConfig is final
+ $self = $this;
- // First, filters that delete rows
- foreach ($priorityFilters as $filter) {
- $this->dataTable->filter($filter[0], $filter[1]);
- }
+ $postProcessor->setCallbackBeforeGenericFilters(function (DataTable\DataTableInterface $dataTable) use ($self, $postProcessor) {
- $this->beforeGenericFiltersAreAppliedToLoadedDataTable();
+ // First, filters that delete rows
+ foreach ($self->config->getPriorityFilters() as $filter) {
+ $dataTable->filter($filter[0], $filter[1]);
+ }
- if (!in_array($this->requestConfig->filter_sort_column, $this->config->columns_to_display)) {
- $hasNbUniqVisitors = in_array('nb_uniq_visitors', $this->config->columns_to_display);
- $this->requestConfig->setDefaultSort($this->config->columns_to_display, $hasNbUniqVisitors, $this->dataTable->getColumns());
- }
+ $self->beforeGenericFiltersAreAppliedToLoadedDataTable();
- $postProcessor = $this->makeDataTablePostProcessor(); // must be created after requestConfig is final
+ if (!in_array($self->requestConfig->filter_sort_column, $self->config->columns_to_display)) {
+ $hasNbUniqVisitors = in_array('nb_uniq_visitors', $self->config->columns_to_display);
+ $columns = $dataTable->getColumns();
+ $self->requestConfig->setDefaultSort($self->config->columns_to_display, $hasNbUniqVisitors, $columns);
+ }
- if (!$this->requestConfig->areGenericFiltersDisabled()) {
- $this->dataTable = $postProcessor->applyGenericFilters($this->dataTable);
- }
+ $postProcessor->setRequest($self->buildApiRequestArray());
+ });
- $postProcessor->applyComputeProcessedMetrics($this->dataTable);
+ $postProcessor->setCallbackAfterGenericFilters(function (DataTable\DataTableInterface $dataTable) use ($self) {
- $this->afterGenericFiltersAreAppliedToLoadedDataTable();
+ $self->afterGenericFiltersAreAppliedToLoadedDataTable();
- // queue other filters so they can be applied later if queued filters are disabled
- foreach ($otherFilters as $filter) {
- $this->dataTable->queueFilter($filter[0], $filter[1]);
- }
+ // queue other filters so they can be applied later if queued filters are disabled
+ foreach ($self->config->getPresentationFilters() as $filter) {
+ $dataTable->queueFilter($filter[0], $filter[1]);
+ }
- // Finally, apply datatable filters that were queued (should be 'presentation' filters that
- // do not affect the number of rows)
- if (!$this->requestConfig->areQueuedFiltersDisabled()) {
- $this->dataTable->applyQueuedFilters();
- }
+ });
- if ($this->requestConfig->shouldFormatMetrics()) {
- $formatter = $this->metricsFormatter;
- $report = $this->report;
- $this->dataTable->filter(function (DataTable $table) use ($formatter, $report) {
- $formatter->formatMetrics($table, $report);
- });
- }
+ $this->dataTable = $postProcessor->process($this->dataTable);
}
private function removeEmptyColumnsFromDisplay()
@@ -456,7 +484,7 @@ class Visualization extends ViewDataTable
*/
private function hasReportBeenPurged()
{
- if (!\Piwik\Plugin\Manager::getInstance()->isPluginActivated('PrivacyManager')) {
+ if (!$this->isPluginActivated('PrivacyManager')) {
return false;
}
@@ -629,15 +657,14 @@ class Visualization extends ViewDataTable
private function makeDataTablePostProcessor()
{
- $requestArray = $this->request->getRequestArray();
- $request = \Piwik\API\Request::getRequestArrayFromString($requestArray);
+ $request = $this->buildApiRequestArray();
+ $module = $this->requestConfig->getApiModuleToRequest();
+ $method = $this->requestConfig->getApiMethodToRequest();
- if (false === $this->config->enable_sort) {
- $request['filter_sort_column'] = '';
- $request['filter_sort_order'] = '';
- }
+ $processor = new DataTablePostProcessor($module, $method, $request);
+ $processor->setFormatter($this->metricsFormatter);
- return new DataTablePostProcessor($this->requestConfig->getApiModuleToRequest(), $this->requestConfig->getApiMethodToRequest(), $request);
+ return $processor;
}
private function logMessageIfRequestPropertiesHaveChanged(array $requestPropertiesBefore)
@@ -685,4 +712,30 @@ class Visualization extends ViewDataTable
return $result;
}
+
+ /**
+ * @internal
+ *
+ * @return array
+ */
+ public function buildApiRequestArray()
+ {
+ $requestArray = $this->request->getRequestArray();
+ $request = APIRequest::getRequestArrayFromString($requestArray);
+
+ if (false === $this->config->enable_sort) {
+ $request['filter_sort_column'] = '';
+ $request['filter_sort_order'] = '';
+ }
+
+ if (!array_key_exists('format_metrics', $request) || $request['format_metrics'] === 'bc') {
+ $request['format_metrics'] = '1';
+ }
+
+ if (!$this->requestConfig->disable_queued_filters && array_key_exists('disable_queued_filters', $request)) {
+ unset($request['disable_queued_filters']);
+ }
+
+ return $request;
+ }
}