@@ -14,13 +14,25 @@ CREATE TABLE user_count
14
14
DROP TABLE IF EXISTS event_count;
15
15
CREATE TABLE event_count
16
16
(
17
- event_id VARCHAR ,
18
- response VARCHAR ,
19
- event_name VARCHAR ,
17
+ event_id VARCHAR ,
18
+ response VARCHAR ,
19
+ event_name VARCHAR ,
20
20
total_rsvps int ,
21
21
PRIMARY KEY (event_id, response)
22
22
);
23
23
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
+
24
36
CREATE OR REPLACE FUNCTION process_rsvp_events () RETURNS TRIGGER AS
25
37
$materialize_agg$
26
38
begin
34
46
VALUES (((NEW .rsvp - > ' event' ) - >> ' event_id' ), NEW .rsvp - >> ' response' , (NEW .rsvp - > ' event' ) - >> ' event_name' ,
35
47
1 )
36
48
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
+
37
66
RETURN NEW;
38
67
end;
39
68
$materialize_agg$ LANGUAGE plpgsql;
0 commit comments