@forestadmin-experimental/datasource-cosmos 1.8.0 → 1.8.1
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,17 @@ 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 stored in Cosmos DB.
|
|
33
|
+
*/
|
|
34
|
+
private static buildDateGroupExpression;
|
|
24
35
|
/**
|
|
25
36
|
* Build aggregation query with grouping
|
|
26
37
|
*/
|
|
@@ -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;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAUvC;;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,39 @@ 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 stored in Cosmos DB.
|
|
51
|
+
*/
|
|
52
|
+
static buildDateGroupExpression(field, operation) {
|
|
53
|
+
const length = this.DATE_OPERATION_TO_LENGTH[operation];
|
|
54
|
+
if (!length) {
|
|
55
|
+
throw new Error(`Unsupported date operation: "${operation}"`);
|
|
56
|
+
}
|
|
57
|
+
return `LEFT(${field}, ${length})`;
|
|
58
|
+
}
|
|
48
59
|
/**
|
|
49
60
|
* Build aggregation query with grouping
|
|
50
61
|
*/
|
|
51
62
|
static buildGroupedAggregationQuery(aggregation, whereFragment, parameters, limit) {
|
|
52
63
|
const groups = aggregation.groups || [];
|
|
53
|
-
if (groups.length !== 1
|
|
54
|
-
throw new Error('Complex grouping with multiple fields
|
|
64
|
+
if (groups.length !== 1) {
|
|
65
|
+
throw new Error('Complex grouping with multiple fields requires ' +
|
|
55
66
|
'application-level processing. Please implement this using the raw query ' +
|
|
56
67
|
'results and post-processing.');
|
|
57
68
|
}
|
|
58
|
-
const
|
|
69
|
+
const group = groups[0];
|
|
70
|
+
const cosmosField = `c.${this.toCosmosField(group.field, 'Group by field')}`;
|
|
71
|
+
const groupExpression = group.operation
|
|
72
|
+
? this.buildDateGroupExpression(cosmosField, group.operation)
|
|
73
|
+
: cosmosField;
|
|
59
74
|
const aggregateExpr = this.buildAggregateExpression(aggregation);
|
|
60
75
|
const query = `
|
|
61
|
-
SELECT ${
|
|
76
|
+
SELECT ${groupExpression} as groupKey, ${aggregateExpr} as aggregateValue
|
|
62
77
|
FROM c
|
|
63
78
|
${whereFragment}
|
|
64
|
-
GROUP BY ${
|
|
65
|
-
|
|
79
|
+
GROUP BY ${groupExpression}
|
|
80
|
+
|
|
66
81
|
${limit ? `OFFSET 0 LIMIT ${limit}` : ''}
|
|
67
82
|
`
|
|
68
83
|
.trim()
|
|
@@ -111,5 +126,15 @@ AggregationConverter.AGGREGATION_OPERATION = {
|
|
|
111
126
|
Max: 'MAX',
|
|
112
127
|
Min: 'MIN',
|
|
113
128
|
};
|
|
129
|
+
/**
|
|
130
|
+
* Mapping from Forest Admin DateOperation to the number of characters to extract
|
|
131
|
+
* from an ISO 8601 date string (e.g. "2024-01-15T10:30:00Z").
|
|
132
|
+
* Year: 4 chars -> "2024", Month: 7 -> "2024-01", Day: 10 -> "2024-01-15"
|
|
133
|
+
*/
|
|
134
|
+
AggregationConverter.DATE_OPERATION_TO_LENGTH = {
|
|
135
|
+
Year: 4,
|
|
136
|
+
Month: 7,
|
|
137
|
+
Day: 10,
|
|
138
|
+
};
|
|
114
139
|
exports.default = AggregationConverter;
|
|
115
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRpb24tY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2FnZ3JlZ2F0aW9uLWNvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVFBLHdFQUErQztBQUMvQyx3RUFBK0M7QUFDL0MsOERBQXNDO0FBRXRDLE1BQXFCLG9CQUFvQjtJQWtCdkM7Ozs7T0FJRztJQUNLLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBYSxFQUFFLE9BQU8sR0FBRyxtQkFBbUI7UUFDdkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFakQsT0FBTyxLQUFLO2FBQ1QsS0FBSyxDQUFDLElBQUksQ0FBQzthQUNYLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUM7YUFDbEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLHFCQUFxQixDQUMxQixXQUF3QixFQUN4QixhQUE2QixFQUM3QixLQUFjO1FBRWQsTUFBTSxjQUFjLEdBQUcsSUFBSSx5QkFBYyxFQUFFLENBQUM7UUFDNUMsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRXBELDZDQUE2QztRQUM3QyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUs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
|