You are here

class NodeStatisticsDatabaseStorage in Drupal 8

Same name and namespace in other branches
  1. 9 core/modules/statistics/src/NodeStatisticsDatabaseStorage.php \Drupal\statistics\NodeStatisticsDatabaseStorage
  2. 10 core/modules/statistics/src/NodeStatisticsDatabaseStorage.php \Drupal\statistics\NodeStatisticsDatabaseStorage

Provides the default database storage backend for statistics.

Hierarchy

Expanded class hierarchy of NodeStatisticsDatabaseStorage

1 string reference to 'NodeStatisticsDatabaseStorage'
statistics.services.yml in core/modules/statistics/statistics.services.yml
core/modules/statistics/statistics.services.yml
1 service uses NodeStatisticsDatabaseStorage
statistics.storage.node in core/modules/statistics/statistics.services.yml
Drupal\statistics\NodeStatisticsDatabaseStorage

File

core/modules/statistics/src/NodeStatisticsDatabaseStorage.php, line 12

Namespace

Drupal\statistics
View source
class NodeStatisticsDatabaseStorage implements StatisticsStorageInterface {

  /**
   * The database connection used.
   *
   * @var \Drupal\Core\Database\Connection
   */
  protected $connection;

  /**
   * The state service.
   *
   * @var \Drupal\Core\State\StateInterface
   */
  protected $state;

  /**
   * The request stack.
   *
   * @var \Symfony\Component\HttpFoundation\RequestStack
   */
  protected $requestStack;

  /**
   * Constructs the statistics storage.
   *
   * @param \Drupal\Core\Database\Connection $connection
   *   The database connection for the node view storage.
   * @param \Drupal\Core\State\StateInterface $state
   *   The state service.
   */
  public function __construct(Connection $connection, StateInterface $state, RequestStack $request_stack) {
    $this->connection = $connection;
    $this->state = $state;
    $this->requestStack = $request_stack;
  }

  /**
   * {@inheritdoc}
   */
  public function recordView($id) {
    return (bool) $this->connection
      ->merge('node_counter')
      ->key('nid', $id)
      ->fields([
      'daycount' => 1,
      'totalcount' => 1,
      'timestamp' => $this
        ->getRequestTime(),
    ])
      ->expression('daycount', 'daycount + 1')
      ->expression('totalcount', 'totalcount + 1')
      ->execute();
  }

  /**
   * {@inheritdoc}
   */
  public function fetchViews($ids) {
    $views = $this->connection
      ->select('node_counter', 'nc')
      ->fields('nc', [
      'totalcount',
      'daycount',
      'timestamp',
    ])
      ->condition('nid', $ids, 'IN')
      ->execute()
      ->fetchAll();
    foreach ($views as $id => $view) {
      $views[$id] = new StatisticsViewsResult($view->totalcount, $view->daycount, $view->timestamp);
    }
    return $views;
  }

  /**
   * {@inheritdoc}
   */
  public function fetchView($id) {
    $views = $this
      ->fetchViews([
      $id,
    ]);
    return reset($views);
  }

  /**
   * {@inheritdoc}
   */
  public function fetchAll($order = 'totalcount', $limit = 5) {
    assert(in_array($order, [
      'totalcount',
      'daycount',
      'timestamp',
    ]), "Invalid order argument.");
    return $this->connection
      ->select('node_counter', 'nc')
      ->fields('nc', [
      'nid',
    ])
      ->orderBy($order, 'DESC')
      ->range(0, $limit)
      ->execute()
      ->fetchCol();
  }

  /**
   * {@inheritdoc}
   */
  public function deleteViews($id) {
    return (bool) $this->connection
      ->delete('node_counter')
      ->condition('nid', $id)
      ->execute();
  }

  /**
   * {@inheritdoc}
   */
  public function resetDayCount() {
    $statistics_timestamp = $this->state
      ->get('statistics.day_timestamp') ?: 0;
    if ($this
      ->getRequestTime() - $statistics_timestamp >= 86400) {
      $this->state
        ->set('statistics.day_timestamp', $this
        ->getRequestTime());
      $this->connection
        ->update('node_counter')
        ->fields([
        'daycount' => 0,
      ])
        ->execute();
    }
  }

  /**
   * {@inheritdoc}
   */
  public function maxTotalCount() {
    $query = $this->connection
      ->select('node_counter', 'nc');
    $query
      ->addExpression('MAX(totalcount)');
    $max_total_count = (int) $query
      ->execute()
      ->fetchField();
    return $max_total_count;
  }

  /**
   * Get current request time.
   *
   * @return int
   *   Unix timestamp for current server request time.
   */
  protected function getRequestTime() {
    return $this->requestStack
      ->getCurrentRequest()->server
      ->get('REQUEST_TIME');
  }

}

Members

Namesort descending Modifiers Type Description Overrides
NodeStatisticsDatabaseStorage::$connection protected property The database connection used.
NodeStatisticsDatabaseStorage::$requestStack protected property The request stack.
NodeStatisticsDatabaseStorage::$state protected property The state service.
NodeStatisticsDatabaseStorage::deleteViews public function Delete counts for a specific entity. Overrides StatisticsStorageInterface::deleteViews
NodeStatisticsDatabaseStorage::fetchAll public function Returns the number of times a entity has been viewed. Overrides StatisticsStorageInterface::fetchAll
NodeStatisticsDatabaseStorage::fetchView public function Returns the number of times a single entity has been viewed. Overrides StatisticsStorageInterface::fetchView
NodeStatisticsDatabaseStorage::fetchViews public function Returns the number of times entities have been viewed. Overrides StatisticsStorageInterface::fetchViews
NodeStatisticsDatabaseStorage::getRequestTime protected function Get current request time.
NodeStatisticsDatabaseStorage::maxTotalCount public function Returns the highest 'totalcount' value. Overrides StatisticsStorageInterface::maxTotalCount
NodeStatisticsDatabaseStorage::recordView public function Count a entity view. Overrides StatisticsStorageInterface::recordView
NodeStatisticsDatabaseStorage::resetDayCount public function Reset the day counter for all entities once every day. Overrides StatisticsStorageInterface::resetDayCount
NodeStatisticsDatabaseStorage::__construct public function Constructs the statistics storage.