@@ -191,16 +191,7 @@ function getScalarOrEnumFields(type) {
191
191
*/
192
192
function getScalarsAndEnums ( object , type ) {
193
193
let doc = { } ;
194
- for ( let i in type . getFields ( ) ) {
195
- let field = type . getFields ( ) [ i ] ;
196
- let t = graphql . getNamedType ( field . type ) ;
197
- if ( graphql . isEnumType ( t ) || graphql . isScalarType ( t ) ) {
198
- if ( object [ field . name ] !== undefined ) {
199
- doc [ field . name ] = object [ field . name ] ;
200
- }
201
- }
202
- }
203
- return doc ;
194
+ return formatFixInput ( doc , object , type ) ;
204
195
}
205
196
206
197
/**
@@ -281,7 +272,7 @@ async function getEdge(parent, args, info){
281
272
// add filters
282
273
let query_filters = [ ] ;
283
274
if ( args . filter != undefined && ! isEmptyObject ( args . filter ) ) {
284
- let filters = getFilters ( args . filter ) ;
275
+ let filters = getFilters ( args . filter , info ) ;
285
276
for ( let i in filters ) {
286
277
i == 0 ? query_filters . push ( aql `FILTER` ) : query_filters . push ( aql `AND` ) ;
287
278
query_filters = query_filters . concat ( filters [ i ] ) ;
@@ -319,15 +310,16 @@ async function create(isRoot, ctxt, data, returnType, info){
319
310
// check key
320
311
validateKey ( ctxt , data , returnType , info . schema ) ;
321
312
322
- //Set creationDate
323
- data [ '_creationDate' ] = new Date ( ) ;
324
313
325
314
// Do not increment the var counter
326
315
let resVar = getVar ( ctxt , false ) ;
327
316
let from = asAQLVar ( resVar ) ;
328
317
329
318
// add doc
330
319
let doc = getScalarsAndEnums ( data , returnType ) ;
320
+ //Set creationDate
321
+ let date = new Date ( ) ;
322
+ doc [ '_creationDate' ] = date . valueOf ( ) ;
331
323
let docVar = getParamVar ( ctxt ) ;
332
324
let aqlDocVar = asAQLVar ( `params.${ docVar } ` ) ;
333
325
let collection = asAQLVar ( `db.${ returnType . name } ` ) ;
@@ -421,9 +413,11 @@ async function createEdge(isRoot, ctxt, source, sourceType, sourceField, target,
421
413
if ( annotations !== undefined ) {
422
414
doc = annotations ;
423
415
}
416
+ doc = formatFixInput ( doc , doc , info . returnType ) ;
424
417
doc [ '_from' ] = source ;
425
418
doc [ '_to' ] = target ;
426
- doc [ '_creationDate' ] = new Date ( ) ;
419
+ let date = new Date ( ) ;
420
+ doc [ '_creationDate' ] = date . valueOf ( ) ;
427
421
let docVar = getParamVar ( ctxt ) ;
428
422
let aqlDocVar = asAQLVar ( `params.${ docVar } ` ) ;
429
423
let collection = asAQLVar ( `db.${ returnTypeName } ` ) ;
@@ -577,13 +571,14 @@ async function update(isRoot, ctxt, id, data, returnType, info){
577
571
}
578
572
}
579
573
580
- //Update lastUpdateDate
581
- data [ '_lastUpdateDate' ] = new Date ( ) ;
582
574
583
575
// add doc
584
576
// Do not increment the var counter
585
577
let resVar = getVar ( ctxt , false ) ;
586
578
let doc = getScalarsAndEnums ( data , returnType ) ;
579
+ //Update lastUpdateDate
580
+ let date = new Date ( ) ;
581
+ doc [ '_lastUpdateDate' ] = date . valueOf ( ) ;
587
582
let docVar = getParamVar ( ctxt ) ;
588
583
ctxt . trans . write . add ( returnType . name ) ;
589
584
ctxt . trans . params [ docVar ] = doc ;
@@ -682,7 +677,64 @@ function asAqlArray(array){
682
677
return q ;
683
678
}
684
679
685
- function getFilters ( filter_arg ) {
680
+ /**
681
+ * Converts all values of enum or scalar type in inputDoc to mach format used for storage in the database,
682
+ * and return result in output map
683
+ * @param map to be changed and returned, map to be used as input, type
684
+ * @returns map given as output
685
+ */
686
+ function formatFixInput ( outputDoc , inputDoc , type ) {
687
+ // Adds scalar/enum values to outputDoc
688
+ for ( let i in type . getFields ( ) ) {
689
+ let field = type . getFields ( ) [ i ] ;
690
+ let t = graphql . getNamedType ( field . type ) ;
691
+ if ( graphql . isEnumType ( t ) || graphql . isScalarType ( t ) ) {
692
+ if ( inputDoc [ field . name ] !== undefined ) {
693
+ outputDoc [ field . name ] = formatFixVariable ( t , inputDoc [ field . name ] ) ;
694
+ }
695
+ }
696
+ }
697
+ return outputDoc ;
698
+ }
699
+
700
+ /**
701
+ * Convert input data (value) to match format used for storage in the database
702
+ * @param type (of field), value
703
+ * @returns value (in database ready format)
704
+ */
705
+ function formatFixVariable ( _type , v ) {
706
+ // DateTime has to be handled separately, which is currently the only reason for this function to exist
707
+ if ( _type == 'DateTime' )
708
+ // Arrays of DateTime needs special, special care.
709
+ if ( Array . isArray ( v ) ) {
710
+ let newV = [ ]
711
+ for ( let i in v )
712
+ newV . push ( aql `DATE_TIMESTAMP(${ v } )` ) ;
713
+ return newV ;
714
+ }
715
+ else
716
+ return aql `DATE_TIMESTAMP(${ v } )` ;
717
+ else
718
+ return v ;
719
+ }
720
+
721
+ /**
722
+ * A small wrapper used by getFilters to call formatFixVariable.
723
+ * @param field, info, value
724
+ * @returns value (in database ready format)
725
+ */
726
+ function formatFixVariableWrapper ( field , info , v ) {
727
+ // no need to even try when we have _id as field
728
+ if ( field == '_id' )
729
+ return v ;
730
+
731
+ let namedReturnType = graphql . getNamedType ( info . returnType . getFields ( ) [ 'content' ] . type )
732
+ let _type = graphql . getNamedType ( namedReturnType . getFields ( ) [ field ] . type ) ;
733
+
734
+ return formatFixVariable ( _type , v ) ;
735
+ }
736
+
737
+ function getFilters ( filter_arg , info ) {
686
738
let filters = [ ] ;
687
739
for ( let i in filter_arg ) {
688
740
let filter = filter_arg [ i ] ;
@@ -697,7 +749,7 @@ function getFilters(filter_arg){
697
749
if ( x != 0 ) {
698
750
f . push ( aql `AND` ) ;
699
751
}
700
- let arr = getFilters ( filter [ x ] ) ;
752
+ let arr = getFilters ( filter [ x ] , info ) ;
701
753
for ( let j in arr ) {
702
754
f = f . concat ( arr [ j ] ) ;
703
755
}
@@ -714,7 +766,7 @@ function getFilters(filter_arg){
714
766
if ( x != 0 ) {
715
767
f . push ( aql `OR` ) ;
716
768
}
717
- let arr = getFilters ( filter [ x ] ) ;
769
+ let arr = getFilters ( filter [ x ] , info ) ;
718
770
for ( let j in arr ) {
719
771
f = f . concat ( arr [ j ] ) ;
720
772
}
@@ -727,7 +779,7 @@ function getFilters(filter_arg){
727
779
if ( i == '_not' ) {
728
780
let f = [ ] ;
729
781
f . push ( aql `NOT (` ) ;
730
- let arr = getFilters ( filter ) ;
782
+ let arr = getFilters ( filter , info ) ;
731
783
for ( let j in arr ) {
732
784
f = f . concat ( arr [ j ] ) ;
733
785
}
@@ -736,50 +788,63 @@ function getFilters(filter_arg){
736
788
}
737
789
738
790
if ( filter . _eq != null ) {
739
- filters . push ( [ aql `x.${ i } == ${ filter . _eq } ` ] ) ;
791
+ let preparedArg = formatFixVariableWrapper ( i , info , filter . _eq ) ;
792
+ filters . push ( [ aql `x.${ i } == ${ preparedArg } ` ] ) ;
740
793
}
741
794
if ( filter . _neq != null ) {
742
- filters . push ( [ aql `x.${ i } != ${ filter . _neq } ` ] ) ;
795
+ let preparedArgs = formatFixVariableWrapper ( i , info , filter . _neq ) ;
796
+ filters . push ( [ aql `x.${ i } != ${ preparedArgs } ` ] ) ;
743
797
}
744
798
if ( filter . _gt != null ) {
745
- filters . push ( [ aql `x.${ i } > ${ filter . _gt } ` ] ) ;
799
+ let preparedArgs = formatFixVariableWrapper ( i , info , filter . _gt ) ;
800
+ filters . push ( [ aql `x.${ i } > ${ preparedArgs } ` ] ) ;
746
801
}
747
802
if ( filter . _egt != null ) {
748
- filters . push ( [ aql `x.${ i } >= ${ filter . _egt } ` ] ) ;
803
+ let preparedArgs = formatFixVariableWrapper ( i , info , filter . _egt ) ;
804
+ filters . push ( [ aql `x.${ i } >= ${ preparedArgs } ` ] ) ;
749
805
}
750
806
if ( filter . _lt != null ) {
751
- filters . push ( [ aql `x.${ i } < ${ filter . _lt } ` ] ) ;
807
+ let preparedArgs = formatFixVariableWrapper ( i , info , filter . _lt ) ;
808
+ filters . push ( [ aql `x.${ i } < ${ preparedArgs } ` ] ) ;
752
809
}
753
810
if ( filter . _elt != null ) {
754
- filters . push ( [ aql `x.${ i } <= ${ filter . _elt } ` ] ) ;
811
+ let preparedArgs = formatFixVariableWrapper ( i , info , filter . _elt ) ;
812
+ filters . push ( [ aql `x.${ i } <= ${ preparedArgs } ` ] ) ;
755
813
}
756
814
if ( filter . _in != null ) {
815
+ let preparedArgs = formatFixVariableWrapper ( i , info , filter . _in )
757
816
let q = [ ] ;
758
817
q = q . concat ( [ aql `x.${ i } IN ` ] ) ;
759
- q = q . concat ( asAqlArray ( filter . _in ) ) ;
818
+ q = q . concat ( asAqlArray ( preparedArgs ) ) ;
760
819
filters . push ( q ) ;
761
820
}
762
821
if ( filter . _nin != null ) {
822
+ let preparedArgs = formatFixVariableWrapper ( i , info , filter . _nin ) ;
763
823
let q = [ ] ;
764
824
q = q . concat ( [ aql `x.${ i } NOT IN ` ] ) ;
765
- q = q . concat ( asAqlArray ( filter . _nin ) ) ;
825
+ q = q . concat ( asAqlArray ( preparedArgs ) ) ;
766
826
filters . push ( q ) ;
767
827
}
768
828
769
829
if ( filter . _like != null ) {
770
- filters . push ( [ aql `LIKE(x.${ i } , ${ filter . _like } , false)` ] ) ;
830
+ let preparedArgs = formatFixVariableWrapper ( i , info , filter . _like ) ;
831
+ filters . push ( [ aql `LIKE(x.${ i } , ${ preparedArgs } , false)` ] ) ;
771
832
}
772
833
if ( filter . _ilike != null ) {
773
- filters . push ( [ aql `LIKE(x.${ i } , ${ filter . _ilike } , true)` ] ) ;
834
+ let preparedArgs = formatFixVariableWrapper ( i , info , filter . _ilike ) ;
835
+ filters . push ( [ aql `LIKE(x.${ i } , ${ preparedArgs } , true)` ] ) ;
774
836
}
775
837
if ( filter . _nlike != null ) {
776
- filters . push ( [ aql `NOT LIKE(x.${ i } , ${ filter . _nlike } , false)` ] ) ;
838
+ let preparedArgs = formatFixVariableWrapper ( i , info , filter . _nlike ) ;
839
+ filters . push ( [ aql `NOT LIKE(x.${ i } , ${ preparedArgs } , false)` ] ) ;
777
840
}
778
841
if ( filter . _nilike != null ) {
779
- filters . push ( [ aql `NOT LIKE(x.${ i } , ${ filter . _nilike } , true)` ] ) ;
842
+ let preparedArgs = formatFixVariableWrapper ( i , info , filter . _nilike ) ;
843
+ filters . push ( [ aql `NOT LIKE(x.${ i } , ${ preparedArgs } , true)` ] ) ;
780
844
}
781
845
782
846
}
847
+
783
848
return filters ;
784
849
}
785
850
@@ -827,7 +892,7 @@ async function getList(args, info){
827
892
// add filters
828
893
let query_filters = [ ] ;
829
894
if ( args . filter != undefined && ! isEmptyObject ( args . filter ) ) {
830
- let filters = getFilters ( args . filter ) ;
895
+ let filters = getFilters ( args . filter , info ) ;
831
896
if ( filters . length > 0 ) {
832
897
query_filters . push ( aql `FILTER` ) ;
833
898
for ( let i in filters ) {
0 commit comments