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

namespace XF\Job;

use function
count, is_array;

class
ReactionIsCounted extends AbstractJob
{
    protected
$defaultData = [
       
'steps' => 0,
       
'start' => 0,
       
'batch' => 100,
       
'type' => null,
       
'ids' => null
   
];

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

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

       
$db = $this->app->db();

       
/** @var \XF\Repository\Reaction $reactionRepo */
       
$reactionRepo = $this->app->repository('XF:Reaction');

       
$reactionHandler = $reactionRepo->getReactionHandler($this->data['type']);
        if (!
$reactionHandler)
        {
            return
$this->complete();
        }

        if (
is_array($this->data['ids']))
        {
            if (!
$this->data['ids'])
            {
                return
$this->complete();
            }

           
$idLimit = 'AND content_id IN (' . $db->quote($this->data['ids']) . ')';
        }
        else
        {
           
$idLimit = '';
        }

       
$reactions = $db->fetchPairs($db->limit(
           
"
                SELECT reaction_content_id, content_id
                FROM xf_reaction_content
                WHERE reaction_content_id > ?
                    AND content_type = ?
                   
{$idLimit}
                ORDER BY reaction_content_id
            "
, $this->data['batch']
        ), [
$this->data['start'], $this->data['type']]);
        if (!
$reactions)
        {
            return
$this->complete();
        }

       
$db->beginTransaction();
       
$reactionRepo->recalculateReactionIsCounted($this->data['type'], $reactions);
       
$db->commit();
       
       
$done = count($reactions);
       
$this->data['start'] = max(array_keys($reactions));

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

        return
$this->resume();
    }

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

    public function
canCancel()
    {
        return
true;
    }

    public function
canTriggerByChoice()
    {
        return
true;
    }
}