From 999803a79a7b19bf888d1b949b2f3965e028e16d Mon Sep 17 00:00:00 2001
From: BeezyT <timo@ezdesign.de>
Date: Wed, 22 Aug 2012 13:42:32 +0000
Subject: [PATCH] refs #3332 only load the metrics that are processed further -
 this really is quite an improvement performance wise!

git-svn-id: http://dev.piwik.org/svn/trunk@6865 59fd770c-687e-43c8-a1e3-f5a4ff64c105
---
 core/ArchiveProcessing/Day.php      | 78 +++++++++++++++++++++--------
 plugins/Transitions/Transitions.php | 11 ++--
 2 files changed, 65 insertions(+), 24 deletions(-)

diff --git a/core/ArchiveProcessing/Day.php b/core/ArchiveProcessing/Day.php
index 9b85e64b8f..372615dfd1 100644
--- a/core/ArchiveProcessing/Day.php
+++ b/core/ArchiveProcessing/Day.php
@@ -315,6 +315,8 @@ class Piwik_ArchiveProcessing_Day extends Piwik_ArchiveProcessing
 	 *
 	 * @param array|string  $label      the dimensions(s) you're interested in
 	 * @param string        $where      where clause
+	 * @param bool|array    $metrics    Set this if you want to limit the columns that are returned.
+	 *                                  The possible values in the array are Piwik_Archive::INDEX_*.
 	 * @param bool|string   $orderBy    order by clause
 	 * @param Piwik_RankingQuery  $rankingQuery     pre-configured ranking query instance
 	 * @param bool|string   $joinLogActionOnColumn  column from log_link_visit_action that
@@ -322,8 +324,8 @@ class Piwik_ArchiveProcessing_Day extends Piwik_ArchiveProcessing
 	 * @param bool|string   $addSelect  additional select clause
 	 * @return mixed
 	 */
-	public function queryActionsByDimension($label, $where = '', $orderBy = false, $rankingQuery = null,
-			$joinLogActionOnColumn = false, $addSelect = false)
+	public function queryActionsByDimension($label, $where = '', $metrics = false, $orderBy = false,
+			$rankingQuery = null, $joinLogActionOnColumn = false, $addSelect = false)
 	{
 	    if(is_array($label))
 	    {
@@ -351,12 +353,14 @@ class Piwik_ArchiveProcessing_Day extends Piwik_ArchiveProcessing
 	    	$where = sprintf($where, "log_link_visit_action", "log_link_visit_action");
 	        $where = ' AND '.$where;
 	    }
-	    
-		// page URLs and page names, general stats
-		$select = "$select,
-				count(distinct log_link_visit_action.idvisit) as `". Piwik_Archive::INDEX_NB_VISITS ."`,
-				count(distinct log_link_visit_action.idvisitor) as `". Piwik_Archive::INDEX_NB_UNIQ_VISITORS ."`,
-				count(*) as `". Piwik_Archive::INDEX_NB_ACTIONS ."`";
+		
+		$pre = ", \n\t\t\t";
+		if (!$metrics || in_array(Piwik_Archive::INDEX_NB_VISITS, $metrics))
+			$select .= $pre . "count(distinct log_link_visit_action.idvisit) as `". Piwik_Archive::INDEX_NB_VISITS ."`";
+		if (!$metrics || in_array(Piwik_Archive::INDEX_NB_UNIQ_VISITORS, $metrics))
+			$select .= $pre . "count(distinct log_link_visit_action.idvisitor) as `". Piwik_Archive::INDEX_NB_UNIQ_VISITORS ."`";
+		if (!$metrics || in_array(Piwik_Archive::INDEX_NB_ACTIONS, $metrics))
+			$select .= $pre . "count(*) as `". Piwik_Archive::INDEX_NB_ACTIONS ."`";
 
 		$from = "log_link_visit_action";
 		
@@ -392,6 +396,17 @@ class Piwik_ArchiveProcessing_Day extends Piwik_ArchiveProcessing
 				Piwik_Archive::INDEX_NB_VISITS,
 				Piwik_Archive::INDEX_NB_ACTIONS
 			);
