@@ -17,7 +17,9 @@ import {
17
17
getFieldValueType ,
18
18
extractTypeMapFromTypeDefs ,
19
19
addDirectiveDeclarations ,
20
- printTypeMap
20
+ printTypeMap ,
21
+ safeLabel ,
22
+ safeVar
21
23
} from './utils' ;
22
24
import { buildCypherSelection } from './selections' ;
23
25
import {
@@ -132,14 +134,16 @@ export function cypherQuery(
132
134
133
135
query = `WITH apoc.cypher.runFirstColumn("${
134
136
cypherQueryArg . value . value
135
- } ", ${ argString } , True) AS x UNWIND x AS ${ variableName }
136
- RETURN ${ variableName } {${ subQuery } } AS ${ variableName } ${ orderByValue } ${ outerSkipLimit } ` ;
137
+ } ", ${ argString } , True) AS x UNWIND x AS ${ safeVar ( variableName ) }
138
+ RETURN ${ safeVar ( variableName ) } {${ subQuery } } AS ${ safeVar (
139
+ variableName
140
+ ) } ${ orderByValue } ${ outerSkipLimit } `;
137
141
} else {
138
142
// No @cypher directive on QueryType
139
143
140
144
// FIXME: support IN for multiple values -> WHERE
141
145
const idWherePredicate =
142
- typeof _id !== 'undefined' ? `ID(${ variableName } )=${ _id } ` : '' ;
146
+ typeof _id !== 'undefined' ? `ID(${ safeVar ( variableName ) } )=${ _id } ` : '' ;
143
147
const nullFieldPredicates = Object . keys ( nullParams ) . map (
144
148
key => `${ variableName } .${ key } IS NULL`
145
149
) ;
@@ -149,9 +153,12 @@ export function cypherQuery(
149
153
const predicate = predicateClauses ? `WHERE ${ predicateClauses } ` : '' ;
150
154
151
155
query =
152
- `MATCH (${ variableName } :${ typeName } ${ argString } ) ${ predicate } ` +
153
- `RETURN ${ variableName } {${ subQuery } } AS ${ variableName } ${ orderByValue } ${ outerSkipLimit } ` ;
154
-
156
+ `MATCH (${ safeVar ( variableName ) } :${ safeLabel (
157
+ typeName
158
+ ) } ${ argString } ) ${ predicate } ` +
159
+ `RETURN ${ safeVar ( variableName ) } {${ subQuery } } AS ${ safeVar (
160
+ variableName
161
+ ) } ${ orderByValue } ${ outerSkipLimit } `;
155
162
}
156
163
157
164
return [ query , { ...nonNullParams , ...subParams } ] ;
@@ -227,10 +234,12 @@ export function cypherMutation(
227
234
cypherQueryArg . value . value
228
235
} ", ${ argString } ) YIELD value
229
236
WITH apoc.map.values(value, [keys(value)[0]])[0] AS ${ variableName }
230
- RETURN ${ variableName } {${ subQuery } } AS ${ variableName } ${ orderByValue } ${ outerSkipLimit } ` ;
237
+ RETURN ${ safeVar ( variableName ) } {${ subQuery } } AS ${ safeVar (
238
+ variableName
239
+ ) } ${ orderByValue } ${ outerSkipLimit } `;
231
240
} else if ( isCreateMutation ( resolveInfo ) ) {
232
- query = `CREATE (${ variableName } :${ typeName } ) ` ;
233
- query += `SET ${ variableName } = $params ` ;
241
+ query = `CREATE (${ safeVar ( variableName ) } :${ safeLabel ( typeName ) } ) ` ;
242
+ query += `SET ${ safeVar ( variableName ) } = $params ` ;
234
243
//query += `RETURN ${variable}`;
235
244
236
245
const [ subQuery , subParams ] = buildCypherSelection ( {
@@ -247,15 +256,17 @@ export function cypherMutation(
247
256
resolveInfo . fieldName
248
257
] . astNode . arguments ;
249
258
250
- const firstIdArg = args . find ( e => getFieldValueType ( e ) === "ID" ) ;
259
+ const firstIdArg = args . find ( e => getFieldValueType ( e ) === 'ID' ) ;
251
260
if ( firstIdArg ) {
252
261
const firstIdArgFieldName = firstIdArg . name . value ;
253
262
if ( params . params [ firstIdArgFieldName ] === undefined ) {
254
263
query += `SET ${ variableName } .${ firstIdArgFieldName } = apoc.create.uuid() ` ;
255
264
}
256
265
}
257
266
258
- query += `RETURN ${ variableName } {${ subQuery } } AS ${ variableName } ` ;
267
+ query += `RETURN ${ safeVar ( variableName ) } {${ subQuery } } AS ${ safeVar (
268
+ variableName
269
+ ) } `;
259
270
} else if ( isAddMutation ( resolveInfo ) ) {
260
271
let mutationMeta , relationshipNameArg , fromTypeArg , toTypeArg ;
261
272
@@ -332,25 +343,35 @@ export function cypherMutation(
332
343
paramIndex : 1 ,
333
344
rootVariableNames : {
334
345
from : `${ fromVar } ` ,
335
- to : `${ toVar } ` ,
346
+ to : `${ toVar } `
336
347
} ,
337
348
variableName : schemaType . name === fromType ? `${ toVar } ` : `${ fromVar } `
338
349
} ) ;
339
350
params = { ...params , ...subParams } ;
340
351
query = `
341
- MATCH (${ fromVar } :${ fromType } {${ fromParam } : $from.${ fromParam } })
342
- MATCH (${ toVar } :${ toType } {${ toParam } : $to.${ toParam } })
343
- CREATE (${ fromVar } )-[${ lowercased } _relation:${ relationshipName } ${
352
+ MATCH (${ safeVar ( fromVar ) } :${ safeLabel (
353
+ fromType
354
+ ) } {${ fromParam } : $from.${ fromParam } })
355
+ MATCH (${ safeVar ( toVar ) } :${ safeLabel (
356
+ toType
357
+ ) } {${ toParam } : $to.${ toParam } })
358
+ CREATE (${ safeVar ( fromVar ) } )-[${ safeVar (
359
+ lowercased + '_relation'
360
+ ) } :${ safeLabel ( relationshipName ) } ${
344
361
relationPropertyArguments ? ` {${ relationPropertyArguments } }` : ''
345
- } ]->(${ toVar } )
346
- RETURN ${ lowercased } _relation { ${ subQuery } } AS ${ schemaType } ;
362
+ } ]->(${ safeVar ( toVar ) } )
363
+ RETURN ${ safeVar ( lowercased + '_relation' ) } { ${ subQuery } } AS ${ safeVar (
364
+ schemaType
365
+ ) } ;
347
366
` ;
348
367
} else if ( isUpdateMutation ( resolveInfo ) ) {
349
368
const idParam = resolveInfo . schema . getMutationType ( ) . getFields ( ) [
350
369
resolveInfo . fieldName
351
370
] . astNode . arguments [ 0 ] . name . value ;
352
371
353
- query = `MATCH (${ variableName } :${ typeName } {${ idParam } : $params.${
372
+ query = `MATCH (${ safeVar ( variableName ) } :${ safeLabel (
373
+ typeName
374
+ ) } {${ idParam } : $params.${
354
375
resolveInfo . schema . getMutationType ( ) . getFields ( ) [ resolveInfo . fieldName ]
355
376
. astNode . arguments [ 0 ] . name . value
356
377
} }) `;
@@ -366,7 +387,9 @@ export function cypherMutation(
366
387
} ) ;
367
388
params = { ...params , ...subParams } ;
368
389
369
- query += `RETURN ${ variableName } {${ subQuery } } AS ${ variableName } ` ;
390
+ query += `RETURN ${ safeVar ( variableName ) } {${ subQuery } } AS ${ safeVar (
391
+ variableName
392
+ ) } `;
370
393
} else if ( isDeleteMutation ( resolveInfo ) ) {
371
394
const idParam = resolveInfo . schema . getMutationType ( ) . getFields ( ) [
372
395
resolveInfo . fieldName
@@ -384,14 +407,17 @@ export function cypherMutation(
384
407
385
408
// Cannot execute a map projection on a deleted node in Neo4j
386
409
// so the projection is executed and aliased before the delete
387
- query = `MATCH (${ variableName } :${ typeName } {${ idParam } : $${
410
+ query = `MATCH (${ safeVar ( variableName ) } :${ safeLabel (
411
+ typeName
412
+ ) } {${ idParam } : $${
388
413
resolveInfo . schema . getMutationType ( ) . getFields ( ) [ resolveInfo . fieldName ]
389
414
. astNode . arguments [ 0 ] . name . value
390
415
} })
391
- WITH ${ variableName } AS ${ variableName +
392
- '_toDelete' } , ${ variableName } {${ subQuery } } AS ${ variableName }
393
- DETACH DELETE ${ variableName + '_toDelete' }
394
- RETURN ${ variableName } ` ;
416
+ WITH ${ safeVar ( variableName ) } AS ${ safeVar (
417
+ variableName + '_toDelete'
418
+ ) } , ${ safeVar ( variableName ) } {${ subQuery } } AS ${ safeVar ( variableName ) }
419
+ DETACH DELETE ${ safeVar ( variableName + '_toDelete' ) }
420
+ RETURN ${ safeVar ( variableName ) } ` ;
395
421
} else if ( isRemoveMutation ( resolveInfo ) ) {
396
422
let mutationMeta , relationshipNameArg , fromTypeArg , toTypeArg ;
397
423
@@ -460,7 +486,7 @@ RETURN ${variableName}`;
460
486
from : `_${ fromVar } ` ,
461
487
to : `_${ toVar } `
462
488
} ,
463
- variableName : schemaType . name === fromType ? `_${ toVar } ` : `_${ fromVar } ` ,
489
+ variableName : schemaType . name === fromType ? `_${ toVar } ` : `_${ fromVar } `
464
490
} ) ;
465
491
params = { ...params , ...subParams } ;
466
492
@@ -470,13 +496,20 @@ RETURN ${variableName}`;
470
496
// object construction into a WITH statement above the DELETE, then return it
471
497
// the delete
472
498
query = `
473
- MATCH (${ fromVar } :${ fromType } {${ fromParam } : $from.${ fromParam } })
474
- MATCH (${ toVar } :${ toType } {${ toParam } : $to.${ toParam } })
475
- OPTIONAL MATCH (${ fromVar } )-[${ fromVar +
476
- toVar } :${ relationshipName } ]->(${ toVar } )
477
- DELETE ${ fromVar + toVar }
478
- WITH COUNT(*) AS scope, ${ fromVar } AS _${ fromVar } , ${ toVar } AS _${ toVar }
479
- RETURN {${ subQuery } } AS ${ schemaType } ;
499
+ MATCH (${ safeVar ( fromVar ) } :${ safeLabel (
500
+ fromType
501
+ ) } {${ fromParam } : $from.${ fromParam } })
502
+ MATCH (${ safeVar ( toVar ) } :${ safeLabel (
503
+ toType
504
+ ) } {${ toParam } : $to.${ toParam } })
505
+ OPTIONAL MATCH (${ safeVar ( fromVar ) } )-[${ safeVar (
506
+ fromVar + toVar
507
+ ) } :${ safeLabel ( relationshipName ) } ]->(${ safeVar ( toVar ) } )
508
+ DELETE ${ safeVar ( fromVar + toVar ) }
509
+ WITH COUNT(*) AS scope, ${ safeVar ( fromVar ) } AS ${ safeVar (
510
+ '_' + fromVar
511
+ ) } , ${ safeVar ( toVar ) } AS ${ safeVar ( '_' + toVar ) }
512
+ RETURN {${ subQuery } } AS ${ safeVar ( schemaType ) } ;
480
513
` ;
481
514
} else {
482
515
// throw error - don't know how to handle this type of mutation
@@ -527,9 +560,9 @@ export const makeAugmentedSchema = ({
527
560
} ) ;
528
561
} ;
529
562
530
- export const augmentTypeDefs = ( typeDefs ) => {
563
+ export const augmentTypeDefs = typeDefs => {
531
564
const typeMap = extractTypeMapFromTypeDefs ( typeDefs ) ;
532
565
// overwrites any provided declarations of system directives
533
566
const augmented = addDirectiveDeclarations ( typeMap ) ;
534
567
return printTypeMap ( augmented ) ;
535
- }
568
+ } ;
0 commit comments