@@ -7,7 +7,11 @@ import {
7
7
buildEnumType ,
8
8
buildEnumValue
9
9
} from './ast' ;
10
- import { isNeo4jPropertyType } from './types/types' ;
10
+ import {
11
+ isNeo4jTemporalType ,
12
+ isNeo4jPointType ,
13
+ Neo4jTypeName
14
+ } from './types/types' ;
11
15
import { isCypherField } from './directives' ;
12
16
import {
13
17
TypeWrappers ,
@@ -18,9 +22,10 @@ import {
18
22
isStringField ,
19
23
isBooleanField ,
20
24
isTemporalField ,
21
- getFieldDefinition
25
+ getFieldDefinition ,
26
+ isSpatialField
22
27
} from './fields' ;
23
-
28
+ import { SpatialType , Neo4jPointDistanceFilter } from './types/spatial' ;
24
29
/**
25
30
* An enum describing the names of the input value definitions
26
31
* used for the field argument AST for data result pagination
@@ -326,10 +331,24 @@ const buildPropertyFilters = ({
326
331
} ) => {
327
332
let filters = [ ] ;
328
333
if (
334
+ isSpatialField ( { type : outputType } ) ||
335
+ isNeo4jPointType ( { type : outputType } )
336
+ ) {
337
+ filters = buildFilters ( {
338
+ fieldName,
339
+ fieldConfig : {
340
+ name : fieldName ,
341
+ type : {
342
+ name : outputType
343
+ }
344
+ } ,
345
+ filterTypes : [ 'not' , ...Object . values ( Neo4jPointDistanceFilter ) ]
346
+ } ) ;
347
+ } else if (
329
348
isIntegerField ( { type : outputType } ) ||
330
349
isFloatField ( { type : outputType } ) ||
331
350
isTemporalField ( { type : outputType } ) ||
332
- isNeo4jPropertyType ( { type : outputType } )
351
+ isNeo4jTemporalType ( { type : outputType } )
333
352
) {
334
353
filters = buildFilters ( {
335
354
fieldName,
@@ -339,7 +358,7 @@ const buildPropertyFilters = ({
339
358
name : outputType
340
359
}
341
360
} ,
342
- filterTypes : [ '_not ' , '_in ' , '_not_in ' , '_lt ' , '_lte ' , '_gt ' , '_gte ' ]
361
+ filterTypes : [ 'not ' , 'in ' , 'not_in ' , 'lt ' , 'lte ' , 'gt ' , 'gte ' ]
343
362
} ) ;
344
363
} else if ( isBooleanField ( { type : outputType } ) ) {
345
364
filters = buildFilters ( {
@@ -350,7 +369,7 @@ const buildPropertyFilters = ({
350
369
name : outputType
351
370
}
352
371
} ,
353
- filterTypes : [ '_not ' ]
372
+ filterTypes : [ 'not ' ]
354
373
} ) ;
355
374
} else if ( isStringField ( { kind : outputKind , type : outputType } ) ) {
356
375
if ( outputKind === Kind . ENUM_TYPE_DEFINITION ) {
@@ -362,7 +381,7 @@ const buildPropertyFilters = ({
362
381
name : outputType
363
382
}
364
383
} ,
365
- filterTypes : [ '_not ' , '_in ' , '_not_in ' ]
384
+ filterTypes : [ 'not ' , 'in ' , 'not_in ' ]
366
385
} ) ;
367
386
} else {
368
387
filters = buildFilters ( {
@@ -374,15 +393,15 @@ const buildPropertyFilters = ({
374
393
}
375
394
} ,
376
395
filterTypes : [
377
- '_not ' ,
378
- '_in ' ,
379
- '_not_in ' ,
380
- '_contains ' ,
381
- '_not_contains ' ,
382
- '_starts_with ' ,
383
- '_not_starts_with ' ,
384
- '_ends_with ' ,
385
- '_not_ends_with '
396
+ 'not ' ,
397
+ 'in ' ,
398
+ 'not_in ' ,
399
+ 'contains ' ,
400
+ 'not_contains ' ,
401
+ 'starts_with ' ,
402
+ 'not_starts_with ' ,
403
+ 'ends_with ' ,
404
+ 'not_ends_with '
386
405
]
387
406
} ) ;
388
407
}
@@ -394,25 +413,39 @@ const buildPropertyFilters = ({
394
413
* Builds the input value definitions that compose input object types
395
414
* used by filtering arguments
396
415
*/
397
- export const buildFilters = ( { fieldName, fieldConfig, filterTypes = [ ] } ) => [
398
- buildInputValue ( {
399
- name : buildName ( { name : fieldConfig . name } ) ,
400
- type : buildNamedType ( fieldConfig . type )
401
- } ) ,
402
- ...filterTypes . map ( filter => {
403
- let wrappers = { } ;
404
- if ( filter === '_in' || filter === '_not_in' ) {
405
- wrappers = {
406
- [ TypeWrappers . NON_NULL_NAMED_TYPE ] : true ,
407
- [ TypeWrappers . LIST_TYPE ] : true
408
- } ;
409
- }
410
- return buildInputValue ( {
411
- name : buildName ( { name : `${ fieldName } ${ filter } ` } ) ,
412
- type : buildNamedType ( {
413
- name : fieldConfig . type . name ,
414
- wrappers
416
+ export const buildFilters = ( { fieldName, fieldConfig, filterTypes = [ ] } ) => {
417
+ return filterTypes . reduce (
418
+ ( inputValues , name ) => {
419
+ const filterName = `${ fieldName } _${ name } ` ;
420
+ const isPointDistanceFilter = Object . values (
421
+ Neo4jPointDistanceFilter
422
+ ) . some ( distanceFilter => distanceFilter === name ) ;
423
+ const isListFilter = name === 'in' || name === 'not_in' ;
424
+ let wrappers = { } ;
425
+ if ( isListFilter ) {
426
+ wrappers = {
427
+ [ TypeWrappers . NON_NULL_NAMED_TYPE ] : true ,
428
+ [ TypeWrappers . LIST_TYPE ] : true
429
+ } ;
430
+ } else if ( isPointDistanceFilter ) {
431
+ fieldConfig . type . name = `${ Neo4jTypeName } ${ SpatialType . POINT } DistanceFilter` ;
432
+ }
433
+ inputValues . push (
434
+ buildInputValue ( {
435
+ name : buildName ( { name : filterName } ) ,
436
+ type : buildNamedType ( {
437
+ name : fieldConfig . type . name ,
438
+ wrappers
439
+ } )
440
+ } )
441
+ ) ;
442
+ return inputValues ;
443
+ } ,
444
+ [
445
+ buildInputValue ( {
446
+ name : buildName ( { name : fieldConfig . name } ) ,
447
+ type : buildNamedType ( fieldConfig . type )
415
448
} )
416
- } ) ;
417
- } )
418
- ] ;
449
+ ]
450
+ ) ;
451
+ } ;
0 commit comments