+			if ($metrics)
+			{
+				foreach ($sumColumns as $i => $column)
+				{
+					if (!in_array($column, $metrics))
+					{
+						unset($sumColumns[$i]);
+					}			
+				}
+				$sumColumns = array_values($sumColumns);
+			}
 			$rankingQuery->addColumn($sumColumns, 'sum');
 			return $rankingQuery->execute($query['sql'], $query['bind']);
 		}
@@ -406,6 +421,8 @@ class Piwik_ArchiveProcessing_Day extends Piwik_ArchiveProcessing
 	 *                                Can also be an array of strings, when the dimension spans multiple fields, 
 	 *                                eg. array("referer_name", "referer_keyword")
 	 * @param string        $where    Additional condition for WHERE clause
+	 * @param bool|array    $metrics  Set this if you want to limit the columns that are returned.
+	 *                                The possible values in the array are Piwik_Archive::INDEX_*.
 	 * @param bool|string   $orderBy  ORDER BY clause. This is needed in combination with $rankingQuery.
 	 * @param Piwik_RankingQuery $rankingQuery
 	 *                                A pre-configured ranking query instance that is used to limit the result.
@@ -415,8 +432,8 @@ class Piwik_ArchiveProcessing_Day extends Piwik_ArchiveProcessing
 	 *                                Set to true if the $label column is generated in $addSelect.
 	 * @return mixed
 	 */
-	public function queryVisitsByDimension($label, $where = '', $orderBy = false, $rankingQuery = null,
-			$addSelect = false, $addSelectGeneratesLabelColumn = false)
+	public function queryVisitsByDimension($label, $where = '', $metrics = false, $orderBy = false,
+			$rankingQuery = null, $addSelect = false, $addSelectGeneratesLabelColumn = false)
 	{
 	    if(is_array($label))
 	    {
@@ -444,15 +461,22 @@ class Piwik_ArchiveProcessing_Day extends Piwik_ArchiveProcessing
 	        $where = ' AND '.$where;
 	    }
 	    
-	    $select = "$select,
-				count(distinct log_visit.idvisitor) as `". Piwik_Archive::INDEX_NB_UNIQ_VISITORS ."`,
-				count(*) as `". Piwik_Archive::INDEX_NB_VISITS ."`,
-				sum(log_visit.visit_total_actions) as `". Piwik_Archive::INDEX_NB_ACTIONS ."`,
-				max(log_visit.visit_total_actions) as `". Piwik_Archive::INDEX_MAX_ACTIONS ."`,
-				sum(log_visit.visit_total_time) as `". Piwik_Archive::INDEX_SUM_VISIT_LENGTH ."`,
-				sum(case log_visit.visit_total_actions when 1 then 1 when 0 then 1 else 0 end) as `". Piwik_Archive::INDEX_BOUNCE_COUNT ."`,
-				sum(case log_visit.visit_goal_converted when 1 then 1 else 0 end) as `". Piwik_Archive::INDEX_NB_VISITS_CONVERTED ."`";
-	    
+		$pre = ", \n\t\t\t";
+		if (!$metrics || in_array(Piwik_Archive::INDEX_NB_UNIQ_VISITORS, $metrics))
+			$select .= $pre . "count(distinct log_visit.idvisitor) as `". Piwik_Archive::INDEX_NB_UNIQ_VISITORS ."`";
+		if (!$metrics || in_array(Piwik_Archive::INDEX_NB_VISITS, $metrics))
+			$select .= $pre . "count(*) as `". Piwik_Archive::INDEX_NB_VISITS ."`";
+		if (!$metrics || in_array(Piwik_Archive::INDEX_NB_ACTIONS, $metrics))
+			$select .= $pre . "sum(log_visit.visit_total_actions) as `". Piwik_Archive::INDEX_NB_ACTIONS ."`";
+		if (!$metrics || in_array(Piwik_Archive::INDEX_MAX_ACTIONS, $metrics))
+			$select .= $pre . "max(log_visit.visit_total_actions) as `". Piwik_Archive::INDEX_MAX_ACTIONS ."`";
+		if (!$metrics || in_array(Piwik_Archive::INDEX_SUM_VISIT_LENGTH, $metrics))
+			$select .= $pre . "sum(log_visit.visit_total_time) as `". Piwik_Archive::INDEX_SUM_VISIT_LENGTH ."`";
+		if (!$metrics || in_array(Piwik_Archive::INDEX_BOUNCE_COUNT, $metrics))
+			$select .= $pre . "sum(case log_visit.visit_total_actions when 1 then 1 when 0 then 1 else 0 end) as `". Piwik_Archive::INDEX_BOUNCE_COUNT ."`";
+		if (!$metrics || in_array(Piwik_Archive::INDEX_NB_VISITS_CONVERTED, $metrics))
+			$select .= $pre . "sum(case log_visit.visit_goal_converted when 1 then 1 else 0 end) as `". Piwik_Archive::INDEX_NB_VISITS_CONVERTED ."`";
+		
 		if ($addSelect && !$addSelectGeneratesLabelColumn) {
 			$select .= ', '.$addSelect;
 		}
@@ -475,8 +499,22 @@ class Piwik_ArchiveProcessing_Day extends Piwik_ArchiveProcessing
 				Piwik_Archive::INDEX_NB_ACTIONS, Piwik_Archive::INDEX_SUM_VISIT_LENGTH,
 				Piwik_Archive::INDEX_BOUNCE_COUNT, Piwik_Archive::INDEX_NB_VISITS_CONVERTED
 			);
