Skip to content

Commit 51d1b95

Browse files
committed
updates
1 parent 3d81c1c commit 51d1b95

File tree

7 files changed

+10170
-93
lines changed

7 files changed

+10170
-93
lines changed

apps/sim/lib/table/service.ts

Lines changed: 10 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,6 @@ import {
3939

4040
const logger = createLogger('TableService')
4141

42-
async function getTableRowCount(tableId: string): Promise<number> {
43-
const [result] = await db
44-
.select({ count: count() })
45-
.from(userTableRows)
46-
.where(eq(userTableRows.tableId, tableId))
47-
48-
return Number(result?.count ?? 0)
49-
}
50-
5142
/**
5243
* Gets a table by ID with full details.
5344
*
@@ -64,15 +55,15 @@ export async function getTableById(tableId: string): Promise<TableDefinition | n
6455
if (results.length === 0) return null
6556

6657
const table = results[0]
67-
const rowCount = await getTableRowCount(tableId)
6858
return {
6959
id: table.id,
7060
name: table.name,
7161
description: table.description,
7262
schema: table.schema as TableSchema,
73-
rowCount,
63+
rowCount: table.rowCount,
7464
maxRows: table.maxRows,
7565
workspaceId: table.workspaceId,
66+
createdBy: table.createdBy,
7667
createdAt: table.createdAt,
7768
updatedAt: table.updatedAt,
7869
}
@@ -91,25 +82,15 @@ export async function listTables(workspaceId: string): Promise<TableDefinition[]
9182
.where(eq(userTableDefinitions.workspaceId, workspaceId))
9283
.orderBy(userTableDefinitions.createdAt)
9384

94-
const rowCounts = await db
95-
.select({
96-
tableId: userTableRows.tableId,
97-
rowCount: count(),
98-
})
99-
.from(userTableRows)
100-
.where(eq(userTableRows.workspaceId, workspaceId))
101-
.groupBy(userTableRows.tableId)
102-
103-
const rowCountByTable = new Map(rowCounts.map((row) => [row.tableId, Number(row.rowCount ?? 0)]))
104-
10585
return tables.map((t) => ({
10686
id: t.id,
10787
name: t.name,
10888
description: t.description,
10989
schema: t.schema as TableSchema,
110-
rowCount: rowCountByTable.get(t.id) ?? 0,
90+
rowCount: t.rowCount,
11191
maxRows: t.maxRows,
11292
workspaceId: t.workspaceId,
93+
createdBy: t.createdBy,
11394
createdAt: t.createdAt,
11495
updatedAt: t.updatedAt,
11596
}))
@@ -194,6 +175,7 @@ export async function createTable(
194175
rowCount: 0,
195176
maxRows: newTable.maxRows,
196177
workspaceId: newTable.workspaceId,
178+
createdBy: newTable.createdBy,
197179
createdAt: newTable.createdAt,
198180
updatedAt: newTable.updatedAt,
199181
}
@@ -228,10 +210,8 @@ export async function insertRow(
228210
table: TableDefinition,
229211
requestId: string
230212
): Promise<TableRow> {
231-
const rowCount = await getTableRowCount(data.tableId)
232-
233-
// Check capacity
234-
if (rowCount >= table.maxRows) {
213+
// Check capacity using stored rowCount (maintained by database triggers)
214+
if (table.rowCount >= table.maxRows) {
235215
throw new Error(`Table has reached maximum row limit (${table.maxRows})`)
236216
}
237217

@@ -303,13 +283,11 @@ export async function batchInsertRows(
303283
table: TableDefinition,
304284
requestId: string
305285
): Promise<TableRow[]> {
306-
const currentRowCount = await getTableRowCount(data.tableId)
307-
308-
// Check capacity
309-
const remainingCapacity = table.maxRows - currentRowCount
286+
// Check capacity using stored rowCount (maintained by database triggers)
287+
const remainingCapacity = table.maxRows - table.rowCount
310288
if (remainingCapacity < data.rows.length) {
311289
throw new Error(
312-
`Insufficient capacity. Can only insert ${remainingCapacity} more rows (table has ${currentRowCount}/${table.maxRows} rows)`
290+
`Insufficient capacity. Can only insert ${remainingCapacity} more rows (table has ${table.rowCount}/${table.maxRows} rows)`
313291
)
314292
}
315293

Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CREATE TABLE "user_table_definitions" (
1+
CREATE TABLE IF NOT EXISTS "user_table_definitions" (
22
"id" text PRIMARY KEY NOT NULL,
33
"workspace_id" text NOT NULL,
44
"name" text NOT NULL,
@@ -12,7 +12,7 @@ CREATE TABLE "user_table_definitions" (
1212
"deleted_at" timestamp
1313
);
1414
--> statement-breakpoint
15-
CREATE TABLE "user_table_rows" (
15+
CREATE TABLE IF NOT EXISTS "user_table_rows" (
1616
"id" text PRIMARY KEY NOT NULL,
1717
"table_id" text NOT NULL,
1818
"workspace_id" text NOT NULL,
@@ -22,15 +22,52 @@ CREATE TABLE "user_table_rows" (
2222
"created_by" text
2323
);
2424
--> statement-breakpoint
25-
ALTER TABLE "user_table_definitions" ADD CONSTRAINT "user_table_definitions_workspace_id_workspace_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."workspace"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
26-
ALTER TABLE "user_table_definitions" ADD CONSTRAINT "user_table_definitions_created_by_user_id_fk" FOREIGN KEY ("created_by") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
27-
ALTER TABLE "user_table_rows" ADD CONSTRAINT "user_table_rows_table_id_user_table_definitions_id_fk" FOREIGN KEY ("table_id") REFERENCES "public"."user_table_definitions"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
28-
ALTER TABLE "user_table_rows" ADD CONSTRAINT "user_table_rows_workspace_id_workspace_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."workspace"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
29-
ALTER TABLE "user_table_rows" ADD CONSTRAINT "user_table_rows_created_by_user_id_fk" FOREIGN KEY ("created_by") REFERENCES "public"."user"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
30-
CREATE INDEX "user_table_def_workspace_id_idx" ON "user_table_definitions" USING btree ("workspace_id");--> statement-breakpoint
31-
CREATE UNIQUE INDEX "user_table_def_workspace_name_unique" ON "user_table_definitions" USING btree ("workspace_id","name");--> statement-breakpoint
32-
CREATE INDEX "user_table_def_deleted_at_idx" ON "user_table_definitions" USING btree ("deleted_at");--> statement-breakpoint
33-
CREATE INDEX "user_table_rows_table_id_idx" ON "user_table_rows" USING btree ("table_id");--> statement-breakpoint
34-
CREATE INDEX "user_table_rows_workspace_id_idx" ON "user_table_rows" USING btree ("workspace_id");--> statement-breakpoint
35-
CREATE INDEX "user_table_rows_data_gin_idx" ON "user_table_rows" USING gin ("data");--> statement-breakpoint
36-
CREATE INDEX "user_table_rows_workspace_table_idx" ON "user_table_rows" USING btree ("workspace_id","table_id");
25+
-- Add constraints if they don't exist
26+
DO $$
27+
BEGIN
28+
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'user_table_definitions_workspace_id_workspace_id_fk') THEN
29+
ALTER TABLE "user_table_definitions" ADD CONSTRAINT "user_table_definitions_workspace_id_workspace_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."workspace"("id") ON DELETE cascade ON UPDATE no action;
30+
END IF;
31+
END $$;
32+
--> statement-breakpoint
33+
DO $$
34+
BEGIN
35+
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'user_table_definitions_created_by_user_id_fk') THEN
36+
ALTER TABLE "user_table_definitions" ADD CONSTRAINT "user_table_definitions_created_by_user_id_fk" FOREIGN KEY ("created_by") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;
37+
END IF;
38+
END $$;
39+
--> statement-breakpoint
40+
DO $$
41+
BEGIN
42+
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'user_table_rows_table_id_user_table_definitions_id_fk') THEN
43+
ALTER TABLE "user_table_rows" ADD CONSTRAINT "user_table_rows_table_id_user_table_definitions_id_fk" FOREIGN KEY ("table_id") REFERENCES "public"."user_table_definitions"("id") ON DELETE cascade ON UPDATE no action;
44+
END IF;
45+
END $$;
46+
--> statement-breakpoint
47+
DO $$
48+
BEGIN
49+
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'user_table_rows_workspace_id_workspace_id_fk') THEN
50+
ALTER TABLE "user_table_rows" ADD CONSTRAINT "user_table_rows_workspace_id_workspace_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."workspace"("id") ON DELETE cascade ON UPDATE no action;
51+
END IF;
52+
END $$;
53+
--> statement-breakpoint
54+
DO $$
55+
BEGIN
56+
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'user_table_rows_created_by_user_id_fk') THEN
57+
ALTER TABLE "user_table_rows" ADD CONSTRAINT "user_table_rows_created_by_user_id_fk" FOREIGN KEY ("created_by") REFERENCES "public"."user"("id") ON DELETE set null ON UPDATE no action;
58+
END IF;
59+
END $$;
60+
--> statement-breakpoint
61+
CREATE INDEX IF NOT EXISTS "user_table_def_workspace_id_idx" ON "user_table_definitions" USING btree ("workspace_id");
62+
--> statement-breakpoint
63+
CREATE UNIQUE INDEX IF NOT EXISTS "user_table_def_workspace_name_unique" ON "user_table_definitions" USING btree ("workspace_id","name");
64+
--> statement-breakpoint
65+
CREATE INDEX IF NOT EXISTS "user_table_def_deleted_at_idx" ON "user_table_definitions" USING btree ("deleted_at");
66+
--> statement-breakpoint
67+
CREATE INDEX IF NOT EXISTS "user_table_rows_table_id_idx" ON "user_table_rows" USING btree ("table_id");
68+
--> statement-breakpoint
69+
CREATE INDEX IF NOT EXISTS "user_table_rows_workspace_id_idx" ON "user_table_rows" USING btree ("workspace_id");
70+
--> statement-breakpoint
71+
CREATE INDEX IF NOT EXISTS "user_table_rows_data_gin_idx" ON "user_table_rows" USING gin ("data");
72+
--> statement-breakpoint
73+
CREATE INDEX IF NOT EXISTS "user_table_rows_workspace_table_idx" ON "user_table_rows" USING btree ("workspace_id","table_id");
Lines changed: 24 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,24 @@
1-
DROP TABLE IF EXISTS "user_table_rows";
2-
--> statement-breakpoint
3-
DROP TABLE IF EXISTS "user_table_definitions";
4-
--> statement-breakpoint
5-
CREATE TABLE "user_table_definitions" (
6-
"id" text PRIMARY KEY NOT NULL,
7-
"workspace_id" text NOT NULL,
8-
"name" text NOT NULL,
9-
"description" text,
10-
"schema" jsonb NOT NULL,
11-
"max_rows" integer DEFAULT 10000 NOT NULL,
12-
"created_by" text NOT NULL,
13-
"created_at" timestamp DEFAULT now() NOT NULL,
14-
"updated_at" timestamp DEFAULT now() NOT NULL
15-
);
16-
--> statement-breakpoint
17-
CREATE TABLE "user_table_rows" (
18-
"id" text PRIMARY KEY NOT NULL,
19-
"table_id" text NOT NULL,
20-
"workspace_id" text NOT NULL,
21-
"data" jsonb NOT NULL,
22-
"created_at" timestamp DEFAULT now() NOT NULL,
23-
"updated_at" timestamp DEFAULT now() NOT NULL,
24-
"created_by" text
25-
);
26-
--> statement-breakpoint
27-
ALTER TABLE "user_table_definitions" ADD CONSTRAINT "user_table_definitions_workspace_id_workspace_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."workspace"("id") ON DELETE cascade ON UPDATE no action;
28-
--> statement-breakpoint
29-
ALTER TABLE "user_table_definitions" ADD CONSTRAINT "user_table_definitions_created_by_user_id_fk" FOREIGN KEY ("created_by") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;
30-
--> statement-breakpoint
31-
ALTER TABLE "user_table_rows" ADD CONSTRAINT "user_table_rows_table_id_user_table_definitions_id_fk" FOREIGN KEY ("table_id") REFERENCES "public"."user_table_definitions"("id") ON DELETE cascade ON UPDATE no action;
32-
--> statement-breakpoint
33-
ALTER TABLE "user_table_rows" ADD CONSTRAINT "user_table_rows_workspace_id_workspace_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."workspace"("id") ON DELETE cascade ON UPDATE no action;
34-
--> statement-breakpoint
35-
ALTER TABLE "user_table_rows" ADD CONSTRAINT "user_table_rows_created_by_user_id_fk" FOREIGN KEY ("created_by") REFERENCES "public"."user"("id") ON DELETE set null ON UPDATE no action;
36-
--> statement-breakpoint
37-
CREATE INDEX "user_table_def_workspace_id_idx" ON "user_table_definitions" USING btree ("workspace_id");
38-
--> statement-breakpoint
39-
CREATE UNIQUE INDEX "user_table_def_workspace_name_unique" ON "user_table_definitions" USING btree ("workspace_id","name");
40-
--> statement-breakpoint
41-
CREATE INDEX "user_table_rows_table_id_idx" ON "user_table_rows" USING btree ("table_id");
42-
--> statement-breakpoint
43-
CREATE INDEX "user_table_rows_workspace_id_idx" ON "user_table_rows" USING btree ("workspace_id");
44-
--> statement-breakpoint
45-
CREATE INDEX "user_table_rows_data_gin_idx" ON "user_table_rows" USING gin ("data");
46-
--> statement-breakpoint
47-
CREATE INDEX "user_table_rows_workspace_table_idx" ON "user_table_rows" USING btree ("workspace_id","table_id");
1+
-- Drop deleted_at column if it exists (from 0139)
2+
DO $$
3+
BEGIN
4+
IF EXISTS (
5+
SELECT 1 FROM information_schema.columns
6+
WHERE table_name = 'user_table_definitions' AND column_name = 'deleted_at'
7+
) THEN
8+
ALTER TABLE "user_table_definitions" DROP COLUMN "deleted_at";
9+
END IF;
10+
END $$;
11+
--> statement-breakpoint
12+
-- Drop row_count column if it exists (from 0139, will be re-added in 0141)
13+
DO $$
14+
BEGIN
15+
IF EXISTS (
16+
SELECT 1 FROM information_schema.columns
17+
WHERE table_name = 'user_table_definitions' AND column_name = 'row_count'
18+
) THEN
19+
ALTER TABLE "user_table_definitions" DROP COLUMN "row_count";
20+
END IF;
21+
END $$;
22+
--> statement-breakpoint
23+
-- Drop the deleted_at index if it exists
24+
DROP INDEX IF EXISTS "user_table_def_deleted_at_idx";
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
-- Add row_count column if it doesn't exist
2+
DO $$
3+
BEGIN
4+
IF NOT EXISTS (
5+
SELECT 1 FROM information_schema.columns
6+
WHERE table_name = 'user_table_definitions' AND column_name = 'row_count'
7+
) THEN
8+
ALTER TABLE "user_table_definitions" ADD COLUMN "row_count" integer DEFAULT 0 NOT NULL;
9+
END IF;
10+
END $$;
11+
--> statement-breakpoint
12+
-- Backfill existing row counts
13+
UPDATE user_table_definitions t
14+
SET row_count = (
15+
SELECT COUNT(*)
16+
FROM user_table_rows r
17+
WHERE r.table_id = t.id
18+
);
19+
--> statement-breakpoint
20+
-- Create function to increment row count on insert
21+
CREATE OR REPLACE FUNCTION increment_table_row_count()
22+
RETURNS TRIGGER AS $$
23+
BEGIN
24+
UPDATE user_table_definitions
25+
SET row_count = row_count + 1
26+
WHERE id = NEW.table_id;
27+
RETURN NEW;
28+
END;
29+
$$ LANGUAGE plpgsql;
30+
--> statement-breakpoint
31+
-- Create trigger for insert
32+
CREATE TRIGGER trg_increment_row_count
33+
AFTER INSERT ON user_table_rows
34+
FOR EACH ROW
35+
EXECUTE FUNCTION increment_table_row_count();
36+
--> statement-breakpoint
37+
-- Create function to decrement row count on delete
38+
CREATE OR REPLACE FUNCTION decrement_table_row_count()
39+
RETURNS TRIGGER AS $$
40+
BEGIN
41+
UPDATE user_table_definitions
42+
SET row_count = GREATEST(0, row_count - 1)
43+
WHERE id = OLD.table_id;
44+
RETURN OLD;
45+
END;
46+
$$ LANGUAGE plpgsql;
47+
--> statement-breakpoint
48+
-- Create trigger for delete
49+
CREATE TRIGGER trg_decrement_row_count
50+
AFTER DELETE ON user_table_rows
51+
FOR EACH ROW
52+
EXECUTE FUNCTION decrement_table_row_count();

0 commit comments

Comments
 (0)