mirror of
https://github.com/Nutomic/ibis.git
synced 2024-12-23 16:51:24 +00:00
135 lines
2.7 KiB
PL/PgSQL
135 lines
2.7 KiB
PL/PgSQL
CREATE TABLE instance_stats (
|
|
id serial PRIMARY KEY,
|
|
users int NOT NULL DEFAULT 0,
|
|
users_active_month int NOT NULL DEFAULT 0,
|
|
users_active_half_year int NOT NULL DEFAULT 0,
|
|
articles int NOT NULL DEFAULT 0
|
|
);
|
|
|
|
INSERT INTO instance_stats (users, articles)
|
|
SELECT
|
|
(SELECT count(*) FROM local_user) AS users,
|
|
(SELECT count(*) FROM article WHERE local = TRUE) AS article
|
|
FROM instance;
|
|
|
|
CREATE FUNCTION instance_stats_local_user_insert ()
|
|
RETURNS TRIGGER
|
|
LANGUAGE plpgsql
|
|
AS $$
|
|
BEGIN
|
|
UPDATE
|
|
instance_stats
|
|
SET
|
|
users = users + 1;
|
|
RETURN NULL;
|
|
END
|
|
$$;
|
|
|
|
CREATE FUNCTION instance_stats_local_user_delete ()
|
|
RETURNS TRIGGER
|
|
LANGUAGE plpgsql
|
|
AS $$
|
|
BEGIN
|
|
UPDATE
|
|
instance_stats sa
|
|
SET
|
|
users = users - 1
|
|
FROM
|
|
instance s
|
|
WHERE
|
|
sa.instance_id = s.id;
|
|
RETURN NULL;
|
|
END
|
|
$$;
|
|
|
|
CREATE TRIGGER instance_stats_local_user_insert
|
|
AFTER INSERT ON local_user
|
|
FOR EACH ROW
|
|
EXECUTE PROCEDURE instance_stats_local_user_insert ();
|
|
|
|
CREATE TRIGGER instance_stats_local_user_delete
|
|
AFTER DELETE ON local_user
|
|
FOR EACH ROW
|
|
EXECUTE PROCEDURE instance_stats_local_user_delete ();
|
|
|
|
CREATE FUNCTION instance_stats_article_insert ()
|
|
RETURNS TRIGGER
|
|
LANGUAGE plpgsql
|
|
AS $$
|
|
BEGIN
|
|
UPDATE
|
|
instance_stats
|
|
SET
|
|
articles = articles + 1;
|
|
RETURN NULL;
|
|
END
|
|
$$;
|
|
|
|
CREATE FUNCTION instance_stats_article_delete ()
|
|
RETURNS TRIGGER
|
|
LANGUAGE plpgsql
|
|
AS $$
|
|
BEGIN
|
|
UPDATE
|
|
instance_stats ia
|
|
SET
|
|
articles = articles - 1
|
|
FROM
|
|
instance i
|
|
WHERE
|
|
ia.instance_id = i.id;
|
|
RETURN NULL;
|
|
END
|
|
$$;
|
|
|
|
CREATE TRIGGER instance_stats_article_insert
|
|
AFTER INSERT ON article
|
|
FOR EACH ROW
|
|
WHEN (NEW.local = TRUE)
|
|
EXECUTE PROCEDURE instance_stats_article_insert ();
|
|
|
|
CREATE TRIGGER instance_stats_article_delete
|
|
AFTER DELETE ON article
|
|
FOR EACH ROW
|
|
WHEN (OLD.local = TRUE)
|
|
EXECUTE PROCEDURE instance_stats_article_delete ();
|
|
|
|
CREATE OR REPLACE FUNCTION instance_stats_activity (i text)
|
|
RETURNS int
|
|
LANGUAGE plpgsql
|
|
AS $$
|
|
DECLARE
|
|
count_ integer;
|
|
BEGIN
|
|
SELECT
|
|
count(*) INTO count_
|
|
FROM (
|
|
SELECT
|
|
e.creator_id
|
|
FROM
|
|
edit e
|
|
INNER JOIN person p ON e.creator_id = p.id
|
|
WHERE
|
|
e.published > ('now'::timestamp - i::interval)
|
|
AND p.local = TRUE);
|
|
RETURN count_;
|
|
END;
|
|
$$;
|
|
|
|
UPDATE
|
|
instance_stats
|
|
SET
|
|
users_active_month = (
|
|
SELECT
|
|
*
|
|
FROM
|
|
instance_stats_activity ('1 month'));
|
|
|
|
UPDATE
|
|
instance_stats
|
|
SET
|
|
users_active_half_year = (
|
|
SELECT
|
|
*
|
|
FROM
|
|
instance_stats_activity ('6 months'));
|