diff --git a/packages/backend/server/migrations/20231024095005_updates_pkey/migration.sql b/packages/backend/server/migrations/20231024095005_updates_pkey/migration.sql new file mode 100644 index 0000000000..79958f1b78 --- /dev/null +++ b/packages/backend/server/migrations/20231024095005_updates_pkey/migration.sql @@ -0,0 +1,14 @@ +/* + Warnings: + + - The primary key for the `updates` table will be changed. If it partially fails, the table could be left without primary key constraint. + - You are about to drop the column `object_id` on the `updates` table. All the data in the column will be lost. + +*/ +-- DropIndex +DROP INDEX "updates_workspace_id_guid_seq_key"; + +-- AlterTable +ALTER TABLE "updates" DROP CONSTRAINT "updates_pkey", +DROP COLUMN "object_id", +ADD CONSTRAINT "updates_pkey" PRIMARY KEY ("workspace_id", "guid", "seq"); diff --git a/packages/backend/server/schema.prisma b/packages/backend/server/schema.prisma index 70c6edf834..5189bbab25 100644 --- a/packages/backend/server/schema.prisma +++ b/packages/backend/server/schema.prisma @@ -143,16 +143,14 @@ model Snapshot { @@map("snapshots") } -// backup during other update operation queue downtime model Update { - objectId String @id @default(uuid()) @map("object_id") @db.VarChar workspaceId String @map("workspace_id") @db.VarChar id String @map("guid") @db.VarChar seq Int @db.Integer blob Bytes @db.ByteA createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6) - @@unique([workspaceId, id, seq]) + @@id([workspaceId, id, seq]) @@map("updates") } diff --git a/packages/backend/server/src/modules/doc/manager.ts b/packages/backend/server/src/modules/doc/manager.ts index 0dec55d1da..9f9ca2e87a 100644 --- a/packages/backend/server/src/modules/doc/manager.ts +++ b/packages/backend/server/src/modules/doc/manager.ts @@ -264,15 +264,15 @@ export class DocManager * get pending updates */ async getUpdates(workspaceId: string, guid: string) { - return this.db.update.findMany({ + const updates = await this.db.update.findMany({ where: { workspaceId, id: guid, }, - orderBy: { - seq: 'asc', - }, }); + + // perf(memory): avoid sorting in db + return updates.sort((a, b) => (a.createdAt < b.createdAt ? -1 : 1)); } /**