nodedb-json
Version:
A lightweight JSON-based database for Node.js with TypeScript support, indexing, and complex query capabilities
66 lines • 2.56 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.applyAggregation = applyAggregation;
const lodash_1 = __importDefault(require("lodash"));
function applyAggregation(data, aggregations) {
return aggregations.map(agg => {
switch (agg.type) {
case 'count':
return {
type: 'count',
value: data.length
};
case 'sum':
if (!agg.field) {
throw new Error('Sum aggregation requires a field');
}
return {
type: 'sum',
field: agg.field,
value: lodash_1.default.sumBy(data, agg.field)
};
case 'avg':
if (!agg.field) {
throw new Error('Average aggregation requires a field');
}
return {
type: 'avg',
field: agg.field,
value: lodash_1.default.meanBy(data, agg.field)
};
case 'min':
if (!agg.field) {
throw new Error('Min aggregation requires a field');
}
return {
type: 'min',
field: agg.field,
value: lodash_1.default.get(lodash_1.default.minBy(data, item => lodash_1.default.get(item, agg.field)), agg.field, 0)
};
case 'max':
if (!agg.field) {
throw new Error('Max aggregation requires a field');
}
return {
type: 'max',
field: agg.field,
value: lodash_1.default.get(lodash_1.default.maxBy(data, item => lodash_1.default.get(item, agg.field)), agg.field, 0)
};
case 'group':
if (!agg.groupBy) {
throw new Error('Group aggregation requires a groupBy field');
}
return {
type: 'group',
groupBy: agg.groupBy,
value: lodash_1.default.groupBy(data, agg.groupBy)
};
default:
throw new Error(`Unsupported aggregation type: ${agg.type}`);
}
});
}
//# sourceMappingURL=aggregator.js.map