Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Job/AbstractRebuildJob.php
<?php

namespace XF\Job;

abstract class
AbstractRebuildJob extends AbstractJob
{
    protected
$rebuildDefaultData = [
       
'steps' => 0,
       
'start' => 0,
       
'batch' => 100,
    ];

    abstract protected function
getNextIds($start, $batch);
    abstract protected function
rebuildById($id);
    abstract protected function
getStatusType();

    protected function
setupData(array $data)
    {
       
$this->defaultData = array_merge($this->rebuildDefaultData, $this->defaultData);

        return
parent::setupData($data);
    }

    public function
run($maxRunTime)
    {
       
$startTime = microtime(true);

       
$this->data['steps']++;

       
$ids = $this->getNextIds($this->data['start'], $this->data['batch']);
        if (!
$ids)
        {
            return
$this->complete();
        }

       
$done = 0;

        foreach (
$ids AS $id)
        {
            if (
microtime(true) - $startTime >= $maxRunTime)
            {
                break;
            }

           
$this->data['start'] = $id;

           
$this->rebuildById($id);

           
$done++;
        }

       
$this->data['batch'] = $this->calculateOptimalBatch($this->data['batch'], $done, $startTime, $maxRunTime, 1000);

        return
$this->resume();
    }

    public function
getStatusMessage()
    {
       
$actionPhrase = \XF::phrase('rebuilding');
       
$typePhrase = $this->getStatusType();
        return
sprintf('%s... %s (%s)', $actionPhrase, $typePhrase, $this->data['start']);
    }

    public function
canCancel()
    {
        return
true;
    }

    public function
canTriggerByChoice()
    {
        return
true;
    }
}