feat: transition to time-block based access count storage, including referrer storage

This commit is contained in:
David Bailey 2023-12-23 10:49:54 +01:00
parent 35ff4951ad
commit a4fe4c4489
2 changed files with 31 additions and 30 deletions

View file

@ -12,6 +12,8 @@ CREATE TABLE posts (
post_create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, post_create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
post_update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, post_update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
post_access_count INTEGER DEFAULT 0,
post_metadata JSON NOT NULL, post_metadata JSON NOT NULL,
post_settings_cache JSON DEFAULT NULL, post_settings_cache JSON DEFAULT NULL,
@ -20,24 +22,22 @@ CREATE TABLE posts (
PRIMARY KEY(post_id), PRIMARY KEY(post_id),
CONSTRAINT unique_post_path UNIQUE (post_path), CONSTRAINT unique_post_path UNIQUE (post_path),
INDEX(post_path, post_update_time), INDEX(post_path),
INDEX(post_path, post_create_time), INDEX(post_path_depth, post_path),
INDEX(post_path_depth, post_path) INDEX(post_create_time),
INDEX(post_update_time)
); );
CREATE TABLE path_access_counts ( CREATE TABLE path_access_counts (
access_time DATETIME NOT NULL,
post_path VARCHAR(255), post_path VARCHAR(255),
agent VARCHAR(255), agent VARCHAR(255),
referrer VARCHAR(255),
path_last_access_time DATETIME NOT NULL
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,
path_access_count INTEGER DEFAULT 0, path_access_count INTEGER DEFAULT 0,
path_processing_time DOUBLE PRECISION DEFAULT 0, path_processing_time DOUBLE PRECISION DEFAULT 0,
PRIMARY KEY(post_path, agent), PRIMARY KEY(access_time, post_path, agent, referrer)
INDEX(path_last_access_time)
); );
INSERT INTO posts (post_path, post_path_depth, post_metadata, post_content) INSERT INTO posts (post_path, post_path_depth, post_metadata, post_content)

View file

@ -105,19 +105,27 @@ class MySQLAdapter {
} }
} }
function log_post_access($post_path, $agent, $time) { function log_post_access($post_path, $agent, $referrer, $time) {
$qry = " $post_path = $this->_sanitize_path($post_path);
INSERT INTO path_access_counts
(post_path, agent, $qry = "INSERT INTO path_access_counts
(access_time,
post_path, agent, referrer,
path_access_count, path_access_count,
path_processing_time) path_processing_time)
VALUES ( ?, ?, 1, ? ) AS new VALUES ( from_unixtime(floor(unix_timestamp(CURRENT_TIMESTAMP) / 300)*300),
?, ?, ?, 1, ?
) AS new
ON DUPLICATE KEY ON DUPLICATE KEY
UPDATE path_access_count=path_access_counts.path_access_count+1, UPDATE path_access_count=path_access_counts.path_access_count+1,
path_processing_time=path_access_counts.path_processing_time+new.path_processing_time; path_processing_time=path_access_counts.path_processing_time+new.path_processing_time;
"; ";
$this->_exec($qry, "ssd", $post_path, $agent, $time); $this->_exec($qry, "sssd", $post_path, $agent, $referrer, $time);
if(preg_match('/^user/', $agent)) {
$this->_exec("UPDATE posts SET post_access_count=post_access_count+1 WHERE post_path=?", "s", $post_path);
}
} }
function get_post_access_counters() { function get_post_access_counters() {
@ -229,28 +237,21 @@ class MySQLAdapter {
function get_post_by_path($post_path, function get_post_by_path($post_path,
$with_subposts = false, $with_settings = true) { $with_subposts = false, $with_settings = true) {
$qry = " $qry = "SELECT *
WITH selected_post AS ( FROM posts WHERE post_path = ?
SELECT * ";
FROM posts WHERE post_path = ?
), post_count_data AS (
SELECT pac.post_path AS post_path, sum(path_access_count) AS post_access_counter
FROM path_access_counts AS pac
INNER JOIN selected_post ON pac.post_path = selected_post.post_path
WHERE agent LIKE 'user%'
GROUP BY pac.post_path
)
SELECT *
FROM selected_post
LEFT JOIN post_count_data ON post_count_data.post_path = selected_post.post_path";
$post_path = $this->_sanitize_path($post_path); $post_path = $this->_sanitize_path($post_path);
$post_data = $this->_exec($qry, "s", $post_path)->fetch_assoc(); $post_data = $this->_exec($qry, "s", $post_path)->fetch_assoc();
$post_data = $this->_normalize_post_data($post_data); if(!isset($post_data)) {
$post_data = ['found' => false];
}
$post_data['post_path'] = $post_path; $post_data['post_path'] = $post_path;
$post_data = $this->_normalize_post_data($post_data);
if(!$post_data['found']) { if(!$post_data['found']) {
return $post_data; return $post_data;
} }