UNPKG

@easyquery/core

Version:

EasyQuery.JS core modules

633 lines 22.6 kB
import { eqi18n } from "../i18n/i18n"; import { equtils } from "../utils/utils"; import { DataModel } from "../dm/data_model"; import { Expression } from "../dm/expression"; import { Column, SortDirection } from "./column"; import { Condition } from "./condition"; import { EventEmitter } from "../event/event_emitter"; import { DataKind } from "../types/data_kind"; import { LinkType } from "../types/link_type"; import { ExprTag } from "../types/expr_tag"; import { CondTag } from "../types/cond_tag"; var Query = /** @class */ (function () { function Query(model, data, options) { this.eventEmitter = new EventEmitter(this); this.id = ""; this.root = new Condition(CondTag.Predicate); this.columns = new Array(); this.justsorted = new Array(); this.name = ""; this.description = ""; this.modelId = ""; this.modelName = ""; this.model = (model) ? model : new DataModel(); if (data) { this.loadFromData(data); } this.attrClassName = (options) ? options.attrTag || ExprTag.EntityAttribute : ExprTag.EntityAttribute; this.clientListRequestHandler = (options) ? options.clientListRequestHandler : new Array(); this.serverListRequestHandler = (options) ? options.serverListRequestHandler : new Array(); //this.setObject(data, true); if (!this.id) { this.id = equtils.generateId(); } } Query.prototype.setData = function (data, silent) { if (silent === void 0) { silent = false; } this.eventEmitter.enterSilentMode(); try { this.clear(); if (data) { if (typeof data === "string") { this.loadFromJson(data); } else { this.loadFromData(data); } } } finally { this.eventEmitter.exitSilentMode(); } if (!silent) { this.fireChangedEvent({ "changeType": "query.all" }); } }; Query.prototype.loadFromJson = function (json) { var data = JSON.parse(json); this.loadFromData(data); }; Query.prototype.loadFromData = function (data) { if (data) { this.id = data.id; this.root.loadFromData(this.model, data.root); // this.modelName = data.modelName; // this.modelId = data.modelId; this.name = data.name; this.description = data.desc; this.justsorted = data.justsortcols; if (data.cols) { for (var i = 0; i < data.cols.length; i++) { var newCol = new Column(); newCol.loadFromData(this.model, data.cols[i]); this.columns.push(newCol); } } } }; /// <method name="getModel" version="1.0.0"> /// <summary> /// Gets DataModel object associated with this query. /// </summary> /// </method> Query.prototype.getModel = function () { return this.model; }; /// <method name="setModel" version="1.0.0"> /// <summary> /// Sets DataModel object associated with this query. /// </summary> /// <param name="model" type="DataModel"> /// A DataModel object /// </param> /// </method> Query.prototype.setModel = function (model) { this.model = model; }; Query.prototype.loadModelData = function (model) { this.model.setData(model); }; /// <method name="toJSON" version="1.0.0"> /// <summary> /// Returns JSON representation of this query. /// </summary> /// </method> Query.prototype.toJSON = function () { return JSON.stringify(this.toJSONData()); }; Query.prototype.toJSONData = function () { var obj = { modelId: this.model ? this.model.getId() : null, modelName: this.model ? this.model.getName() : null }; obj.id = this.id; obj.name = this.name; if (this.description) { obj.desc = this.description; } obj.cols = []; for (var i = 0; i < this.columns.length; i++) { obj.cols.push(this.columns[i].saveToData()); } obj.justsortcols = this.justsorted; obj.root = this.root.saveToData(); return obj; }; /// <method name="isEmptyConditions" version="1.0.0"> /// <summary> /// Returns true if query does not contain any condition. /// </summary> /// </method> Query.prototype.isEmptyConditions = function () { return !this.root || !this.root.conditions || this.root.conditions.length === 0; }; /// <method name="isEmptyConditions" version="1.0.0"> /// <summary> /// Returns true if query does not contain any column. /// </summary> /// </method> Query.prototype.isEmptyColumns = function () { return !this.columns || this.columns.length === 0; }; Query.prototype.beginUpdate = function () { this.eventEmitter.enterSilentMode(); }; Query.prototype.endUpdate = function (raiseChangeEvent) { if (raiseChangeEvent === void 0) { raiseChangeEvent = false; } this.eventEmitter.exitSilentMode(); if (!this.eventEmitter.isSilent() && raiseChangeEvent) { this.fireChangedEvent({ "changeType": "query.all" }); } }; /// <method version="1.0.0"> /// <summary> /// Clears query (all conditions and columns). /// </summary> /// </method> Query.prototype.clear = function (silent) { if (silent === void 0) { silent = false; } this.beginUpdate(); try { this.clearColumns(); this.clearConditions(); } finally { this.endUpdate(false); if (!silent) { this.fireChangedEvent({ "changeType": "query.clear" }); } } }; /// <method version="1.0.0"> /// <summary> /// Clears all columns in query. /// </summary> /// </method> Query.prototype.clearColumns = function () { this.columns = []; this.justsorted = []; this.fireChangedEvent({ "changeType": "query.columns.clear" }); }; /// <method version="1.0.0"> /// <summary> /// Clears all conditions in query. /// </summary> /// </method> Query.prototype.clearConditions = function () { this.root.conditions = []; this.root.linkType = LinkType.All; this.root.enabled = true; this.fireChangedEvent({ "changeType": "query.conditions.clear" }); }; /// <method version="1.0.0"> /// <summary> /// Gets query ID. /// </summary> /// </method> Query.prototype.getId = function () { return this.id; }; /// <method version="1.0.0"> /// <summary> /// Sets query ID. /// </summary> /// <param name="id" type="String"> /// New Query ID /// </param> /// </method> Query.prototype.setId = function (id) { this.id = id; }; /// <method version="1.0.0"> /// <summary> /// Gets the query's name. /// </summary> /// </method> Query.prototype.getName = function () { return this.name; }; /// <method version="1.0.0"> /// <summary> /// Sets the query's name. /// </summary> /// <param name="name" type="String"> /// The new name /// </param> /// </method> Query.prototype.setName = function (name) { this.name = name; }; /// <method version="1.0.0"> /// <summary> /// Gets the query's description. /// </summary> /// </method> Query.prototype.getDescription = function () { return this.description; }; /// <method version="1.0.0"> /// <summary> /// Sets the query's description. /// </summary> /// <param name="name" type="String"> /// The new description /// </param> /// </method> Query.prototype.setDescription = function (description) { this.description = description; }; /// <method version="1.0.0"> /// <summary> /// Get array of columns. /// </summary> /// </method> Query.prototype.getColumns = function () { return this.columns; }; Query.prototype.getSortedColumns = function () { var sortedCols = new Array(); var cols = this.getColumns(); var col; for (var i = 0; i < cols.length; i++) { col = cols[i]; if (col.sortIndex >= 0) { sortedCols.push(col); } } sortedCols.sort(function (col1, col2) { return col1.sortIndex - col2.sortIndex; }); return sortedCols; }; Query.prototype.getColumnSortIndex = function (col) { if (col.sorting != SortDirection.None) { if (col.sortIndex < 0) { var cols = this.getColumns(); return equtils.indexOfArrayItem(cols, col); } else { return col.sortIndex; } } return -1; }; /// <method version="1.0.0"> /// <summary> /// Adds a new column with specified index. /// </summary> /// <param name="column" type="Object"> /// A plain JavaScript object that defines a new column. /// <example> /// <code> /// { /// "caption" : "Company name", /// "sorting" : "None", /// "sortIndex" : -1, /// "expr" : { /// "typeName" : "ENTATTR", /// "id" : "Customers.Company" /// } /// } /// </code> /// </example> /// </param> /// <param name="index" type="Number"> /// The index of new column /// </param> /// </method> Query.prototype.addColumn = function (column, index, author) { var columns = this.columns; if (typeof column.length == "undefined") { if (typeof index == "number") { columns.splice(index, 0, column); } else { columns.push(column); } } else { if (typeof index == "number") { columns.push.apply(columns, [index, 0].concat(column)); } else { columns.push.apply(columns, [].concat(column)); } } this.fireChangedEvent({ "author": author, "changeType": "column.add", "column": column }); }; /// <method version="1.0.0"> /// <summary> /// Moves the column with specified index to another position. /// </summary> /// <param name="index1" type="Number"> /// The index of the column that should be moved. /// </param> /// <param name="index2" type="Number"> /// The index of the position the column should be moved to /// </param> /// </method> Query.prototype.moveColumn = function (index1, index2, author) { var columns = this.getColumns(); var column = columns[index1]; equtils.moveArrayItem(columns, index1, index2); this.fireChangedEvent({ "author": author, "changeType": "column.move", "column": column }); }; /// <method version="1.0.0"> /// <summary> /// Removes the column. /// </summary> /// <param name="column" type="Object"> /// The column to be removed. /// </param> /// </method> Query.prototype.removeColumn = function (column, author) { var columns = this.getColumns(); var index = columns.indexOf(column); if (index >= 0) { columns.splice(index, 1); this.fireChangedEvent({ "author": author, "changeType": "column.remove", "column": column }); } }; Query.prototype.addPredicate = function (params) { var parent = params.predicate || this.getRootPredicate(); var model = this.getModel(); var attr = model.getFirstUICAttr(); var op = model.getDefaultOperatorForAttr(attr); var cond = this.createSimpleConditionObject(attr, op, ""); var lType = parent.linkType === LinkType.All ? LinkType.Any : LinkType.All; var predicate = new Condition(CondTag.Predicate); predicate.linkType = lType; predicate.conditions.push(cond); return predicate; }; Query.prototype.addSimpleCondition = function (params) { var predicate = params.predicate || this.getRootPredicate(); var model = this.getModel(); if (!model) return null; var attrId = params.attr; var attr = model.getAttributeById(attrId); if (!attr) return null; var operatorId = params.operator; var op; if (!operatorId) { op = model.getDefaultOperatorForAttr(attr); } else { op = model.getOperatorById(operatorId); } if (!op) return null; var cond = this.createSimpleConditionObject(attr, op, params.value); predicate.conditions.push(cond); this.fireChangedEvent({ "changeType": "condition.add", "condition": cond }); return cond; }; Query.prototype.createValueExpr = function (attr, operator, index, value) { var model = this.getModel(); var operand = model.getOperand(attr, operator, index); var valueNotDefined = typeof value === 'undefined'; var result = new Expression(); if (operand.kind === DataKind.Query) { result.tag = ExprTag.Query; result.dataType = operand.dataType; result.kind = operand.kind; result.value = value; result.text = ''; } else { if (operand.kind === DataKind.Attribute) { if (!valueNotDefined) { var defAttr = this.getModel().getFirstAttributeByFilter(function (attr) { return attr.usedInCondition == true && (!operand.dataType || attr.dataType == operand.dataType); }); value = defAttr ? defAttr.id : null; } result.tag = ExprTag.EntityAttribute; result.dataType = operand.dataType; result.kind = operand.kind; result.id = value; result.value = value; result.text = ''; } else { if (valueNotDefined) { if (operand.defValue && operand.defValue != "") { value = operand.defValue; } else { if (operand.editor && operand.editor.defValue) { value = operand.editor.defValue; } else { value = ''; } } } result.tag = ExprTag.Constant; result.dataType = operand.dataType; result.kind = operand.kind; result.value = value; result.text = value; } } return result; }; Query.prototype.createSimpleConditionObject = function (attr, operator, value) { var self = this; if (!attr) { return null; } if (!attr.usedInCondition) { return null; } var newExp = new Expression(); newExp.id = attr.id; newExp.tag = self.attrClassName; var cond = new Condition(CondTag.Simple); cond.enabled = true; cond.operatorID = operator.id; cond.expressions.push(newExp); if (value !== null && typeof value !== "undefined") { if (Array.isArray(value)) { var valLength = value.length; for (var i = 0; i < valLength; i++) { cond.expressions.push(this.createValueExpr(attr, operator, i + 1, value[i])); } } else { cond.expressions.push(this.createValueExpr(attr, operator, 1, value)); } } return cond; }; /// <method version="1.0.0"> /// <summary> /// Removes several columns passed as array. /// </summary> /// <param name="columnsToRemove" type="Array"> /// The list of columns to be removed. /// </param> /// </method> Query.prototype.removeColumns = function (columnsToRemove, author) { var allColumns = this.getColumns(); var ctrLen = columnsToRemove.length; for (var i = 0; i < ctrLen; i++) { var index = allColumns.indexOf(columnsToRemove[i]); if (index >= 0) { allColumns.splice(index, 1); } } this.fireChangedEvent({ "author": author, "changeType": "column.remove", "column": columnsToRemove }); }; Query.prototype.fireProcessEvent = function (data) { this.eventEmitter.fire('query.process', data); }; Query.prototype.fireChangedEvent = function (data, postpone) { if (postpone === void 0) { postpone = 100; } this.eventEmitter.fire('query.change', data, postpone); }; Query.prototype.runThroughConditions = function (processCondition) { var processPredicate = function (predicate) { for (var i = 0; i < predicate.conditions.length; i++) { var cond = predicate.conditions[i]; if (cond.conditions) { processPredicate(cond); } else { if (processCondition) processCondition(cond); } } }; processPredicate(this.getRootPredicate()); }; Query.prototype.getOneValueForAttr = function (attrId) { var res = null; this.runThroughConditions(function (cond) { if (cond.enabled) { var expr = cond.expressions[0]; if (expr.id == attrId && cond.expressions[1] && (cond.operatorID == "Equal" || cond.operatorID == "InList" || cond.operatorID == "StartsWith")) { res = cond.expressions[1].value; } } }); return res; }; Query.prototype.getRootPredicate = function () { return this.root; }; Query.prototype.addProcessCallback = function (callback) { return this.eventEmitter.subscribe('query.process', callback); }; Query.prototype.removeProcessCallback = function (callbackId) { this.eventEmitter.unsubscribe('query.process', callbackId); }; Query.prototype.addChangedCallback = function (callback) { return this.eventEmitter.subscribe('query.change', callback); }; Query.prototype.removeChangedCallback = function (callbackId) { this.eventEmitter.unsubscribe('query.change', callbackId); }; Query.prototype.getConditionsText = function () { var self = this; var model = this.getModel(); if (!model) return ''; var getPredicateText = function (predicate) { var result = '', conjKey = "Conj" + predicate.linkType, conjText = eqi18n.getText(conjKey), condText, i; for (i = 0; i < predicate.conditions.length; i++) { condText = ""; var cond = predicate.conditions[i]; if (cond.enabled || typeof (cond.enabled) === "undefined") { if (cond.conditions) { condText = getPredicateText(cond); if (condText) { condText = "(" + condText + ")"; } } else { var opId = cond.operatorID; var operator = model.getOperatorById(opId); var parts = equtils.parseOperatorFormat(operator); var plen = parts.length; for (var pi = 0; pi < plen; pi++) { var part = parts[pi]; var txt = part.text; if (part.type == "expression") { var expr = cond.expressions[part.index]; if (expr.kind == DataKind.Attribute || expr.tag == ExprTag.EntityAttribute) { var attr = model.getAttributeById(expr.id); txt = model.getAttributeText(attr, "{entity} {attr}"); } else { txt = expr.text; } } if (pi > 0) condText += " "; condText += txt; } } } if (condText) { if (i > 0 && result) { result += " " + conjText + " "; } result += condText; } } if (predicate.linkType == LinkType.None || predicate.linkType == LinkType.NotAll) { result = "not ( " + result + " )"; } return result; }; return getPredicateText(this.getRootPredicate()); }; return Query; }()); export { Query }; //# sourceMappingURL=query.js.map