sparnatural
Version:
Visual client-side SPARQL query builder and knowledge graph exploration tool
222 lines • 13.8 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 _a, _QueryLoader_buildSparnatural, _QueryLoader_buildCriteriaGroupFromPair, _QueryLoader_triggerOptions, _QueryLoader_mapPairSubTypeToOptions, _QueryLoader_setSelectedValue, _QueryLoader_setSelectViewVariableBtn, _QueryLoader_updateOrderingOfVariables, _QueryLoader_updateNamingOfVariables, _QueryLoader_hasSelectedVar, _QueryLoader_isBind, _QueryLoader_getSelectedVarNameFromSelectItem, _QueryLoader_clickOn;
import { OptionTypes } from "../components/builder-section/groupwrapper/criteriagroup/optionsgroup/OptionsGroup";
import { translateObjectValues, translateFilters, patternBindToVariableExpression, } from "./QueryAdapterFunc";
import { Order } from "../SparnaturalQueryIfc";
export default class QueryLoader {
static setSparnatural(sparnatural) {
this.sparnatural = sparnatural;
}
// Load a query in the visual query builder
static loadQuery(query) {
this.query = query;
// set Sparnatural quiet so it does not emit the update callbacks
this.sparnatural.setQuiet(true);
// first reset the current query
this.sparnatural.BgWrapper.resetCallback();
const clone = JSON.parse(JSON.stringify(query));
// build Sparnatural from query
const varMapping = __classPrivateFieldGet(this, _a, "m", _QueryLoader_buildSparnatural).call(this, this.sparnatural, clone);
// set the correct variable names
__classPrivateFieldGet(this, _a, "m", _QueryLoader_updateNamingOfVariables).call(this, varMapping);
// set the correct ordering of the draggables
__classPrivateFieldGet(this, _a, "m", _QueryLoader_updateOrderingOfVariables).call(this);
// then reset the quiet flag
this.sparnatural.setQuiet(false);
this.sparnatural.html[0].dispatchEvent(new CustomEvent("generateQuery"));
this.sparnatural.html[0].dispatchEvent(new CustomEvent("redrawBackgroundAndLinks"));
}
}
_a = QueryLoader, _QueryLoader_buildSparnatural = function _QueryLoader_buildSparnatural(sparnatural, query) {
const varMapping = new Map();
if (!query?.where || query.where.subType !== "bgpSameSubject") {
throw Error("Query.where is missing or not a bgpSameSubject");
}
// catch subject and predicateObjectPairs from the query
const subject = query.where.subject;
const pairs = [...(query.where.predicateObjectPairs ?? [])];
if (pairs.length === 0)
throw Error("No predicateObjectPairs detected");
const rootGrpWrapper = sparnatural.BgWrapper.componentsList.rootGroupWrapper;
// root = first pair
const first = pairs.shift();
const localMap1 = __classPrivateFieldGet(this, _a, "m", _QueryLoader_buildCriteriaGroupFromPair).call(this, rootGrpWrapper, subject, first);
localMap1.forEach((v, k) => varMapping.set(k, v));
// other top-level pairs = AND siblings
let parent = rootGrpWrapper;
pairs.forEach((p) => {
__classPrivateFieldGet(this, _a, "m", _QueryLoader_clickOn).call(this, parent.criteriaGroup.actionsGroup.actions.actionAnd.btn);
const localMap = __classPrivateFieldGet(this, _a, "m", _QueryLoader_buildCriteriaGroupFromPair).call(this, parent.andSibling, subject, p);
localMap.forEach((v, k) => varMapping.set(k, v));
parent = parent.andSibling;
});
// unselect root subject eye if not selected in query
if (!__classPrivateFieldGet(this, _a, "m", _QueryLoader_hasSelectedVar).call(this, query.variables, subject.value)) {
__classPrivateFieldGet(this, _a, "m", _QueryLoader_clickOn).call(this, rootGrpWrapper.criteriaGroup.startClassGroup
.inputSelector?.selectViewVariableBtn?.widgetHtml);
}
return varMapping;
}, _QueryLoader_buildCriteriaGroupFromPair = function _QueryLoader_buildCriteriaGroupFromPair(grpWrapper, subject, pair) {
const varMapping = new Map();
const obj = pair.object;
// Start class (subject rdfType)
const startClassVal = {
type: subject.rdfType,
variable: subject.value,
};
if (!grpWrapper.criteriaGroup.startClassGroup.startClassVal.type) {
__classPrivateFieldGet(this, _a, "m", _QueryLoader_setSelectedValue).call(this, grpWrapper.criteriaGroup.startClassGroup, subject.rdfType);
}
// This is for cases where the variable name has been manually changed in the query
// and is not one of the selected variables in the result set
grpWrapper.criteriaGroup.startClassGroup.startClassVal = startClassVal;
varMapping.set(grpWrapper.criteriaGroup.startClassGroup.startClassVal.variable, subject.value);
// End class (object rdfType)
const endClassVal = {
type: obj.variable.rdfType,
variable: obj.variable.value,
};
__classPrivateFieldGet(this, _a, "m", _QueryLoader_setSelectedValue).call(this, grpWrapper.criteriaGroup.endClassGroup, obj.variable.rdfType);
// This is for cases where the variable name has been manually changed in the query
// and is not one of the selected variables in the result set
grpWrapper.criteriaGroup.endClassGroup.endClassVal = endClassVal;
varMapping.set(grpWrapper.criteriaGroup.endClassGroup.endClassVal.variable, obj.variable.value);
// predicate
__classPrivateFieldGet(this, _a, "m", _QueryLoader_setSelectedValue).call(this, grpWrapper.criteriaGroup.objectPropertyGroup, pair.predicate.value);
// ---------- VALUES / FILTERS translation to v1-style widget inputs ----------
const widgetInputs = [];
// 1) filters -> labelledCriteria(criteria: Date/Number/Search/Map)
if (obj.filters?.length) {
widgetInputs.push(...translateFilters(obj.filters));
}
// 2) values -> labelledCriteria(criteria: RdfTermCriteria)
if (obj.values?.length) {
widgetInputs.push(...translateObjectValues(obj.variable.value, obj));
}
// render widget inputs (same logic as v1)
if (widgetInputs.length > 0) {
widgetInputs.forEach((input) => {
const parsedVal = grpWrapper.criteriaGroup.endClassGroup.editComponents.widgetWrapper.widgetComponent.parseInput(input);
if (grpWrapper.criteriaGroup.endClassWidgetGroup.widgetValues.length > 0) {
__classPrivateFieldGet(this, _a, "m", _QueryLoader_clickOn).call(this, grpWrapper.criteriaGroup.endClassWidgetGroup.addWidgetValueBtn.html);
}
grpWrapper.criteriaGroup.endClassGroup.editComponents.widgetWrapper.widgetComponent.triggerRenderWidgetVal(parsedVal);
});
}
// if no values/filters and no children => Any
const hasNoValuesOrFilters = (!obj.values || obj.values.length === 0) &&
(!obj.filters || obj.filters.length === 0);
const hasNoChildren = !obj.predicateObjectPairs || obj.predicateObjectPairs.length === 0;
if (hasNoValuesOrFilters && hasNoChildren) {
grpWrapper.criteriaGroup.endClassGroup.editComponents.onSelectAll();
}
// children recursion (WHERE)
if (obj.predicateObjectPairs?.length) {
__classPrivateFieldGet(this, _a, "m", _QueryLoader_clickOn).call(this, grpWrapper.criteriaGroup.endClassGroup.editComponents.actionWhere.btn);
const childrenPairs = [...obj.predicateObjectPairs];
const firstChild = childrenPairs.shift();
let localMap = __classPrivateFieldGet(this, _a, "m", _QueryLoader_buildCriteriaGroupFromPair).call(this, grpWrapper.whereChild, obj.variable, firstChild);
localMap.forEach((v, k) => varMapping.set(k, v));
let parent = grpWrapper.whereChild;
childrenPairs.forEach((cp) => {
__classPrivateFieldGet(this, _a, "m", _QueryLoader_clickOn).call(this, parent.criteriaGroup.actionsGroup.actions.actionAnd.btn);
localMap = __classPrivateFieldGet(this, _a, "m", _QueryLoader_buildCriteriaGroupFromPair).call(this, parent.andSibling, obj.variable, cp);
localMap.forEach((v, k) => varMapping.set(k, v));
parent = parent.andSibling;
});
}
// options v13 - do it only after children so that the state is properly propagated
__classPrivateFieldGet(this, _a, "m", _QueryLoader_triggerOptions).call(this, grpWrapper, __classPrivateFieldGet(this, _a, "m", _QueryLoader_mapPairSubTypeToOptions).call(this, pair));
// eye button (same behaviour: only end class toggled)
__classPrivateFieldGet(this, _a, "m", _QueryLoader_setSelectViewVariableBtn).call(this, startClassVal, grpWrapper.criteriaGroup.startClassGroup, endClassVal, grpWrapper.criteriaGroup.endClassGroup);
return varMapping;
}, _QueryLoader_triggerOptions = function _QueryLoader_triggerOptions(grpWrapper, branchLike) {
if (branchLike.notExists &&
grpWrapper.currentOptionState != OptionTypes.NOTEXISTS) {
__classPrivateFieldGet(this, _a, "m", _QueryLoader_clickOn).call(this, grpWrapper.criteriaGroup.optionsGroup.optionalArrow.widgetHtml);
__classPrivateFieldGet(this, _a, "m", _QueryLoader_clickOn).call(this, grpWrapper.criteriaGroup.optionsGroup.NotExistsComponent.html);
}
if (branchLike.optional && grpWrapper.currentOptionState != OptionTypes.OPTIONAL) {
__classPrivateFieldGet(this, _a, "m", _QueryLoader_clickOn).call(this, grpWrapper.criteriaGroup.optionsGroup.optionalArrow.widgetHtml);
__classPrivateFieldGet(this, _a, "m", _QueryLoader_clickOn).call(this, grpWrapper.criteriaGroup.optionsGroup.OptionalComponent.html);
}
}, _QueryLoader_mapPairSubTypeToOptions = function _QueryLoader_mapPairSubTypeToOptions(pair) {
switch (pair.subType) {
case "optional":
return { optional: true };
case "notExists":
return { notExists: true };
default:
return { optional: false, notExists: false };
}
}, _QueryLoader_setSelectedValue = function _QueryLoader_setSelectedValue(component, value) {
component.inputSelector.setSelected(value);
component.inputSelector.submitSelected();
}, _QueryLoader_setSelectViewVariableBtn = function _QueryLoader_setSelectViewVariableBtn(startClassVal, startClassComponent, endClassVal, endClassComponent) {
if (__classPrivateFieldGet(this, _a, "m", _QueryLoader_hasSelectedVar).call(this, this.query.variables, endClassVal.variable)) {
__classPrivateFieldGet(this, _a, "m", _QueryLoader_clickOn).call(this, endClassComponent.inputSelector?.selectViewVariableBtn
?.widgetHtml);
}
}, _QueryLoader_updateOrderingOfVariables = function _QueryLoader_updateOrderingOfVariables() {
const varMenu = this.sparnatural.variableSection.variableOrderMenu;
this.query.variables.forEach((v) => {
varMenu.draggables.forEach((d) => {
const varName = __classPrivateFieldGet(this, _a, "m", _QueryLoader_getSelectedVarNameFromSelectItem).call(this, v);
if (d.state.selectedVariable.variable === varName) {
varMenu.removeDraggableByVarName(varName);
const newDraggable = varMenu.addDraggableComponent(d.state.selectedVariable);
if (__classPrivateFieldGet(this, _a, "m", _QueryLoader_isBind).call(this, v)) {
newDraggable.loadAggregatedVariable(patternBindToVariableExpression(v));
}
}
});
});
const variableSortOption = this.sparnatural.variableSection.variableSortOption;
const orderDef = this.query.solutionModifiers?.order?.orderDefs?.[0];
if (!orderDef) {
variableSortOption.changeSortOrderCallBack(Order.NOORDER);
return;
}
variableSortOption.changeSortOrderCallBack(orderDef.descending ? Order.DESC : Order.ASC);
}, _QueryLoader_updateNamingOfVariables = function _QueryLoader_updateNamingOfVariables(varNameMapping) {
const varMenu = this.sparnatural.variableSection.variableOrderMenu;
this.query.variables.forEach((v) => {
varMenu.draggables.forEach((d) => {
const targetVarName = __classPrivateFieldGet(this, _a, "m", _QueryLoader_getSelectedVarNameFromSelectItem).call(this, v);
if (varNameMapping.get(d.state.selectedVariable.variable) ===
targetVarName) {
d.setVarName(targetVarName);
}
});
});
}, _QueryLoader_hasSelectedVar = function _QueryLoader_hasSelectedVar(vars, varName) {
let result = false;
vars.forEach((v) => {
if (__classPrivateFieldGet(this, _a, "m", _QueryLoader_isBind).call(this, v)) {
// keep same old behaviour: consider the aggregated INPUT variable as "selected"
const aggregatedInputVar = v.expression?.expression?.[0]?.value;
if (aggregatedInputVar === varName)
result = true;
}
else {
if (v.value === varName)
result = true;
}
});
return result;
}, _QueryLoader_isBind = function _QueryLoader_isBind(v) {
return (v.type === "pattern" &&
v.subType === "bind");
}, _QueryLoader_getSelectedVarNameFromSelectItem = function _QueryLoader_getSelectedVarNameFromSelectItem(v) {
if (__classPrivateFieldGet(this, _a, "m", _QueryLoader_isBind).call(this, v)) {
return v.expression?.expression?.[0]?.value ?? v.variable.value;
}
return v.value;
}, _QueryLoader_clickOn = function _QueryLoader_clickOn(el) {
el[0].dispatchEvent(new Event("click"));
};
//# sourceMappingURL=QueryLoader-v13.js.map