model = new Model(); $this->model->createArchiveTable($this->tableName, 'archive_numeric'); } public function testGetInvalidatedArchiveIdsSafeToDeleteHandlesCutOffGroupMaxLenCorrectly() { Db::get()->query('SET SESSION group_concat_max_len=32'); $this->insertArchiveData([ ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_OK], ]); // sanity check $table = ArchiveTableCreator::getNumericTable(Date::factory('2020-02-03'), true); $sql = "SELECT GROUP_CONCAT(idarchive, '.', value ORDER BY ts_archived DESC, idarchive DESC) as archives FROM `$table` GROUP BY idsite, date1, date2, period, name"; $result = Db::fetchRow($sql); $this->assertEquals(['archives' => '21.1,20.1,19.1,18.1,17.1,16.1,15'], $result); $ids = $this->model->getInvalidatedArchiveIdsSafeToDelete($table, $setMaxLen = false); $expected = ['20', '19', '18', '17', '16']; $this->assertEquals($expected, $ids); } public function testResetFailedArchivingJobsUpdatesCorrectStatuses() { Date::$now = strtotime('2020-03-03 04:00:00'); $this->insertInvalidations([ ['idsite' => 1, 'date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => 1, 'status' => 1, 'ts_invalidated' => '2020-03-01 00:00:00', 'ts_started' => '2020-03-02 03:00:00'], ['idsite' => 2, 'date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done.Plugin', 'value' => 2, 'status' => 0, 'ts_invalidated' => '2020-03-01 00:00:00', 'ts_started' => '2020-03-02 03:00:00'], ['idsite' => 1, 'date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'doneblablah', 'value' => 3, 'status' => 0, 'ts_invalidated' => '2020-03-01 00:00:00', 'ts_started' => '2020-03-03 00:00:00'], ['idsite' => 3, 'date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'donebluhbluh', 'value' => 4, 'status' => 1, 'ts_invalidated' => '2020-03-01 00:00:00', 'ts_started' => '2020-03-02 12:00:00'], ['idsite' => 1, 'date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'donedone', 'value' => 5, 'status' => 1, 'ts_invalidated' => '2020-03-01 00:00:00', 'ts_started' => '2020-03-01 03:00:00'], ['idsite' => 2, 'date1' => '2020-02-02', 'date2' => '2020-02-02', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => 2, 'status' => 1, 'ts_invalidated' => '2020-03-01 00:00:00', 'ts_started' => '2020-03-02 03:00:00'], ]); // Setting the time to two days for idsite 2, should skip the last in progress archive, as it was started within that time Config::getInstance()->General_2['archive_failure_recovery_timeout'] = 86400 * 2; $this->model->resetFailedArchivingJobs(); $idinvalidationStatus = Db::fetchAll('SELECT idinvalidation, idsite, status FROM ' . Common::prefixTable('archive_invalidations')); $expected = [ ['idinvalidation' => 1, 'idsite' => 1, 'status' => 0], ['idinvalidation' => 2, 'idsite' => 2, 'status' => 0], ['idinvalidation' => 3, 'idsite' => 1, 'status' => 0], ['idinvalidation' => 4, 'idsite' => 3, 'status' => 1], ['idinvalidation' => 5, 'idsite' => 1, 'status' => 0], ['idinvalidation' => 6, 'idsite' => 2, 'status' => 1], ]; $this->assertEquals($expected, $idinvalidationStatus); } public function testInsertNewArchiveId() { $this->assertAllocatedArchiveId(1); $this->assertAllocatedArchiveId(2); $this->assertAllocatedArchiveId(3); $this->assertAllocatedArchiveId(4); $this->assertAllocatedArchiveId(5); $this->assertAllocatedArchiveId(6); } private function assertAllocatedArchiveId($expectedId) { $id = $this->model->allocateNewArchiveId($this->tableName); $this->assertEquals($expectedId, $id); } public function testGetAndUpdateArchiveStatus() { $this->insertArchiveData([ ['date1' => '2020-02-03', 'date2' => '2020-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => ArchiveWriter::DONE_ERROR], ]); $numericTable = ArchiveTableCreator::getNumericTable(Date::factory('2020-02-03'), true); self::assertEquals( ArchiveWriter::DONE_ERROR, $this->model->getArchiveStatus($numericTable, '1', 'done') ); $this->model->updateArchiveStatus($numericTable, '1', 'done', ArchiveWriter::DONE_ERROR_INVALIDATED); self::assertEquals( ArchiveWriter::DONE_ERROR_INVALIDATED, $this->model->getArchiveStatus($numericTable, '1', 'done') ); } /** * @dataProvider getTestDataForHasChildArchivesInPeriod */ public function testHasChildArchivesInPeriodReturnsFalseIfThereIsNoChildPeriod($archivesToInsert, $idSite, $date, $period, $expected) { $this->insertArchiveData($archivesToInsert); $periodObj = Factory::build($period, $date); $result = $this->model->hasChildArchivesInPeriod($idSite, $periodObj); $this->assertEquals($expected, $result); } public function testHasInvalidationForPeriodAndNameReturnsTrueIfExists() { $date = '2021-03-23'; $this->insertInvalidations([ ['date1' => $date, 'date2' => $date, 'period' => Day::PERIOD_ID, 'name' => 'done'], ]); $periodObj = Factory::build('day', $date); $result = $this->model->hasInvalidationForPeriodAndName(1, $periodObj, 'done'); $this->assertTrue($result); } public function testHasInvalidationForPeriodAndNameReturnsTrueIfExistsForReport() { $date = '2021-03-23'; $this->insertInvalidations([ ['date1' => $date, 'date2' => $date, 'period' => Day::PERIOD_ID, 'name' => 'done', 'report' => 'myReport'], ]); $periodObj = Factory::build('day', $date); $result = $this->model->hasInvalidationForPeriodAndName(1, $periodObj, 'done', 'myReport'); $this->assertTrue($result); } public function testHasInvalidationForPeriodAndNameReturnsFalseIfNotExistsForReport() { $date = '2021-03-23'; $this->insertInvalidations([ ['date1' => $date, 'date2' => $date, 'period' => Day::PERIOD_ID, 'name' => 'done', 'report' => 'myReport'], ]); $periodObj = Factory::build('day', $date); $result = $this->model->hasInvalidationForPeriodAndName(1, $periodObj, 'done', 'otherReport'); $this->assertFalse($result); } public function testHasInvalidationForPeriodAndNameReturnsFalseIfNotExists() { $date = '2021-03-23'; $date2 = '2021-03-22'; $this->insertInvalidations([ ['date1' => $date, 'date2' => $date, 'period' => Day::PERIOD_ID, 'name' => 'done'], ]); $periodObj = Factory::build('day', $date2); $result = $this->model->hasInvalidationForPeriodAndName(1, $periodObj, 'done'); $this->assertFalse($result); } public function getTestDataForHasChildArchivesInPeriod() { return [ // day period, no child [ [ ['date1' => '2015-02-01', 'date2' => '2015-02-28', 'period' => Month::PERIOD_ID, 'name' => 'done', 'value' => 1], ], 1, '2015-02-03', 'day', false, ], // week period, no child [ [ ['date1' => '2015-02-01', 'date2' => '2015-02-28', 'period' => Month::PERIOD_ID, 'name' => 'done', 'value' => 1], ], 1, '2015-02-03', 'week', false, ], // month period, no child [ [ ['date1' => '2015-01-31', 'date2' => '2015-01-31', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => 1], ['date1' => '2015-01-01', 'date2' => '2015-12-31', 'period' => Year::PERIOD_ID, 'name' => 'done', 'value' => 1], ], 1, '2015-02-04', 'month', false, ], // year period, no child [ [], 1, '2015-02-03', 'year', false, ], // week period, w/ child [ [ ['date1' => '2015-02-01', 'date2' => '2015-02-28', 'period' => Month::PERIOD_ID, 'name' => 'done', 'value' => 1], ['date1' => '2015-01-31', 'date2' => '2015-01-31', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => 1], ], 1, '2015-02-01', 'week', true, ], [ [ ['date1' => '2015-02-01', 'date2' => '2015-02-28', 'period' => Month::PERIOD_ID, 'name' => 'done', 'value' => 1], ['date1' => '2015-02-11', 'date2' => '2015-02-11', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => 1], ], 1, '2015-02-10', 'week', true, ], // month period, w/ child [ [ ['date1' => '2015-02-09', 'date2' => '2015-02-15', 'period' => Week::PERIOD_ID, 'name' => 'done', 'value' => 1], ], 1, '2015-02-10', 'month', true, ], [ [ ['date1' => '2015-02-09', 'date2' => '2015-02-09', 'period' => Week::PERIOD_ID, 'name' => 'done', 'value' => 1], ], 1, '2015-02-10', 'month', true, ], [ [ ['date1' => '2015-02-01', 'date2' => '2015-02-01', 'period' => Week::PERIOD_ID, 'name' => 'done', 'value' => 1], ], 1, '2015-02-10', 'month', true, ], // year period, w/ child [ [ ['date1' => '2015-02-01', 'date2' => '2015-02-28', 'period' => Month::PERIOD_ID, 'name' => 'done', 'value' => 1], ], 1, '2015-02-04', 'year', true, ], [ [ ['date1' => '2015-04-01', 'date2' => '2015-04-01', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => 1], ], 1, '2015-02-04', 'year', true, ], [ [ ['date1' => '2015-04-01', 'date2' => '2015-04-01', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => 4], ], 1, '2015-02-04', 'year', true, ], [ [ ['date1' => '2015-04-01', 'date2' => '2015-04-01', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => 5], ['date1' => '2014-04-01', 'date2' => '2014-04-01', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => 1], ], 1, '2015-02-04', 'year', true, ], // range period w/ day child [ [ ['date1' => '2015-04-01', 'date2' => '2015-04-01', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => 1], ], 1, '2015-03-30,2015-04-05', 'range', true, ], [ [ ['date1' => '2015-04-01', 'date2' => '2015-04-01', 'period' => Day::PERIOD_ID, 'name' => 'done', 'value' => 1], ], 1, '2015-04-01,2015-04-05', 'range', true, ], ]; } public function testGetNextInvalidatedArchiveReturnsCorrectOrder() { $this->insertInvalidations([ ['date1' => '2015-03-30', 'date2' => '2015-03-30', 'period' => Day::PERIOD_ID, 'name' => 'done' . md5('testsegment8')], ['date1' => '2015-04-01', 'date2' => '2015-04-01', 'period' => Day::PERIOD_ID, 'name' => 'done'], ['date1' => '2015-04-02', 'date2' => '2015-04-02', 'period' => Day::PERIOD_ID, 'name' => 'done' . md5('testsegment1')], ['date1' => '2015-01-01', 'date2' => '2015-12-31', 'period' => Year::PERIOD_ID, 'name' => 'done'], ['date1' => '2015-04-06', 'date2' => '2015-04-12', 'period' => Week::PERIOD_ID, 'name' => 'done' . md5('testsegment3')], ['date1' => '2015-03-29', 'date2' => '2015-03-29', 'period' => Day::PERIOD_ID, 'name' => 'done'], ['date1' => '2015-03-30', 'date2' => '2015-03-30', 'period' => Day::PERIOD_ID, 'name' => 'done'], ['date1' => '2015-04-04', 'date2' => '2015-04-04', 'period' => Day::PERIOD_ID, 'name' => 'done'], ['date1' => '2015-03-29', 'date2' => '2015-03-29', 'period' => Day::PERIOD_ID, 'name' => 'done' . md5('testsegment2')], ['date1' => '2015-04-01', 'date2' => '2015-04-30', 'period' => Month::PERIOD_ID, 'name' => 'done'], ['date1' => '2015-04-15', 'date2' => '2015-04-24', 'period' => Range::PERIOD_ID, 'name' => 'done'], ['date1' => '2015-04-06', 'date2' => '2015-04-06', 'period' => Day::PERIOD_ID, 'name' => 'done'], ['date1' => '2015-04-06', 'date2' => '2015-04-06', 'period' => Day::PERIOD_ID, 'name' => 'done' . md5('testsegment3')], ['date1' => '2015-04-03', 'date2' => '2015-04-03', 'period' => Day::PERIOD_ID, 'name' => 'done'], ['date1' => '2015-04-05', 'date2' => '2015-04-05', 'period' => Day::PERIOD_ID, 'name' => 'done'], ['date1' => '2015-03-30', 'date2' => '2015-04-05', 'period' => Week::PERIOD_ID, 'name' => 'done'], ['date1' => '2015-04-01', 'date2' => '2015-04-30', 'period' => Month::PERIOD_ID, 'name' => 'done' . md5('testsegment1')], ['date1' => '2015-03-01', 'date2' => '2015-03-24', 'period' => Day::PERIOD_ID, 'name' => 'done'], ['date1' => '2015-04-06', 'date2' => '2015-04-12', 'period' => Week::PERIOD_ID, 'name' => 'done'], ['date1' => '2015-04-02', 'date2' => '2015-04-02', 'period' => Day::PERIOD_ID, 'name' => 'done'], ['date1' => '2015-03-01', 'date2' => '2015-03-31', 'period' => Month::PERIOD_ID, 'name' => 'done'], ['date1' => '2015-03-31', 'date2' => '2015-03-31', 'period' => Day::PERIOD_ID, 'name' => 'done'], ]); $expected = array ( array ( 'idinvalidation' => '11', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-04-15', 'date2' => '2015-04-24', 'period' => Range::PERIOD_ID, 'name' => 'done', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '12', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-04-06', 'date2' => '2015-04-06', 'period' => Day::PERIOD_ID, 'name' => 'done', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '13', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-04-06', 'date2' => '2015-04-06', 'period' => Day::PERIOD_ID, 'name' => 'done764644a7142bdcbedaab92f9dedef5e5', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '19', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-04-06', 'date2' => '2015-04-12', 'period' => Week::PERIOD_ID, 'name' => 'done', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '5', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-04-06', 'date2' => '2015-04-12', 'period' => Week::PERIOD_ID, 'name' => 'done764644a7142bdcbedaab92f9dedef5e5', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '15', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-04-05', 'date2' => '2015-04-05', 'period' => Day::PERIOD_ID, 'name' => 'done', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '8', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-04-04', 'date2' => '2015-04-04', 'period' => Day::PERIOD_ID, 'name' => 'done', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '14', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-04-03', 'date2' => '2015-04-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '20', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-04-02', 'date2' => '2015-04-02', 'period' => Day::PERIOD_ID, 'name' => 'done', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '3', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-04-02', 'date2' => '2015-04-02', 'period' => Day::PERIOD_ID, 'name' => 'done67564f109e3f4bba6b185a5343ff2bb0', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '2', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-04-01', 'date2' => '2015-04-01', 'period' => Day::PERIOD_ID, 'name' => 'done', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '10', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-04-01', 'date2' => '2015-04-30', 'period' => Month::PERIOD_ID, 'name' => 'done', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '17', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-04-01', 'date2' => '2015-04-30', 'period' => Month::PERIOD_ID, 'name' => 'done67564f109e3f4bba6b185a5343ff2bb0', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '22', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-03-31', 'date2' => '2015-03-31', 'period' => Day::PERIOD_ID, 'name' => 'done', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '7', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-03-30', 'date2' => '2015-03-30', 'period' => Day::PERIOD_ID, 'name' => 'done', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '1', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-03-30', 'date2' => '2015-03-30', 'period' => Day::PERIOD_ID, 'name' => 'done0bb102ea2ac682a578480dd184736607', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '16', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-03-30', 'date2' => '2015-04-05', 'period' => Week::PERIOD_ID, 'name' => 'done', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '6', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-03-29', 'date2' => '2015-03-29', 'period' => Day::PERIOD_ID, 'name' => 'done', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '9', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-03-29', 'date2' => '2015-03-29', 'period' => Day::PERIOD_ID, 'name' => 'doneb321434abb5a139c17dadf08c9d2e315', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '18', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-03-01', 'date2' => '2015-03-24', 'period' => Day::PERIOD_ID, 'name' => 'done', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '21', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-03-01', 'date2' => '2015-03-31', 'period' => Month::PERIOD_ID, 'name' => 'done', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), array ( 'idinvalidation' => '4', 'idarchive' => null, 'idsite' => '1', 'date1' => '2015-01-01', 'date2' => '2015-12-31', 'period' => Year::PERIOD_ID, 'name' => 'done', 'report' => null, 'ts_started' => null, 'status' => 0, 'processing_host' => null, 'process_id' => null, ), ); $actual = $this->model->getNextInvalidatedArchive(1, '2030-01-01 00:00:00', null, $useLimit = false); foreach ($actual as &$item) { unset($item['ts_invalidated']); } $this->assertEquals($expected, $actual); } public function testDeleteInvalidationsForDeletedSites() { Fixture::createWebsite('2014-01-01 00:00:00'); $this->insertInvalidations([ ['idsite' => 1, 'date1' => '2014-02-03', 'date2' => '2014-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done'], ['idsite' => 2, 'date1' => '2014-02-01', 'date2' => '2014-02-28', 'period' => Week::PERIOD_ID, 'name' => 'done'], ['idsite' => 2, 'date1' => '2014-02-01', 'date2' => '2014-02-01', 'period' => Day::PERIOD_ID, 'name' => 'done'], ['idsite' => 3, 'date1' => '2014-02-01', 'date2' => '2014-02-01', 'period' => Day::PERIOD_ID, 'name' => 'done'], ]); $this->model->deleteInvalidationsForDeletedSites(); $invalidations = Db::fetchAll("SELECT idsite, idinvalidation FROM " . Common::prefixTable('archive_invalidations') . " ORDER BY idinvalidation ASC"); $this->assertEquals([ ['idsite' => 1, 'idinvalidation' => 1], ], $invalidations); } public function testStartArchiveEnrichesRecordWithHostnameAndProcessId() { Fixture::createWebsite('2014-01-01 00:00:00'); $this->insertInvalidations([ ['idsite' => 1, 'date1' => '2014-02-04', 'date2' => '2014-02-04', 'period' => 1, 'name' => 'done', 'ts_started' => Date::now()->getDatetime(), 'status' => ArchiveInvalidator::INVALIDATION_STATUS_IN_PROGRESS], ['idsite' => 1, 'date1' => '2014-02-01', 'date2' => '2014-02-28', 'period' => 2, 'name' => 'done', 'status' => ArchiveInvalidator::INVALIDATION_STATUS_QUEUED], ]); $invalidations = Db::fetchAll("SELECT * FROM " . Common::prefixTable('archive_invalidations') . " ORDER BY idinvalidation ASC"); self::assertEmpty($invalidations[0]['processing_host']); self::assertEmpty($invalidations[0]['process_id']); self::assertEmpty($invalidations[1]['processing_host']); self::assertEmpty($invalidations[1]['process_id']); self::assertCount(2, $invalidations); $this->model->startArchive($invalidations[0]); $this->model->startArchive($invalidations[1]); $invalidations = Db::fetchAll("SELECT * FROM " . Common::prefixTable('archive_invalidations') . " ORDER BY idinvalidation ASC"); self::assertCount(2, $invalidations); // first one should not be updated as it's already running self::assertEmpty($invalidations[0]['processing_host']); self::assertEmpty($invalidations[0]['process_id']); self::assertNotEmpty($invalidations[1]['processing_host']); self::assertNotEmpty($invalidations[1]['process_id']); } public function testGetInvalidationsInProgress() { $this->insertInvalidations([ ['idsite' => 1, 'date1' => '2014-02-01', 'date2' => '2014-02-28', 'period' => Week::PERIOD_ID, 'name' => 'done'], ['idsite' => 1, 'date1' => '2014-02-01', 'date2' => '2014-02-01', 'period' => Day::PERIOD_ID, 'name' => 'doneb321434abb5a139c17dadf08c9d2e315', 'ts_started' => '2014-02-03 23:13:00', 'status' => 1], ['idsite' => 1, 'date1' => '2014-02-03', 'date2' => '2014-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'ts_started' => '2014-02-03 23:00:00', 'status' => 1], ['idsite' => 1, 'date1' => '2014-02-01', 'date2' => '2014-02-01', 'period' => Day::PERIOD_ID, 'name' => 'done'], ]); $expectedInvalidations = [ ['idsite' => 1, 'date1' => '2014-02-03', 'date2' => '2014-02-03', 'period' => Day::PERIOD_ID, 'name' => 'done', 'ts_started' => '2014-02-03 23:00:00', 'report' => null, 'processing_host' => null, 'process_id' => null], ['idsite' => 1, 'date1' => '2014-02-01', 'date2' => '2014-02-01', 'period' => Day::PERIOD_ID, 'name' => 'doneb321434abb5a139c17dadf08c9d2e315', 'ts_started' => '2014-02-03 23:13:00', 'report' => null, 'processing_host' => null, 'process_id' => null], ]; $result = $this->model->getInvalidationsInProgress([1]); unset($result[0]['idinvalidation'], $result[1]['idinvalidation']); unset($result[0]['ts_invalidated'], $result[1]['ts_invalidated']); self::assertEquals($expectedInvalidations, $result); } private function insertArchiveData($archivesToInsert) { $idarchive = 1; $now = Date::now()->getDatetime(); foreach ($archivesToInsert as $archive) { $table = ArchiveTableCreator::getNumericTable(Date::factory($archive['date1']), true); $sql = "INSERT INTO `$table` (idarchive, idsite, date1, date2, period, `name`, `value`, ts_archived) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; Db::query($sql, [ $idarchive, 1, $archive['date1'], $archive['date2'], $archive['period'], $archive['name'], $archive['value'], $archive['ts_archived'] ?? $now, ]); ++$idarchive; } } private function insertInvalidations(array $invalidations) { $table = Common::prefixTable('archive_invalidations'); $now = Date::now()->getDatetime(); foreach ($invalidations as $invalidation) { $sql = "INSERT INTO `$table` (idsite, date1, date2, period, `name`, status, ts_invalidated, ts_started, report) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; Db::query($sql, [ $invalidation['idsite'] ?? 1, $invalidation['date1'], $invalidation['date2'], $invalidation['period'], $invalidation['name'], $invalidation['status'] ?? 0, $invalidation['ts_invalidated'] ?? $now, $invalidation['ts_started'] ?? null, $invalidation['report'] ?? null, ]); } } }