1<?php
2/**
3 * Matomo - free/libre analytics platform
4 *
5 * @link https://matomo.org
6 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7 *
8 */
9namespace Piwik\Plugins\DBStats\Reports;
10
11use Piwik\Metrics\Formatter;
12use Piwik\Option;
13use Piwik\Piwik;
14use Piwik\Plugin\ViewDataTable;
15use Piwik\Plugins\CoreVisualizations\Visualizations\Graph;
16use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable;
17use Piwik\Plugins\DBStats\DBStats;
18
19abstract class Base extends \Piwik\Plugin\Report
20{
21    public function isEnabled()
22    {
23        return Piwik::hasUserSuperUserAccess();
24    }
25
26    public function configureReportMetadata(&$availableReports, $info)
27    {
28        // DBStats is not supposed to appear in report metadata
29    }
30
31    protected function addBaseDisplayProperties(ViewDataTable $view)
32    {
33        $view->requestConfig->filter_sort_column   = 'label';
34        $view->requestConfig->filter_sort_order    = 'desc';
35        $view->requestConfig->filter_limit         = 25;
36
37        $view->config->show_exclude_low_population = false;
38        $view->config->show_table_all_columns      = false;
39        $view->config->show_tag_cloud = false;
40        $view->config->show_search    = false;
41
42        if ($view->isViewDataTableId(HtmlTable::ID)) {
43            $view->config->keep_summary_row      = true;
44            $view->config->disable_row_evolution = true;
45            $view->config->highlight_summary_row = true;
46        }
47
48        if ($view->isViewDataTableId(Graph::ID)) {
49            $view->config->show_series_picker = false;
50        }
51
52        $view->config->addTranslations(array(
53            'label'          => Piwik::translate('DBStats_Table'),
54            'year'           => Piwik::translate('Intl_PeriodYear'),
55            'data_size'      => Piwik::translate('DBStats_DataSize'),
56            'index_size'     => Piwik::translate('DBStats_IndexSize'),
57            'total_size'     => Piwik::translate('DBStats_TotalSize'),
58            'row_count'      => Piwik::translate('DBStats_RowCount'),
59            'percent_total'  => '%&nbsp;' . Piwik::translate('DBStats_DBSize'),
60            'estimated_size' => Piwik::translate('DBStats_EstimatedSize')
61        ));
62    }
63
64    protected function addPresentationFilters(ViewDataTable $view, $addTotalSizeColumn = true, $addPercentColumn = false,
65                                              $sizeColumns = array('data_size', 'index_size'))
66    {
67        // add total_size column
68        if ($addTotalSizeColumn) {
69            $getTotalTableSize = function ($dataSize, $indexSize) {
70                return $dataSize + $indexSize;
71            };
72
73            $view->config->filters[] = array('ColumnCallbackAddColumn',
74                array(array('data_size', 'index_size'), 'total_size', $getTotalTableSize), $isPriority = true);
75
76            $sizeColumns[] = 'total_size';
77        }
78
79        $runPrettySizeFilterBeforeGeneric = false;
80
81        if ($view->isViewDataTableId(HtmlTable::ID)) {
82
83            // add summary row only if displaying a table
84            $view->config->filters[] = array('AddSummaryRow', Piwik::translate('General_Total'));
85
86            // add percentage column if desired
87            if ($addPercentColumn
88                && $addTotalSizeColumn
89            ) {
90                $view->config->filters[] = array(
91                    'ColumnCallbackAddColumnPercentage',
92                    array('percent_total', 'total_size', 'total_size', $quotientPrecision = 0,
93                          $shouldSkipRows = false, $getDivisorFromSummaryRow = true),
94                    $isPriority = false
95                );
96
97                $view->requestConfig->filter_sort_column = 'percent_total';
98            }
99
100        } else if ($view->isViewDataTableId(Graph::ID)) {
101            if ($addTotalSizeColumn) {
102                $view->config->columns_to_display = array('label', 'total_size');
103
104                // when displaying a graph, we force sizes to be shown as the same unit so axis labels
105                // will be readable. NOTE: The unit should depend on the smallest value of the data table,
106                // however there's no way to know this information, short of creating a custom filter. For
107                // now, just assume KB.
108                $fixedMemoryUnit = 'K';
109                $view->config->y_axis_unit = ' K';
110                $view->requestConfig->filter_sort_column = 'total_size';
111                $view->requestConfig->filter_sort_order  = 'desc';
112            } else {
113                $view->config->columns_to_display = array('label', 'row_count');
114                $view->config->y_axis_unit        = ' ' . Piwik::translate('General_Rows');
115
116                $view->requestConfig->filter_sort_column = 'row_count';
117                $view->requestConfig->filter_sort_order  = 'desc';
118            }
119            $view->config->selectable_rows = array();
120        }
121
122        $formatter = new Formatter();
123
124        $getPrettySize = array($formatter, 'getPrettySizeFromBytes');
125        $params        = !isset($fixedMemoryUnit) ? array() : array($fixedMemoryUnit);
126
127        $view->config->filters[] = function ($dataTable) use ($sizeColumns, $getPrettySize, $params) {
128            $dataTable->filter('ColumnCallbackReplace', array($sizeColumns, $getPrettySize, $params));
129        };
130
131        // jqPlot will display &nbsp; as, well, '&nbsp;', so don't replace the spaces when rendering as a graph
132        if ($view->isViewDataTableId(HtmlTable::ID)) {
133            $replaceSpaces = function ($value) {
134                return str_replace(' ', '&nbsp;', $value);
135            };
136
137            $view->config->filters[] = array('ColumnCallbackReplace', array($sizeColumns, $replaceSpaces));
138        }
139
140        $getPrettyNumber = array($formatter, 'getPrettyNumber');
141        $view->config->filters[] = array('ColumnCallbackReplace', array('row_count', $getPrettyNumber));
142    }
143
144    /**
145     * Sets the footer message for the Individual...Summary reports.
146     */
147    protected function setIndividualSummaryFooterMessage(ViewDataTable $view)
148    {
149        $lastGenerated = self::getDateOfLastCachingRun();
150        if ($lastGenerated !== false) {
151            $view->config->show_footer_message = Piwik::translate('Mobile_LastUpdated', $lastGenerated);
152        }
153    }
154
155    /** Returns the date when the cacheDataByArchiveNameReports was last run. */
156    private static function getDateOfLastCachingRun()
157    {
158        return Option::get(DBStats::TIME_OF_LAST_TASK_RUN_OPTION);
159    }
160}
161