@@ -8,13 +8,11 @@ import type {
8
8
} from "../yargs-types" ;
9
9
import type {
10
10
VectorizeMatches ,
11
- VectorizeMetadataFilterInnerValue ,
12
11
VectorizeMetadataFilterValue ,
13
12
VectorizeMetadataRetrievalLevel ,
14
13
VectorizeQueryOptions ,
15
14
VectorizeVectorMetadataFilter ,
16
15
VectorizeVectorMetadataFilterOp ,
17
- VectorizeVectorMetadataValue ,
18
16
} from "./types" ;
19
17
20
18
export function options ( yargs : CommonYargsArgv ) {
@@ -155,6 +153,12 @@ export async function handler(
155
153
logger . log ( JSON . stringify ( res , null , 2 ) ) ;
156
154
}
157
155
156
+ function validateQueryFilterInnerValue (
157
+ innerValue : VectorizeMetadataFilterValue
158
+ ) {
159
+ return [ "string" , "number" , "boolean" ] . includes ( typeof innerValue ) ;
160
+ }
161
+
158
162
export function validateQueryFilter (
159
163
input : object
160
164
) : VectorizeVectorMetadataFilter | null {
@@ -176,7 +180,7 @@ export function validateQueryFilter(
176
180
for ( const field in parsedObj ) {
177
181
if ( Object . prototype . hasOwnProperty . call ( parsedObj , field ) ) {
178
182
const value = (
179
- parsedObj as Record < string , VectorizeMetadataFilterValue >
183
+ parsedObj as Record < string , VectorizeVectorMetadataFilter >
180
184
) [ field ] ;
181
185
182
186
if ( Array . isArray ( value ) ) {
@@ -186,38 +190,28 @@ export function validateQueryFilter(
186
190
187
191
if ( typeof value === "object" && value !== null ) {
188
192
// Handle nested objects
189
- const innerObj : Partial < {
190
- [ Op in VectorizeVectorMetadataFilterOp ] ?: Exclude <
191
- VectorizeVectorMetadataValue ,
192
- string [ ]
193
- > | null ;
194
- } > = { } ;
193
+ const innerObj : VectorizeVectorMetadataFilter = { } ;
195
194
let validInnerObj = true ;
196
195
197
196
for ( const op in value ) {
198
197
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
209
- 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
198
+ const innerValue = value [ 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 ( ! innerValue . every ( validateQueryFilterInnerValue ) ) {
208
+ validInnerObj = false ;
209
+ }
210
+ }
211
+ } else {
218
212
validInnerObj = false ;
219
- break ;
220
213
}
214
+
221
215
innerObj [ op as VectorizeVectorMetadataFilterOp ] = innerValue ;
222
216
}
223
217
}
0 commit comments