sparnatural
Version:
Visual client-side SPARQL query builder and knowledge graph exploration tool
272 lines • 22.4 kB
JavaScript
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