sports_league-8.x-1.x-dev/modules/sl_stats/src/SLStatsComputer.php

modules/sl_stats/src/SLStatsComputer.php
<?php

namespace Drupal\sl_stats;

use Drupal\Component\Utility\Timer;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Queue\QueueFactory;

/**
 * The stats computer service.
 */
class SLStatsComputer {

  /**
   * The entity type manager.
   *
   * @var \Drupal\sl_stats\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * The queue.
   *
   * @var \Drupal\Core\Queue\QueueFactory
   */
  protected $queue;

  /**
   * The plugin manager.
   *
   * @var \Drupal\sl_stats\SLStatsComputerManager
   */
  protected $pluginManager;

  /**
   * The module handler.
   *
   * @var \Drupal\Core\Extension\ModuleHandlerInterface
   */
  protected $moduleHandler;

  /**
   * SLStatsComputer constructor.
   *
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The entity type manager.
   * @param \Drupal\Core\Queue\QueueFactory $queue
   *   The queue.
   * @param \Drupal\sl_stats\SLStatsComputerManager $plugin_manager
   *   The plugin manager.
   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
   *   The module handler.
   */
  public function __construct(EntityTypeManagerInterface $entity_type_manager, QueueFactory $queue, SLStatsComputerManager $plugin_manager, ModuleHandlerInterface $module_handler) {
    $this->entityTypeManager = $entity_type_manager;
    $this->queue = $queue;
    $this->pluginManager = $plugin_manager;
    $this->moduleHandler = $module_handler;
  }

  /**
   * Resets the computer.
   */
  public function reset() {
    Timer::start('sl_stats_reset');
    $stop = 1;
    ini_set('max_execution_time', 0);
    ini_set('memory_limit', '1024M');

    // Iterate over all players.
    $efq = $this->entityTypeManager->getStorage('node')->getQuery();
    $efq->condition('type', 'sl_person');
    $efq->condition('status', 1);
    $efq->accessCheck(TRUE);
    $result = $efq->execute();
    /** @var QueueInterface $queue */
    $queue = $this->queue->get('sl_stats_worker');

    if (!empty($result)) {
      foreach ($result as $entity) {
        $item = new \stdClass();
        $item->nid = $entity;
        $queue->createItem($item);
      }
    }
  }

  /**
   * Computes the stats for a person.
   *
   * @param int $person_id
   *   The person id.
   */
  public function compute(int $person_id) {
    ini_set("memory_limit", "-1");
    Timer::start('sl_stats_compute');
    $computer_plugins = $this->pluginManager->getDefinitions();
    $node_manager = $this->entityTypeManager->getStorage('node');
    $stats_manager = $this->entityTypeManager->getStorage('sl_stats');
    foreach ($computer_plugins as $name => $plugin) {
      $computers[$name] = $this->pluginManager->createInstance($name);
    }

    if (!empty($person_id)) {
      $node = $node_manager->load($person_id);
    }

    $efq = $stats_manager->getQuery();

    if (!empty($node)) {
      // Deletes existing stats.
      $efq->condition('field_sl_stats_person', $node->id());
      $efq->condition('type', 'sl_stats_manual', '<>');
      $efq->accessCheck(TRUE);
      $result_stats = $efq->execute();
      $stats = $stats_manager->loadMultiple(array_values($result_stats));
      $stats_manager->delete($stats);
    }

    $teams = [];
    $total_stats['matches'] = $total_stats['goals'] = 0;
    if (!empty($node->field_sl_teams)) {
      foreach ($node->field_sl_teams as $team) {
        $teams[] = $team;

        // Don't compute for teams with manual stats present.
        $efq = $stats_manager->getQuery();
        $efq->condition('type', 'sl_stats_manual');
        $efq->condition('field_sl_stats_person', $node->id());
        $efq->condition('field_sl_teams', $team->entity->id());
        $efq->accessCheck(TRUE);
        $manual_stats = $efq->execute();
        if (!empty($manual_stats)) {
          continue;
        }

        // Defines the computer.
        foreach ($computer_plugins as $name => $plugin) {
          if ($computers[$name]->isApplicable($node, $team->entity)) {
            $computers[$name]->compute($node, $team->entity);
            continue 2;
          }
        }
      }
    }

    if (!empty($node)) {
      $this->moduleHandler->alter('sl_stats_finish', $node, $node->total_stats);
      $node->sl_stats_already_computed = TRUE;
      $node->save();
      return $node;
    }
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc