1
1
-- Create the denormalized table
2
2
CREATE TABLE "BookingTimeStatusDenormalized " (
3
- id INTEGER ,
4
- uid TEXT ,
3
+ id INTEGER NOT NULL PRIMARY KEY ,
4
+ uid TEXT NOT NULL ,
5
5
" eventTypeId" INTEGER ,
6
6
title TEXT ,
7
7
description TEXT ,
8
- " startTime" TIMESTAMP (3 ),
9
- " endTime" TIMESTAMP (3 ),
10
- " createdAt" TIMESTAMP (3 ),
8
+ " startTime" TIMESTAMP (3 ) NOT NULL ,
9
+ " endTime" TIMESTAMP (3 ) NOT NULL ,
10
+ " createdAt" TIMESTAMP (3 ) NOT NULL ,
11
11
location TEXT ,
12
12
paid BOOLEAN ,
13
- status TEXT ,
13
+ status TEXT NOT NULL ,
14
14
rescheduled BOOLEAN ,
15
15
" userId" INTEGER ,
16
16
" teamId" INTEGER ,
@@ -26,14 +26,15 @@ CREATE TABLE "BookingTimeStatusDenormalized" (
26
26
);
27
27
28
28
-- Create indexes to match likely query patterns
29
- CREATE INDEX "idx_booking_id " ON " BookingTimeStatusDenormalized" (id);
30
29
CREATE INDEX "idx_booking_user_id " ON " BookingTimeStatusDenormalized" (" userId" );
31
30
CREATE INDEX "idx_booking_created_at " ON " BookingTimeStatusDenormalized" (" createdAt" );
31
+ CREATE INDEX "idx_event_type_id " ON " BookingTimeStatusDenormalized" (" eventTypeId" );
32
32
CREATE INDEX "idx_event_type_hierarchy " ON " BookingTimeStatusDenormalized" (" eventTypeId" , " eventParentId" );
33
- CREATE INDEX "idx_time_status " ON " BookingTimeStatusDenormalized" (" timeStatus" );
34
- CREATE INDEX "idx_team_id " ON " BookingTimeStatusDenormalized" (" teamId" );
35
- CREATE INDEX "idx_start_time " ON " BookingTimeStatusDenormalized" (" startTime" );
36
- CREATE INDEX "idx_end_time " ON " BookingTimeStatusDenormalized" (" endTime" );
33
+ CREATE INDEX "idx_booking_time_status " ON " BookingTimeStatusDenormalized" (" timeStatus" );
34
+ CREATE INDEX "idx_booking_team_id " ON " BookingTimeStatusDenormalized" (" teamId" );
35
+ CREATE INDEX "idx_booking_start_time " ON " BookingTimeStatusDenormalized" (" startTime" );
36
+ CREATE INDEX "idx_booking_end_time " ON " BookingTimeStatusDenormalized" (" endTime" );
37
+ CREATE INDEX "idx_booking_status " ON " BookingTimeStatusDenormalized" (" status" );
37
38
38
39
-- Function to calculate timeStatus
39
40
CREATE OR REPLACE FUNCTION calculate_time_status (
@@ -104,7 +105,11 @@ $$ LANGUAGE plpgsql;
104
105
CREATE OR REPLACE FUNCTION trigger_refresh_booking_time_status_denormalized ()
105
106
RETURNS TRIGGER AS $$
106
107
BEGIN
107
- PERFORM refresh_booking_time_status_denormalized(NEW .id );
108
+ BEGIN
109
+ PERFORM refresh_booking_time_status_denormalized(NEW .id );
110
+ EXCEPTION WHEN OTHERS THEN
111
+ RAISE WARNING ' DENORM_ERROR: BookingTimeStatusDenormalized - Failed to handle booking change for id %, error: %' , NEW .id , SQLERRM;
112
+ END;
108
113
RETURN NEW;
109
114
END;
110
115
$$ LANGUAGE plpgsql;
@@ -113,7 +118,11 @@ $$ LANGUAGE plpgsql;
113
118
CREATE OR REPLACE FUNCTION trigger_delete_booking_time_status_denormalized ()
114
119
RETURNS TRIGGER AS $$
115
120
BEGIN
116
- DELETE FROM " BookingTimeStatusDenormalized" WHERE id = OLD .id ;
121
+ BEGIN
122
+ DELETE FROM " BookingTimeStatusDenormalized" WHERE id = OLD .id ;
123
+ EXCEPTION WHEN OTHERS THEN
124
+ RAISE WARNING ' DENORM_ERROR: BookingTimeStatusDenormalized - Failed to delete denormalized booking id %, error: %' , OLD .id , SQLERRM;
125
+ END;
117
126
RETURN OLD;
118
127
END;
119
128
$$ LANGUAGE plpgsql;
@@ -133,14 +142,17 @@ CREATE TRIGGER booking_delete_trigger
133
142
CREATE OR REPLACE FUNCTION trigger_refresh_booking_time_status_denormalized_event_type ()
134
143
RETURNS TRIGGER AS $$
135
144
BEGIN
136
- -- Refresh all bookings associated with this event type
137
- UPDATE " BookingTimeStatusDenormalized" btsd
138
- SET
139
- " teamId" = NEW." teamId" ,
140
- " eventLength" = NEW .length ,
141
- " eventParentId" = NEW." parentId" ,
142
- " isTeamBooking" = calculate_is_team_booking(NEW." teamId" )
143
- WHERE btsd." eventTypeId" = NEW .id ;
145
+ BEGIN
146
+ UPDATE " BookingTimeStatusDenormalized" btsd
147
+ SET
148
+ " teamId" = NEW." teamId" ,
149
+ " eventLength" = NEW .length ,
150
+ " eventParentId" = NEW." parentId" ,
151
+ " isTeamBooking" = calculate_is_team_booking(NEW." teamId" )
152
+ WHERE btsd." eventTypeId" = NEW .id ;
153
+ EXCEPTION WHEN OTHERS THEN
154
+ RAISE WARNING ' DENORM_ERROR: BookingTimeStatusDenormalized - Failed to update EventType changes for id %, error: %' , NEW .id , SQLERRM;
155
+ END;
144
156
RETURN NEW;
145
157
END;
146
158
$$ LANGUAGE plpgsql;
@@ -149,12 +161,15 @@ $$ LANGUAGE plpgsql;
149
161
CREATE OR REPLACE FUNCTION trigger_refresh_booking_time_status_denormalized_user ()
150
162
RETURNS TRIGGER AS $$
151
163
BEGIN
152
- -- Refresh all bookings associated with this user
153
- UPDATE " BookingTimeStatusDenormalized" btsd
154
- SET
155
- " userEmail" = NEW .email ,
156
- " username" = NEW .username
157
- WHERE btsd." userId" = NEW .id ;
164
+ BEGIN
165
+ UPDATE " BookingTimeStatusDenormalized" btsd
166
+ SET
167
+ " userEmail" = NEW .email ,
168
+ " username" = NEW .username
169
+ WHERE btsd." userId" = NEW .id ;
170
+ EXCEPTION WHEN OTHERS THEN
171
+ RAISE WARNING ' DENORM_ERROR: BookingTimeStatusDenormalized - Failed to update user changes for id %, error: %' , NEW .id , SQLERRM;
172
+ END;
158
173
RETURN NEW;
159
174
END;
160
175
$$ LANGUAGE plpgsql;
0 commit comments