blob: 4858a71b60a1941d008282b57c7fd16bc26bc507 [file] [log] [blame]
CREATE TABLE json_state
(
key TEXT PRIMARY KEY,
timestamp TIMESTAMPTZ,
data JSONB NOT NULL
);
--
-- Table that store the raw issues data fetched from Github
--
CREATE TABLE github_issue_data
(
owner TEXT NOT NULL,
repo TEXT NOT NULL,
issue_number INTEGER NOT NULL,
timestamp TIMESTAMPTZ NOT NULL,
etag TEXT NOT NULL,
data JSONB NOT NULL,
PRIMARY KEY (owner, repo, issue_number)
);
CREATE OR REPLACE FUNCTION tf_regenerate_github_issue()
RETURNS TRIGGER
LANGUAGE plpgsql
AS
$$
BEGIN
IF NEW IS NULL THEN
DELETE FROM github_issue WHERE owner = OLD.owner AND repo = OLD.repo AND issue_number = OLD.issue_number;
ELSE
CALL regenerate_github_issue(NEW.owner, NEW.repo, NEW.issue_number);
END IF;
RETURN NEW;
END;
$$;
CREATE TRIGGER t_regenerate_github_issue
AFTER INSERT OR UPDATE OR DELETE
ON github_issue_data
FOR EACH ROW
EXECUTE PROCEDURE tf_regenerate_github_issue();
--
-- Table that stored issues generated from github_issue_data automatically by trigger
--
CREATE TABLE github_issue
(
owner TEXT NOT NULL,
repo TEXT NOT NULL,
issue_number INTEGER NOT NULL,
timestamp TIMESTAMPTZ NOT NULL,
state TEXT NOT NULL,
is_pull_request BOOL NOT NULL,
title TEXT NOT NULL,
body TEXT NOT NULL,
labels TEXT[] NOT NULL,
created_at TIMESTAMPTZ NOT NULL,
updated_at TIMESTAMPTZ,
closed_at TIMESTAMPTZ,
PRIMARY KEY (owner, repo, issue_number)
);
CREATE UNIQUE INDEX ON github_issue (owner, repo, issue_number);
CREATE INDEX ON github_issue (state);
CREATE INDEX ON github_issue USING GIN (labels);
CREATE INDEX ON github_issue (is_pull_request);
CREATE INDEX ON github_issue (created_at);
CREATE INDEX ON github_issue (updated_at);
CREATE INDEX ON github_issue (closed_at);
CREATE OR REPLACE PROCEDURE regenerate_github_issue(target_owner TEXT, target_repo TEXT, target_issue_number INTEGER)
LANGUAGE plpgsql
AS
$$
BEGIN
INSERT INTO github_issue(owner,
repo,
issue_number,
timestamp,
state,
is_pull_request,
title,
body,
labels,
created_at,
updated_at,
closed_at)
WITH github_issue_label AS (
SELECT owner, repo, issue_number, jsonb_array_elements(data -> 'labels') ->> 'name' AS label
FROM github_issue_data
),
github_issue_labels AS (
SELECT owner, repo, issue_number, array_agg(label) AS labels
FROM github_issue_label
GROUP BY owner, repo, issue_number
)
SELECT i.owner,
i.repo,
i.issue_number,
i.timestamp,
i.data ->> 'state',
i.data -> 'pull_request' IS NOT NULL,
COALESCE(i.data ->> 'title', ''),
COALESCE(i.data ->> 'body', ''),
COALESCE(il.labels, '{}'),
(data ->> 'created_at')::TIMESTAMPTZ,
(data ->> 'updated_at')::TIMESTAMPTZ,
(data ->> 'closed_at')::TIMESTAMPTZ
FROM github_issue_data i
LEFT JOIN github_issue_labels il
ON i.owner = il.owner AND i.repo = il.repo AND i.issue_number = il.issue_number
WHERE i.owner = target_owner
AND i.repo = target_repo
AND i.issue_number = target_issue_number
ON CONFLICT (owner, repo, issue_number) DO UPDATE
SET timestamp = excluded.timestamp,
state = excluded.state,
is_pull_request = excluded.is_pull_request,
title = excluded.title,
body = excluded.body,
labels = excluded.labels,
created_at = excluded.created_at,
updated_at = excluded.updated_at,
closed_at = excluded.closed_at;
END;
$$;
CREATE VIEW github_issue_label AS
SELECT owner, repo, issue_number, unnest(labels) AS label
FROM github_issue;
CREATE VIEW github_label AS
WITH github_label AS (
SELECT owner, repo, unnest(labels) AS name
FROM github_issue
)
SELECT owner, repo, name
FROM github_label
GROUP BY owner, repo, name;
CREATE TABLE github_team
(
owner TEXT,
repo TEXT,
label TEXT,
created_at TIMESTAMPTZ,
updated_at TIMESTAMPTZ,
name TEXT,
team_owner TEXT,
PRIMARY KEY (owner, repo, label)
);
CREATE TABLE github_issue_query
(
owner TEXT,
repo TEXT,
id TEXT,
created_at TIMESTAMPTZ NOT NULL,
updated_at TIMESTAMPTZ NOT NULL,
name TEXT,
query TEXT NOT NULL,
PRIMARY KEY (owner, repo, id)
);
CREATE TABLE github_issue_query_count_task
(
owner TEXT,
repo TEXT,
query_id TEXT,
period TEXT,
created_at TIMESTAMPTZ NOT NULL,
PRIMARY KEY (owner, repo, query_id, period)
);
CREATE TABLE github_issue_query_count_task_result
(
owner TEXT,
repo TEXT,
query_id TEXT,
period TEXT,
timestamp TIMESTAMPTZ,
count int,
PRIMARY KEY (owner, repo, query_id, period, timestamp)
);
CREATE TABLE github_team_table
(
owner TEXT,
repo TEXT,
id TEXT,
created_at TIMESTAMPTZ NOT NULL,
updated_at TIMESTAMPTZ NOT NULL,
name TEXT NOT NULL,
none_team_owner TEXT NOT NULL DEFAULT '',
PRIMARY KEY (owner, repo, id)
);
CREATE TABLE github_team_table_header
(
owner TEXT,
repo TEXT,
table_id TEXT,
id TEXT,
created_at TIMESTAMPTZ NOT NULL,
updated_at TIMESTAMPTZ NOT NULL,
seq INT NOT NULL,
name TEXT NOT NULL,
query TEXT NOT NULL,
PRIMARY KEY (owner, repo, table_id, id)
);
CREATE UNIQUE INDEX ON github_team_table_header (owner, repo, table_id, id, seq);
CREATE TABLE github_repo
(
owner TEXT,
repo TEXT,
created_at TIMESTAMPTZ NOT NULL,
updated_at TIMESTAMPTZ NOT NULL,
PRIMARY KEY (owner, repo)
);
CREATE TABLE github_issue_status
(
owner TEXT,
repo TEXT,
issue_number INTEGER NOT NULL,
status TEXT,
action_owner TEXT,
updated_at TIMESTAMPTZ NOT NULL,
expected_respond_at TIMESTAMPTZ,
last_notified_at TIMESTAMPTZ,
next_notify_at TIMESTAMPTZ,
checked_at TIMESTAMPTZ NOT NULL,
PRIMARY KEY (owner, repo, issue_number)
);
CREATE INDEX ON github_issue_status (status);
CREATE INDEX ON github_issue_status (action_owner);
CREATE INDEX ON github_issue_status (expected_respond_at);
CREATE INDEX ON github_issue_status (next_notify_at);
CREATE TABLE github_user
(
username TEXT,
email TEXT NOT NULL,
PRIMARY KEY (username)
);