ts-flex-query
Version:
Flexible and type-safe data queries
43 lines • 1.89 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.GroupExpression = void 0;
const lodash_1 = require("lodash");
const evaluate_expression_1 = require("../helpers/evaluate-expression");
const evaluation_context_utils_1 = require("../helpers/evaluation-context-utils");
const data_type_1 = require("../types/data-type");
class GroupExpression {
constructor(input, variableSymbol, groupValue, elementsField, groupValueField) {
this.input = input;
this.variableSymbol = variableSymbol;
this.groupValue = groupValue;
this.elementsField = elementsField;
this.groupValueField = groupValueField;
this.dataType = {
type: data_type_1.DataTypeType.array,
elementType: {
type: data_type_1.DataTypeType.object,
fields: {
[elementsField]: input.dataType,
[groupValueField]: groupValue.dataType
}
}
};
}
evaluate(context) {
const inputResult = (0, evaluate_expression_1.evaluateExpression)(this.input, context);
if (!Array.isArray(inputResult)) {
return [];
}
const groups = (0, lodash_1.groupBy)(inputResult, (element) => JSON.stringify(this.evaluateGroupValue(element, context)));
return Object.values(groups).map((elements) => ({
[this.elementsField]: elements,
[this.groupValueField]: this.evaluateGroupValue(elements[0], context)
}));
}
evaluateGroupValue(elementValue, context) {
const elementContext = (0, evaluation_context_utils_1.addVariable)(context, this.variableSymbol, elementValue);
return (0, evaluate_expression_1.evaluateExpression)(this.groupValue, elementContext);
}
}
exports.GroupExpression = GroupExpression;
//# sourceMappingURL=group.js.map