+			if ($metrics)
+			{
+				foreach ($sumColumns as $i => $column)
+				{
+					if (!in_array($column, $metrics))
+					{
+						unset($sumColumns[$i]);
+					}			
+				}
+				$sumColumns = array_values($sumColumns);
+			}
 			$rankingQuery->addColumn($sumColumns, 'sum');
-			$rankingQuery->addColumn(Piwik_Archive::INDEX_MAX_ACTIONS, 'max');
+			if (!$metrics || in_array(Piwik_Archive::INDEX_MAX_ACTIONS, $metrics))
+			{
+				$rankingQuery->addColumn(Piwik_Archive::INDEX_MAX_ACTIONS, 'max');
+			}
 			return $rankingQuery->execute($query['sql'], $query['bind']);
 		}
 		
diff --git a/plugins/Transitions/Transitions.php b/plugins/Transitions/Transitions.php
index e09479856e..94c02d84b7 100644
--- a/plugins/Transitions/Transitions.php
+++ b/plugins/Transitions/Transitions.php
@@ -88,8 +88,9 @@ class Piwik_Transitions extends Piwik_Plugin
 		$orderBy = '`'.Piwik_Archive::INDEX_NB_VISITS.'` DESC';
 		$where = 'visit_entry_idaction_url = '.intval($idaction);
 		
-		$data = $archiveProcessing->queryVisitsByDimension($dimension, $where, $orderBy, $rankingQuery,
-					$select, $selectGeneratesLabelColumn = true);
+		$metrics = array(Piwik_Archive::INDEX_NB_VISITS);
+		$data = $archiveProcessing->queryVisitsByDimension($dimension, $where, $metrics, $orderBy,
+					$rankingQuery, $select, $selectGeneratesLabelColumn = true);
 		
 		$referrerData = array();
 		$referrerSubData = array();
@@ -150,7 +151,8 @@ class Piwik_Transitions extends Piwik_Plugin
 		
 		$orderBy = '`'.Piwik_Archive::INDEX_NB_ACTIONS.'` DESC';
 		
-		$data = $archiveProcessing->queryActionsByDimension(array($dimension), $where, $orderBy,
+		$metrics = array(Piwik_Archive::INDEX_NB_ACTIONS);
+		$data = $archiveProcessing->queryActionsByDimension(array($dimension), $where, $metrics, $orderBy,
 					$rankingQuery, $dimension, $addSelect);
 		
 		$previousPagesDataTable = new Piwik_DataTable;
@@ -206,7 +208,8 @@ class Piwik_Transitions extends Piwik_Plugin
 		
 		$orderBy = '`'.Piwik_Archive::INDEX_NB_ACTIONS.'` DESC';
 		
-		$data = $archiveProcessing->queryActionsByDimension(array($dimension), $where, $orderBy, 
+		$metrics = array(Piwik_Archive::INDEX_NB_ACTIONS);
+		$data = $archiveProcessing->queryActionsByDimension(array($dimension), $where, $metrics, $orderBy, 
 					$rankingQuery, $dimension, $addSelect);
 		
 		$dataTables = array();
-- 
GitLab