/* Create the file RSS table. */
CREATE VIEW file_rss AS
SELECT ts,
       LEAD(ts, 1, ts) OVER(PARTITION BY ref ORDER BY ts) - ts as dur,
       ref AS upid,
       value AS file
FROM counters
WHERE ref_type = 'upid' AND counters.name IN ("mem.rss.file", "rss_stat.mm_filepages");

/* Create the anon RSS table. */
create view anon_rss as
select ts,
       lead(ts, 1, ts) over(PARTITION by ref order by ts) - ts as dur,
       ref as upid,
       value as anon
from counters
where ref_type = 'upid' and counters.name in ("mem.rss.anon", "rss_stat.mm_anonpages");

/* Create the oom adj table. */
create view oom_adj as
select ts,
       dur,
       ref as upid,
       value as oom_score_adj
from counters
where ref_type = 'upid' and counters.name = 'oom_score_adj';

/* Harmonise the three tables above into a single table. */
CREATE VIRTUAL TABLE anon_file USING span_join(anon_rss PARTITIONED upid, file_rss PARTITIONED upid);

CREATE VIRTUAL TABLE anon_file_oom USING span_join(anon_file PARTITIONED upid, oom_adj PARTITIONED upid);

/* For each span, compute the RSS (for a given upid) for each category of oom_adj */
CREATE VIEW rss_spans_for_oom_upid AS
SELECT ts,
       dur,
       upid,
       CASE WHEN oom_score_adj < 0 THEN file + anon ELSE 0 END as rss_oom_lt_zero,
       CASE WHEN oom_score_adj <= 0 THEN file + anon ELSE 0 END as rss_oom_eq_zero,
       CASE WHEN oom_score_adj < 20 THEN file + anon ELSE 0 END as rss_fg,
       CASE WHEN oom_score_adj < 700 THEN file + anon ELSE 0 END as rss_bg,
       CASE WHEN oom_score_adj < 900 THEN file + anon ELSE 0 END as rss_low_bg,
       file + anon as rss_cached
FROM anon_file_oom;

/* Convert the raw RSS values to the change in RSS (for a given upid) over time */
CREATE VIEW rss_spans_rss_change AS
SELECT ts,
       dur,
       upid,
       rss_oom_lt_zero - lag(rss_oom_lt_zero, 1, 0) OVER win as rss_oom_lt_zero_diff,
       rss_oom_eq_zero - lag(rss_oom_eq_zero, 1, 0) OVER win as rss_oom_eq_zero_diff,
       rss_fg - lag(rss_fg, 1, 0) OVER win as rss_fg_diff,
       rss_bg - lag(rss_bg, 1, 0) OVER win as rss_bg_diff,
       rss_low_bg - lag(rss_low_bg, 1, 0) OVER win as rss_low_bg_diff,
       rss_cached - lag(rss_cached, 1, 0) OVER win as rss_cached_diff
FROM rss_spans_for_oom_upid
WINDOW win AS (PARTITION BY upid ORDER BY ts);

/*
 * Compute a rolling sum of anon + file for each category of process state.
 * (note: we no longer consider upid in the windows which means we are now
 * computing a rolling sum for all the processes).
 */
CREATE VIEW output AS
SELECT ts,
       lead(ts, 1, ts) over win - ts as dur,
       SUM(rss_oom_lt_zero_diff) OVER win as rss_oom_lt_zero,
       SUM(rss_oom_eq_zero_diff) OVER win as rss_oom_eq_zero,
       SUM(rss_fg_diff) OVER win as rss_fg,
       SUM(rss_bg_diff) OVER win as rss_bg,
       SUM(rss_low_bg_diff) OVER win as rss_low_bg,
       SUM(rss_cached_diff) OVER win as rss_cached
FROM rss_spans_rss_change
WINDOW win as (ORDER BY ts)
ORDER BY ts;

/*
 * Print out the final result (note: dur = 0 is excluded to account for times
 * where multiple processes report a new memory value at the same timestamp)
 */
SELECT *
FROM output
WHERE dur > 0
