PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 5.0.7
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v5.0.7
5.11.1 5.11.0 5.10.2 5.10.1 trunk 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.3.2 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.1.3 4.10.0 4.11.0 4.12.0 4.13.0 4.13.2 4.13.3 4.13.4 4.13.5 4.14.0 4.14.1 4.14.2 4.15.0 4.15.1 4.15.2 4.15.3 4.2.0 4.3.0 4.3.1 4.4.1 4.4.2 4.5.0 4.6.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.10.0 5.2.0 5.2.1 5.2.2 5.3.0 5.3.1 5.3.2 5.3.3 5.6.0 5.6.1 5.7.0 5.7.1 5.8.0 5.8.1 5.8.2
matomo / app / core / DataArray.php
matomo / app / core Last commit date
API 2 years ago Access 2 years ago Application 2 years ago Archive 2 years ago ArchiveProcessor 2 years ago Archiver 2 years ago AssetManager 2 years ago Auth 2 years ago Category 2 years ago Changes 2 years ago CliMulti 2 years ago Columns 2 years ago Concurrency 2 years ago Config 2 years ago Container 2 years ago CronArchive 2 years ago DataAccess 2 years ago DataFiles 2 years ago DataTable 2 years ago Db 2 years ago DeviceDetector 2 years ago Email 2 years ago Exception 2 years ago Http 2 years ago Intl 2 years ago Log 2 years ago Mail 2 years ago Measurable 2 years ago Menu 2 years ago Metrics 2 years ago Notification 2 years ago Period 2 years ago Plugin 2 years ago ProfessionalServices 2 years ago Report 2 years ago ReportRenderer 2 years ago Scheduler 2 years ago Segment 2 years ago Session 2 years ago Settings 2 years ago Tracker 2 years ago Translation 2 years ago Twig 2 years ago UpdateCheck 2 years ago Updater 2 years ago Updates 2 years ago Validators 2 years ago View 2 years ago ViewDataTable 2 years ago Visualization 2 years ago Widget 2 years ago .htaccess 2 years ago Access.php 2 years ago Archive.php 2 years ago ArchiveProcessor.php 2 years ago AssetManager.php 2 years ago Auth.php 2 years ago AuthResult.php 2 years ago BaseFactory.php 2 years ago Cache.php 2 years ago CacheId.php 2 years ago CliMulti.php 2 years ago Common.php 2 years ago Config.php 2 years ago Console.php 2 years ago Context.php 2 years ago Cookie.php 2 years ago CronArchive.php 2 years ago DI.php 2 years ago DataArray.php 2 years ago DataTable.php 2 years ago Date.php 2 years ago Db.php 2 years ago DbHelper.php 2 years ago Development.php 2 years ago ErrorHandler.php 2 years ago EventDispatcher.php 2 years ago ExceptionHandler.php 2 years ago FileIntegrity.php 2 years ago Filechecks.php 2 years ago Filesystem.php 2 years ago FrontController.php 2 years ago Http.php 2 years ago IP.php 2 years ago Log.php 2 years ago LogDeleter.php 2 years ago Mail.php 2 years ago Metrics.php 2 years ago NoAccessException.php 2 years ago Nonce.php 2 years ago Notification.php 2 years ago NumberFormatter.php 2 years ago Option.php 2 years ago Period.php 2 years ago Piwik.php 2 years ago Plugin.php 2 years ago Profiler.php 2 years ago ProxyHeaders.php 2 years ago ProxyHttp.php 2 years ago QuickForm2.php 2 years ago RankingQuery.php 2 years ago ReportRenderer.php 2 years ago Request.php 2 years ago Segment.php 2 years ago Sequence.php 2 years ago Session.php 2 years ago SettingsPiwik.php 2 years ago SettingsServer.php 2 years ago Singleton.php 2 years ago Site.php 2 years ago SiteContentDetector.php 2 years ago SupportedBrowser.php 2 years ago TCPDF.php 2 years ago Theme.php 2 years ago Timer.php 2 years ago Tracker.php 2 years ago Twig.php 2 years ago Unzip.php 2 years ago UpdateCheck.php 2 years ago Updater.php 2 years ago UpdaterErrorException.php 2 years ago Updates.php 2 years ago Url.php 2 years ago UrlHelper.php 2 years ago Version.php 2 years ago View.php 2 years ago bootstrap.php 2 years ago dispatch.php 2 years ago testMinimumPhpVersion.php 2 years ago
DataArray.php
336 lines
1 <?php
2
3 /**
4 * Matomo - free/libre analytics platform
5 *
6 * @link https://matomo.org
7 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
8 *
9 */
10 namespace Piwik;
11
12 use Exception;
13 use Piwik\DataTable\Filter\EnrichRecordWithGoalMetricSums;
14 use Piwik\Tracker\GoalManager;
15 /**
16 * The DataArray is a data structure used to aggregate datasets,
17 * ie. sum arrays made of rows made of columns,
18 * data from the logs is stored in a DataArray before being converted in a DataTable
19 *
20 */
21 class DataArray
22 {
23 protected $data = array();
24 protected $dataTwoLevels = array();
25 public function __construct($data = array(), $dataArrayByLabel = array())
26 {
27 $this->data = $data;
28 $this->dataTwoLevels = $dataArrayByLabel;
29 }
30 /**
31 * This returns the actual raw data array
32 *
33 * @return array
34 */
35 public function &getDataArray()
36 {
37 return $this->data;
38 }
39 public function getDataArrayWithTwoLevels()
40 {
41 return $this->dataTwoLevels;
42 }
43 public function sumMetricsVisits($label, $row)
44 {
45 if (!isset($this->data[$label])) {
46 $this->data[$label] = static::makeEmptyRow();
47 }
48 $this->doSumVisitsMetrics($row, $this->data[$label]);
49 }
50 /**
51 * Returns an empty row containing default metrics
52 *
53 * @return array
54 */
55 public static function makeEmptyRow()
56 {
57 return array(\Piwik\Metrics::INDEX_NB_UNIQ_VISITORS => 0, \Piwik\Metrics::INDEX_NB_VISITS => 0, \Piwik\Metrics::INDEX_NB_ACTIONS => 0, \Piwik\Metrics::INDEX_NB_USERS => 0, \Piwik\Metrics::INDEX_MAX_ACTIONS => 0, \Piwik\Metrics::INDEX_SUM_VISIT_LENGTH => 0, \Piwik\Metrics::INDEX_BOUNCE_COUNT => 0, \Piwik\Metrics::INDEX_NB_VISITS_CONVERTED => 0);
58 }
59 /**
60 * Adds the given row $newRowToAdd to the existing $oldRowToUpdate passed by reference
61 * The rows are php arrays Name => value
62 *
63 * @param array $newRowToAdd
64 * @param array $oldRowToUpdate
65 * @param bool $onlyMetricsAvailableInActionsTable
66 *
67 * @return void
68 */
69 protected function doSumVisitsMetrics($newRowToAdd, &$oldRowToUpdate)
70 {
71 // Pre 1.2 format: string indexed rows are returned from the DB
72 // Left here for Backward compatibility with plugins doing custom SQL queries using these metrics as string
73 if (!isset($newRowToAdd[\Piwik\Metrics::INDEX_NB_VISITS])) {
74 $oldRowToUpdate[\Piwik\Metrics::INDEX_NB_VISITS] += $newRowToAdd['nb_visits'];
75 $oldRowToUpdate[\Piwik\Metrics::INDEX_NB_ACTIONS] += $newRowToAdd['nb_actions'];
76 $oldRowToUpdate[\Piwik\Metrics::INDEX_NB_UNIQ_VISITORS] += $newRowToAdd['nb_uniq_visitors'];
77 $oldRowToUpdate[\Piwik\Metrics::INDEX_NB_USERS] += $newRowToAdd['nb_users'];
78 $oldRowToUpdate[\Piwik\Metrics::INDEX_MAX_ACTIONS] = (float) max($newRowToAdd['max_actions'], $oldRowToUpdate[\Piwik\Metrics::INDEX_MAX_ACTIONS]);
79 $oldRowToUpdate[\Piwik\Metrics::INDEX_SUM_VISIT_LENGTH] += $newRowToAdd['sum_visit_length'];
80 $oldRowToUpdate[\Piwik\Metrics::INDEX_BOUNCE_COUNT] += $newRowToAdd['bounce_count'];
81 $oldRowToUpdate[\Piwik\Metrics::INDEX_NB_VISITS_CONVERTED] += $newRowToAdd['nb_visits_converted'];
82 return;
83 }
84 // Edge case fail safe
85 if (!isset($oldRowToUpdate[\Piwik\Metrics::INDEX_NB_VISITS])) {
86 return;
87 }
88 $oldRowToUpdate[\Piwik\Metrics::INDEX_NB_VISITS] += $newRowToAdd[\Piwik\Metrics::INDEX_NB_VISITS];
89 $oldRowToUpdate[\Piwik\Metrics::INDEX_NB_ACTIONS] += $newRowToAdd[\Piwik\Metrics::INDEX_NB_ACTIONS];
90 $oldRowToUpdate[\Piwik\Metrics::INDEX_NB_UNIQ_VISITORS] += $newRowToAdd[\Piwik\Metrics::INDEX_NB_UNIQ_VISITORS];
91 // In case the existing Row had no action metrics (eg. Custom Variable XYZ with "visit" scope)
92 // but the new Row has action metrics (eg. same Custom Variable XYZ this time with a "page" scope)
93 if (!isset($oldRowToUpdate[\Piwik\Metrics::INDEX_MAX_ACTIONS])) {
94 $toZero = array(\Piwik\Metrics::INDEX_NB_USERS, \Piwik\Metrics::INDEX_MAX_ACTIONS, \Piwik\Metrics::INDEX_SUM_VISIT_LENGTH, \Piwik\Metrics::INDEX_BOUNCE_COUNT, \Piwik\Metrics::INDEX_NB_VISITS_CONVERTED);
95 foreach ($toZero as $metric) {
96 $oldRowToUpdate[$metric] = 0;
97 }
98 }
99 $oldRowToUpdate[\Piwik\Metrics::INDEX_NB_USERS] += $newRowToAdd[\Piwik\Metrics::INDEX_NB_USERS];
100 $oldRowToUpdate[\Piwik\Metrics::INDEX_MAX_ACTIONS] = (float) max($newRowToAdd[\Piwik\Metrics::INDEX_MAX_ACTIONS], $oldRowToUpdate[\Piwik\Metrics::INDEX_MAX_ACTIONS]);
101 $oldRowToUpdate[\Piwik\Metrics::INDEX_SUM_VISIT_LENGTH] += $newRowToAdd[\Piwik\Metrics::INDEX_SUM_VISIT_LENGTH];
102 $oldRowToUpdate[\Piwik\Metrics::INDEX_BOUNCE_COUNT] += $newRowToAdd[\Piwik\Metrics::INDEX_BOUNCE_COUNT];
103 $oldRowToUpdate[\Piwik\Metrics::INDEX_NB_VISITS_CONVERTED] += $newRowToAdd[\Piwik\Metrics::INDEX_NB_VISITS_CONVERTED];
104 }
105 /**
106 * Adds the given row $newRowToAdd to the existing $oldRowToUpdate passed by reference
107 * The rows are php arrays Name => value
108 *
109 * @param array $newRowToAdd
110 * @param array $oldRowToUpdate
111 * @param bool $onlyMetricsAvailableInActionsTable
112 *
113 * @return void
114 */
115 protected function doSumActionsMetrics($newRowToAdd, &$oldRowToUpdate)
116 {
117 // Pre 1.2 format: string indexed rows are returned from the DB
118 // Left here for Backward compatibility with plugins doing custom SQL queries using these metrics as string
119 if (!isset($newRowToAdd[\Piwik\Metrics::INDEX_NB_VISITS])) {
120 $oldRowToUpdate[\Piwik\Metrics::INDEX_NB_VISITS] += $newRowToAdd['nb_visits'];
121 $oldRowToUpdate[\Piwik\Metrics::INDEX_NB_ACTIONS] += $newRowToAdd['nb_actions'];
122 $oldRowToUpdate[\Piwik\Metrics::INDEX_NB_UNIQ_VISITORS] += $newRowToAdd['nb_uniq_visitors'];
123 return;
124 }
125 // Edge case fail safe
126 if (!isset($oldRowToUpdate[\Piwik\Metrics::INDEX_NB_VISITS])) {
127 return;
128 }
129 $oldRowToUpdate[\Piwik\Metrics::INDEX_NB_VISITS] += $newRowToAdd[\Piwik\Metrics::INDEX_NB_VISITS];
130 if (array_key_exists(\Piwik\Metrics::INDEX_NB_ACTIONS, $newRowToAdd)) {
131 $oldRowToUpdate[\Piwik\Metrics::INDEX_NB_ACTIONS] += $newRowToAdd[\Piwik\Metrics::INDEX_NB_ACTIONS];
132 }
133 if (array_key_exists(\Piwik\Metrics::INDEX_PAGE_NB_HITS, $newRowToAdd)) {
134 if (!array_key_exists(\Piwik\Metrics::INDEX_PAGE_NB_HITS, $oldRowToUpdate)) {
135 $oldRowToUpdate[\Piwik\Metrics::INDEX_PAGE_NB_HITS] = 0;
136 }
137 $oldRowToUpdate[\Piwik\Metrics::INDEX_PAGE_NB_HITS] += $newRowToAdd[\Piwik\Metrics::INDEX_PAGE_NB_HITS];
138 }
139 $oldRowToUpdate[\Piwik\Metrics::INDEX_NB_UNIQ_VISITORS] += $newRowToAdd[\Piwik\Metrics::INDEX_NB_UNIQ_VISITORS];
140 }
141 public function sumMetricsGoals($label, $row)
142 {
143 $idGoal = $row['idgoal'];
144 if (!isset($this->data[$label][\Piwik\Metrics::INDEX_GOALS][$idGoal])) {
145 $this->data[$label][\Piwik\Metrics::INDEX_GOALS][$idGoal] = static::makeEmptyGoalRow($idGoal);
146 }
147 $this->doSumGoalsMetrics($row, $this->data[$label][\Piwik\Metrics::INDEX_GOALS][$idGoal]);
148 }
149 /**
150 * @param $idGoal
151 * @return array
152 */
153 protected static function makeEmptyGoalRow($idGoal)
154 {
155 if ($idGoal > GoalManager::IDGOAL_ORDER) {
156 return array(\Piwik\Metrics::INDEX_GOAL_NB_CONVERSIONS => 0, \Piwik\Metrics::INDEX_GOAL_NB_VISITS_CONVERTED => 0, \Piwik\Metrics::INDEX_GOAL_REVENUE => 0);
157 }
158 if ($idGoal == GoalManager::IDGOAL_ORDER) {
159 return array(\Piwik\Metrics::INDEX_GOAL_NB_CONVERSIONS => 0, \Piwik\Metrics::INDEX_GOAL_NB_VISITS_CONVERTED => 0, \Piwik\Metrics::INDEX_GOAL_REVENUE => 0, \Piwik\Metrics::INDEX_GOAL_ECOMMERCE_REVENUE_SUBTOTAL => 0, \Piwik\Metrics::INDEX_GOAL_ECOMMERCE_REVENUE_TAX => 0, \Piwik\Metrics::INDEX_GOAL_ECOMMERCE_REVENUE_SHIPPING => 0, \Piwik\Metrics::INDEX_GOAL_ECOMMERCE_REVENUE_DISCOUNT => 0, \Piwik\Metrics::INDEX_GOAL_ECOMMERCE_ITEMS => 0);
160 }
161 // idGoal == GoalManager::IDGOAL_CART
162 return array(\Piwik\Metrics::INDEX_GOAL_NB_CONVERSIONS => 0, \Piwik\Metrics::INDEX_GOAL_NB_VISITS_CONVERTED => 0, \Piwik\Metrics::INDEX_GOAL_REVENUE => 0, \Piwik\Metrics::INDEX_GOAL_ECOMMERCE_ITEMS => 0);
163 }
164 /**
165 *
166 * @param $newRowToAdd
167 * @param $oldRowToUpdate
168 */
169 protected function doSumGoalsMetrics($newRowToAdd, &$oldRowToUpdate)
170 {
171 $oldRowToUpdate[\Piwik\Metrics::INDEX_GOAL_NB_CONVERSIONS] += $newRowToAdd[\Piwik\Metrics::INDEX_GOAL_NB_CONVERSIONS];
172 $oldRowToUpdate[\Piwik\Metrics::INDEX_GOAL_NB_VISITS_CONVERTED] += $newRowToAdd[\Piwik\Metrics::INDEX_GOAL_NB_VISITS_CONVERTED];
173 $oldRowToUpdate[\Piwik\Metrics::INDEX_GOAL_REVENUE] += $newRowToAdd[\Piwik\Metrics::INDEX_GOAL_REVENUE];
174 // Cart & Order
175 if (isset($oldRowToUpdate[\Piwik\Metrics::INDEX_GOAL_ECOMMERCE_ITEMS])) {
176 $oldRowToUpdate[\Piwik\Metrics::INDEX_GOAL_ECOMMERCE_ITEMS] += $newRowToAdd[\Piwik\Metrics::INDEX_GOAL_ECOMMERCE_ITEMS];
177 // Order only
178 if (isset($oldRowToUpdate[\Piwik\Metrics::INDEX_GOAL_ECOMMERCE_REVENUE_SUBTOTAL])) {
179 $oldRowToUpdate[\Piwik\Metrics::INDEX_GOAL_ECOMMERCE_REVENUE_SUBTOTAL] += $newRowToAdd[\Piwik\Metrics::INDEX_GOAL_ECOMMERCE_REVENUE_SUBTOTAL];
180 $oldRowToUpdate[\Piwik\Metrics::INDEX_GOAL_ECOMMERCE_REVENUE_TAX] += $newRowToAdd[\Piwik\Metrics::INDEX_GOAL_ECOMMERCE_REVENUE_TAX];
181 $oldRowToUpdate[\Piwik\Metrics::INDEX_GOAL_ECOMMERCE_REVENUE_SHIPPING] += $newRowToAdd[\Piwik\Metrics::INDEX_GOAL_ECOMMERCE_REVENUE_SHIPPING];
182 $oldRowToUpdate[\Piwik\Metrics::INDEX_GOAL_ECOMMERCE_REVENUE_DISCOUNT] += $newRowToAdd[\Piwik\Metrics::INDEX_GOAL_ECOMMERCE_REVENUE_DISCOUNT];
183 }
184 }
185 }
186 public function sumMetricsActions($label, $row)
187 {
188 if (!isset($this->data[$label])) {
189 $this->data[$label] = static::makeEmptyActionRow();
190 }
191 $this->doSumActionsMetrics($row, $this->data[$label]);
192 }
193 protected static function makeEmptyActionRow()
194 {
195 return array(\Piwik\Metrics::INDEX_NB_UNIQ_VISITORS => 0, \Piwik\Metrics::INDEX_NB_VISITS => 0, \Piwik\Metrics::INDEX_NB_ACTIONS => 0);
196 }
197 public function sumMetricsEvents($label, $row)
198 {
199 if (!isset($this->data[$label])) {
200 $this->data[$label] = static::makeEmptyEventRow();
201 }
202 $this->doSumEventsMetrics($row, $this->data[$label], $onlyMetricsAvailableInActionsTable = true);
203 }
204 protected static function makeEmptyEventRow()
205 {
206 return array(\Piwik\Metrics::INDEX_NB_UNIQ_VISITORS => 0, \Piwik\Metrics::INDEX_NB_VISITS => 0, \Piwik\Metrics::INDEX_EVENT_NB_HITS => 0, \Piwik\Metrics::INDEX_EVENT_NB_HITS_WITH_VALUE => 0, \Piwik\Metrics::INDEX_EVENT_SUM_EVENT_VALUE => 0, \Piwik\Metrics::INDEX_EVENT_MIN_EVENT_VALUE => false, \Piwik\Metrics::INDEX_EVENT_MAX_EVENT_VALUE => 0);
207 }
208 const EVENT_VALUE_PRECISION = 2;
209 /**
210 * @param array $newRowToAdd
211 * @param array $oldRowToUpdate
212 * @return void
213 */
214 protected function doSumEventsMetrics($newRowToAdd, &$oldRowToUpdate)
215 {
216 $oldRowToUpdate[\Piwik\Metrics::INDEX_NB_VISITS] += $newRowToAdd[\Piwik\Metrics::INDEX_NB_VISITS];
217 $oldRowToUpdate[\Piwik\Metrics::INDEX_NB_UNIQ_VISITORS] += $newRowToAdd[\Piwik\Metrics::INDEX_NB_UNIQ_VISITORS];
218 $oldRowToUpdate[\Piwik\Metrics::INDEX_EVENT_NB_HITS] += $newRowToAdd[\Piwik\Metrics::INDEX_EVENT_NB_HITS];
219 $oldRowToUpdate[\Piwik\Metrics::INDEX_EVENT_NB_HITS_WITH_VALUE] += $newRowToAdd[\Piwik\Metrics::INDEX_EVENT_NB_HITS_WITH_VALUE];
220 $newRowToAdd[\Piwik\Metrics::INDEX_EVENT_SUM_EVENT_VALUE] = round($newRowToAdd[\Piwik\Metrics::INDEX_EVENT_SUM_EVENT_VALUE], static::EVENT_VALUE_PRECISION);
221 $oldRowToUpdate[\Piwik\Metrics::INDEX_EVENT_SUM_EVENT_VALUE] += $newRowToAdd[\Piwik\Metrics::INDEX_EVENT_SUM_EVENT_VALUE];
222 $oldRowToUpdate[\Piwik\Metrics::INDEX_EVENT_MAX_EVENT_VALUE] = round(max(0, $newRowToAdd[\Piwik\Metrics::INDEX_EVENT_MAX_EVENT_VALUE], $oldRowToUpdate[\Piwik\Metrics::INDEX_EVENT_MAX_EVENT_VALUE]), static::EVENT_VALUE_PRECISION);
223 // Update minimum only if it is set
224 if ($newRowToAdd[\Piwik\Metrics::INDEX_EVENT_MIN_EVENT_VALUE] !== false && $newRowToAdd[\Piwik\Metrics::INDEX_EVENT_MIN_EVENT_VALUE] !== null) {
225 if ($oldRowToUpdate[\Piwik\Metrics::INDEX_EVENT_MIN_EVENT_VALUE] === false) {
226 $oldRowToUpdate[\Piwik\Metrics::INDEX_EVENT_MIN_EVENT_VALUE] = round($newRowToAdd[\Piwik\Metrics::INDEX_EVENT_MIN_EVENT_VALUE], static::EVENT_VALUE_PRECISION);
227 } else {
228 $oldRowToUpdate[\Piwik\Metrics::INDEX_EVENT_MIN_EVENT_VALUE] = round(min($newRowToAdd[\Piwik\Metrics::INDEX_EVENT_MIN_EVENT_VALUE], $oldRowToUpdate[\Piwik\Metrics::INDEX_EVENT_MIN_EVENT_VALUE]), static::EVENT_VALUE_PRECISION);
229 }
230 }
231 }
232 /**
233 * Generic function that will sum all columns of the given row, at the specified label's row.
234 *
235 * @param $label
236 * @param $row
237 * @throws Exception if the the data row contains non numeric values
238 */
239 public function sumMetrics($label, $row)
240 {
241 foreach ($row as $columnName => $columnValue) {
242 if (empty($columnValue)) {
243 continue;
244 }
245 if (empty($this->data[$label][$columnName])) {
246 $this->data[$label][$columnName] = 0;
247 }
248 if (!is_numeric($columnValue)) {
249 throw new Exception("DataArray->sumMetricsPivot expects rows of numeric values, non numeric found: " . var_export($columnValue, true) . " for column {$columnName}");
250 }
251 $this->data[$label][$columnName] += $columnValue;
252 }
253 }
254 public function sumMetricsVisitsPivot($parentLabel, $label, $row)
255 {
256 if (!isset($this->dataTwoLevels[$parentLabel][$label])) {
257 $this->dataTwoLevels[$parentLabel][$label] = static::makeEmptyRow();
258 }
259 $this->doSumVisitsMetrics($row, $this->dataTwoLevels[$parentLabel][$label]);
260 }
261 public function sumMetricsGoalsPivot($parentLabel, $label, $row)
262 {
263 $idGoal = $row['idgoal'];
264 if (!isset($this->dataTwoLevels[$parentLabel][$label][\Piwik\Metrics::INDEX_GOALS][$idGoal])) {
265 $this->dataTwoLevels[$parentLabel][$label][\Piwik\Metrics::INDEX_GOALS][$idGoal] = static::makeEmptyGoalRow($idGoal);
266 }
267 $this->doSumGoalsMetrics($row, $this->dataTwoLevels[$parentLabel][$label][\Piwik\Metrics::INDEX_GOALS][$idGoal]);
268 }
269 public function sumMetricsActionsPivot($parentLabel, $label, $row)
270 {
271 if (!isset($this->dataTwoLevels[$parentLabel][$label])) {
272 $this->dataTwoLevels[$parentLabel][$label] = $this->makeEmptyActionRow();
273 }
274 $this->doSumActionsMetrics($row, $this->dataTwoLevels[$parentLabel][$label]);
275 }
276 public function sumMetricsEventsPivot($parentLabel, $label, $row)
277 {
278 if (!isset($this->dataTwoLevels[$parentLabel][$label])) {
279 $this->dataTwoLevels[$parentLabel][$label] = $this->makeEmptyEventRow();
280 }
281 $this->doSumEventsMetrics($row, $this->dataTwoLevels[$parentLabel][$label]);
282 }
283 public function setRowColumnPivot($parentLabel, $label, $column, $value)
284 {
285 $this->dataTwoLevels[$parentLabel][$label][$column] = $value;
286 }
287 public function enrichMetricsWithConversions()
288 {
289 $this->enrichWithConversions($this->data);
290 foreach ($this->dataTwoLevels as &$metricsBySubLabel) {
291 $this->enrichWithConversions($metricsBySubLabel);
292 }
293 }
294 /**
295 * Given an array of stats, it will process the sum of goal conversions
296 * and sum of revenue and add it in the stats array in two new fields.
297 *
298 * @param array $data Passed by reference, two new columns
299 * will be added: total conversions, and total revenue, for all goals for this label/row
300 */
301 protected function enrichWithConversions(&$data)
302 {
303 foreach ($data as &$values) {
304 EnrichRecordWithGoalMetricSums::enrichWithConversions($values);
305 }
306 }
307 /**
308 * Returns true if the row looks like an Action metrics row
309 *
310 * @param $row
311 * @return bool
312 */
313 public static function isRowActions($row)
314 {
315 return count($row) == count(static::makeEmptyActionRow()) && isset($row[\Piwik\Metrics::INDEX_NB_ACTIONS]);
316 }
317 /**
318 * Converts array to a datatable
319 *
320 * @return \Piwik\DataTable
321 */
322 public function asDataTable()
323 {
324 $dataArray = $this->getDataArray();
325 $dataArrayTwoLevels = $this->getDataArrayWithTwoLevels();
326 $subtableByLabel = null;
327 if (!empty($dataArrayTwoLevels)) {
328 $subtableByLabel = array();
329 foreach ($dataArrayTwoLevels as $label => $subTable) {
330 $subtableByLabel[$label] = \Piwik\DataTable::makeFromIndexedArray($subTable);
331 }
332 }
333 return \Piwik\DataTable::makeFromIndexedArray($dataArray, $subtableByLabel);
334 }
335 }
336