@forestadmin-experimental/datasource-cosmos 1.8.0 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -21,6 +21,18 @@ export default class AggregationConverter {
|
|
|
21
21
|
* Build SELECT clause for aggregation expression
|
|
22
22
|
*/
|
|
23
23
|
private static buildAggregateExpression;
|
|
24
|
+
/**
|
|
25
|
+
* Mapping from Forest Admin DateOperation to the number of characters to extract
|
|
26
|
+
* from an ISO 8601 date string (e.g. "2024-01-15T10:30:00Z").
|
|
27
|
+
* Year: 4 chars -> "2024", Month: 7 -> "2024-01", Day: 10 -> "2024-01-15"
|
|
28
|
+
*/
|
|
29
|
+
private static DATE_OPERATION_TO_LENGTH;
|
|
30
|
+
/**
|
|
31
|
+
* Build a Cosmos DB expression that truncates a date field to the given granularity.
|
|
32
|
+
* Uses LEFT() on ISO 8601 string dates for Year/Month/Day.
|
|
33
|
+
* Week uses DateTimeAdd/DateTimePart to compute Monday of the week.
|
|
34
|
+
*/
|
|
35
|
+
private static buildDateGroupExpression;
|
|
24
36
|
/**
|
|
25
37
|
* Build aggregation query with grouping
|
|
26
38
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregation-converter.d.ts","sourceRoot":"","sources":["../../src/utils/aggregation-converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EACL,eAAe,EACf,WAAW,EAEX,aAAa,EACd,MAAM,iCAAiC,CAAC;AAMzC,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACvC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS,CAGrB;IAEH,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAMlC;IAEF;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAS5B;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAC1B,WAAW,EAAE,WAAW,EACxB,aAAa,CAAC,EAAE,aAAa,EAC7B,KAAK,CAAC,EAAE,MAAM,GACb,YAAY;IAiBf;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAUvC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,4BAA4B;
|
|
1
|
+
{"version":3,"file":"aggregation-converter.d.ts","sourceRoot":"","sources":["../../src/utils/aggregation-converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EACL,eAAe,EACf,WAAW,EAEX,aAAa,EACd,MAAM,iCAAiC,CAAC;AAMzC,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACvC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS,CAGrB;IAEH,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAMlC;IAEF;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAS5B;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAC1B,WAAW,EAAE,WAAW,EACxB,aAAa,CAAC,EAAE,aAAa,EAC7B,KAAK,CAAC,EAAE,MAAM,GACb,YAAY;IAiBf;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAUvC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB,CAIrC;IAEF;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IA+BvC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,4BAA4B;IAuC3C;;OAEG;IACH;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAIpC,MAAM,CAAC,yBAAyB,CAC9B,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAC1C,WAAW,EAAE,WAAW,GACvB,eAAe,EAAE;CAqBrB"}
|
|
@@ -45,24 +45,56 @@ class AggregationConverter {
|
|
|
45
45
|
const operation = this.AGGREGATION_OPERATION[aggregation.operation];
|
|
46
46
|
return `${operation}(c.${this.toCosmosField(aggregation.field, 'Aggregation target field')})`;
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Build a Cosmos DB expression that truncates a date field to the given granularity.
|
|
50
|
+
* Uses LEFT() on ISO 8601 string dates for Year/Month/Day.
|
|
51
|
+
* Week uses DateTimeAdd/DateTimePart to compute Monday of the week.
|
|
52
|
+
*/
|
|
53
|
+
static buildDateGroupExpression(field, operation) {
|
|
54
|
+
if (operation === 'Week') {
|
|
55
|
+
// Compute the Monday of the week using Cosmos DB date functions.
|
|
56
|
+
// DateTimePart("dw", ...) returns 1=Sunday ... 7=Saturday.
|
|
57
|
+
// To get days-since-Monday: (dw + 5) % 7 → Mon=0, Tue=1, ..., Sun=6.
|
|
58
|
+
// Subtract that many days to get Monday's date.
|
|
59
|
+
const dw = `(DateTimePart("dw", ${field}) + 5) % 7`;
|
|
60
|
+
return `LEFT(DateTimeAdd("day", -1 * (${dw}), ${field}), 10)`;
|
|
61
|
+
}
|
|
62
|
+
if (operation === 'Quarter') {
|
|
63
|
+
// Return first day of the quarter as "YYYY-MM-01" so Forest Admin can parse it.
|
|
64
|
+
// Compute quarter start month: FLOOR((month - 1) / 3) * 3 + 1
|
|
65
|
+
// e.g. Jan-Mar -> 01, Apr-Jun -> 04, Jul-Sep -> 07, Oct-Dec -> 10
|
|
66
|
+
const startMonth = `FLOOR((DateTimePart("mm", ${field}) - 1) / 3) * 3 + 1`;
|
|
67
|
+
const mm = `RIGHT(CONCAT("0", ToString(${startMonth})), 2)`;
|
|
68
|
+
return `CONCAT(LEFT(${field}, 4), "-", ${mm}, "-01")`;
|
|
69
|
+
}
|
|
70
|
+
const length = this.DATE_OPERATION_TO_LENGTH[operation];
|
|
71
|
+
if (!length) {
|
|
72
|
+
throw new Error(`Unsupported date operation: "${operation}"`);
|
|
73
|
+
}
|
|
74
|
+
return `LEFT(${field}, ${length})`;
|
|
75
|
+
}
|
|
48
76
|
/**
|
|
49
77
|
* Build aggregation query with grouping
|
|
50
78
|
*/
|
|
51
79
|
static buildGroupedAggregationQuery(aggregation, whereFragment, parameters, limit) {
|
|
52
80
|
const groups = aggregation.groups || [];
|
|
53
|
-
if (groups.length !== 1
|
|
54
|
-
throw new Error('Complex grouping with multiple fields
|
|
81
|
+
if (groups.length !== 1) {
|
|
82
|
+
throw new Error('Complex grouping with multiple fields requires ' +
|
|
55
83
|
'application-level processing. Please implement this using the raw query ' +
|
|
56
84
|
'results and post-processing.');
|
|
57
85
|
}
|
|
58
|
-
const
|
|
86
|
+
const group = groups[0];
|
|
87
|
+
const cosmosField = `c.${this.toCosmosField(group.field, 'Group by field')}`;
|
|
88
|
+
const groupExpression = group.operation
|
|
89
|
+
? this.buildDateGroupExpression(cosmosField, group.operation)
|
|
90
|
+
: cosmosField;
|
|
59
91
|
const aggregateExpr = this.buildAggregateExpression(aggregation);
|
|
60
92
|
const query = `
|
|
61
|
-
SELECT ${
|
|
93
|
+
SELECT ${groupExpression} as groupKey, ${aggregateExpr} as aggregateValue
|
|
62
94
|
FROM c
|
|
63
95
|
${whereFragment}
|
|
64
|
-
GROUP BY ${
|
|
65
|
-
|
|
96
|
+
GROUP BY ${groupExpression}
|
|
97
|
+
|
|
66
98
|
${limit ? `OFFSET 0 LIMIT ${limit}` : ''}
|
|
67
99
|
`
|
|
68
100
|
.trim()
|
|
@@ -111,5 +143,15 @@ AggregationConverter.AGGREGATION_OPERATION = {
|
|
|
111
143
|
Max: 'MAX',
|
|
112
144
|
Min: 'MIN',
|
|
113
145
|
};
|
|
146
|
+
/**
|
|
147
|
+
* Mapping from Forest Admin DateOperation to the number of characters to extract
|
|
148
|
+
* from an ISO 8601 date string (e.g. "2024-01-15T10:30:00Z").
|
|
149
|
+
* Year: 4 chars -> "2024", Month: 7 -> "2024-01", Day: 10 -> "2024-01-15"
|
|
150
|
+
*/
|
|
151
|
+
AggregationConverter.DATE_OPERATION_TO_LENGTH = {
|
|
152
|
+
Year: 4,
|
|
153
|
+
Month: 7,
|
|
154
|
+
Day: 10,
|
|
155
|
+
};
|
|
114
156
|
exports.default = AggregationConverter;
|
|
115
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRpb24tY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2FnZ3JlZ2F0aW9uLWNvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVFBLHdFQUErQztBQUMvQyx3RUFBK0M7QUFDL0MsOERBQXNDO0FBRXRDLE1BQXFCLG9CQUFvQjtJQWtCdkM7Ozs7T0FJRztJQUNLLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBYSxFQUFFLE9BQU8sR0FBRyxtQkFBbUI7UUFDdkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFakQsT0FBTyxLQUFLO2FBQ1QsS0FBSyxDQUFDLElBQUksQ0FBQzthQUNYLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUM7YUFDbEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLHFCQUFxQixDQUMxQixXQUF3QixFQUN4QixhQUE2QixFQUM3QixLQUFjO1FBRWQsTUFBTSxjQUFjLEdBQUcsSUFBSSx5QkFBYyxFQUFFLENBQUM7UUFDNUMsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRXBELDZDQUE2QztRQUM3QyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUs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
|