@easyquery/core
Version:
EasyQuery.JS core modules
633 lines • 22.6 kB
JavaScript
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