Skip to content

Commit 7aa49cb

Browse files
committed
fix(codegen): add VectorFilter scalar filter type for pgvector fields
Adds Vector → VectorFilter mapping in SCALAR_FILTER_MAP and VectorFilter config (equality + distinct operators) in SCALAR_FILTER_CONFIGS, so that vector embedding fields in Filter types use VectorFilter instead of falling back to StringFilter. Includes unit test and updated snapshots.
1 parent 0ffda8e commit 7aa49cb

6 files changed

Lines changed: 71 additions & 7 deletions

File tree

graphql/codegen/src/__tests__/codegen/__snapshots__/input-types-generator.test.ts.snap

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,13 @@ export interface InternetAddressFilter {
166166
export interface FullTextFilter {
167167
matches?: string;
168168
}
169+
export interface VectorFilter {
170+
isNull?: boolean;
171+
equalTo?: number[];
172+
notEqualTo?: number[];
173+
distinctFrom?: number[];
174+
notDistinctFrom?: number[];
175+
}
169176
export interface StringListFilter {
170177
isNull?: boolean;
171178
equalTo?: string[];
@@ -648,6 +655,13 @@ export interface InternetAddressFilter {
648655
export interface FullTextFilter {
649656
matches?: string;
650657
}
658+
export interface VectorFilter {
659+
isNull?: boolean;
660+
equalTo?: number[];
661+
notEqualTo?: number[];
662+
distinctFrom?: number[];
663+
notDistinctFrom?: number[];
664+
}
651665
export interface StringListFilter {
652666
isNull?: boolean;
653667
equalTo?: string[];
@@ -966,6 +980,13 @@ export interface InternetAddressFilter {
966980
export interface FullTextFilter {
967981
matches?: string;
968982
}
983+
export interface VectorFilter {
984+
isNull?: boolean;
985+
equalTo?: number[];
986+
notEqualTo?: number[];
987+
distinctFrom?: number[];
988+
notDistinctFrom?: number[];
989+
}
969990
export interface StringListFilter {
970991
isNull?: boolean;
971992
equalTo?: string[];
@@ -1296,6 +1317,13 @@ export interface InternetAddressFilter {
12961317
export interface FullTextFilter {
12971318
matches?: string;
12981319
}
1320+
export interface VectorFilter {
1321+
isNull?: boolean;
1322+
equalTo?: number[];
1323+
notEqualTo?: number[];
1324+
distinctFrom?: number[];
1325+
notDistinctFrom?: number[];
1326+
}
12991327
export interface StringListFilter {
13001328
isNull?: boolean;
13011329
equalTo?: string[];
@@ -1631,6 +1659,13 @@ export interface InternetAddressFilter {
16311659
export interface FullTextFilter {
16321660
matches?: string;
16331661
}
1662+
export interface VectorFilter {
1663+
isNull?: boolean;
1664+
equalTo?: number[];
1665+
notEqualTo?: number[];
1666+
distinctFrom?: number[];
1667+
notDistinctFrom?: number[];
1668+
}
16341669
export interface StringListFilter {
16351670
isNull?: boolean;
16361671
equalTo?: string[];
@@ -2022,6 +2057,13 @@ export interface InternetAddressFilter {
20222057
export interface FullTextFilter {
20232058
matches?: string;
20242059
}
2060+
export interface VectorFilter {
2061+
isNull?: boolean;
2062+
equalTo?: number[];
2063+
notEqualTo?: number[];
2064+
distinctFrom?: number[];
2065+
notDistinctFrom?: number[];
2066+
}
20252067
export interface StringListFilter {
20262068
isNull?: boolean;
20272069
equalTo?: string[];
@@ -2409,6 +2451,13 @@ export interface InternetAddressFilter {
24092451
export interface FullTextFilter {
24102452
matches?: string;
24112453
}
2454+
export interface VectorFilter {
2455+
isNull?: boolean;
2456+
equalTo?: number[];
2457+
notEqualTo?: number[];
2458+
distinctFrom?: number[];
2459+
notDistinctFrom?: number[];
2460+
}
24122461
export interface StringListFilter {
24132462
isNull?: boolean;
24142463
equalTo?: string[];

graphql/codegen/src/__tests__/codegen/__snapshots__/react-query-hooks.test.ts.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2138,7 +2138,7 @@ exports[`Schema Types Generator generateSchemaTypesFile generates schema types f
21382138
* DO NOT EDIT - changes will be overwritten
21392139
*/
21402140

2141-
import type { BigFloatFilter, BigIntFilter, BitStringFilter, BooleanFilter, DateFilter, DatetimeFilter, FloatFilter, FullTextFilter, IntFilter, IntListFilter, InternetAddressFilter, JSONFilter, StringFilter, StringListFilter, UUIDFilter, UUIDListFilter } from "./types";
2141+
import type { BigFloatFilter, BigIntFilter, BitStringFilter, BooleanFilter, DateFilter, DatetimeFilter, FloatFilter, FullTextFilter, IntFilter, IntListFilter, InternetAddressFilter, JSONFilter, StringFilter, StringListFilter, UUIDFilter, UUIDListFilter, VectorFilter } from "./types";
21422142
export type UserRole = "ADMIN" | "USER" | "GUEST";
21432143
export interface RegisterInput {
21442144
email: string;
@@ -2165,7 +2165,7 @@ exports[`Schema Types Generator generateSchemaTypesFile generates schema types f
21652165
* DO NOT EDIT - changes will be overwritten
21662166
*/
21672167

2168-
import type { User, BigFloatFilter, BigIntFilter, BitStringFilter, BooleanFilter, DateFilter, DatetimeFilter, FloatFilter, FullTextFilter, IntFilter, IntListFilter, InternetAddressFilter, JSONFilter, StringFilter, StringListFilter, UUIDFilter, UUIDListFilter } from "./types";
2168+
import type { User, BigFloatFilter, BigIntFilter, BitStringFilter, BooleanFilter, DateFilter, DatetimeFilter, FloatFilter, FullTextFilter, IntFilter, IntListFilter, InternetAddressFilter, JSONFilter, StringFilter, StringListFilter, UUIDFilter, UUIDListFilter, VectorFilter } from "./types";
21692169
export type UserRole = "ADMIN" | "USER" | "GUEST";
21702170
export interface RegisterInput {
21712171
email: string;

graphql/codegen/src/__tests__/codegen/__snapshots__/schema-types-generator.test.ts.snap

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ exports[`schema-types-generator generates enum types as string unions 1`] = `
77
* DO NOT EDIT - changes will be overwritten
88
*/
99
10-
import type { BigFloatFilter, BigIntFilter, BitStringFilter, BooleanFilter, DateFilter, DatetimeFilter, FloatFilter, FullTextFilter, IntFilter, IntListFilter, InternetAddressFilter, JSONFilter, StringFilter, StringListFilter, UUIDFilter, UUIDListFilter } from "./types";
10+
import type { BigFloatFilter, BigIntFilter, BitStringFilter, BooleanFilter, DateFilter, DatetimeFilter, FloatFilter, FullTextFilter, IntFilter, IntListFilter, InternetAddressFilter, JSONFilter, StringFilter, StringListFilter, UUIDFilter, UUIDListFilter, VectorFilter } from "./types";
1111
export type Status = "ACTIVE" | "INACTIVE" | "PENDING";
1212
export type Priority = "LOW" | "MEDIUM" | "HIGH";"
1313
`;
@@ -19,7 +19,7 @@ exports[`schema-types-generator generates input object types as interfaces 1`] =
1919
* DO NOT EDIT - changes will be overwritten
2020
*/
2121
22-
import type { BigFloatFilter, BigIntFilter, BitStringFilter, BooleanFilter, DateFilter, DatetimeFilter, FloatFilter, FullTextFilter, IntFilter, IntListFilter, InternetAddressFilter, JSONFilter, StringFilter, StringListFilter, UUIDFilter, UUIDListFilter } from "./types";
22+
import type { BigFloatFilter, BigIntFilter, BitStringFilter, BooleanFilter, DateFilter, DatetimeFilter, FloatFilter, FullTextFilter, IntFilter, IntListFilter, InternetAddressFilter, JSONFilter, StringFilter, StringListFilter, UUIDFilter, UUIDListFilter, VectorFilter } from "./types";
2323
export interface CreateUserInput {
2424
email: string;
2525
name?: string;
@@ -38,7 +38,7 @@ exports[`schema-types-generator generates payload types from mutation return typ
3838
* DO NOT EDIT - changes will be overwritten
3939
*/
4040
41-
import type { User, BigFloatFilter, BigIntFilter, BitStringFilter, BooleanFilter, DateFilter, DatetimeFilter, FloatFilter, FullTextFilter, IntFilter, IntListFilter, InternetAddressFilter, JSONFilter, StringFilter, StringListFilter, UUIDFilter, UUIDListFilter } from "./types";
41+
import type { User, BigFloatFilter, BigIntFilter, BitStringFilter, BooleanFilter, DateFilter, DatetimeFilter, FloatFilter, FullTextFilter, IntFilter, IntListFilter, InternetAddressFilter, JSONFilter, StringFilter, StringListFilter, UUIDFilter, UUIDListFilter, VectorFilter } from "./types";
4242
export interface LoginPayload {
4343
token: string;
4444
refreshToken?: string | null;
@@ -53,7 +53,7 @@ exports[`schema-types-generator generates union types 1`] = `
5353
* DO NOT EDIT - changes will be overwritten
5454
*/
5555
56-
import type { BigFloatFilter, BigIntFilter, BitStringFilter, BooleanFilter, DateFilter, DatetimeFilter, FloatFilter, FullTextFilter, IntFilter, IntListFilter, InternetAddressFilter, JSONFilter, StringFilter, StringListFilter, UUIDFilter, UUIDListFilter } from "./types";
56+
import type { BigFloatFilter, BigIntFilter, BitStringFilter, BooleanFilter, DateFilter, DatetimeFilter, FloatFilter, FullTextFilter, IntFilter, IntListFilter, InternetAddressFilter, JSONFilter, StringFilter, StringListFilter, UUIDFilter, UUIDListFilter, VectorFilter } from "./types";
5757
export type SearchResult = User | Post | Comment;"
5858
`;
5959

@@ -64,6 +64,6 @@ exports[`schema-types-generator skips table types and standard scalars 1`] = `
6464
* DO NOT EDIT - changes will be overwritten
6565
*/
6666
67-
import type { BigFloatFilter, BigIntFilter, BitStringFilter, BooleanFilter, DateFilter, DatetimeFilter, FloatFilter, FullTextFilter, IntFilter, IntListFilter, InternetAddressFilter, JSONFilter, StringFilter, StringListFilter, UUIDFilter, UUIDListFilter } from "./types";
67+
import type { BigFloatFilter, BigIntFilter, BitStringFilter, BooleanFilter, DateFilter, DatetimeFilter, FloatFilter, FullTextFilter, IntFilter, IntListFilter, InternetAddressFilter, JSONFilter, StringFilter, StringListFilter, UUIDFilter, UUIDListFilter, VectorFilter } from "./types";
6868
export type CustomEnum = "VALUE_A" | "VALUE_B";"
6969
`;

graphql/codegen/src/__tests__/codegen/input-types-generator.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,18 @@ describe('scalar filter types', () => {
455455
// Float filters
456456
expect(result.content).toContain('export interface FloatFilter {');
457457
});
458+
459+
it('includes VectorFilter for pgvector embedding fields', () => {
460+
const result = generateInputTypesFile(new Map(), new Set(), [userTable]);
461+
462+
// VectorFilter should be generated as a scalar filter type
463+
expect(result.content).toContain('export interface VectorFilter {');
464+
expect(result.content).toContain('isNull?: boolean;');
465+
expect(result.content).toContain('equalTo?: number[];');
466+
expect(result.content).toContain('notEqualTo?: number[];');
467+
expect(result.content).toContain('distinctFrom?: number[];');
468+
expect(result.content).toContain('notDistinctFrom?: number[];');
469+
});
458470
});
459471

460472
// ============================================================================

graphql/codegen/src/core/codegen/orm/input-types-generator.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,8 @@ const SCALAR_FILTER_CONFIGS: ScalarFilterConfig[] = [
322322
operators: ['equality', 'distinct', 'inArray', 'comparison', 'inet'],
323323
},
324324
{ name: 'FullTextFilter', tsType: 'string', operators: ['fulltext'] },
325+
// Vector filter (for pgvector embedding fields)
326+
{ name: 'VectorFilter', tsType: 'number[]', operators: ['equality', 'distinct'] },
325327
// List filters (for array fields like string[], int[], uuid[])
326328
{
327329
name: 'StringListFilter',

graphql/codegen/src/core/codegen/scalars.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ export const SCALAR_FILTER_MAP: Record<string, string> = {
6161
BigFloat: 'BigFloatFilter',
6262
BitString: 'BitStringFilter',
6363
InternetAddress: 'InternetAddressFilter',
64+
Vector: 'VectorFilter',
6465
FullText: 'FullTextFilter',
6566
Interval: 'StringFilter',
6667
};

0 commit comments

Comments
 (0)