-
Notifications
You must be signed in to change notification settings - Fork 0
/
graphql-marklogic.sjs
101 lines (89 loc) · 3.01 KB
/
graphql-marklogic.sjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*
* Module which interfaces with Ruben Taelman's JavaScript libraries
*
* Version: 1.0.0
* Author: Charles Foster
*
* Copyright 2019 XML London Limited. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var graphqlToSparql = require("lib/graphql-to-sparql.js");
var sparqlAlgebra = require("lib/sparqlalgebrajs.js");
var sparqlJsonToTree = require("lib/sparqljson-to-tree.js");
var sem = require("/MarkLogic/semantics.xqy");
// ---------- The following variable is injected in from XQRS ------------
var pObject;
pObject = JSON.parse(pObject);
// -----------------------------------------------------------------------
/* GraphQL Query as a String */
var pQuery = pObject["query"];
/* GraphQL Config JSON Object */
var pConfig = pObject["config"];
/* alternative behaviour "sparql-results", "show-sparql-query" */
var pAction = pObject["action"];
var context = pConfig["context"];
var schema = pConfig["schema"];
var materializeRdfJsTermsOption = pConfig["materializeRdfJsTerms"];
/** Converts GraphQL to SPARQL **/
function graphql2sparql(query, context) {
var algebra =
new graphqlToSparql.Converter().graphqlToSparqlAlgebra(query, context);
return sparqlAlgebra.toSparql(algebra);
}
/** Execute SPARQL Query, results come back as SPARQL Results JSON **/
function executeSparql(sparqlQuery) {
return sem.queryResultsSerialize(sem.sparql(sparqlQuery), "json");
}
/** Converts SPARQL Results to a JSON Tree **/
function toJSONTree(
sparqlJsonResults,
materializeRdfJsTermsOption,
schema) {
var resultsToTreeConverter = new sparqlJsonToTree.Converter(
{
// The string to split variable names by. (Default: '_')
delimiter: "_",
// If terms should be converted to their raw value instead
// of being represented as RDFJS terms (Default: false)
materializeRdfJsTerms: materializeRdfJsTermsOption
});
return (
resultsToTreeConverter.sparqlJsonResultsToTree(sparqlJsonResults, schema)
);
}
var sparqlQuery = sparqlQuery = graphql2sparql(pQuery, context);
if(pAction == "show-sparql-query")
{
// Just show the SPARQL Query Generated (for debugging purposes)
sparqlQuery;
}
else
{
// Execute the Query and produce the result
var sparqlJSONResults = JSON.parse(executeSparql(sparqlQuery));
if(pAction == "sparql-results")
{
// Produce SPARQL JSON Results
sparqlJSONResults;
}
else // (DEFAULT BEHAVIOUR)
{
// Produce GraphQL Result JSON
toJSONTree(
sparqlJSONResults,
materializeRdfJsTermsOption,
schema
);
}
}