Skip to content

Commit a0e007c

Browse files
Refactor video effective date and optimize DB indexes (#1361)
* Refactor video effective date and optimize DB indexes * migrations * format
1 parent 6aa4e86 commit a0e007c

File tree

11 files changed

+3892
-84
lines changed

11 files changed

+3892
-84
lines changed

apps/web/actions/spaces/get-user-videos.ts

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,7 @@ export async function getUserVideos(spaceId: Space.SpaceIdOrOrganisationId) {
3838
ownerName: users.name,
3939
folderName: folders.name,
4040
folderColor: folders.color,
41-
effectiveDate: sql<string>`
42-
COALESCE(
43-
JSON_UNQUOTE(JSON_EXTRACT(${videos.metadata}, '$.customCreatedAt')),
44-
${videos.createdAt}
45-
)
46-
`,
41+
effectiveDate: videos.effectiveCreatedAt,
4742
hasActiveUpload: sql`${videoUploads.videoId} IS NOT NULL`.mapWith(
4843
Boolean,
4944
),
@@ -81,12 +76,7 @@ export async function getUserVideos(spaceId: Space.SpaceIdOrOrganisationId) {
8176
folders.spaceId,
8277
videos.folderId,
8378
)
84-
.orderBy(
85-
desc(sql`COALESCE(
86-
JSON_UNQUOTE(JSON_EXTRACT(${videos.metadata}, '$.customCreatedAt')),
87-
${videos.createdAt}
88-
)`),
89-
)
79+
.orderBy(desc(videos.effectiveCreatedAt))
9080
: await db()
9181
.select(selectFields)
9282
.from(videos)
@@ -118,12 +108,7 @@ export async function getUserVideos(spaceId: Space.SpaceIdOrOrganisationId) {
118108
folders.spaceId,
119109
videos.folderId,
120110
)
121-
.orderBy(
122-
desc(sql`COALESCE(
123-
JSON_UNQUOTE(JSON_EXTRACT(${videos.metadata}, '$.customCreatedAt')),
124-
${videos.createdAt}
125-
)`),
126-
);
111+
.orderBy(desc(videos.effectiveCreatedAt));
127112

128113
const processedVideoData = videoData.map((video) => {
129114
const { effectiveDate: _effectiveDate, ...videoWithoutEffectiveDate } =

apps/web/app/(org)/dashboard/caps/page.tsx

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -164,12 +164,7 @@ export default async function CapsPage(props: PageProps<"/dashboard/caps">) {
164164
)
165165
`,
166166
ownerName: users.name,
167-
effectiveDate: sql<string>`
168-
COALESCE(
169-
JSON_UNQUOTE(JSON_EXTRACT(${videos.metadata}, '$.customCreatedAt')),
170-
${videos.createdAt}
171-
)
172-
`,
167+
effectiveDate: videos.effectiveCreatedAt,
173168
hasPassword: sql`${videos.password} IS NOT NULL`.mapWith(Boolean),
174169
hasActiveUpload: sql`${videoUploads.videoId} IS NOT NULL`.mapWith(
175170
Boolean,
@@ -198,12 +193,7 @@ export default async function CapsPage(props: PageProps<"/dashboard/caps">) {
198193
videos.orgId,
199194
users.name,
200195
)
201-
.orderBy(
202-
desc(sql`COALESCE(
203-
JSON_UNQUOTE(JSON_EXTRACT(${videos.metadata}, '$.customCreatedAt')),
204-
${videos.createdAt}
205-
)`),
206-
)
196+
.orderBy(desc(videos.effectiveCreatedAt))
207197
.limit(limit)
208198
.offset(offset);
209199

apps/web/app/(org)/dashboard/spaces/[spaceId]/page.tsx

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ export default async function SharedCapsPage(props: {
192192
totalComments: sql<number>`COUNT(DISTINCT CASE WHEN ${comments.type} = 'text' THEN ${comments.id} END)`,
193193
totalReactions: sql<number>`COUNT(DISTINCT CASE WHEN ${comments.type} = 'emoji' THEN ${comments.id} END)`,
194194
ownerName: users.name,
195-
effectiveDate: sql<string>`COALESCE(JSON_UNQUOTE(JSON_EXTRACT(${videos.metadata}, '$.customCreatedAt')), ${videos.createdAt})`,
195+
effectiveDate: videos.effectiveCreatedAt,
196196
hasActiveUpload: sql`${videoUploads.videoId} IS NOT NULL`.mapWith(
197197
Boolean,
198198
),
@@ -218,11 +218,7 @@ export default async function SharedCapsPage(props: {
218218
videos.metadata,
219219
users.name,
220220
)
221-
.orderBy(
222-
desc(
223-
sql`COALESCE(JSON_UNQUOTE(JSON_EXTRACT(${videos.metadata}, '$.customCreatedAt')), ${videos.createdAt})`,
224-
),
225-
)
221+
.orderBy(desc(videos.effectiveCreatedAt))
226222
.limit(limit)
227223
.offset(offset),
228224
db()
@@ -292,7 +288,7 @@ export default async function SharedCapsPage(props: {
292288
totalComments: sql<number>`COUNT(DISTINCT CASE WHEN ${comments.type} = 'text' THEN ${comments.id} END)`,
293289
totalReactions: sql<number>`COUNT(DISTINCT CASE WHEN ${comments.type} = 'emoji' THEN ${comments.id} END)`,
294290
ownerName: users.name,
295-
effectiveDate: sql<string>`COALESCE(JSON_UNQUOTE(JSON_EXTRACT(${videos.metadata}, '$.customCreatedAt')), ${videos.createdAt})`,
291+
effectiveDate: videos.effectiveCreatedAt,
296292
hasActiveUpload: sql`${videoUploads.videoId} IS NOT NULL`.mapWith(
297293
Boolean,
298294
),
@@ -317,11 +313,7 @@ export default async function SharedCapsPage(props: {
317313
users.name,
318314
videos.duration,
319315
)
320-
.orderBy(
321-
desc(
322-
sql`COALESCE(JSON_UNQUOTE(JSON_EXTRACT(${videos.metadata}, '$.customCreatedAt')), ${videos.createdAt})`,
323-
),
324-
)
316+
.orderBy(desc(videos.effectiveCreatedAt))
325317
.limit(limit)
326318
.offset(offset),
327319
db()

apps/web/lib/folder.ts

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -197,12 +197,7 @@ export const getVideosByFolderId = Effect.fn(function* (
197197
`,
198198

199199
ownerName: users.name,
200-
effectiveDate: sql<string>`
201-
COALESCE(
202-
JSON_UNQUOTE(JSON_EXTRACT(${videos.metadata}, '$.customCreatedAt')),
203-
${videos.createdAt}
204-
)
205-
`,
200+
effectiveDate: videos.effectiveCreatedAt,
206201
hasPassword: sql`${videos.password} IS NOT NULL`.mapWith(Boolean),
207202
hasActiveUpload: sql`${videoUploads.videoId} IS NOT NULL`.mapWith(
208203
Boolean,
@@ -240,12 +235,7 @@ export const getVideosByFolderId = Effect.fn(function* (
240235
videos.metadata,
241236
users.name,
242237
)
243-
.orderBy(
244-
desc(sql`COALESCE(
245-
JSON_UNQUOTE(JSON_EXTRACT(${videos.metadata}, '$.customCreatedAt')),
246-
${videos.createdAt}
247-
)`),
248-
),
238+
.orderBy(desc(videos.effectiveCreatedAt)),
249239
);
250240

251241
// Fetch shared spaces data for all videos
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
ALTER TABLE `accounts` DROP INDEX `accounts_id_unique`;--> statement-breakpoint
2+
ALTER TABLE `folders` DROP INDEX `folders_id_unique`;--> statement-breakpoint
3+
ALTER TABLE `organization_invites` DROP INDEX `organization_invites_id_unique`;--> statement-breakpoint
4+
ALTER TABLE `organization_members` DROP INDEX `organization_members_id_unique`;--> statement-breakpoint
5+
ALTER TABLE `organizations` DROP INDEX `organizations_id_unique`;--> statement-breakpoint
6+
ALTER TABLE `sessions` DROP INDEX `sessions_id_unique`;--> statement-breakpoint
7+
ALTER TABLE `sessions` DROP INDEX `sessions_sessionToken_unique`;--> statement-breakpoint
8+
ALTER TABLE `users` DROP INDEX `users_id_unique`;--> statement-breakpoint
9+
ALTER TABLE `users` DROP INDEX `users_email_unique`;--> statement-breakpoint
10+
ALTER TABLE `videos` DROP INDEX `videos_id_unique`;--> statement-breakpoint
11+
DROP INDEX `user_id_idx` ON `organization_members`;--> statement-breakpoint
12+
DROP INDEX `owner_id_idx` ON `organizations`;--> statement-breakpoint
13+
DROP INDEX `id_idx` ON `videos`;--> statement-breakpoint
14+
ALTER TABLE `videos` ADD `effectiveCreatedAt` datetime GENERATED ALWAYS AS (COALESCE(
15+
STR_TO_DATE(JSON_UNQUOTE(JSON_EXTRACT(`metadata`, '$.customCreatedAt')), '%Y-%m-%dT%H:%i:%s.%fZ'),
16+
STR_TO_DATE(JSON_UNQUOTE(JSON_EXTRACT(`metadata`, '$.customCreatedAt')), '%Y-%m-%dT%H:%i:%sZ'),
17+
`createdAt`
18+
)) STORED;--> statement-breakpoint
19+
CREATE INDEX `owner_id_tombstone_idx` ON `organizations` (`ownerId`,`tombstoneAt`);--> statement-breakpoint
20+
CREATE INDEX `org_owner_folder_idx` ON `videos` (`orgId`,`ownerId`,`folderId`);--> statement-breakpoint
21+
CREATE INDEX `org_effective_created_idx` ON `videos` (`orgId`,`effectiveCreatedAt`);
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
ALTER TABLE `auth_api_keys` DROP INDEX `auth_api_keys_id_unique`;--> statement-breakpoint
2+
ALTER TABLE `comments` DROP INDEX `comments_id_unique`;--> statement-breakpoint
3+
ALTER TABLE `notifications` DROP INDEX `notifications_id_unique`;--> statement-breakpoint
4+
ALTER TABLE `s3_buckets` DROP INDEX `s3_buckets_id_unique`;--> statement-breakpoint
5+
ALTER TABLE `shared_videos` DROP INDEX `shared_videos_id_unique`;--> statement-breakpoint
6+
ALTER TABLE `space_members` DROP INDEX `space_members_id_unique`;--> statement-breakpoint
7+
ALTER TABLE `space_videos` DROP INDEX `space_videos_id_unique`;--> statement-breakpoint
8+
ALTER TABLE `spaces` DROP INDEX `spaces_id_unique`;--> statement-breakpoint
9+
DROP INDEX `video_id_idx` ON `comments`;--> statement-breakpoint
10+
DROP INDEX `recipient_id_idx` ON `notifications`;--> statement-breakpoint
11+
DROP INDEX `video_id_idx` ON `shared_videos`;--> statement-breakpoint
12+
DROP INDEX `space_id_idx` ON `space_members`;--> statement-breakpoint
13+
DROP INDEX `space_id_user_id_idx` ON `space_members`;--> statement-breakpoint
14+
DROP INDEX `space_id_idx` ON `space_videos`;--> statement-breakpoint
15+
CREATE INDEX `video_type_created_idx` ON `comments` (`videoId`,`type`,`createdAt`,`id`);--> statement-breakpoint
16+
CREATE INDEX `space_id_folder_id_idx` ON `space_videos` (`spaceId`,`folderId`);
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
ALTER TABLE `shared_videos`
2+
DROP INDEX `shared_videos_id_unique`,
3+
DROP INDEX `video_id_idx`;
4+
5+
ALTER TABLE `comments`
6+
DROP INDEX `comments_id_unique`,
7+
DROP INDEX `video_id_idx`,
8+
ADD INDEX `video_type_created_idx` (`videoId`, `type`, `createdAt`, `id`);
9+
10+
ALTER TABLE `notifications`
11+
DROP INDEX `notifications_id_unique`,
12+
DROP INDEX `recipient_id_idx`;
13+
14+
ALTER TABLE `s3_buckets`
15+
DROP INDEX `s3_buckets_id_unique`;
16+
17+
ALTER TABLE `auth_api_keys`
18+
DROP INDEX `auth_api_keys_id_unique`;
19+
20+
ALTER TABLE `spaces`
21+
DROP INDEX `spaces_id_unique`;
22+
23+
ALTER TABLE `space_members`
24+
DROP INDEX `space_members_id_unique`,
25+
DROP INDEX `space_id_idx`,
26+
DROP INDEX `space_id_user_id_idx`;
27+
28+
ALTER TABLE `space_videos`
29+
DROP INDEX `space_videos_id_unique`,
30+
DROP INDEX `space_id_idx`,
31+
ADD INDEX `space_id_folder_id_idx` (`spaceId`, `folderId`);

0 commit comments

Comments
 (0)