Skip to content

Commit 87e92ac

Browse files
committed
Merge branch 'datetime-filtering' into add-tool-for-creating-graphql-server
2 parents cc6d621 + 69843e1 commit 87e92ac

File tree

3 files changed

+104
-33
lines changed

3 files changed

+104
-33
lines changed

graphql-resolver-generator/generator.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,16 @@ def generate(input_file, output_dir):
3939
'name': camelCase(type_name),
4040
'fields': [],
4141
'edgeFields': [],
42+
'DateTime': [],
4243
'hasKeyDirective': f'_KeyFor{type_name}' in schema.type_map.keys()
4344
}
4445
# add object fields
4546
for field_name, field_type in _type.fields.items():
4647
inner_field_type = get_named_type(field_type.type)
4748
if is_schema_defined_object_type(inner_field_type) or is_interface_type(inner_field_type):
4849
t['fields'].append(field_name)
50+
if inner_field_type.name == 'DateTime':
51+
t['DateTime'].append(field_name)
4952
if field_name[0] == '_':
5053
continue
5154
if is_schema_defined_object_type(inner_field_type) or is_interface_type(inner_field_type):

graphql-resolver-generator/resources/resolver.template

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ const resolvers = {
6767
% for type in data['types']:
6868
${type['Name']}: {
6969
id: (parent, args, context, info) => parent._id,
70+
% for field in type['DateTime']:
71+
${field}: async (parent, args, context, info) => new Date(parent.${field}),
72+
% endfor
7073
% for field in type['fields']:
7174
${field}: async (parent, args, context, info) =>
7275
await driver.getEdge(parent, args, info),

graphql-server/drivers/arangodb/driver.js

Lines changed: 98 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -191,16 +191,7 @@ function getScalarOrEnumFields(type) {
191191
*/
192192
function getScalarsAndEnums(object, type){
193193
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);
204195
}
205196

206197
/**
@@ -281,7 +272,7 @@ async function getEdge(parent, args, info){
281272
// add filters
282273
let query_filters = [];
283274
if(args.filter != undefined && !isEmptyObject(args.filter)){
284-
let filters = getFilters(args.filter);
275+
let filters = getFilters(args.filter, info);
285276
for(let i in filters){
286277
i == 0 ? query_filters.push(aql`FILTER`) : query_filters.push(aql`AND`);
287278
query_filters = query_filters.concat(filters[i]);
@@ -319,15 +310,16 @@ async function create(isRoot, ctxt, data, returnType, info){
319310
// check key
320311
validateKey(ctxt, data, returnType, info.schema);
321312

322-
//Set creationDate
323-
data['_creationDate'] = new Date();
324313

325314
// Do not increment the var counter
326315
let resVar = getVar(ctxt, false);
327316
let from = asAQLVar(resVar);
328317

329318
// add doc
330319
let doc = getScalarsAndEnums(data, returnType);
320+
//Set creationDate
321+
let date = new Date();
322+
doc['_creationDate'] = date.valueOf();
331323
let docVar = getParamVar(ctxt);
332324
let aqlDocVar = asAQLVar(`params.${docVar}`);
333325
let collection = asAQLVar(`db.${returnType.name}`);
@@ -421,9 +413,11 @@ async function createEdge(isRoot, ctxt, source, sourceType, sourceField, target,
421413
if(annotations !== undefined) {
422414
doc = annotations;
423415
}
416+
doc = formatFixInput(doc, doc, info.returnType);
424417
doc['_from'] = source;
425418
doc['_to'] = target;
426-
doc['_creationDate'] = new Date();
419+
let date = new Date();
420+
doc['_creationDate'] = date.valueOf();
427421
let docVar = getParamVar(ctxt);
428422
let aqlDocVar = asAQLVar(`params.${docVar}`);
429423
let collection = asAQLVar(`db.${returnTypeName}`);
@@ -577,13 +571,14 @@ async function update(isRoot, ctxt, id, data, returnType, info){
577571
}
578572
}
579573

580-
//Update lastUpdateDate
581-
data['_lastUpdateDate'] = new Date();
582574

583575
// add doc
584576
// Do not increment the var counter
585577
let resVar = getVar(ctxt, false);
586578
let doc = getScalarsAndEnums(data, returnType);
579+
//Update lastUpdateDate
580+
let date = new Date();
581+
doc['_lastUpdateDate'] = date.valueOf();
587582
let docVar = getParamVar(ctxt);
588583
ctxt.trans.write.add(returnType.name);
589584
ctxt.trans.params[docVar] = doc;
@@ -682,7 +677,64 @@ function asAqlArray(array){
682677
return q;
683678
}
684679

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){
686738
let filters = [];
687739
for(let i in filter_arg){
688740
let filter = filter_arg[i];
@@ -697,7 +749,7 @@ function getFilters(filter_arg){
697749
if(x != 0){
698750
f.push(aql`AND`);
699751
}
700-
let arr = getFilters(filter[x]);
752+
let arr = getFilters(filter[x], info);
701753
for(let j in arr){
702754
f = f.concat(arr[j]);
703755
}
@@ -714,7 +766,7 @@ function getFilters(filter_arg){
714766
if(x != 0){
715767
f.push(aql`OR`);
716768
}
717-
let arr = getFilters(filter[x]);
769+
let arr = getFilters(filter[x], info);
718770
for(let j in arr){
719771
f = f.concat(arr[j]);
720772
}
@@ -727,7 +779,7 @@ function getFilters(filter_arg){
727779
if(i == '_not'){
728780
let f = [];
729781
f.push(aql`NOT (`);
730-
let arr = getFilters(filter);
782+
let arr = getFilters(filter, info);
731783
for(let j in arr){
732784
f = f.concat(arr[j]);
733785
}
@@ -736,50 +788,63 @@ function getFilters(filter_arg){
736788
}
737789

738790
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}`]);
740793
}
741794
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}`]);
743797
}
744798
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}`]);
746801
}
747802
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}`]);
749805
}
750806
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}`]);
752809
}
753810
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}`]);
755813
}
756814
if(filter._in != null){
815+
let preparedArgs = formatFixVariableWrapper(i, info, filter._in)
757816
let q = [];
758817
q = q.concat([aql`x.${i} IN `]);
759-
q = q.concat(asAqlArray(filter._in));
818+
q = q.concat(asAqlArray(preparedArgs));
760819
filters.push(q);
761820
}
762821
if(filter._nin != null){
822+
let preparedArgs = formatFixVariableWrapper(i, info, filter._nin);
763823
let q = [];
764824
q = q.concat([aql`x.${i} NOT IN `]);
765-
q = q.concat(asAqlArray(filter._nin));
825+
q = q.concat(asAqlArray(preparedArgs));
766826
filters.push(q);
767827
}
768828

769829
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)`]);
771832
}
772833
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)`]);
774836
}
775837
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)`]);
777840
}
778841
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)`]);
780844
}
781845

782846
}
847+
783848
return filters;
784849
}
785850

@@ -827,7 +892,7 @@ async function getList(args, info){
827892
// add filters
828893
let query_filters = [];
829894
if(args.filter != undefined && !isEmptyObject(args.filter)){
830-
let filters = getFilters(args.filter);
895+
let filters = getFilters(args.filter, info);
831896
if(filters.length > 0) {
832897
query_filters.push(aql`FILTER`);
833898
for (let i in filters) {

0 commit comments

Comments
 (0)