2 namespace wcf\system\worker
;
3 use wcf\data\
object\type\ObjectTypeCache
;
4 use wcf\system\event\EventHandler
;
9 * Worker implementation for updating daily statistics.
12 * @copyright 2001-2014 WoltLab GmbH
13 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
14 * @package com.woltlab.wcf
15 * @subpackage system.worker
16 * @category Community Framework
18 class StatDailyRebuildDataWorker
extends AbstractRebuildDataWorker
{
20 * @see \wcf\system\worker\AbstractRebuildDataWorker::$objectListClassName
22 protected $objectListClassName = 'wcf\data\attachment\AttachmentList';
25 * @see \wcf\system\worker\AbstractWorker::$limit
27 protected $limit = 30;
33 protected $startDate = 0;
36 * @see \wcf\system\worker\AbstractRebuildDataWorker::initObjectList()
38 protected function initObjectList() {}
41 * @see \wcf\system\worker\IWorker::countObjects()
43 public function countObjects() {
44 $this->getStartDate();
46 $this->count
= ceil((TIME_NOW
- $this->startDate
) / 86400);
50 * @see \wcf\system\worker\IWorker::execute()
52 public function execute() {
53 EventHandler
::getInstance()->fireAction($this, 'execute');
55 if (!$this->loopCount
) {
56 // delete existing stat
57 $sql = "DELETE FROM wcf".WCF_N
."_stat_daily";
58 $statement = WCF
::getDB()->prepareStatement($sql);
59 $statement->execute();
62 // prepare insert statement
63 $sql = "INSERT IGNORE INTO wcf".WCF_N
."_stat_daily
64 (objectTypeID, date, counter, total)
66 $statement = WCF
::getDB()->prepareStatement($sql);
68 $this->getStartDate();
69 $d = DateUtil
::getDateTimeByTimestamp($this->startDate
);
70 $d->setTimezone(new \
DateTimeZone(TIMEZONE
));
72 if ($this->loopCount
) {
73 $d->add(new \
DateInterval('P'.($this->loopCount
* $this->limit
).'D'));
75 for ($i = 0; $i < $this->limit
; $i++
) {
77 foreach (ObjectTypeCache
::getInstance()->getObjectTypes('com.woltlab.wcf.statDailyHandler') as $objectType) {
78 $data = $objectType->getProcessor()->getData($d->getTimestamp());
79 $statement->execute(array($objectType->objectTypeID
, $d->format('Y-m-d'), $data['counter'], $data['total']));
82 $d->add(new \
DateInterval('P1D'));
87 * Gets the start timestamp.
91 protected function getStartDate() {
92 if ($this->startDate
) return;
93 $sql = "SELECT MIN(registrationDate)
94 FROM wcf".WCF_N
."_user";
95 $statement = WCF
::getDB()->prepareStatement($sql);
96 $statement->execute();
97 $this->startDate
= $statement->fetchColumn();