Skip to content

Commit 7089424

Browse files
committed
Add set and range filters to filter validation
1 parent 8def8c9 commit 7089424

File tree

3 files changed

+34
-30
lines changed

3 files changed

+34
-30
lines changed

packages/wrangler/src/__tests__/vectorize/vectorize.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -727,11 +727,11 @@ describe("vectorize commands", () => {
727727
describe("vectorize query filter", () => {
728728
it("should parse correctly", async () => {
729729
let jsonString =
730-
'{ "p1": "abc", "p2": { "$ne": true }, "p3": 10, "p4": false, "nested.p5": "abcd" }'; // Successful parse
730+
'{ "p1": "abc", "p2": { "$ne": true }, "p3": 10, "p4": false, "nested.p5": "abcd", "p6": { "$in": ["a", 3, 4] }, "p7": {"$gt": 4, "$lte": "aaa"} }'; // Successful parse
731731
expect(
732732
JSON.stringify(validateQueryFilter(JSON.parse(jsonString)))
733733
).toMatchInlineSnapshot(
734-
`"{\\"p1\\":\\"abc\\",\\"p2\\":{\\"$ne\\":true},\\"p3\\":10,\\"p4\\":false,\\"nested.p5\\":\\"abcd\\"}"`
734+
`"{\\"p1\\":\\"abc\\",\\"p2\\":{\\"$ne\\":true},\\"p3\\":10,\\"p4\\":false,\\"nested.p5\\":\\"abcd\\",\\"p6\\":{\\"$in\\":[\\"a\\",3,4]},\\"p7\\":{\\"$gt\\":4,\\"$lte\\":\\"aaa\\"}}"`
735735
);
736736

737737
jsonString =

packages/wrangler/src/vectorize/query.ts

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ export async function handler(
155155
logger.log(JSON.stringify(res, null, 2));
156156
}
157157

158+
function validateQueryFilterInnerValue(innerValue: any) {
159+
return ["string", "number", "boolean"].includes(typeof innerValue);
160+
}
161+
158162
export function validateQueryFilter(
159163
input: object
160164
): VectorizeVectorMetadataFilter | null {
@@ -186,38 +190,30 @@ export function validateQueryFilter(
186190

187191
if (typeof value === "object" && value !== null) {
188192
// Handle nested objects
189-
const innerObj: Partial<{
190-
[Op in VectorizeVectorMetadataFilterOp]?: Exclude<
191-
VectorizeVectorMetadataValue,
192-
string[]
193-
> | null;
194-
}> = {};
193+
const innerObj: any = {};
195194
let validInnerObj = true;
196195

197196
for (const op in value) {
198197
if (Object.prototype.hasOwnProperty.call(value, op)) {
199-
if (!["$eq", "$ne"].includes(op)) {
200-
// Skip objects with invalid operators
201-
validInnerObj = false;
202-
break;
203-
}
204-
const innerValue = (value as VectorizeMetadataFilterInnerValue)[
205-
op as VectorizeVectorMetadataFilterOp
206-
];
207-
if (Array.isArray(innerValue)) {
208-
// Skip arrays in nested objects
198+
const innerValue = (value as any)[op];
199+
if (["$eq", "$ne", "$lt", "$lte", "$gt", "gte"].includes(op)) {
200+
if (!validateQueryFilterInnerValue(innerValue)) {
201+
validInnerObj = false;
202+
}
203+
} else if (["$in", "$nin"].includes(op)) {
204+
if (!Array.isArray(innerValue)) {
205+
validInnerObj = false;
206+
} else {
207+
if (
208+
!(innerValue as any[]).every(validateQueryFilterInnerValue)
209+
) {
210+
validInnerObj = false;
211+
}
212+
}
213+
} else {
209214
validInnerObj = false;
210-
break;
211-
}
212-
if (
213-
typeof innerValue === "object" &&
214-
innerValue !== null &&
215-
Object.keys(innerValue).length === 0
216-
) {
217-
// Skip empty objects in nested objects
218-
validInnerObj = false;
219-
break;
220215
}
216+
221217
innerObj[op as VectorizeVectorMetadataFilterOp] = innerValue;
222218
}
223219
}

packages/wrangler/src/vectorize/types.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,19 @@ export type VectorFloatArray = Float32Array | Float64Array;
2525
*
2626
* This list is expected to grow as support for more operations are released.
2727
*/
28-
export type VectorizeVectorMetadataFilterOp = "$eq" | "$ne";
28+
export type VectorizeMetadataFilterEqualityOp = "$eq" | "$ne";
29+
export type VectorizeMetadataFilterSetOp = "$in" | "$nin";
30+
export type VectorizeMetadataFilterRangeOp = "$lt" | "$lte" | "$gt" | "$gte";
31+
32+
export type VectorizeVectorMetadataFilterOp =
33+
| VectorizeMetadataFilterEqualityOp
34+
| VectorizeMetadataFilterSetOp
35+
| VectorizeMetadataFilterRangeOp;
2936

3037
export type VectorizeMetadataFilterInnerValue = Record<
3138
VectorizeVectorMetadataFilterOp,
32-
Exclude<VectorizeVectorMetadataValue, string[]>
39+
| Exclude<VectorizeVectorMetadataValue, string[]>
40+
| Exclude<VectorizeVectorMetadataValue, string[]>[]
3341
>;
3442

3543
export type VectorizeMetadataFilterValue =

0 commit comments

Comments
 (0)