in templates/JSResolverOCHTTPS.js [816:959]
function resolveGrapgDBqueryForGraphQLMutation (obj, querySchemaInfo) {
// createNode
if (querySchemaInfo.name.startsWith('createNode') && querySchemaInfo.graphQuery == null) {
const inputFields = transformFunctionInputParameters(obj.definitions[0].selectionSet.selections[0].arguments[0].value.fields, querySchemaInfo);
const nodeName = querySchemaInfo.name + '_' + querySchemaInfo.returnType;
let returnBlock = `ID(${nodeName})`;
if (obj.definitions[0].selectionSet.selections[0].selectionSet != undefined) {
returnBlock = returnStringOnly(obj.definitions[0].selectionSet.selections[0].selectionSet.selections, querySchemaInfo);
}
const ocQuery = `CREATE (${nodeName}:\`${querySchemaInfo.returnTypeAlias}\` {${inputFields.fields}})\nRETURN ${returnBlock}`;
return ocQuery;
}
// updateNode
if (querySchemaInfo.name.startsWith('updateNode') && querySchemaInfo.graphQuery == null) {
const inputFields = transformFunctionInputParameters(obj.definitions[0].selectionSet.selections[0].arguments[0].value.fields, querySchemaInfo);
const nodeID = inputFields.graphIdValue;
const nodeName = querySchemaInfo.name + '_' + querySchemaInfo.returnType;
let returnBlock = `ID(${nodeName})`;
if (obj.definitions[0].selectionSet.selections[0].selectionSet != undefined) {
returnBlock = returnStringOnly(obj.definitions[0].selectionSet.selections[0].selectionSet.selections, querySchemaInfo);
}
// :( SET += is not working, so let's work around it.
//let ocQuery = `MATCH (${nodeName}) WHERE ID(${nodeName}) = '${nodeID}' SET ${nodeName} += {${inputFields}} RETURN ${returnBlock}`;
// workaround:
const propertyList = inputFields.fields.split(', ');
let setString = '';
propertyList.forEach(property => {
let kv = property.split(': ');
setString = setString + ` ${nodeName}.${kv[0]} = ${kv[1]},`;
});
setString = setString.substring(0, setString.length - 1);
let param = nodeName + '_' + 'whereId';
Object.assign(parameters, {[param]: nodeID});
const ocQuery = `MATCH (${nodeName})\nWHERE ID(${nodeName}) = $${param}\nSET ${setString}\nRETURN ${returnBlock}`;
return ocQuery;
}
// deleteNode
if (querySchemaInfo.name.startsWith('deleteNode') && querySchemaInfo.graphQuery == null) {
const nodeID = obj.definitions[0].selectionSet.selections[0].arguments[0].value.value;
const nodeName = querySchemaInfo.name + '_' + querySchemaInfo.returnType;
let param = nodeName + '_' + 'whereId';
Object.assign(parameters, {[param]: nodeID});
const ocQuery = `MATCH (${nodeName})\nWHERE ID(${nodeName}) = $${param}\nDETACH DELETE ${nodeName}\nRETURN true`;
return ocQuery;
}
// connect
if (querySchemaInfo.name.startsWith('connectNode') && querySchemaInfo.graphQuery == null) {
let fromID = obj.definitions[0].selectionSet.selections[0].arguments[0].value.value;
let toID = obj.definitions[0].selectionSet.selections[0].arguments[1].value.value;
const edgeType = querySchemaInfo.name.match(new RegExp('Edge' + "(.*)" + ''))[1];
const edgeName = querySchemaInfo.name + '_' + querySchemaInfo.returnType;
const egdgeTypeAlias = getTypeAlias(edgeType);
const returnBlock = returnStringOnly(obj.definitions[0].selectionSet.selections[0].selectionSet.selections, querySchemaInfo);
let paramFromId = edgeName + '_' + 'whereFromId';
let paramToId = edgeName + '_' + 'whereToId';
Object.assign(parameters, {[paramFromId]: fromID});
Object.assign(parameters, {[paramToId]: toID});
if (obj.definitions[0].selectionSet.selections[0].arguments.length > 2) {
const inputFields = transformFunctionInputParameters(obj.definitions[0].selectionSet.selections[0].arguments[2].value.fields, querySchemaInfo);
const ocQuery = `MATCH (from), (to)\nWHERE ID(from) = $${paramFromId} AND ID(to) = $${paramToId}\nCREATE (from)-[${edgeName}:\`${egdgeTypeAlias}\`{${inputFields.fields}}]->(to)\nRETURN ${returnBlock}`;
return ocQuery;
} else {
const ocQuery = `MATCH (from), (to)\nWHERE ID(from) = $${paramFromId} AND ID(to) = $${paramToId}\nCREATE (from)-[${edgeName}:\`${egdgeTypeAlias}\`]->(to)\nRETURN ${returnBlock}`;
return ocQuery;
}
}
// updateEdge
if (querySchemaInfo.name.startsWith('updateEdge') && querySchemaInfo.graphQuery == null) {
let fromID = obj.definitions[0].selectionSet.selections[0].arguments[0].value.value;
let toID = obj.definitions[0].selectionSet.selections[0].arguments[1].value.value;
let edgeType = querySchemaInfo.name.match(new RegExp('updateEdge' + "(.*)" + 'From'))[1];
let egdgeTypeAlias = getTypeAlias(edgeType);
const inputFields = transformFunctionInputParameters(obj.definitions[0].selectionSet.selections[0].arguments[2].value.fields, querySchemaInfo);
const edgeName = querySchemaInfo.name + '_' + querySchemaInfo.returnType;
let returnBlock = `ID(${edgeName})`;
if (obj.definitions[0].selectionSet.selections[0].selectionSet != undefined) {
returnBlock = returnStringOnly(obj.definitions[0].selectionSet.selections[0].selectionSet.selections, querySchemaInfo);
}
const propertyList = inputFields.fields.split(', ');
let setString = '';
propertyList.forEach(property => {
let kv = property.split(': ');
setString = setString + ` ${edgeName}.${kv[0]} = ${kv[1]},`;
});
setString = setString.substring(0, setString.length - 1);
const paramFromId = edgeName + '_' + 'whereFromId';
const paramToId = edgeName + '_' + 'whereToId';
Object.assign(parameters, {[paramFromId]: fromID});
Object.assign(parameters, {[paramToId]: toID});
const ocQuery = `MATCH (from)-[${edgeName}:$\`${egdgeTypeAlias}\`]->(to)\nWHERE ID(from) = $${paramFromId} AND ID(to) = $${paramToId}\nSET ${setString}\nRETURN ${returnBlock}`;
return ocQuery;
}
// deleteEdge
if (querySchemaInfo.name.startsWith('deleteEdge') && querySchemaInfo.graphQuery == null) {
let fromID = obj.definitions[0].selectionSet.selections[0].arguments[0].value.value;
let toID = obj.definitions[0].selectionSet.selections[0].arguments[1].value.value;
const edgeName = querySchemaInfo.name + '_' + querySchemaInfo.returnType;
const paramFromId = edgeName + '_' + 'whereFromId';
const paramToId = edgeName + '_' + 'whereToId';
Object.assign(parameters, {[paramFromId]: fromID});
Object.assign(parameters, {[paramToId]: toID});
const ocQuery = `MATCH (from)-[${edgeName}]->(to)\nWHERE ID(from) = $${paramFromId} AND ID(to) = $${paramToId}\nDELETE ${edgeName}\nRETURN true`;
return ocQuery;
}
// graph query directive
if (querySchemaInfo.graphQuery != null) {
let ocQuery = querySchemaInfo.graphQuery;
if (ocQuery.includes('$input')) {
const inputFields = transformFunctionInputParameters(obj.definitions[0].selectionSet.selections[0].arguments[0].value.fields, querySchemaInfo);
ocQuery = ocQuery.replace('$input', inputFields.fields);
} else {
obj.definitions[0].selectionSet.selections[0].arguments.forEach(arg => {
ocQuery = ocQuery.replace('$' + arg.name.value, arg.value.value);
});
}
if (ocQuery.includes('RETURN')) {
const statements = ocQuery.split(' RETURN ');
const entityName = querySchemaInfo.name + '_' + querySchemaInfo.returnType;
const body = statements[0].replace("this", entityName);
const returnBlock = returnStringOnly(obj.definitions[0].selectionSet.selections[0].selectionSet.selections, querySchemaInfo);
ocQuery = body + '\nRETURN ' + returnBlock;
}
return ocQuery;
}
return '';
}