diff --git a/core/DataAccess/LogQueryBuilder.php b/core/DataAccess/LogQueryBuilder.php index 31691c018406a7680f9025c3af6cdf74afc8e988..2ba44f27df81c5c087a28b9bd0a5caac733cf6df 100644 --- a/core/DataAccess/LogQueryBuilder.php +++ b/core/DataAccess/LogQueryBuilder.php @@ -44,50 +44,6 @@ class LogQueryBuilder ); } - private function getIndexIfTableInTables($tableToFind, $tables) - { - $index = array_search($tableToFind, $tables); - - if (false !== $index) { - return $index; - } - - foreach ($tables as $index => $table) { - if (is_array($table) - && !empty($table['table']) - && $table['table'] === $tableToFind - && (!isset($table['tableAlias']) || $table['tableAlias'] === $tableToFind)) { - return $index; - } - } - - return false; - } - - private function swapPositionOfTableEntries($tables, $index1, $index2) - { - $table1 = $tables[$index1]; - $table2 = $tables[$index2]; - - $tables[$index1] = $table2; - $tables[$index2] = $table1; - - return $tables; - } - - private function hasJoinedTableAlreadyManually($tableToFind, $tables) - { - foreach ($tables as $index => $table) { - if (is_array($table) - && !empty($table['table']) - && $table['table'] === $tableToFind - && (!isset($table['tableAlias']) || $table['tableAlias'] === $tableToFind)) { - return true; - } - } - - return false; - } /** * Generate the join sql based on the needed tables @@ -97,7 +53,7 @@ class LogQueryBuilder */ private function generateJoinsString(&$tables) { - $knownTables = array('log_action', 'log_visit', 'log_link_visit_action', 'log_conversion', 'log_conversion_item'); + $knownTables = array("log_action", "log_visit", "log_link_visit_action", "log_conversion", "log_conversion_item"); $visitsAvailable = $linkVisitActionsTableAvailable = $conversionsAvailable = $conversionItemAvailable = $actionsTableAvailable = false; $joinWithSubSelect = false; $sql = ''; @@ -105,30 +61,33 @@ class LogQueryBuilder // make sure the tables are joined in the right order // base table first, then action before conversion // this way, conversions can be left joined on idvisit - $actionIndex = $this->getIndexIfTableInTables("log_link_visit_action", $tables); - $conversionIndex = $this->getIndexIfTableInTables("log_conversion", $tables); + $actionIndex = array_search("log_link_visit_action", $tables); + $conversionIndex = array_search("log_conversion", $tables); if ($actionIndex > 0 && $conversionIndex > 0 && $actionIndex > $conversionIndex) { - $tables = $this->swapPositionOfTableEntries($tables, $actionIndex, $conversionIndex); + $tables[$actionIndex] = "log_conversion"; + $tables[$conversionIndex] = "log_link_visit_action"; } // same as above: action before visit - $actionIndex = $this->getIndexIfTableInTables("log_link_visit_action", $tables); - $visitIndex = $this->getIndexIfTableInTables("log_visit", $tables); + $actionIndex = array_search("log_link_visit_action", $tables); + $visitIndex = array_search("log_visit", $tables); if ($actionIndex > 0 && $visitIndex > 0 && $actionIndex > $visitIndex) { - $tables = $this->swapPositionOfTableEntries($tables, $actionIndex, $visitIndex); + $tables[$actionIndex] = "log_visit"; + $tables[$visitIndex] = "log_link_visit_action"; } // we need to add log_link_visit_action dynamically to join eg visit with action - $linkVisitAction = $this->getIndexIfTableInTables("log_link_visit_action", $tables); - $actionIndex = $this->getIndexIfTableInTables("log_action", $tables); + $linkVisitAction = array_search("log_link_visit_action", $tables); + $actionIndex = array_search("log_action", $tables); if ($linkVisitAction === false && $actionIndex > 0) { $tables[] = "log_link_visit_action"; } - $linkVisitAction = $this->getIndexIfTableInTables("log_link_visit_action", $tables); - $actionIndex = $this->getIndexIfTableInTables("log_action", $tables); + $linkVisitAction = array_search("log_link_visit_action", $tables); + $actionIndex = array_search("log_action", $tables); if ($linkVisitAction > 0 && $actionIndex > 0 && $linkVisitAction > $actionIndex) { - $tables = $this->swapPositionOfTableEntries($tables, $linkVisitAction, $actionIndex); + $tables[$actionIndex] = "log_link_visit_action"; + $tables[$linkVisitAction] = "log_action"; } foreach ($tables as $i => $table) { @@ -150,7 +109,8 @@ class LogQueryBuilder if ($i == 0) { // first table $sql .= $tableSql; - } elseif (!$this->hasJoinedTableAlreadyManually($table, $tables)) { + } else { + if ($linkVisitActionsTableAvailable && $table === 'log_action') { $join = "log_link_visit_action.idaction_url = log_action.idaction"; } elseif ($linkVisitActionsTableAvailable && $table == "log_conversion") { diff --git a/tests/PHPUnit/Integration/SegmentTest.php b/tests/PHPUnit/Integration/SegmentTest.php index 73324b088bcb67eff8052e91667b9c862d94ef72..80c17ebe638906c0570555b46f234535eaddd094 100644 --- a/tests/PHPUnit/Integration/SegmentTest.php +++ b/tests/PHPUnit/Integration/SegmentTest.php @@ -486,7 +486,7 @@ class SegmentTest extends IntegrationTestCase $this->assertEquals($this->removeExtraWhiteSpaces($expected), $this->removeExtraWhiteSpaces($query)); } - public function test_getSelectQuery_whenJoinLogLinkVisitActionOnActionOnVisit_WithDifferentTableAlias() + public function test_getSelectQuery_whenJoinLogLinkVisitActionOnActionOnVisit() { $actionType = 3; $idSite = 1; @@ -535,53 +535,6 @@ class SegmentTest extends IntegrationTestCase $this->assertEquals($this->removeExtraWhiteSpaces($expected), $this->removeExtraWhiteSpaces($query)); } - public function test_getSelectQuery_whenJoinLogLinkVisitActionOnActionOnVisit_WithSameTableAlias() - { - $actionType = 3; - $idSite = 1; - $select = 'log_link_visit_action.custom_dimension_1, - log_action.name as url, - sum(log_link_visit_action.time_spent) as `13`, - sum(case log_visit.visit_total_actions when 1 then 1 when 0 then 1 else 0 end) as `6`'; - $from = array( - 'log_link_visit_action', - array('table' => 'log_visit', 'joinOn' => 'log_visit.idvisit = log_link_visit_action.idvisit'), - array('table' => 'log_action', 'joinOn' => 'log_link_visit_action.idaction_url = log_action.idaction') - ); - $where = 'log_link_visit_action.server_time >= ? - AND log_link_visit_action.server_time <= ? - AND log_link_visit_action.idsite = ?'; - $bind = array('2015-11-30 11:00:00', '2015-12-01 10:59:59', $idSite); - - $segment = 'actionType==' . $actionType; - $segment = new Segment($segment, $idSites = array()); - - $query = $segment->getSelectQuery($select, $from, $where, $bind); - - $logVisitTable = Common::prefixTable('log_visit'); - $logActionTable = Common::prefixTable('log_action'); - $logLinkVisitActionTable = Common::prefixTable('log_link_visit_action'); - - $expected = array( - "sql" => " - SELECT log_link_visit_action.custom_dimension_1, - log_action.name as url, - sum(log_link_visit_action.time_spent) as `13`, - sum(case log_visit.visit_total_actions when 1 then 1 when 0 then 1 else 0 end) as `6` - FROM $logLinkVisitActionTable AS log_link_visit_action - LEFT JOIN $logVisitTable AS log_visit - ON log_visit.idvisit = log_link_visit_action.idvisit - LEFT JOIN $logActionTable AS log_action - ON log_link_visit_action.idaction_url = log_action.idaction - WHERE ( log_link_visit_action.server_time >= ? - AND log_link_visit_action.server_time <= ? - AND log_link_visit_action.idsite = ? ) - AND ( log_action.type = ? )", - "bind" => array('2015-11-30 11:00:00', '2015-12-01 10:59:59', $idSite, $actionType)); - - $this->assertEquals($this->removeExtraWhiteSpaces($expected), $this->removeExtraWhiteSpaces($query)); - } - public function test_getSelectQuery_whenJoinLogLinkVisitActionOnAction() { $actionType = 3;