Skip to content

Commit 48388bb

Browse files
committed
Number of responses per minute for an event
1 parent 82a4999 commit 48388bb

File tree

1 file changed

+32
-3
lines changed

1 file changed

+32
-3
lines changed

datagen/intidb.sql

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,25 @@ CREATE TABLE user_count
1414
DROP TABLE IF EXISTS event_count;
1515
CREATE TABLE event_count
1616
(
17-
event_id VARCHAR,
18-
response VARCHAR,
19-
event_name VARCHAR,
17+
event_id VARCHAR,
18+
response VARCHAR,
19+
event_name VARCHAR,
2020
total_rsvps int,
2121
PRIMARY KEY (event_id, response)
2222
);
2323

24+
DROP TABLE IF EXISTS event_time_count;
25+
CREATE TABLE event_time_count
26+
(
27+
event_id VARCHAR,
28+
start_time TIMESTAMP,
29+
end_time TIMESTAMP,
30+
total_rsvps INT,
31+
PRIMARY KEY (event_id, start_time)
32+
);
33+
CREATE INDEX idx_event_time_count_inverse
34+
ON event_time_count (event_id, start_time, end_time DESC);
35+
2436
CREATE OR REPLACE FUNCTION process_rsvp_events() RETURNS TRIGGER AS
2537
$materialize_agg$
2638
begin
@@ -34,6 +46,23 @@ begin
3446
VALUES (((NEW.rsvp -> 'event') ->> 'event_id'), NEW.rsvp ->> 'response', (NEW.rsvp -> 'event') ->> 'event_name',
3547
1)
3648
ON CONFLICT (event_id, response) DO UPDATE SET total_rsvps = event_count.total_rsvps + 1;
49+
50+
if EXISTS(SELECT 1
51+
FROM event_time_count et
52+
WHERE et.event_id = (NEW.rsvp -> 'event') ->> 'event_id'
53+
AND et.start_time >= to_timestamp(((New.rsvp) ->> 'mtime')::bigint / 1000)
54+
AND to_timestamp(((New.rsvp) ->> 'mtime')::bigint / 1000) < et.end_time) then
55+
UPDATE event_time_count et
56+
SET total_rsvps = total_rsvps + 1
57+
WHERE et.event_id = (NEW.rsvp -> 'event') ->> 'event_id'
58+
AND et.start_time >= to_timestamp(((New.rsvp) ->> 'mtime')::bigint / 1000)
59+
AND to_timestamp(((New.rsvp) ->> 'mtime')::bigint / 1000) < et.end_time;
60+
else
61+
INSERT INTO event_time_count
62+
VALUES ((NEW.rsvp -> 'event') ->> 'event_id', to_timestamp(((New.rsvp) ->> 'mtime')::bigint / 1000),
63+
to_timestamp(((New.rsvp) ->> 'mtime')::bigint / 1000) + interval '1 minute', 1);
64+
end if;
65+
3766
RETURN NEW;
3867
end;
3968
$materialize_agg$ LANGUAGE plpgsql;

0 commit comments

Comments
 (0)