UNPKG

sparnatural

Version:

Visual client-side SPARQL query builder and knowledge graph exploration tool

155 lines 7.76 kB
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