sparnatural
Version:
Visual client-side SPARQL query builder and knowledge graph exploration tool
155 lines • 7.76 kB
JavaScript
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _JsonV13SparqlTranslator_instances, _JsonV13SparqlTranslator_addGroupBy, _JsonV13SparqlTranslator_needsGrouping, _JsonV13SparqlTranslator_createWhereClause, _JsonV13SparqlTranslator_varsToRDFJS, _JsonV13SparqlTranslator_orderFromSolutionModifiers, _JsonV13SparqlTranslator_insertDefaultLabelVar;
import SparqlFactory from "../SparqlFactory";
import { DataFactory } from "rdf-data-factory";
import QueryWhereTranslatorV13 from "./QueryWhereTranslatorV13";
const factory = new DataFactory();
export class JsonV13SparqlTranslator {
constructor(
// the Sparnatural configuration
specProvider,
// settings
settings) {
_JsonV13SparqlTranslator_instances.add(this);
this.prefixes = {};
this.defaultLabelVars = [];
this.specProvider = specProvider;
this.settings = settings;
}
/**
*
* @param jsonQuery the sparnaturalV13 JSON query
* @returns a SPARQL query translated from the Sparnatural JSON query structure
*/
generateQuery(jsonQuery) {
this.jsonQuery = jsonQuery;
const sparqlJsQuery = {
queryType: "SELECT",
distinct: jsonQuery.distinct,
type: "query",
variables: __classPrivateFieldGet(this, _JsonV13SparqlTranslator_instances, "m", _JsonV13SparqlTranslator_varsToRDFJS).call(this, jsonQuery.variables),
where: __classPrivateFieldGet(this, _JsonV13SparqlTranslator_instances, "m", _JsonV13SparqlTranslator_createWhereClause).call(this),
prefixes: this.prefixes,
order: __classPrivateFieldGet(this, _JsonV13SparqlTranslator_instances, "m", _JsonV13SparqlTranslator_orderFromSolutionModifiers).call(this, jsonQuery),
// sets a limit if provided, otherwise leave to undefined
limit: jsonQuery.solutionModifiers?.limitOffset?.limit > 0
? jsonQuery.solutionModifiers.limitOffset.limit
: undefined,
};
// if the RdfJsQuery contains empty 'where' array, then the generator crashes.
// create query with no triples
if (sparqlJsQuery.where?.length === 0) {
sparqlJsQuery.where = [
{
type: "bgp",
triples: [],
},
];
}
if (this.defaultLabelVars.length > 0) {
this.defaultLabelVars.forEach((v) => __classPrivateFieldGet(this, _JsonV13SparqlTranslator_instances, "m", _JsonV13SparqlTranslator_insertDefaultLabelVar).call(this, sparqlJsQuery, v));
}
if (!sparqlJsQuery.order)
delete sparqlJsQuery.order;
if (!sparqlJsQuery.limit)
delete sparqlJsQuery.limit;
// set a GROUP BY based on aggregation expression in the variables
// add this after defaultLabel var have been inserted, and re-read them from the query
sparqlJsQuery.group = __classPrivateFieldGet(this, _JsonV13SparqlTranslator_instances, "m", _JsonV13SparqlTranslator_addGroupBy).call(this, sparqlJsQuery.variables);
return sparqlJsQuery;
}
}
_JsonV13SparqlTranslator_instances = new WeakSet(), _JsonV13SparqlTranslator_addGroupBy = function _JsonV13SparqlTranslator_addGroupBy(variables) {
if (__classPrivateFieldGet(this, _JsonV13SparqlTranslator_instances, "m", _JsonV13SparqlTranslator_needsGrouping).call(this, variables)) {
let g = [];
variables.forEach((v) => {
if (!v.expression) {
g.push({
expression: v,
});
}
});
return g;
}
else {
// no aggregation, or only one column, grouping is undefined
return undefined;
}
}, _JsonV13SparqlTranslator_needsGrouping = function _JsonV13SparqlTranslator_needsGrouping(variables) {
return variables.find((v) => v.expression) &&
variables.length > 1
? true
: false;
}, _JsonV13SparqlTranslator_createWhereClause = function _JsonV13SparqlTranslator_createWhereClause() {
const whereBuilder = new QueryWhereTranslatorV13(this.jsonQuery, this.specProvider, this.settings);
whereBuilder.build();
this.defaultLabelVars = whereBuilder.getDefaultVars();
return whereBuilder.getResultPtrns();
}, _JsonV13SparqlTranslator_varsToRDFJS = function _JsonV13SparqlTranslator_varsToRDFJS(variables) {
const where = this.jsonQuery.where;
const pairs = where?.predicateObjectPairs ?? [];
const variablesArray = variables.map((v) => {
if (v.type === "pattern" && v.subType === "bind") {
return [
SparqlFactory.buildAggregateFunctionExpression(v.expression.aggregation, factory.variable(v.expression.expression[0].value), factory.variable(v.variable.value)),
];
}
let varName = v.value;
let specProperty;
// chercher la propriété qui produit cette variable
pairs.forEach((pair) => {
if (pair.object?.variable?.value === varName) {
specProperty = this.specProvider.getProperty(pair.predicate.value);
}
});
console.log("specProperty for var", varName, specProperty);
if (!specProperty) {
return [factory.variable(varName)];
}
if (specProperty.getBeginDateProperty() ||
specProperty.getEndDateProperty() ||
specProperty.getExactDateProperty()) {
const result = [];
if (specProperty.getBeginDateProperty()) {
result.push(factory.variable(`${varName}_begin`));
}
if (specProperty.getEndDateProperty()) {
result.push(factory.variable(`${varName}_end`));
}
if (specProperty.getExactDateProperty()) {
result.push(factory.variable(`${varName}_exact`));
}
return result;
}
return [factory.variable(varName)];
});
const finalResult = [];
variablesArray.forEach((arr) => finalResult.push(...arr));
return finalResult;
}, _JsonV13SparqlTranslator_orderFromSolutionModifiers = function _JsonV13SparqlTranslator_orderFromSolutionModifiers(query) {
const order = query.solutionModifiers?.order;
if (!order || order.orderDefs.length === 0)
return undefined;
return order.orderDefs.map((o) => ({
expression: factory.variable(o.expression.value),
descending: o.descending,
}));
}, _JsonV13SparqlTranslator_insertDefaultLabelVar = function _JsonV13SparqlTranslator_insertDefaultLabelVar(sparqlQuery, defaultLabelVar) {
// reconstruct the original var name by removing "_label" suffix
var originalVar = defaultLabelVar.value.substring(0, defaultLabelVar.value.length - "_label".length);
//console.log("SpraqlQuery variables", sparqlQuery.variables);
for (var i = 0; i < sparqlQuery.variables.length; i++) {
// find variable with the original name
if (sparqlQuery.variables[i].value == originalVar) {
// insert the default label var after this one
sparqlQuery.variables.splice(i + 1, 0, defaultLabelVar);
// don't forget, otherwise infinite loop
break;
}
}
};
//# sourceMappingURL=JsonV13SparqlTranslator.js.map