UNPKG

@forestadmin/datasource-toolkit

Version:
144 lines 11.8 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const luxon_1 = require("luxon"); const object_hash_1 = __importDefault(require("object-hash")); const projection_1 = __importDefault(require("./projection")); const record_1 = __importDefault(require("../../utils/record")); class Aggregation { get projection() { const { field, groups } = this; const aggregateFields = [field, ...(groups ?? []).map(b => b.field)].filter(Boolean); return new projection_1.default(...aggregateFields); } constructor(components) { this.field = components.field; this.operation = components.operation; this.groups = components.groups; } apply(records, timezone, limit) { const rows = this.formatSummaries(this.createSummaries(records, timezone)); rows.sort((r1, r2) => { if (r1.value === r2.value) return 0; return r1.value < r2.value ? 1 : -1; }); if (limit && rows.length > limit) { rows.length = limit; } return rows; } nest(prefix) { if (!prefix || prefix.length === 0) { return this; } let nestedField; let nestedGroups; if (this.field) { nestedField = `${prefix}:${this.field}`; } if (this.groups) { nestedGroups = this.groups.map(bucket => ({ field: `${prefix}:${bucket.field}`, operation: bucket.operation, })); } return new Aggregation({ field: nestedField, operation: this.operation, groups: nestedGroups }); } replaceFields(handler) { const result = new Aggregation(this); if (result.field) { result.field = handler(result.field); } result.groups = result.groups?.map(({ field, operation }) => ({ field: handler(field), operation, })); return result; } createSummaries(records, timezone) { const groupingMap = {}; for (const record of records) { const group = this.createGroup(record, timezone); const uniqueKey = (0, object_hash_1.default)(group); const summary = groupingMap[uniqueKey] ?? this.createSummary(group); this.updateSummaryInPlace(summary, record); groupingMap[uniqueKey] = summary; } return Object.values(groupingMap); } formatSummaries(summaries) { const { operation } = this; return operation === 'Avg' ? summaries .filter(summary => summary.Count) .map(summary => ({ group: summary.group, value: summary.Sum / summary.Count, })) : summaries.map(summary => ({ group: summary.group, value: operation === 'Count' && !this.field ? summary.starCount : summary[operation], })); } createGroup(record, timezone) { const group = {}; for (const { field, operation } of this.groups ?? []) { const groupValue = record_1.default.getFieldValue(record, field); group[field] = this.applyDateOperation(groupValue, operation, timezone); } return group; } createSummary(group) { return { group, starCount: 0, Count: 0, Sum: 0, Min: undefined, Max: undefined, }; } updateSummaryInPlace(summary, record) { summary.starCount += 1; // i.e: count(*) if (this.field) { const value = record_1.default.getFieldValue(record, this.field); if (value !== undefined && value !== null) { const { Min: min, Max: max } = summary; summary.Count += 1; // i.e: count(column) if (min === undefined || value < min) summary.Min = value; if (max === undefined || value > max) summary.Max = value; } if (typeof value === 'number' && !Number.isNaN(value)) { summary.Sum += value; } } } applyDateOperation(value, operation, timezone) { if (operation) { const dateTime = luxon_1.DateTime.fromISO(value).setZone(timezone); if (operation === 'Year') { return dateTime.toFormat('yyyy-01-01'); } if (operation === 'Quarter') { return dateTime.startOf('quarter').toFormat('yyyy-LL-dd'); } if (operation === 'Month') { return dateTime.toFormat('yyyy-LL-01'); } if (operation === 'Day') { return dateTime.toFormat('yyyy-LL-dd'); } if (operation === 'Week') { return dateTime.startOf('week').toFormat('yyyy-LL-dd'); } } return value; } } exports.default = Aggregation; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW50ZXJmYWNlcy9xdWVyeS9hZ2dyZWdhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGlDQUFpQztBQUNqQyw4REFBcUM7QUFFckMsOERBQXNDO0FBQ3RDLGdFQUE2QztBQTZCN0MsTUFBcUIsV0FBVztJQUs5QixJQUFJLFVBQVU7UUFDWixNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQztRQUMvQixNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVyRixPQUFPLElBQUksb0JBQVUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxZQUFZLFVBQThCO1FBQ3hDLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBcUIsRUFBRSxRQUFnQixFQUFFLEtBQWM7UUFDM0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRTNFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDbkIsSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQyxLQUFLO2dCQUFFLE9B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