Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\statistics;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Core\Database\Connection;
|
Chris@0
|
6 use Drupal\Core\State\StateInterface;
|
Chris@0
|
7 use Symfony\Component\HttpFoundation\RequestStack;
|
Chris@0
|
8
|
Chris@0
|
9 /**
|
Chris@0
|
10 * Provides the default database storage backend for statistics.
|
Chris@0
|
11 */
|
Chris@0
|
12 class NodeStatisticsDatabaseStorage implements StatisticsStorageInterface {
|
Chris@0
|
13
|
Chris@0
|
14 /**
|
Chris@0
|
15 * The database connection used.
|
Chris@0
|
16 *
|
Chris@0
|
17 * @var \Drupal\Core\Database\Connection
|
Chris@0
|
18 */
|
Chris@0
|
19 protected $connection;
|
Chris@0
|
20
|
Chris@0
|
21 /**
|
Chris@0
|
22 * The state service.
|
Chris@0
|
23 *
|
Chris@0
|
24 * @var \Drupal\Core\State\StateInterface
|
Chris@0
|
25 */
|
Chris@0
|
26 protected $state;
|
Chris@0
|
27
|
Chris@0
|
28 /**
|
Chris@0
|
29 * The request stack.
|
Chris@0
|
30 *
|
Chris@0
|
31 * @var \Symfony\Component\HttpFoundation\RequestStack
|
Chris@0
|
32 */
|
Chris@0
|
33 protected $requestStack;
|
Chris@0
|
34
|
Chris@0
|
35 /**
|
Chris@0
|
36 * Constructs the statistics storage.
|
Chris@0
|
37 *
|
Chris@0
|
38 * @param \Drupal\Core\Database\Connection $connection
|
Chris@0
|
39 * The database connection for the node view storage.
|
Chris@0
|
40 * @param \Drupal\Core\State\StateInterface $state
|
Chris@0
|
41 * The state service.
|
Chris@0
|
42 */
|
Chris@0
|
43 public function __construct(Connection $connection, StateInterface $state, RequestStack $request_stack) {
|
Chris@0
|
44 $this->connection = $connection;
|
Chris@0
|
45 $this->state = $state;
|
Chris@0
|
46 $this->requestStack = $request_stack;
|
Chris@0
|
47 }
|
Chris@0
|
48
|
Chris@0
|
49 /**
|
Chris@0
|
50 * {@inheritdoc}
|
Chris@0
|
51 */
|
Chris@0
|
52 public function recordView($id) {
|
Chris@0
|
53 return (bool) $this->connection
|
Chris@0
|
54 ->merge('node_counter')
|
Chris@0
|
55 ->key('nid', $id)
|
Chris@0
|
56 ->fields([
|
Chris@0
|
57 'daycount' => 1,
|
Chris@0
|
58 'totalcount' => 1,
|
Chris@0
|
59 'timestamp' => $this->getRequestTime(),
|
Chris@0
|
60 ])
|
Chris@0
|
61 ->expression('daycount', 'daycount + 1')
|
Chris@0
|
62 ->expression('totalcount', 'totalcount + 1')
|
Chris@0
|
63 ->execute();
|
Chris@0
|
64 }
|
Chris@0
|
65
|
Chris@0
|
66 /**
|
Chris@0
|
67 * {@inheritdoc}
|
Chris@0
|
68 */
|
Chris@0
|
69 public function fetchViews($ids) {
|
Chris@0
|
70 $views = $this->connection
|
Chris@0
|
71 ->select('node_counter', 'nc')
|
Chris@0
|
72 ->fields('nc', ['totalcount', 'daycount', 'timestamp'])
|
Chris@0
|
73 ->condition('nid', $ids, 'IN')
|
Chris@0
|
74 ->execute()
|
Chris@0
|
75 ->fetchAll();
|
Chris@0
|
76 foreach ($views as $id => $view) {
|
Chris@0
|
77 $views[$id] = new StatisticsViewsResult($view->totalcount, $view->daycount, $view->timestamp);
|
Chris@0
|
78 }
|
Chris@0
|
79 return $views;
|
Chris@0
|
80 }
|
Chris@0
|
81
|
Chris@0
|
82 /**
|
Chris@0
|
83 * {@inheritdoc}
|
Chris@0
|
84 */
|
Chris@0
|
85 public function fetchView($id) {
|
Chris@0
|
86 $views = $this->fetchViews([$id]);
|
Chris@0
|
87 return reset($views);
|
Chris@0
|
88 }
|
Chris@0
|
89
|
Chris@0
|
90 /**
|
Chris@0
|
91 * {@inheritdoc}
|
Chris@0
|
92 */
|
Chris@0
|
93 public function fetchAll($order = 'totalcount', $limit = 5) {
|
Chris@0
|
94 assert(in_array($order, ['totalcount', 'daycount', 'timestamp']), "Invalid order argument.");
|
Chris@0
|
95
|
Chris@0
|
96 return $this->connection
|
Chris@0
|
97 ->select('node_counter', 'nc')
|
Chris@0
|
98 ->fields('nc', ['nid'])
|
Chris@0
|
99 ->orderBy($order, 'DESC')
|
Chris@0
|
100 ->range(0, $limit)
|
Chris@0
|
101 ->execute()
|
Chris@0
|
102 ->fetchCol();
|
Chris@0
|
103 }
|
Chris@0
|
104
|
Chris@0
|
105 /**
|
Chris@0
|
106 * {@inheritdoc}
|
Chris@0
|
107 */
|
Chris@0
|
108 public function deleteViews($id) {
|
Chris@0
|
109 return (bool) $this->connection
|
Chris@0
|
110 ->delete('node_counter')
|
Chris@0
|
111 ->condition('nid', $id)
|
Chris@0
|
112 ->execute();
|
Chris@0
|
113 }
|
Chris@0
|
114
|
Chris@0
|
115 /**
|
Chris@0
|
116 * {@inheritdoc}
|
Chris@0
|
117 */
|
Chris@0
|
118 public function resetDayCount() {
|
Chris@0
|
119 $statistics_timestamp = $this->state->get('statistics.day_timestamp') ?: 0;
|
Chris@0
|
120 if (($this->getRequestTime() - $statistics_timestamp) >= 86400) {
|
Chris@0
|
121 $this->state->set('statistics.day_timestamp', $this->getRequestTime());
|
Chris@0
|
122 $this->connection->update('node_counter')
|
Chris@0
|
123 ->fields(['daycount' => 0])
|
Chris@0
|
124 ->execute();
|
Chris@0
|
125 }
|
Chris@0
|
126 }
|
Chris@0
|
127
|
Chris@0
|
128 /**
|
Chris@0
|
129 * {@inheritdoc}
|
Chris@0
|
130 */
|
Chris@0
|
131 public function maxTotalCount() {
|
Chris@0
|
132 $query = $this->connection->select('node_counter', 'nc');
|
Chris@0
|
133 $query->addExpression('MAX(totalcount)');
|
Chris@0
|
134 $max_total_count = (int) $query->execute()->fetchField();
|
Chris@0
|
135 return $max_total_count;
|
Chris@0
|
136 }
|
Chris@0
|
137
|
Chris@0
|
138 /**
|
Chris@0
|
139 * Get current request time.
|
Chris@0
|
140 *
|
Chris@0
|
141 * @return int
|
Chris@0
|
142 * Unix timestamp for current server request time.
|
Chris@0
|
143 */
|
Chris@0
|
144 protected function getRequestTime() {
|
Chris@0
|
145 return $this->requestStack->getCurrentRequest()->server->get('REQUEST_TIME');
|
Chris@0
|
146 }
|
Chris@0
|
147
|
Chris@0
|
148 }
|