graphql-to-sparql
Version:
Converts GraphQL queries to SPARQL queries
85 lines • 4.24 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.NodeHandlerDocument = void 0;
const sparqlalgebrajs_1 = require("sparqlalgebrajs");
const NodeHandlerAdapter_1 = require("./NodeHandlerAdapter");
/**
* Converts GraphQL documents to joined operations for all its definitions.
*/
class NodeHandlerDocument extends NodeHandlerAdapter_1.NodeHandlerAdapter {
constructor(util, settings) {
super('Document', util, settings);
}
handle(document, convertContext) {
const definitionOperations = document.definitions
.map((definition) => {
const subjectOutput = this.getNodeQuadContextDefinitionNode(definition, Object.assign(Object.assign({}, convertContext), { ignoreUnknownVariables: true }));
const queryParseContext = Object.assign(Object.assign({}, convertContext), { graph: subjectOutput.graph || convertContext.graph, subject: subjectOutput.subject || this.util.dataFactory.blankNode() });
let definitionOperation = this.util.handleNode(definition, queryParseContext);
if (subjectOutput && subjectOutput.auxiliaryPatterns) {
definitionOperation = this.util.joinOperations([
definitionOperation,
this.util.operationFactory.createBgp(subjectOutput.auxiliaryPatterns),
]);
}
return definitionOperation;
});
const operation = this.util.operationFactory.createProject(definitionOperations.length === 1 ? definitionOperations[0] : this.util.operationFactory.createUnion(definitionOperations), convertContext.terminalVariables);
// Convert blank nodes to variables
return this.translateBlankNodesToVariables(operation);
}
/**
* Get the quad context of a definition node that should be used for the whole definition node.
* @param {DefinitionNode} definition A definition node.
* @param {IConvertContext} convertContext A convert context.
* @return {INodeQuadContext} The subject and optional auxiliary patterns.
*/
getNodeQuadContextDefinitionNode(definition, convertContext) {
if (definition.kind === 'OperationDefinition') {
return this.getNodeQuadContextSelectionSet(definition.selectionSet, definition.name ? definition.name.value : '', convertContext);
}
throw new Error(`Unsupported definition: ${definition.kind}`);
}
/**
* Translates blank nodes inside the query to variables.
* @param {Project} operation The operation to translate.
* @return {Operation} The transformed operation.
*/
translateBlankNodesToVariables(operation) {
const self = this;
const blankToVariableMapping = {};
const variablesRaw = Array.from(operation.variables)
.reduce((acc, variable) => {
acc[variable.value] = true;
return acc;
}, {});
return sparqlalgebrajs_1.Util.mapOperation(operation, {
path: (op, factory) => {
return {
recurse: false,
result: factory.createPath(blankToVariable(op.subject), op.predicate, blankToVariable(op.object), blankToVariable(op.graph)),
};
},
pattern: (op, factory) => {
return {
recurse: false,
result: factory.createPattern(blankToVariable(op.subject), blankToVariable(op.predicate), blankToVariable(op.object), blankToVariable(op.graph)),
};
},
});
function blankToVariable(term) {
if (term.termType === 'BlankNode') {
let variable = blankToVariableMapping[term.value];
if (!variable) {
variable = sparqlalgebrajs_1.Util.createUniqueVariable(term.value, variablesRaw, self.util.dataFactory);
variablesRaw[variable.value] = true;
blankToVariableMapping[term.value] = variable;
}
return variable;
}
return term;
}
}
}
exports.NodeHandlerDocument = NodeHandlerDocument;
//# sourceMappingURL=NodeHandlerDocument.js.map