diff --git a/core/DataAccess/Model.php b/core/DataAccess/Model.php index ba04962ff48c8ed14ab1f863ea5efa77e54ed64a..d5da1e33edf73d75df7b5da6b69235dcde113042 100644 --- a/core/DataAccess/Model.php +++ b/core/DataAccess/Model.php @@ -304,11 +304,12 @@ class Model { // duplicate idarchives are Ignored, see https://github.com/piwik/piwik/issues/987 $query = "INSERT IGNORE INTO " . $tableName . " (" . implode(", ", $fields) . ") - VALUES (?,?,?,?,?,?,?,?)"; + VALUES (?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE " . end($fields) . " = ?"; $bindSql = $record; $bindSql[] = $name; $bindSql[] = $value; + $bindSql[] = $value; Db::query($query, $bindSql); diff --git a/tests/PHPUnit/Integration/ArchiveTest.php b/tests/PHPUnit/Integration/ArchiveTest.php index 906cfe40c986bee9ce79ec92c60cd1aa4be4c0af..df8ef4021ceeae0fe1584ab901f263d5bbe1d296 100644 --- a/tests/PHPUnit/Integration/ArchiveTest.php +++ b/tests/PHPUnit/Integration/ArchiveTest.php @@ -7,16 +7,21 @@ */ namespace Piwik\Tests\Integration; +use Piwik\API\Proxy; use Piwik\Archive as PiwikArchive; +use Piwik\ArchiveProcessor; use Piwik\ArchiveProcessor\Parameters; use Piwik\ArchiveProcessor\Rules; use Piwik\Common; use Piwik\Config; +use Piwik\DataAccess\ArchiveSelector; use Piwik\DataAccess\ArchiveTableCreator; use Piwik\DataAccess\ArchiveWriter; +use Piwik\DataAccess\LogAggregator; use Piwik\Date; use Piwik\Db; use Piwik\Piwik; +use Piwik\Plugins\UserLanguage; use Piwik\Segment; use Piwik\Site; use Piwik\Tests\Fixtures\OneVisitorTwoVisits; @@ -229,6 +234,65 @@ class ArchiveTest extends IntegrationTestCase ); } + public function testExistingArchivesAreReplaced() + { + $date = self::$fixture->dateTime; + $period = PeriodFactory::makePeriodFromQueryParams('UTC', 'day', $date); + + // request an report to trigger archiving + $userLanguageReport = Proxy::getInstance()->call('\\Piwik\\Plugins\\UserLanguage\\API', 'getLanguage', array( + 'idSite' => 1, + 'period' => 'day', + 'date' => $date + )); + + $this->assertEquals(1, $userLanguageReport->getRowsCount()); + $this->assertEquals('UserLanguage_LanguageCode fr', $userLanguageReport->getFirstRow()->getColumn('label')); + $this->assertEquals('UserLanguage_LanguageCode fr', $userLanguageReport->getLastRow()->getColumn('label')); + + $parameters = new Parameters(new Site(1), $period, new Segment('', '')); + $parameters->setRequestedPlugin('UserLanguage'); + + $result = ArchiveSelector::getArchiveIdAndVisits($parameters, $period->getDateStart()->getDateStartUTC()); + $idArchive = $result ? array_shift($result) : null; + + if (empty($idArchive)) { + $this->fail('Archive should be available'); + } + + // track a new visits now + $fixture = self::$fixture; + $t = $fixture::getTracker(1, $date, $defaultInit = true); + $t->setForceVisitDateTime(Date::factory($date)->addHour(1)->getDatetime()); + $t->setUrl('http://example.org/index.htm'); + $t->setBrowserLanguage('pt-br'); + $fixture::checkResponse($t->doTrackPageView('my site')); + + $archiveWriter = new ArchiveWriter($parameters, !!$idArchive); + $archiveWriter->idArchive = $idArchive; + + $archiveProcessor = new ArchiveProcessor($parameters, $archiveWriter, + new LogAggregator($parameters)); + + $archiveProcessor->setNumberOfVisits(1, 1); + + // directly trigger specific archiver for existing archive + $archiver = new UserLanguage\Archiver($archiveProcessor); + $archiver->aggregateDayReport(); + + // report should be updated + $userLanguageReport = Proxy::getInstance()->call('\\Piwik\\Plugins\\UserLanguage\\API', 'getLanguage', array( + 'idSite' => 1, + 'period' => 'day', + 'date' => $date + )); + + $this->assertEquals(2, $userLanguageReport->getRowsCount()); + $this->assertEquals('UserLanguage_LanguageCode fr', $userLanguageReport->getFirstRow()->getColumn('label')); + $this->assertEquals('UserLanguage_LanguageCode pt', $userLanguageReport->getLastRow()->getColumn('label')); + } + + private function createManyDifferentArchiveBlobs() { $recordName1 = 'Actions_Actions';