From 80b25f8ec5e8d024d0cbe212d90809b31d748fc6 Mon Sep 17 00:00:00 2001 From: Jesse_Chen Date: Mon, 27 Jul 2026 12:50:16 +0800 Subject: [PATCH] fix: support neq filters in local postgres client --- frontend/src/lib/db/local-postgres-client-core.ts | 9 ++++++++- frontend/tests/database-local-business.test.ts | 6 ++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/frontend/src/lib/db/local-postgres-client-core.ts b/frontend/src/lib/db/local-postgres-client-core.ts index 9b124e6c..57a780dd 100644 --- a/frontend/src/lib/db/local-postgres-client-core.ts +++ b/frontend/src/lib/db/local-postgres-client-core.ts @@ -12,6 +12,7 @@ type QueryResult = Readonly<{ type Filter = | Readonly<{ kind: "eq"; column: string; value: unknown }> + | Readonly<{ kind: "neq"; column: string; value: unknown }> | Readonly<{ kind: "in"; column: string; value: readonly unknown[] }> | Readonly<{ kind: "is"; column: string; value: unknown }> | Readonly<{ kind: "notContains"; column: string; value: unknown }>; @@ -169,6 +170,12 @@ class LocalPostgresQueryBuilder implements PromiseLike { return this; } + neq(column: string, value: unknown) { + identifier(column); + this.filters.push({ kind: "neq", column, value }); + return this; + } + in(column: string, value: readonly unknown[]) { identifier(column); this.filters.push({ kind: "in", column, value }); @@ -250,7 +257,7 @@ class LocalPostgresQueryBuilder implements PromiseLike { return `not (${column} @> $${parameters.length})`; } parameters.push(databaseValue(types.get(filter.column), filter.value)); - return `${column} = $${parameters.length}`; + return `${column} ${filter.kind === "neq" ? "<>" : "="} $${parameters.length}`; }); return ` where ${parts.join(" and ")}`; } diff --git a/frontend/tests/database-local-business.test.ts b/frontend/tests/database-local-business.test.ts index b6dd0ffc..b8fe3dad 100644 --- a/frontend/tests/database-local-business.test.ts +++ b/frontend/tests/database-local-business.test.ts @@ -150,6 +150,12 @@ test("local PostgreSQL applies the reviewed business schema and serves authentic email: "local-user@example.com", credits: 0, }); + const nonAbandonedProfiles = await local.from("profiles") + .select("id") + .neq("email", "not-local-user@example.com") + .single(); + assert.equal(nonAbandonedProfiles.error, null); + assert.deepEqual(nonAbandonedProfiles.data, { id: userId }); const admin = createLocalPostgresDataClient( fixture.connectionUrl("admin_runtime", "admin-runtime-test-password"), null,