Chris@0: connection = $connection; Chris@0: $this->state = $state; Chris@0: $this->requestStack = $request_stack; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function recordView($id) { Chris@0: return (bool) $this->connection Chris@0: ->merge('node_counter') Chris@0: ->key('nid', $id) Chris@0: ->fields([ Chris@0: 'daycount' => 1, Chris@0: 'totalcount' => 1, Chris@0: 'timestamp' => $this->getRequestTime(), Chris@0: ]) Chris@0: ->expression('daycount', 'daycount + 1') Chris@0: ->expression('totalcount', 'totalcount + 1') Chris@0: ->execute(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function fetchViews($ids) { Chris@0: $views = $this->connection Chris@0: ->select('node_counter', 'nc') Chris@0: ->fields('nc', ['totalcount', 'daycount', 'timestamp']) Chris@0: ->condition('nid', $ids, 'IN') Chris@0: ->execute() Chris@0: ->fetchAll(); Chris@0: foreach ($views as $id => $view) { Chris@0: $views[$id] = new StatisticsViewsResult($view->totalcount, $view->daycount, $view->timestamp); Chris@0: } Chris@0: return $views; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function fetchView($id) { Chris@0: $views = $this->fetchViews([$id]); Chris@0: return reset($views); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function fetchAll($order = 'totalcount', $limit = 5) { Chris@0: assert(in_array($order, ['totalcount', 'daycount', 'timestamp']), "Invalid order argument."); Chris@0: Chris@0: return $this->connection Chris@0: ->select('node_counter', 'nc') Chris@0: ->fields('nc', ['nid']) Chris@0: ->orderBy($order, 'DESC') Chris@0: ->range(0, $limit) Chris@0: ->execute() Chris@0: ->fetchCol(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function deleteViews($id) { Chris@0: return (bool) $this->connection Chris@0: ->delete('node_counter') Chris@0: ->condition('nid', $id) Chris@0: ->execute(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function resetDayCount() { Chris@0: $statistics_timestamp = $this->state->get('statistics.day_timestamp') ?: 0; Chris@0: if (($this->getRequestTime() - $statistics_timestamp) >= 86400) { Chris@0: $this->state->set('statistics.day_timestamp', $this->getRequestTime()); Chris@0: $this->connection->update('node_counter') Chris@0: ->fields(['daycount' => 0]) Chris@0: ->execute(); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function maxTotalCount() { Chris@0: $query = $this->connection->select('node_counter', 'nc'); Chris@0: $query->addExpression('MAX(totalcount)'); Chris@0: $max_total_count = (int) $query->execute()->fetchField(); Chris@0: return $max_total_count; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get current request time. Chris@0: * Chris@0: * @return int Chris@0: * Unix timestamp for current server request time. Chris@0: */ Chris@0: protected function getRequestTime() { Chris@0: return $this->requestStack->getCurrentRequest()->server->get('REQUEST_TIME'); Chris@0: } Chris@0: Chris@0: }