rawLogDao = $rawLogDao; $this->logTablesProvider = $logTablesProvider; } /** * Deletes visits by ID. This method cascades, so conversions, conversion items and visit actions for * the visits are also deleted. * * @param int[] $visitIds * @return int The number of deleted visits. */ public function deleteVisits($visitIds) { $numDeletedVisits = 0; foreach ($this->logTablesProvider->getAllLogTables() as $logTable) { if ($logTable->getColumnToJoinOnIdVisit()) { $numVisits = $this->rawLogDao->deleteFromLogTable($logTable->getName(), $visitIds); if ($logTable->getName() === 'log_visit') { $numDeletedVisits = $numVisits; } } } return $numDeletedVisits; } /** * Deletes visits within the specified date range and belonging to the specified site (if any). Visits are * deleted in chunks, so only `$iterationStep` visits are deleted at a time. * * @param string|null $startDatetime A datetime string. Visits that occur at this time or after are deleted. If not supplied, * visits from the beginning of time are deleted. * @param string|null $endDatetime A datetime string. Visits that occur before this time are deleted. If not supplied, * visits from the end of time are deleted. * @param int|null $idSite The site to delete visits from. * @param int $iterationStep The number of visits to delete at a single time. * @param callable $afterChunkDeleted Callback executed after every chunk of visits are deleted. * @return int The number of visits deleted. */ public function deleteVisitsFor($startDatetime, $endDatetime, $idSite = null, $iterationStep = 1000, $afterChunkDeleted = null) { $fields = array('idvisit'); $conditions = array(); if (!empty($startDatetime)) { $conditions[] = array('visit_last_action_time', '>=', $startDatetime); } if (!empty($endDatetime)) { $conditions[] = array('visit_last_action_time', '<', $endDatetime); } if (!empty($idSite)) { $conditions[] = array('idsite', '=', $idSite); } $logsDeleted = 0; $logPurger = $this; $this->rawLogDao->forAllLogs('log_visit', $fields, $conditions, $iterationStep, function ($logs) use ($logPurger, &$logsDeleted, $afterChunkDeleted) { $ids = array_map(function ($row) { return reset($row); }, $logs); $logsDeleted += $logPurger->deleteVisits($ids); if (!empty($afterChunkDeleted)) { $afterChunkDeleted($logsDeleted); } }); return $logsDeleted; } }