UNPKG

sparnatural

Version:

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

272 lines 22.4 kB
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; 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 _BranchTranslatorV13_instances, _BranchTranslatorV13_pair, _BranchTranslatorV13_rootSubject, _BranchTranslatorV13_object, _BranchTranslatorV13_fullQuery, _BranchTranslatorV13_specProvider, _BranchTranslatorV13_isVeryFirst, _BranchTranslatorV13_isInOption, _BranchTranslatorV13_s, _BranchTranslatorV13_sType, _BranchTranslatorV13_p, _BranchTranslatorV13_o, _BranchTranslatorV13_oType, _BranchTranslatorV13_valueBuilder, _BranchTranslatorV13_startClassPtrn, _BranchTranslatorV13_endClassPtrn, _BranchTranslatorV13_intersectionPtrn, _BranchTranslatorV13_whereChildPtrns, _BranchTranslatorV13_valuePtrns, _BranchTranslatorV13_executedAfterPtrns, _BranchTranslatorV13_resultPtrns, _BranchTranslatorV13_defaultVars, _BranchTranslatorV13_buildChildrenPatterns, _BranchTranslatorV13_collectCriterias, _BranchTranslatorV13_buildValuePtrn, _BranchTranslatorV13_buildSubjectClassPtrn, _BranchTranslatorV13_buildObjectClassPtrn, _BranchTranslatorV13_buildIntersectionPtrn, _BranchTranslatorV13_buildFinalResultPtrn, _BranchTranslatorV13_createOptionStatePtrn; import { DataFactory } from "rdf-data-factory"; import SparqlFactory from "../SparqlFactory"; import { ValueBuilderFactory } from "../ValueBuilder"; import TypedVariableTranslator from "../../sparql/fromjson/TypedVariableTranslator"; // adaptateurs v13 -> v1 import { translateFilters, translateObjectValues, } from "../../../querypreloading/QueryAdapterFunc"; const factory = new DataFactory(); /** * Translates a v13 PredicateObjectPair (+ its ObjectCriteria) into SparqlJs patterns * while keeping the same internal logic as the legacy BranchTranslator. */ export default class BranchTranslatorV13 { constructor( //the pair to convert pair, // the root subject (shared for the whole bgpSameSubject) rootSubject, // the full query (we need it to test if variables are selected) fullQuery, // the sparnatural spec specProvider, // true if this branch is the very first of the query (not a child of another, not a sibling of the first one) isVeryFirst, // true if this branch is under (recursively) of another that is itself in an option isInOption, settings) { _BranchTranslatorV13_instances.add(this); // v13 input _BranchTranslatorV13_pair.set(this, void 0); _BranchTranslatorV13_rootSubject.set(this, void 0); _BranchTranslatorV13_object.set(this, void 0); // full query (for isVarSelected) _BranchTranslatorV13_fullQuery.set(this, void 0); _BranchTranslatorV13_specProvider.set(this, void 0); _BranchTranslatorV13_isVeryFirst.set(this, void 0); _BranchTranslatorV13_isInOption.set(this, void 0); // derived "legacy-like" fields _BranchTranslatorV13_s.set(this, void 0); _BranchTranslatorV13_sType.set(this, void 0); _BranchTranslatorV13_p.set(this, void 0); // property IRI _BranchTranslatorV13_o.set(this, void 0); _BranchTranslatorV13_oType.set(this, void 0); // to translate widget values to SPARQL _BranchTranslatorV13_valueBuilder.set(this, void 0); // intermediate patterns _BranchTranslatorV13_startClassPtrn.set(this, []); _BranchTranslatorV13_endClassPtrn.set(this, []); _BranchTranslatorV13_intersectionPtrn.set(this, []); _BranchTranslatorV13_whereChildPtrns.set(this, []); _BranchTranslatorV13_valuePtrns.set(this, []); _BranchTranslatorV13_executedAfterPtrns.set(this, []); // final result _BranchTranslatorV13_resultPtrns.set(this, []); // default vars gathered from children _BranchTranslatorV13_defaultVars.set(this, []); __classPrivateFieldSet(this, _BranchTranslatorV13_pair, pair, "f"); __classPrivateFieldSet(this, _BranchTranslatorV13_rootSubject, rootSubject, "f"); __classPrivateFieldSet(this, _BranchTranslatorV13_object, pair.object, "f"); __classPrivateFieldSet(this, _BranchTranslatorV13_fullQuery, fullQuery, "f"); __classPrivateFieldSet(this, _BranchTranslatorV13_specProvider, specProvider, "f"); __classPrivateFieldSet(this, _BranchTranslatorV13_isVeryFirst, isVeryFirst, "f"); __classPrivateFieldSet(this, _BranchTranslatorV13_isInOption, isInOption, "f"); this.settings = settings; // derive legacy-like vars __classPrivateFieldSet(this, _BranchTranslatorV13_s, rootSubject.value, "f"); __classPrivateFieldSet(this, _BranchTranslatorV13_sType, rootSubject.rdfType, "f"); __classPrivateFieldSet(this, _BranchTranslatorV13_p, pair.predicate.value, "f"); __classPrivateFieldSet(this, _BranchTranslatorV13_o, __classPrivateFieldGet(this, _BranchTranslatorV13_object, "f").variable.value, "f"); __classPrivateFieldSet(this, _BranchTranslatorV13_oType, __classPrivateFieldGet(this, _BranchTranslatorV13_object, "f").variable.rdfType, "f"); // build criteria list from v13 values + filters const criterias = __classPrivateFieldGet(this, _BranchTranslatorV13_instances, "m", _BranchTranslatorV13_collectCriterias).call(this); // create the object to convert criteria values to SPARQL (same as legacy) const endClassValue = __classPrivateFieldGet(this, _BranchTranslatorV13_oType, "f"); // this is because the query generation may be triggered while the end class is not there yet if (endClassValue != null) { __classPrivateFieldSet(this, _BranchTranslatorV13_valueBuilder, new ValueBuilderFactory().buildValueBuilder(__classPrivateFieldGet(this, _BranchTranslatorV13_specProvider, "f").getProperty(__classPrivateFieldGet(this, _BranchTranslatorV13_p, "f")).getPropertyType(endClassValue)), "f"); // pass everything needed to generate SPARQL __classPrivateFieldGet(this, _BranchTranslatorV13_valueBuilder, "f").init(__classPrivateFieldGet(this, _BranchTranslatorV13_specProvider, "f"), { variable: __classPrivateFieldGet(this, _BranchTranslatorV13_s, "f"), type: __classPrivateFieldGet(this, _BranchTranslatorV13_sType, "f") }, { variable: null, type: __classPrivateFieldGet(this, _BranchTranslatorV13_p, "f") }, { variable: __classPrivateFieldGet(this, _BranchTranslatorV13_o, "f"), type: __classPrivateFieldGet(this, _BranchTranslatorV13_oType, "f") }, BranchTranslatorV13.isVarSelected(fullQuery, __classPrivateFieldGet(this, _BranchTranslatorV13_o, "f")), criterias.map((v) => v.criteria)); } } build() { __classPrivateFieldGet(this, _BranchTranslatorV13_instances, "m", _BranchTranslatorV13_buildChildrenPatterns).call(this); __classPrivateFieldGet(this, _BranchTranslatorV13_instances, "m", _BranchTranslatorV13_buildSubjectClassPtrn).call(this); __classPrivateFieldGet(this, _BranchTranslatorV13_instances, "m", _BranchTranslatorV13_buildIntersectionPtrn).call(this); __classPrivateFieldGet(this, _BranchTranslatorV13_instances, "m", _BranchTranslatorV13_buildObjectClassPtrn).call(this); __classPrivateFieldGet(this, _BranchTranslatorV13_instances, "m", _BranchTranslatorV13_buildValuePtrn).call(this); __classPrivateFieldGet(this, _BranchTranslatorV13_instances, "m", _BranchTranslatorV13_buildFinalResultPtrn).call(this); } /** * * @param query The query to test * @param varName The variable to test the selection for * @returns true if the varName is selected in the query */ static isVarSelected(query, varName) { return (query.variables.filter((v) => { // PatternBind (aggregate) if (v.type === "pattern" && v.subType === "bind") { return v.expression.expression[0].value === varName; } // TermVariable return (v.type === "term" && v.subType === "variable" && v.value === varName); }).length === 1); } getResultPtrns() { return __classPrivateFieldGet(this, _BranchTranslatorV13_resultPtrns, "f"); } getDefaultVars() { return __classPrivateFieldGet(this, _BranchTranslatorV13_defaultVars, "f"); } getExecutedAfterPtrns() { return __classPrivateFieldGet(this, _BranchTranslatorV13_executedAfterPtrns, "f"); } } _BranchTranslatorV13_pair = new WeakMap(), _BranchTranslatorV13_rootSubject = new WeakMap(), _BranchTranslatorV13_object = new WeakMap(), _BranchTranslatorV13_fullQuery = new WeakMap(), _BranchTranslatorV13_specProvider = new WeakMap(), _BranchTranslatorV13_isVeryFirst = new WeakMap(), _BranchTranslatorV13_isInOption = new WeakMap(), _BranchTranslatorV13_s = new WeakMap(), _BranchTranslatorV13_sType = new WeakMap(), _BranchTranslatorV13_p = new WeakMap(), _BranchTranslatorV13_o = new WeakMap(), _BranchTranslatorV13_oType = new WeakMap(), _BranchTranslatorV13_valueBuilder = new WeakMap(), _BranchTranslatorV13_startClassPtrn = new WeakMap(), _BranchTranslatorV13_endClassPtrn = new WeakMap(), _BranchTranslatorV13_intersectionPtrn = new WeakMap(), _BranchTranslatorV13_whereChildPtrns = new WeakMap(), _BranchTranslatorV13_valuePtrns = new WeakMap(), _BranchTranslatorV13_executedAfterPtrns = new WeakMap(), _BranchTranslatorV13_resultPtrns = new WeakMap(), _BranchTranslatorV13_defaultVars = new WeakMap(), _BranchTranslatorV13_instances = new WeakSet(), _BranchTranslatorV13_buildChildrenPatterns = function _BranchTranslatorV13_buildChildrenPatterns() { const children = __classPrivateFieldGet(this, _BranchTranslatorV13_object, "f").predicateObjectPairs; if (!children || children.length === 0) return; children.forEach((childPair) => { const builder = new BranchTranslatorV13(childPair, // subject of children becomes the current object variable // In v13, nested predicateObjectPairs are under ObjectCriteria, so the "same subject" at that level is the object variable. __classPrivateFieldGet(this, _BranchTranslatorV13_object, "f").variable, __classPrivateFieldGet(this, _BranchTranslatorV13_fullQuery, "f"), __classPrivateFieldGet(this, _BranchTranslatorV13_specProvider, "f"), false, // children are in option if parent is optional/notExists __classPrivateFieldGet(this, _BranchTranslatorV13_pair, "f").subType === "optional" || __classPrivateFieldGet(this, _BranchTranslatorV13_pair, "f").subType === "notExists", this.settings); builder.build(); __classPrivateFieldGet(this, _BranchTranslatorV13_whereChildPtrns, "f").push(...builder.getResultPtrns()); // gather default vars from children __classPrivateFieldGet(this, _BranchTranslatorV13_defaultVars, "f").push(...builder.getDefaultVars()); // gather patterns to be executed after __classPrivateFieldGet(this, _BranchTranslatorV13_executedAfterPtrns, "f").push(...builder.getExecutedAfterPtrns()); }); }, _BranchTranslatorV13_collectCriterias = function _BranchTranslatorV13_collectCriterias() { const out = []; // VALUES / direct values out.push(...translateObjectValues(__classPrivateFieldGet(this, _BranchTranslatorV13_o, "f"), __classPrivateFieldGet(this, _BranchTranslatorV13_object, "f"))); // FILTERS if (__classPrivateFieldGet(this, _BranchTranslatorV13_object, "f").filters && __classPrivateFieldGet(this, _BranchTranslatorV13_object, "f").filters.length > 0) { out.push(...translateFilters(__classPrivateFieldGet(this, _BranchTranslatorV13_object, "f").filters)); } return out; }, _BranchTranslatorV13_buildValuePtrn = function _BranchTranslatorV13_buildValuePtrn() { let hasValues = (__classPrivateFieldGet(this, _BranchTranslatorV13_object, "f").values && __classPrivateFieldGet(this, _BranchTranslatorV13_object, "f").values.length > 0) || (__classPrivateFieldGet(this, _BranchTranslatorV13_object, "f").filters && __classPrivateFieldGet(this, _BranchTranslatorV13_object, "f").filters.length > 0); if (hasValues) { __classPrivateFieldSet(this, _BranchTranslatorV13_valuePtrns, __classPrivateFieldGet(this, _BranchTranslatorV13_valueBuilder, "f").build(), "f"); } }, _BranchTranslatorV13_buildSubjectClassPtrn = function _BranchTranslatorV13_buildSubjectClassPtrn() { let typeTranslator = new TypedVariableTranslator(__classPrivateFieldGet(this, _BranchTranslatorV13_s, "f"), __classPrivateFieldGet(this, _BranchTranslatorV13_sType, "f"), // same semantics as legacy: subject variable selectable only if very first BranchTranslatorV13.isVarSelected(__classPrivateFieldGet(this, _BranchTranslatorV13_fullQuery, "f"), __classPrivateFieldGet(this, _BranchTranslatorV13_s, "f")) && __classPrivateFieldGet(this, _BranchTranslatorV13_isVeryFirst, "f"), __classPrivateFieldGet(this, _BranchTranslatorV13_valueBuilder, "f")?.isBlockingStart(), __classPrivateFieldGet(this, _BranchTranslatorV13_specProvider, "f"), this.settings); typeTranslator.build(); __classPrivateFieldSet(this, _BranchTranslatorV13_startClassPtrn, typeTranslator.resultPtrns, "f"); // if there was any default label patterns generated, gather the variable names of the default label if (typeTranslator.defaultLblPatterns.length > 0) { __classPrivateFieldGet(this, _BranchTranslatorV13_defaultVars, "f").push(factory.variable(typeTranslator.defaultLabelVarName)); } }, _BranchTranslatorV13_buildObjectClassPtrn = function _BranchTranslatorV13_buildObjectClassPtrn() { let typeTranslator = new TypedVariableTranslator(__classPrivateFieldGet(this, _BranchTranslatorV13_o, "f"), __classPrivateFieldGet(this, _BranchTranslatorV13_oType, "f"), BranchTranslatorV13.isVarSelected(__classPrivateFieldGet(this, _BranchTranslatorV13_fullQuery, "f"), __classPrivateFieldGet(this, _BranchTranslatorV13_o, "f")), __classPrivateFieldGet(this, _BranchTranslatorV13_valueBuilder, "f")?.isBlockingEnd(), __classPrivateFieldGet(this, _BranchTranslatorV13_specProvider, "f"), this.settings); typeTranslator.build(); __classPrivateFieldSet(this, _BranchTranslatorV13_endClassPtrn, typeTranslator.resultPtrns, "f"); if (typeTranslator.defaultLblPatterns.length > 0) { __classPrivateFieldGet(this, _BranchTranslatorV13_defaultVars, "f").push(factory.variable(typeTranslator.defaultLabelVarName)); } }, _BranchTranslatorV13_buildIntersectionPtrn = function _BranchTranslatorV13_buildIntersectionPtrn() { // Vérification des conditions de génération de l'intersection triple if (!__classPrivateFieldGet(this, _BranchTranslatorV13_s, "f") || !__classPrivateFieldGet(this, _BranchTranslatorV13_o, "f") || __classPrivateFieldGet(this, _BranchTranslatorV13_valueBuilder, "f")?.isBlockingObjectProp()) return; const specProperty = __classPrivateFieldGet(this, _BranchTranslatorV13_specProvider, "f").getProperty(__classPrivateFieldGet(this, _BranchTranslatorV13_p, "f")); if (specProperty.getBeginDateProperty() && specProperty.getEndDateProperty()) { // Génération des triples pour les dates de début, de fin et exactes, si disponibles if (specProperty.getBeginDateProperty()) { __classPrivateFieldGet(this, _BranchTranslatorV13_intersectionPtrn, "f").push(SparqlFactory.buildOptionalPattern([ SparqlFactory.buildBgpPattern([ SparqlFactory.buildIntersectionTriple(factory.variable(__classPrivateFieldGet(this, _BranchTranslatorV13_s, "f")), specProperty.getBeginDateProperty(), factory.variable(`${__classPrivateFieldGet(this, _BranchTranslatorV13_o, "f")}_begin`)), ]), ])); } if (specProperty.getEndDateProperty()) { __classPrivateFieldGet(this, _BranchTranslatorV13_intersectionPtrn, "f").push(SparqlFactory.buildOptionalPattern([ SparqlFactory.buildBgpPattern([ SparqlFactory.buildIntersectionTriple(factory.variable(__classPrivateFieldGet(this, _BranchTranslatorV13_s, "f")), specProperty.getEndDateProperty(), factory.variable(`${__classPrivateFieldGet(this, _BranchTranslatorV13_o, "f")}_end`)), ]), ])); } if (specProperty.getExactDateProperty()) { __classPrivateFieldGet(this, _BranchTranslatorV13_intersectionPtrn, "f").push(SparqlFactory.buildOptionalPattern([ SparqlFactory.buildBgpPattern([ SparqlFactory.buildIntersectionTriple(factory.variable(__classPrivateFieldGet(this, _BranchTranslatorV13_s, "f")), specProperty.getExactDateProperty(), factory.variable(`${__classPrivateFieldGet(this, _BranchTranslatorV13_o, "f")}_exact`)), ]), ])); } } else { // Génération du triple d'intersection normal si aucune propriété de date n'est spécifiée __classPrivateFieldGet(this, _BranchTranslatorV13_intersectionPtrn, "f").push(SparqlFactory.buildBgpPattern([ SparqlFactory.buildIntersectionTriple(factory.variable(__classPrivateFieldGet(this, _BranchTranslatorV13_s, "f")), __classPrivateFieldGet(this, _BranchTranslatorV13_p, "f"), factory.variable(__classPrivateFieldGet(this, _BranchTranslatorV13_o, "f"))), ])); } // Ajout du filtre de langue si la propriété est multilingue if (specProperty.isMultilingual()) { __classPrivateFieldGet(this, _BranchTranslatorV13_intersectionPtrn, "f").push(SparqlFactory.buildFilterLangEquals(factory.variable(__classPrivateFieldGet(this, _BranchTranslatorV13_o, "f")), factory.literal(this.settings.language))); } }, _BranchTranslatorV13_buildFinalResultPtrn = function _BranchTranslatorV13_buildFinalResultPtrn() { // always store the startClassPattern in the final result pattern (no OPTIONAL, no NOT EXISTS, no SERVICE) // the subject type criteria is generated only for the first criteria, // not if it is inside a WHERE or an AND if (__classPrivateFieldGet(this, _BranchTranslatorV13_isVeryFirst, "f")) __classPrivateFieldGet(this, _BranchTranslatorV13_resultPtrns, "f").push(...__classPrivateFieldGet(this, _BranchTranslatorV13_startClassPtrn, "f")); // concat all the patterns together, except the start pattern which is handled differntly let exceptStartPtrn = []; exceptStartPtrn.push(...__classPrivateFieldGet(this, _BranchTranslatorV13_intersectionPtrn, "f")); if (__classPrivateFieldGet(this, _BranchTranslatorV13_o, "f") && !__classPrivateFieldGet(this, _BranchTranslatorV13_specProvider, "f").getEntity(__classPrivateFieldGet(this, _BranchTranslatorV13_oType, "f")).isLiteralEntity()) { exceptStartPtrn.push(...__classPrivateFieldGet(this, _BranchTranslatorV13_endClassPtrn, "f")); } exceptStartPtrn.push(...__classPrivateFieldGet(this, _BranchTranslatorV13_valuePtrns, "f")); exceptStartPtrn.push(...__classPrivateFieldGet(this, _BranchTranslatorV13_whereChildPtrns, "f")); // this will wrap everything except start inside the OPTIONAL or NOT EXISTS __classPrivateFieldGet(this, _BranchTranslatorV13_instances, "m", _BranchTranslatorV13_createOptionStatePtrn).call(this, exceptStartPtrn); }, _BranchTranslatorV13_createOptionStatePtrn = function _BranchTranslatorV13_createOptionStatePtrn(exceptStartPtrn) { // create a SERVICE clause of needed const sparqlService = __classPrivateFieldGet(this, _BranchTranslatorV13_specProvider, "f") .getProperty(__classPrivateFieldGet(this, _BranchTranslatorV13_p, "f")) ?.getServiceEndpoint(); let servicePtrn = null; const endpoint = factory.namedNode(sparqlService); if (sparqlService && exceptStartPtrn.length > 0) { servicePtrn = SparqlFactory.buildServicePattern(exceptStartPtrn, endpoint); } let normalOrServicePatterns = servicePtrn ? [servicePtrn] : exceptStartPtrn; let isOptional = __classPrivateFieldGet(this, _BranchTranslatorV13_pair, "f").subType === "optional"; let isNotExists = __classPrivateFieldGet(this, _BranchTranslatorV13_pair, "f").subType === "notExists"; // produce the generated patterns, maybe wrapped in OPTIONAL or NOT EXISTS let finalResultPtrns = []; // if this branch is optional and is not inside an optional branch if (isOptional && !__classPrivateFieldGet(this, _BranchTranslatorV13_isInOption, "f")) { finalResultPtrns.push(SparqlFactory.buildOptionalPattern(normalOrServicePatterns)); } else if (isNotExists && !__classPrivateFieldGet(this, _BranchTranslatorV13_isInOption, "f")) { finalResultPtrns.push(SparqlFactory.buildNotExistsPattern(SparqlFactory.buildGroupPattern(normalOrServicePatterns))); } else { // nothing special, just retain the patterns in the final result pattern finalResultPtrns.push(...normalOrServicePatterns); } // then decide where to store the generated patterns : either in "normal" patterns // or in patterns that shall be executed after the rest of the query if (servicePtrn && __classPrivateFieldGet(this, _BranchTranslatorV13_specProvider, "f").getProperty(__classPrivateFieldGet(this, _BranchTranslatorV13_p, "f"))?.isLogicallyExecutedAfter()) { __classPrivateFieldGet(this, _BranchTranslatorV13_executedAfterPtrns, "f").push(...finalResultPtrns); } else { __classPrivateFieldGet(this, _BranchTranslatorV13_resultPtrns, "f").push(...finalResultPtrns); } }; //# sourceMappingURL=BranchTranslatorV13.js.map