cozy-client 30.0.0 → 32.0.0
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.
- package/dist/CozyClient.js +1 -1
- package/dist/Query.spec.jsx +1 -0
- package/dist/hooks/useQuery.spec.jsx +1 -0
- package/dist/models/dacc.js +111 -7
- package/dist/models/dacc.spec.js +54 -2
- package/dist/store/__snapshots__/queries.spec.js.snap +18 -0
- package/dist/store/queries.js +67 -24
- package/dist/store/queries.spec.js +97 -1
- package/dist/store.spec.js +78 -0
- package/dist/types.js +31 -0
- package/package.json +3 -3
- package/types/models/dacc.d.ts +24 -1
- package/types/store/queries.d.ts +6 -1
- package/types/types.d.ts +63 -0
package/dist/CozyClient.js
CHANGED
|
@@ -2550,7 +2550,7 @@ var CozyClient = /*#__PURE__*/function () {
|
|
|
2550
2550
|
CozyClient.hooks = CozyClient.hooks || {};
|
|
2551
2551
|
CozyClient.fetchPolicies = _policies.default; //COZY_CLIENT_VERSION_PACKAGE in replaced by babel. See babel config
|
|
2552
2552
|
|
|
2553
|
-
CozyClient.version = "
|
|
2553
|
+
CozyClient.version = "32.0.0";
|
|
2554
2554
|
|
|
2555
2555
|
_microee.default.mixin(CozyClient);
|
|
2556
2556
|
|
package/dist/Query.spec.jsx
CHANGED
package/dist/models/dacc.js
CHANGED
|
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.sendMeasureToDACC = exports.checkMeasureParams = void 0;
|
|
8
|
+
exports.fetchAggregatesFromDACC = exports.buildAggregateParams = exports.sendMeasureToDACC = exports.checkMeasureParams = exports.isCorrectDateFormat = void 0;
|
|
9
9
|
|
|
10
10
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
11
11
|
|
|
@@ -15,11 +15,31 @@ var _cozyLogger = _interopRequireDefault(require("cozy-logger"));
|
|
|
15
15
|
|
|
16
16
|
var _types = require("../types");
|
|
17
17
|
|
|
18
|
+
var _CozyClient = _interopRequireDefault(require("../CozyClient"));
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Check whether or not the given date is in YYYY-MM-DD format
|
|
22
|
+
*
|
|
23
|
+
* @param {string} date - The date to check
|
|
24
|
+
* @returns {boolean}
|
|
25
|
+
*/
|
|
26
|
+
var isCorrectDateFormat = function isCorrectDateFormat(date) {
|
|
27
|
+
try {
|
|
28
|
+
var parsedDate = new Date(Date.parse(date));
|
|
29
|
+
return !!parsedDate.toISOString().startsWith(date);
|
|
30
|
+
} catch (err) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
18
34
|
/**
|
|
19
35
|
* Throw an errror if a DACC parameter is incorrect.
|
|
20
36
|
*
|
|
21
37
|
* @param { DACCMeasure} measure - The DACC measure
|
|
22
38
|
*/
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
exports.isCorrectDateFormat = isCorrectDateFormat;
|
|
42
|
+
|
|
23
43
|
var checkMeasureParams = function checkMeasureParams(measure) {
|
|
24
44
|
var createdBy = measure.createdBy,
|
|
25
45
|
measureName = measure.measureName,
|
|
@@ -41,9 +61,7 @@ var checkMeasureParams = function checkMeasureParams(measure) {
|
|
|
41
61
|
throw new Error('Missing parameter: startDate');
|
|
42
62
|
}
|
|
43
63
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if (!parsedDate.toISOString().startsWith(startDate)) {
|
|
64
|
+
if (!isCorrectDateFormat(startDate)) {
|
|
47
65
|
throw new Error('Date should be in YYYY-MM-DD format');
|
|
48
66
|
}
|
|
49
67
|
|
|
@@ -62,7 +80,7 @@ var checkMeasureParams = function checkMeasureParams(measure) {
|
|
|
62
80
|
/**
|
|
63
81
|
* Send measures to a DACC through a remote doctype
|
|
64
82
|
*
|
|
65
|
-
* @param {
|
|
83
|
+
* @param {CozyClient} client - The CozyClient instance
|
|
66
84
|
* @param {string} remoteDoctype - The remote doctype to use
|
|
67
85
|
* @param {DACCMeasure} measure - The DACC measure
|
|
68
86
|
*/
|
|
@@ -80,7 +98,8 @@ var sendMeasureToDACC = /*#__PURE__*/function () {
|
|
|
80
98
|
checkMeasureParams(measure);
|
|
81
99
|
_context.next = 4;
|
|
82
100
|
return client.getStackClient().fetchJSON('POST', "/remote/".concat(remoteDoctype), {
|
|
83
|
-
data: JSON.stringify(measure)
|
|
101
|
+
data: JSON.stringify(measure),
|
|
102
|
+
path: 'measure'
|
|
84
103
|
});
|
|
85
104
|
|
|
86
105
|
case 4:
|
|
@@ -105,5 +124,90 @@ var sendMeasureToDACC = /*#__PURE__*/function () {
|
|
|
105
124
|
return _ref.apply(this, arguments);
|
|
106
125
|
};
|
|
107
126
|
}();
|
|
127
|
+
/**
|
|
128
|
+
* Build parameters to request DACC aggregate
|
|
129
|
+
*
|
|
130
|
+
*
|
|
131
|
+
* @typedef Params - The unformatted DACC aggregate params
|
|
132
|
+
* @property {string} [measureName] - The measure name
|
|
133
|
+
* @property {string} [startDate] - The measure start date
|
|
134
|
+
* @property {string} [endDate] - The measure end date
|
|
135
|
+
*
|
|
136
|
+
* @param {Params} params - The unformatted DACC aggregate params
|
|
137
|
+
* @returns {DACCAggregatesParams}
|
|
138
|
+
*/
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
exports.sendMeasureToDACC = sendMeasureToDACC;
|
|
142
|
+
|
|
143
|
+
var buildAggregateParams = function buildAggregateParams(params) {
|
|
144
|
+
var measureName = params.measureName;
|
|
145
|
+
|
|
146
|
+
if (!measureName || typeof measureName !== 'string') {
|
|
147
|
+
throw new Error('Missing or wrong type parameter: measureName');
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
var startDate = params.startDate || new Date(0).toISOString();
|
|
151
|
+
var endDate = params.endDate || new Date(Date.now()).toISOString();
|
|
152
|
+
|
|
153
|
+
if (!isCorrectDateFormat(startDate) || !isCorrectDateFormat(endDate)) {
|
|
154
|
+
(0, _cozyLogger.default)('error', "Date should be in YYYY-MM-DD format but received: startDate: ".concat(startDate, " | endDate: ").concat(endDate));
|
|
155
|
+
throw new Error('Date should be in YYYY-MM-DD format');
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return {
|
|
159
|
+
measureName: measureName,
|
|
160
|
+
startDate: startDate,
|
|
161
|
+
endDate: endDate
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
/**
|
|
165
|
+
* Send measures to a DACC through a remote doctype
|
|
166
|
+
*
|
|
167
|
+
* @param {CozyClient} client - The CozyClient instance
|
|
168
|
+
* @param {string} remoteDoctype - The remote doctype to use
|
|
169
|
+
* @param {DACCAggregatesParams} params - The request params
|
|
170
|
+
* @returns { Promise<DACCAggregatesResponse> }
|
|
171
|
+
*/
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
exports.buildAggregateParams = buildAggregateParams;
|
|
175
|
+
|
|
176
|
+
var fetchAggregatesFromDACC = /*#__PURE__*/function () {
|
|
177
|
+
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(client, remoteDoctype, params) {
|
|
178
|
+
var aggregateParams;
|
|
179
|
+
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
180
|
+
while (1) {
|
|
181
|
+
switch (_context2.prev = _context2.next) {
|
|
182
|
+
case 0:
|
|
183
|
+
_context2.prev = 0;
|
|
184
|
+
aggregateParams = buildAggregateParams(params);
|
|
185
|
+
_context2.next = 4;
|
|
186
|
+
return client.getStackClient().fetchJSON('POST', "/remote/".concat(remoteDoctype), {
|
|
187
|
+
data: JSON.stringify(aggregateParams),
|
|
188
|
+
path: 'aggregate'
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
case 4:
|
|
192
|
+
return _context2.abrupt("return", _context2.sent);
|
|
193
|
+
|
|
194
|
+
case 7:
|
|
195
|
+
_context2.prev = 7;
|
|
196
|
+
_context2.t0 = _context2["catch"](0);
|
|
197
|
+
(0, _cozyLogger.default)('error', "Error while fetching aggregates to remote doctype: ".concat(_context2.t0.message));
|
|
198
|
+
throw _context2.t0;
|
|
199
|
+
|
|
200
|
+
case 11:
|
|
201
|
+
case "end":
|
|
202
|
+
return _context2.stop();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}, _callee2, null, [[0, 7]]);
|
|
206
|
+
}));
|
|
207
|
+
|
|
208
|
+
return function fetchAggregatesFromDACC(_x4, _x5, _x6) {
|
|
209
|
+
return _ref2.apply(this, arguments);
|
|
210
|
+
};
|
|
211
|
+
}();
|
|
108
212
|
|
|
109
|
-
exports.
|
|
213
|
+
exports.fetchAggregatesFromDACC = fetchAggregatesFromDACC;
|
package/dist/models/dacc.spec.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { checkMeasureParams } from './dacc'
|
|
1
|
+
import { checkMeasureParams, buildAggregateParams } from './dacc'
|
|
2
2
|
|
|
3
|
-
describe('
|
|
3
|
+
describe('checkMeasureParams', () => {
|
|
4
4
|
const measure = {
|
|
5
5
|
value: 42,
|
|
6
6
|
measureName: 'theanswer',
|
|
@@ -104,3 +104,55 @@ describe('dacc', () => {
|
|
|
104
104
|
).toThrow()
|
|
105
105
|
})
|
|
106
106
|
})
|
|
107
|
+
|
|
108
|
+
describe('buildAggregateParams', () => {
|
|
109
|
+
beforeAll(() => {
|
|
110
|
+
jest
|
|
111
|
+
.spyOn(global.Date, 'now')
|
|
112
|
+
.mockImplementation(() => new Date(2022, 5, 1).valueOf())
|
|
113
|
+
})
|
|
114
|
+
it('should throw if measure name is not correct', () => {
|
|
115
|
+
expect(() => buildAggregateParams({})).toThrow()
|
|
116
|
+
expect(() => buildAggregateParams({ measurName: 42 })).toThrow()
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
it('should throw if dates are not correct', () => {
|
|
120
|
+
expect(() =>
|
|
121
|
+
buildAggregateParams({
|
|
122
|
+
measureName: 'test',
|
|
123
|
+
startDate: 'Lundi 10 août 2021'
|
|
124
|
+
})
|
|
125
|
+
).toThrow()
|
|
126
|
+
expect(() =>
|
|
127
|
+
buildAggregateParams({
|
|
128
|
+
measureName: 'test',
|
|
129
|
+
endDate: 'Lundi 10 août 2021'
|
|
130
|
+
})
|
|
131
|
+
).toThrow()
|
|
132
|
+
})
|
|
133
|
+
it('should build dates if none provided', () => {
|
|
134
|
+
expect(buildAggregateParams({ measureName: 'test' })).toEqual({
|
|
135
|
+
measureName: 'test',
|
|
136
|
+
startDate: '1970-01-01T00:00:00.000Z',
|
|
137
|
+
endDate: new Date(2022, 5, 1).toISOString()
|
|
138
|
+
})
|
|
139
|
+
})
|
|
140
|
+
it('should build dates if startDate provided', () => {
|
|
141
|
+
expect(
|
|
142
|
+
buildAggregateParams({ measureName: 'test', startDate: '2021-08-10' })
|
|
143
|
+
).toEqual({
|
|
144
|
+
measureName: 'test',
|
|
145
|
+
startDate: '2021-08-10',
|
|
146
|
+
endDate: new Date(2022, 5, 1).toISOString()
|
|
147
|
+
})
|
|
148
|
+
})
|
|
149
|
+
it('should build dates if endDate provided', () => {
|
|
150
|
+
expect(
|
|
151
|
+
buildAggregateParams({ measureName: 'test', endDate: '2022-05-02' })
|
|
152
|
+
).toEqual({
|
|
153
|
+
measureName: 'test',
|
|
154
|
+
startDate: '1970-01-01T00:00:00.000Z',
|
|
155
|
+
endDate: '2022-05-02'
|
|
156
|
+
})
|
|
157
|
+
})
|
|
158
|
+
})
|
|
@@ -23,6 +23,7 @@ Object {
|
|
|
23
23
|
"sort": undefined,
|
|
24
24
|
},
|
|
25
25
|
"fetchStatus": "pending",
|
|
26
|
+
"fetchedPagesCount": 0,
|
|
26
27
|
"hasMore": false,
|
|
27
28
|
"id": "a",
|
|
28
29
|
"lastError": null,
|
|
@@ -60,6 +61,7 @@ Object {
|
|
|
60
61
|
"sort": undefined,
|
|
61
62
|
},
|
|
62
63
|
"fetchStatus": "loaded",
|
|
64
|
+
"fetchedPagesCount": 1,
|
|
63
65
|
"hasMore": false,
|
|
64
66
|
"id": "a",
|
|
65
67
|
"lastError": null,
|
|
@@ -96,6 +98,7 @@ Object {
|
|
|
96
98
|
"sort": undefined,
|
|
97
99
|
},
|
|
98
100
|
"fetchStatus": "loaded",
|
|
101
|
+
"fetchedPagesCount": 1,
|
|
99
102
|
"hasMore": false,
|
|
100
103
|
"id": "a",
|
|
101
104
|
"lastError": null,
|
|
@@ -132,6 +135,7 @@ Object {
|
|
|
132
135
|
"sort": undefined,
|
|
133
136
|
},
|
|
134
137
|
"fetchStatus": "pending",
|
|
138
|
+
"fetchedPagesCount": 0,
|
|
135
139
|
"hasMore": false,
|
|
136
140
|
"id": "b",
|
|
137
141
|
"lastError": null,
|
|
@@ -168,6 +172,7 @@ Object {
|
|
|
168
172
|
"sort": undefined,
|
|
169
173
|
},
|
|
170
174
|
"fetchStatus": "loaded",
|
|
175
|
+
"fetchedPagesCount": 1,
|
|
171
176
|
"hasMore": false,
|
|
172
177
|
"id": "a",
|
|
173
178
|
"lastError": null,
|
|
@@ -201,6 +206,7 @@ Object {
|
|
|
201
206
|
"sort": undefined,
|
|
202
207
|
},
|
|
203
208
|
"fetchStatus": "pending",
|
|
209
|
+
"fetchedPagesCount": 0,
|
|
204
210
|
"hasMore": false,
|
|
205
211
|
"id": "b",
|
|
206
212
|
"lastError": null,
|
|
@@ -243,6 +249,7 @@ Object {
|
|
|
243
249
|
],
|
|
244
250
|
},
|
|
245
251
|
"fetchStatus": "loaded",
|
|
252
|
+
"fetchedPagesCount": 1,
|
|
246
253
|
"hasMore": false,
|
|
247
254
|
"id": "a",
|
|
248
255
|
"lastError": null,
|
|
@@ -274,6 +281,7 @@ Object {
|
|
|
274
281
|
"sort": undefined,
|
|
275
282
|
},
|
|
276
283
|
"fetchStatus": "pending",
|
|
284
|
+
"fetchedPagesCount": 0,
|
|
277
285
|
"hasMore": false,
|
|
278
286
|
"id": "b",
|
|
279
287
|
"lastError": null,
|
|
@@ -311,6 +319,7 @@ Object {
|
|
|
311
319
|
"sort": undefined,
|
|
312
320
|
},
|
|
313
321
|
"fetchStatus": "loaded",
|
|
322
|
+
"fetchedPagesCount": 1,
|
|
314
323
|
"hasMore": false,
|
|
315
324
|
"id": "a",
|
|
316
325
|
"lastError": null,
|
|
@@ -343,6 +352,7 @@ Object {
|
|
|
343
352
|
"sort": undefined,
|
|
344
353
|
},
|
|
345
354
|
"fetchStatus": "pending",
|
|
355
|
+
"fetchedPagesCount": 0,
|
|
346
356
|
"hasMore": false,
|
|
347
357
|
"id": "b",
|
|
348
358
|
"lastError": null,
|
|
@@ -379,6 +389,7 @@ Object {
|
|
|
379
389
|
"sort": undefined,
|
|
380
390
|
},
|
|
381
391
|
"fetchStatus": "loaded",
|
|
392
|
+
"fetchedPagesCount": 1,
|
|
382
393
|
"hasMore": false,
|
|
383
394
|
"id": "a",
|
|
384
395
|
"lastError": null,
|
|
@@ -410,6 +421,7 @@ Object {
|
|
|
410
421
|
"sort": undefined,
|
|
411
422
|
},
|
|
412
423
|
"fetchStatus": "pending",
|
|
424
|
+
"fetchedPagesCount": 0,
|
|
413
425
|
"hasMore": false,
|
|
414
426
|
"id": "b",
|
|
415
427
|
"lastError": null,
|
|
@@ -448,6 +460,7 @@ Object {
|
|
|
448
460
|
"sort": undefined,
|
|
449
461
|
},
|
|
450
462
|
"fetchStatus": "pending",
|
|
463
|
+
"fetchedPagesCount": 0,
|
|
451
464
|
"hasMore": false,
|
|
452
465
|
"id": "a",
|
|
453
466
|
"lastError": null,
|
|
@@ -477,6 +490,7 @@ Object {
|
|
|
477
490
|
"sort": undefined,
|
|
478
491
|
},
|
|
479
492
|
"fetchStatus": "pending",
|
|
493
|
+
"fetchedPagesCount": 0,
|
|
480
494
|
"hasMore": false,
|
|
481
495
|
"id": "b",
|
|
482
496
|
"lastError": null,
|
|
@@ -513,6 +527,7 @@ Object {
|
|
|
513
527
|
"sort": undefined,
|
|
514
528
|
},
|
|
515
529
|
"fetchStatus": "loaded",
|
|
530
|
+
"fetchedPagesCount": 2,
|
|
516
531
|
"hasMore": false,
|
|
517
532
|
"id": "a",
|
|
518
533
|
"lastError": null,
|
|
@@ -546,6 +561,7 @@ Object {
|
|
|
546
561
|
"sort": undefined,
|
|
547
562
|
},
|
|
548
563
|
"fetchStatus": "pending",
|
|
564
|
+
"fetchedPagesCount": 0,
|
|
549
565
|
"hasMore": false,
|
|
550
566
|
"id": "b",
|
|
551
567
|
"lastError": null,
|
|
@@ -586,6 +602,7 @@ Object {
|
|
|
586
602
|
"sort": undefined,
|
|
587
603
|
},
|
|
588
604
|
"fetchStatus": "loaded",
|
|
605
|
+
"fetchedPagesCount": 1,
|
|
589
606
|
"hasMore": false,
|
|
590
607
|
"id": "a",
|
|
591
608
|
"lastError": null,
|
|
@@ -617,6 +634,7 @@ Object {
|
|
|
617
634
|
"sort": undefined,
|
|
618
635
|
},
|
|
619
636
|
"fetchStatus": "pending",
|
|
637
|
+
"fetchedPagesCount": 0,
|
|
620
638
|
"hasMore": false,
|
|
621
639
|
"id": "b",
|
|
622
640
|
"lastError": null,
|
package/dist/store/queries.js
CHANGED
|
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.QueryIDGenerator = exports.getQueryFromSlice = exports.receiveQueryError = exports.receiveQueryResult = exports.loadQuery = exports.initQuery = exports.default = exports.makeSorterFromDefinition = exports.mergeSelectorAndPartialIndex = exports.convert$gtNullSelectors = exports.isReceivingData = exports.isQueryAction = void 0;
|
|
8
|
+
exports.QueryIDGenerator = exports.getQueryFromSlice = exports.receiveQueryError = exports.receiveQueryResult = exports.loadQuery = exports.initQuery = exports.default = exports.makeSorterFromDefinition = exports.mergeSelectorAndPartialIndex = exports.convert$gtNullSelectors = exports.sortAndLimitDocsIds = exports.isReceivingData = exports.isQueryAction = void 0;
|
|
9
9
|
|
|
10
10
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
11
11
|
|
|
@@ -90,25 +90,65 @@ var queryInitialState = {
|
|
|
90
90
|
lastError: null,
|
|
91
91
|
hasMore: false,
|
|
92
92
|
count: 0,
|
|
93
|
+
fetchedPagesCount: 0,
|
|
93
94
|
data: [],
|
|
94
95
|
bookmark: null
|
|
95
96
|
};
|
|
97
|
+
/**
|
|
98
|
+
* Return the docs ids accordingly to the given sort and fetched docs
|
|
99
|
+
*
|
|
100
|
+
* @param {QueryState} queryState - Current state
|
|
101
|
+
* @param {DocumentsStateSlice} documents - Reference to the documents slice
|
|
102
|
+
* @param {Array<string>} ids - The updated ids after query
|
|
103
|
+
* @param {object} params - The additional params
|
|
104
|
+
* @param {number} params.count - The count of retrieved docs
|
|
105
|
+
* @param {number} params.fetchedPagesCount - The number of pages already fetched
|
|
106
|
+
* @returns {Array<string>} The list of sorted ids
|
|
107
|
+
*/
|
|
96
108
|
|
|
97
|
-
var
|
|
98
|
-
var
|
|
109
|
+
var sortAndLimitDocsIds = function sortAndLimitDocsIds(queryState, documents, ids, _ref) {
|
|
110
|
+
var count = _ref.count,
|
|
111
|
+
fetchedPagesCount = _ref.fetchedPagesCount;
|
|
112
|
+
var evaluatedIds = (0, _toConsumableArray2.default)(ids);
|
|
99
113
|
|
|
100
|
-
if (queryState.definition.sort) {
|
|
114
|
+
if (queryState.definition.sort && documents) {
|
|
101
115
|
var sorter = makeSorterFromDefinition(queryState.definition);
|
|
102
|
-
var
|
|
103
|
-
var
|
|
104
|
-
var docs = allDocs ? updatedIds.map(function (_id) {
|
|
116
|
+
var allDocs = documents[queryState.definition.doctype];
|
|
117
|
+
var docs = allDocs ? evaluatedIds.map(function (_id) {
|
|
105
118
|
return allDocs[_id];
|
|
106
119
|
}).filter(Boolean) : [];
|
|
107
|
-
|
|
108
|
-
|
|
120
|
+
evaluatedIds = sorter(docs).map(_helpers.properId);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (queryState.definition.limit) {
|
|
124
|
+
evaluatedIds = queryState.definition.limit ? evaluatedIds.slice(0, count * fetchedPagesCount) : evaluatedIds;
|
|
109
125
|
}
|
|
110
126
|
|
|
111
|
-
return
|
|
127
|
+
return evaluatedIds;
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* Return the query docs ids, taken from the action response and the documents' slice
|
|
131
|
+
*
|
|
132
|
+
* @param {QueryState} queryState - Current state
|
|
133
|
+
* @param {object} response - The action response
|
|
134
|
+
* @param {DocumentsStateSlice} documents - Reference to the documents slice
|
|
135
|
+
* @param {object} params - The additional params
|
|
136
|
+
* @param {number} params.count - The count of retrieved docs
|
|
137
|
+
* @param {number} params.fetchedPagesCount - The number of pages already fetched
|
|
138
|
+
* @returns {Array<string>} The list of sorted ids
|
|
139
|
+
*/
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
exports.sortAndLimitDocsIds = sortAndLimitDocsIds;
|
|
143
|
+
|
|
144
|
+
var updateQueryDataFromResponse = function updateQueryDataFromResponse(queryState, response, documents, _ref2) {
|
|
145
|
+
var count = _ref2.count,
|
|
146
|
+
fetchedPagesCount = _ref2.fetchedPagesCount;
|
|
147
|
+
var updatedIds = (0, _uniq.default)([].concat((0, _toConsumableArray2.default)(queryState.data), (0, _toConsumableArray2.default)(response.data.map(_helpers.properId))));
|
|
148
|
+
return sortAndLimitDocsIds(queryState, documents, updatedIds, {
|
|
149
|
+
count: count,
|
|
150
|
+
fetchedPagesCount: fetchedPagesCount
|
|
151
|
+
});
|
|
112
152
|
};
|
|
113
153
|
/**
|
|
114
154
|
* Reducer for a query slice
|
|
@@ -177,11 +217,18 @@ var query = function query() {
|
|
|
177
217
|
});
|
|
178
218
|
}
|
|
179
219
|
|
|
220
|
+
var count = response.meta && response.meta.count ? response.meta.count : response.data.length;
|
|
221
|
+
var fetchedPagesCount = state.fetchedPagesCount + 1;
|
|
222
|
+
var data = updateQueryDataFromResponse(state, response, documents, {
|
|
223
|
+
count: count,
|
|
224
|
+
fetchedPagesCount: fetchedPagesCount
|
|
225
|
+
});
|
|
180
226
|
return _objectSpread(_objectSpread(_objectSpread({}, state), common), {}, {
|
|
181
227
|
bookmark: response.bookmark || null,
|
|
182
228
|
hasMore: response.next !== undefined ? response.next : state.hasMore,
|
|
183
|
-
count:
|
|
184
|
-
|
|
229
|
+
count: count,
|
|
230
|
+
fetchedPagesCount: fetchedPagesCount,
|
|
231
|
+
data: data
|
|
185
232
|
});
|
|
186
233
|
}
|
|
187
234
|
|
|
@@ -371,20 +418,16 @@ var updateData = function updateData(query, newData, documents) {
|
|
|
371
418
|
// It is also faster than union.
|
|
372
419
|
|
|
373
420
|
var updatedData = (0, _difference.default)((0, _concat.default)(originalIds, toAdd), toRemove);
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
});
|
|
381
|
-
var sortedDocs = sorter(docs);
|
|
382
|
-
updatedData = sortedDocs.map(_helpers.properId);
|
|
383
|
-
}
|
|
384
|
-
|
|
421
|
+
var count = query.count,
|
|
422
|
+
fetchedPagesCount = query.fetchedPagesCount;
|
|
423
|
+
var docsIds = sortAndLimitDocsIds(query, documents, updatedData, {
|
|
424
|
+
count: count,
|
|
425
|
+
fetchedPagesCount: fetchedPagesCount
|
|
426
|
+
});
|
|
385
427
|
return _objectSpread(_objectSpread({}, query), {}, {
|
|
386
|
-
data:
|
|
428
|
+
data: docsIds,
|
|
387
429
|
count: updatedData.length,
|
|
430
|
+
fetchedPagesCount: fetchedPagesCount,
|
|
388
431
|
lastUpdate: changed ? Date.now() : query.lastUpdate
|
|
389
432
|
});
|
|
390
433
|
};
|
|
@@ -3,7 +3,8 @@ import queries, {
|
|
|
3
3
|
receiveQueryResult,
|
|
4
4
|
convert$gtNullSelectors,
|
|
5
5
|
makeSorterFromDefinition,
|
|
6
|
-
mergeSelectorAndPartialIndex
|
|
6
|
+
mergeSelectorAndPartialIndex,
|
|
7
|
+
sortAndLimitDocsIds
|
|
7
8
|
} from './queries'
|
|
8
9
|
import { Q } from '../queries/dsl'
|
|
9
10
|
import { TODO_1, TODO_2, TODO_3 } from '../__tests__/fixtures'
|
|
@@ -332,3 +333,98 @@ describe('mergeSelectorAndPartialIndex', () => {
|
|
|
332
333
|
expect(mergeSelectorAndPartialIndex(query)).toMatchObject(result)
|
|
333
334
|
})
|
|
334
335
|
})
|
|
336
|
+
|
|
337
|
+
describe('sortAndLimitDocsIds', () => {
|
|
338
|
+
const docs = {
|
|
339
|
+
'io.cozy.files': {
|
|
340
|
+
doc1: {
|
|
341
|
+
_id: 'doc1',
|
|
342
|
+
name: 'toto'
|
|
343
|
+
},
|
|
344
|
+
doc2: {
|
|
345
|
+
_id: 'doc2',
|
|
346
|
+
name: 'tata'
|
|
347
|
+
},
|
|
348
|
+
doc3: {
|
|
349
|
+
_id: 'doc3',
|
|
350
|
+
name: 'tutu'
|
|
351
|
+
},
|
|
352
|
+
doc4: {
|
|
353
|
+
_id: 'doc4',
|
|
354
|
+
name: 'tutu'
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
it('should return ids as is, when no sort', () => {
|
|
359
|
+
const query = Q('io.cozy.files')
|
|
360
|
+
const ids = sortAndLimitDocsIds(
|
|
361
|
+
{ definition: query.toDefinition() },
|
|
362
|
+
docs,
|
|
363
|
+
['doc1', 'doc2', 'doc3'],
|
|
364
|
+
{
|
|
365
|
+
count: 0,
|
|
366
|
+
fetchedPagesCount: 0
|
|
367
|
+
}
|
|
368
|
+
)
|
|
369
|
+
expect(ids).toEqual(['doc1', 'doc2', 'doc3'])
|
|
370
|
+
})
|
|
371
|
+
it('should return ids as is, when no documents in the documents slice', () => {
|
|
372
|
+
const query = Q('io.cozy.files').sortBy([{ name: 'asc' }])
|
|
373
|
+
|
|
374
|
+
const ids = sortAndLimitDocsIds(
|
|
375
|
+
{ definition: query.toDefinition() },
|
|
376
|
+
null,
|
|
377
|
+
['doc1', 'doc2', 'doc3'],
|
|
378
|
+
{
|
|
379
|
+
count: 0,
|
|
380
|
+
fetchedPagesCount: 0
|
|
381
|
+
}
|
|
382
|
+
)
|
|
383
|
+
expect(ids).toEqual(['doc1', 'doc2', 'doc3'])
|
|
384
|
+
})
|
|
385
|
+
it('should return sorted ids', () => {
|
|
386
|
+
const query = Q('io.cozy.files').sortBy([{ name: 'asc' }])
|
|
387
|
+
|
|
388
|
+
const ids = sortAndLimitDocsIds(
|
|
389
|
+
{ definition: query.toDefinition() },
|
|
390
|
+
docs,
|
|
391
|
+
['doc1', 'doc2', 'doc3'],
|
|
392
|
+
{
|
|
393
|
+
count: 3,
|
|
394
|
+
fetchedPagesCount: 1
|
|
395
|
+
}
|
|
396
|
+
)
|
|
397
|
+
expect(ids).toEqual(['doc2', 'doc1', 'doc3'])
|
|
398
|
+
})
|
|
399
|
+
it('should return sorted ids, accordingly to limitBy', () => {
|
|
400
|
+
const query1 = Q('io.cozy.files')
|
|
401
|
+
.sortBy([{ name: 'asc' }])
|
|
402
|
+
.limitBy(2)
|
|
403
|
+
|
|
404
|
+
const ids1 = sortAndLimitDocsIds(
|
|
405
|
+
{ definition: query1.toDefinition() },
|
|
406
|
+
docs,
|
|
407
|
+
['doc1', 'doc2', 'doc3'],
|
|
408
|
+
{
|
|
409
|
+
count: 2,
|
|
410
|
+
fetchedPagesCount: 1
|
|
411
|
+
}
|
|
412
|
+
)
|
|
413
|
+
expect(ids1).toEqual(['doc2', 'doc1'])
|
|
414
|
+
|
|
415
|
+
const query2 = Q('io.cozy.files')
|
|
416
|
+
.sortBy([{ name: 'asc' }])
|
|
417
|
+
.limitBy(1)
|
|
418
|
+
|
|
419
|
+
const ids2 = sortAndLimitDocsIds(
|
|
420
|
+
{ definition: query2.toDefinition() },
|
|
421
|
+
docs,
|
|
422
|
+
['doc1', 'doc2', 'doc3'],
|
|
423
|
+
{
|
|
424
|
+
count: 1,
|
|
425
|
+
fetchedPagesCount: 2
|
|
426
|
+
}
|
|
427
|
+
)
|
|
428
|
+
expect(ids2).toEqual(['doc2', 'doc1'])
|
|
429
|
+
})
|
|
430
|
+
})
|
package/dist/store.spec.js
CHANGED
|
@@ -230,6 +230,83 @@ describe('Store', () => {
|
|
|
230
230
|
).toBe(FILE_1.label)
|
|
231
231
|
})
|
|
232
232
|
|
|
233
|
+
it('should respect the query limit', () => {
|
|
234
|
+
const query = new Q({
|
|
235
|
+
doctype: 'io.cozy.todos',
|
|
236
|
+
limit: 2
|
|
237
|
+
})
|
|
238
|
+
let queryResult
|
|
239
|
+
store.dispatch(initQuery('Q1', query))
|
|
240
|
+
store.dispatch(initQuery('Q2', query.offset(2)))
|
|
241
|
+
store.dispatch(
|
|
242
|
+
receiveQueryResult('Q1', {
|
|
243
|
+
data: [TODO_1, TODO_2]
|
|
244
|
+
})
|
|
245
|
+
)
|
|
246
|
+
store.dispatch(
|
|
247
|
+
receiveQueryResult('Q2', {
|
|
248
|
+
data: [TODO_3, TODO_4]
|
|
249
|
+
})
|
|
250
|
+
)
|
|
251
|
+
// There are now 4 docs in the store
|
|
252
|
+
expect(
|
|
253
|
+
Object.keys(store.getState().cozy.documents['io.cozy.todos']).length
|
|
254
|
+
).toBe(4)
|
|
255
|
+
// Q1 and Q2 only returns 2 todos because of the limit
|
|
256
|
+
queryResult = getQueryFromStore(store, 'Q1')
|
|
257
|
+
expect(queryResult.data.length).toBe(2)
|
|
258
|
+
expect(queryResult.data.map(x => x._id)).toEqual(['todo_1', 'todo_2'])
|
|
259
|
+
queryResult = getQueryFromStore(store, 'Q2')
|
|
260
|
+
expect(queryResult.data.length).toBe(2)
|
|
261
|
+
expect(queryResult.data.map(x => x._id)).toEqual(['todo_3', 'todo_4'])
|
|
262
|
+
})
|
|
263
|
+
|
|
264
|
+
it('should respect the query limit with sort', () => {
|
|
265
|
+
const query = new Q({
|
|
266
|
+
doctype: 'io.cozy.todos',
|
|
267
|
+
limit: 2
|
|
268
|
+
})
|
|
269
|
+
let queryResult
|
|
270
|
+
store.dispatch(initQuery('Q1', query.sortBy([{ label: 'asc' }])))
|
|
271
|
+
store.dispatch(initQuery('Q2', query.sortBy([{ label: 'desc' }])))
|
|
272
|
+
|
|
273
|
+
// Labels' ascending order, as defined in fixtures: TODO_3, TODO_1, TODO_4, TODO_2
|
|
274
|
+
store.dispatch(
|
|
275
|
+
receiveQueryResult('Q2', {
|
|
276
|
+
data: [TODO_2, TODO_4]
|
|
277
|
+
})
|
|
278
|
+
)
|
|
279
|
+
store.dispatch(
|
|
280
|
+
receiveQueryResult('Q1', {
|
|
281
|
+
data: [TODO_3, TODO_1]
|
|
282
|
+
})
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
// There are now 4 docs in the store, ordered by their query arrival
|
|
286
|
+
const todosInStore = store.getState().cozy.documents['io.cozy.todos']
|
|
287
|
+
expect(Object.values(todosInStore)).toEqual([
|
|
288
|
+
TODO_2,
|
|
289
|
+
TODO_4,
|
|
290
|
+
TODO_3,
|
|
291
|
+
TODO_1
|
|
292
|
+
])
|
|
293
|
+
// Q1 and Q2 retrieves the todos sorted by label, thanks to the sort in the store
|
|
294
|
+
queryResult = getQueryFromStore(store, 'Q1')
|
|
295
|
+
expect(
|
|
296
|
+
queryResult.data.map(x => ({ _id: x._id, label: x.label }))
|
|
297
|
+
).toEqual([
|
|
298
|
+
{ _id: 'todo_3', label: 'Build stuff' },
|
|
299
|
+
{ _id: 'todo_1', label: 'Buy bread' }
|
|
300
|
+
])
|
|
301
|
+
queryResult = getQueryFromStore(store, 'Q2')
|
|
302
|
+
expect(
|
|
303
|
+
queryResult.data.map(x => ({ _id: x._id, label: x.label }))
|
|
304
|
+
).toEqual([
|
|
305
|
+
{ _id: 'todo_4', label: 'Run a semi-marathon' },
|
|
306
|
+
{ _id: 'todo_2', label: 'Check email' }
|
|
307
|
+
])
|
|
308
|
+
})
|
|
309
|
+
|
|
233
310
|
describe('deletion', () => {
|
|
234
311
|
let originalWarn
|
|
235
312
|
beforeEach(() => {
|
|
@@ -326,6 +403,7 @@ describe('Store', () => {
|
|
|
326
403
|
lastErrorUpdate: null,
|
|
327
404
|
hasMore: false,
|
|
328
405
|
count: 0,
|
|
406
|
+
fetchedPagesCount: 0,
|
|
329
407
|
data: null
|
|
330
408
|
})
|
|
331
409
|
})
|
package/dist/types.js
CHANGED
|
@@ -67,6 +67,7 @@ var _dsl = require("./queries/dsl");
|
|
|
67
67
|
* @property {Error} lastError
|
|
68
68
|
* @property {boolean} hasMore
|
|
69
69
|
* @property {number} count
|
|
70
|
+
* @property {number} fetchedPagesCount
|
|
70
71
|
* @property {object|Array} data
|
|
71
72
|
* @property {string} bookmark
|
|
72
73
|
* @property {object} [execution_stats]
|
|
@@ -329,6 +330,36 @@ var _dsl = require("./queries/dsl");
|
|
|
329
330
|
* @property {object} group3 - Should be a {key: value} where the key is set in the measure definition.
|
|
330
331
|
*/
|
|
331
332
|
|
|
333
|
+
/**
|
|
334
|
+
* @typedef {object} DACCAggregatesParams
|
|
335
|
+
* See https://github.com/cozy/DACC
|
|
336
|
+
*
|
|
337
|
+
* @property {string} measureName - It must match an existing measure name on the DACC server
|
|
338
|
+
* @property {string} startDate - Start of the aggregation period. Should be in YYYY-MM-DD format
|
|
339
|
+
* @property {string} endDate - End of the aggregation period. Should be in YYYY-MM-DD format
|
|
340
|
+
*/
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* @typedef {Array<DACCAggregate>} DACCAggregatesResponse
|
|
344
|
+
* See https://github.com/cozy/DACC
|
|
345
|
+
*/
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* @typedef {object} DACCAggregate
|
|
349
|
+
* See https://github.com/cozy/DACC
|
|
350
|
+
*
|
|
351
|
+
* @property {string} measureName - The name of the measures aggregate
|
|
352
|
+
* @property {string} startDate - The aggregation start date
|
|
353
|
+
* @property {number} sum - The aggregate sum
|
|
354
|
+
* @property {number} count - The aggregate count
|
|
355
|
+
* @property {number} countNotZero - The aggregate count of values different from zero
|
|
356
|
+
* @property {number} avg - The aggregate average
|
|
357
|
+
* @property {number} min - The aggregate min
|
|
358
|
+
* @property {number} max - The aggregate max
|
|
359
|
+
* @property {number} std - The aggregate standard deviation
|
|
360
|
+
*
|
|
361
|
+
*/
|
|
362
|
+
|
|
332
363
|
/**
|
|
333
364
|
* Receives the URL to present to the user as a parameter, and should return a promise that resolves with the URL the user was redirected to after accepting the permissions.
|
|
334
365
|
*
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cozy-client",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "32.0.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"main": "dist/index.node.js",
|
|
6
6
|
"browser": "dist/index.js",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"@types/jest": "^26.0.20",
|
|
19
19
|
"@types/lodash": "^4.14.170",
|
|
20
20
|
"btoa": "^1.2.1",
|
|
21
|
-
"cozy-stack-client": "^
|
|
21
|
+
"cozy-stack-client": "^32.0.0",
|
|
22
22
|
"json-stable-stringify": "^1.0.1",
|
|
23
23
|
"lodash": "^4.17.13",
|
|
24
24
|
"microee": "^0.0.6",
|
|
@@ -73,5 +73,5 @@
|
|
|
73
73
|
"react-native-ios11-devicecheck": "https://github.com/cozy/react-native-devicecheck#app-attest-v0.1"
|
|
74
74
|
},
|
|
75
75
|
"sideEffects": false,
|
|
76
|
-
"gitHead": "
|
|
76
|
+
"gitHead": "d289d3676de1de89d0ff38d659c188319e73c16f"
|
|
77
77
|
}
|
package/types/models/dacc.d.ts
CHANGED
|
@@ -1,3 +1,26 @@
|
|
|
1
|
+
export function isCorrectDateFormat(date: string): boolean;
|
|
1
2
|
export function checkMeasureParams(measure: DACCMeasure): void;
|
|
2
|
-
export function sendMeasureToDACC(client:
|
|
3
|
+
export function sendMeasureToDACC(client: CozyClient, remoteDoctype: string, measure: DACCMeasure): Promise<void>;
|
|
4
|
+
export function buildAggregateParams(params: Params): DACCAggregatesParams;
|
|
5
|
+
export function fetchAggregatesFromDACC(client: CozyClient, remoteDoctype: string, params: DACCAggregatesParams): Promise<DACCAggregatesResponse>;
|
|
6
|
+
/**
|
|
7
|
+
* - The unformatted DACC aggregate params
|
|
8
|
+
*/
|
|
9
|
+
export type Params = {
|
|
10
|
+
/**
|
|
11
|
+
* - The measure name
|
|
12
|
+
*/
|
|
13
|
+
measureName?: string;
|
|
14
|
+
/**
|
|
15
|
+
* - The measure start date
|
|
16
|
+
*/
|
|
17
|
+
startDate?: string;
|
|
18
|
+
/**
|
|
19
|
+
* - The measure end date
|
|
20
|
+
*/
|
|
21
|
+
endDate?: string;
|
|
22
|
+
};
|
|
3
23
|
import { DACCMeasure } from "../types";
|
|
24
|
+
import CozyClient from "../CozyClient";
|
|
25
|
+
import { DACCAggregatesParams } from "../types";
|
|
26
|
+
import { DACCAggregatesResponse } from "../types";
|
package/types/store/queries.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
export function isQueryAction(action: any): boolean;
|
|
2
2
|
export function isReceivingData(action: any): boolean;
|
|
3
|
+
export function sortAndLimitDocsIds(queryState: QueryState, documents: DocumentsStateSlice, ids: Array<string>, { count, fetchedPagesCount }: {
|
|
4
|
+
count: number;
|
|
5
|
+
fetchedPagesCount: number;
|
|
6
|
+
}): Array<string>;
|
|
3
7
|
export function convert$gtNullSelectors(selector: any): object;
|
|
4
8
|
export function mergeSelectorAndPartialIndex(queryDefinition: object): object;
|
|
5
9
|
export function makeSorterFromDefinition(definition: QueryDefinition): (arg0: Array<CozyClientDocument>) => Array<CozyClientDocument>;
|
|
@@ -46,6 +50,8 @@ export class QueryIDGenerator {
|
|
|
46
50
|
export namespace QueryIDGenerator {
|
|
47
51
|
const UNNAMED: string;
|
|
48
52
|
}
|
|
53
|
+
import { QueryState } from "../types";
|
|
54
|
+
import { DocumentsStateSlice } from "../types";
|
|
49
55
|
import { QueryDefinition } from "../queries/dsl";
|
|
50
56
|
import { CozyClientDocument } from "../types";
|
|
51
57
|
/**
|
|
@@ -58,4 +64,3 @@ import { CozyClientDocument } from "../types";
|
|
|
58
64
|
declare function queries(state: QueriesStateSlice, action: object, documents?: DocumentsStateSlice, haveDocumentsChanged?: boolean): QueriesStateSlice;
|
|
59
65
|
import { QueryOptions } from "../types";
|
|
60
66
|
import { QueriesStateSlice } from "../types";
|
|
61
|
-
import { DocumentsStateSlice } from "../types";
|
package/types/types.d.ts
CHANGED
|
@@ -41,6 +41,7 @@ export type QueryState = {
|
|
|
41
41
|
lastError: Error;
|
|
42
42
|
hasMore: boolean;
|
|
43
43
|
count: number;
|
|
44
|
+
fetchedPagesCount: number;
|
|
44
45
|
data: object | any[];
|
|
45
46
|
bookmark: string;
|
|
46
47
|
execution_stats?: object;
|
|
@@ -390,6 +391,68 @@ export type DACCMeasure = {
|
|
|
390
391
|
*/
|
|
391
392
|
group3: object;
|
|
392
393
|
};
|
|
394
|
+
/**
|
|
395
|
+
* See https://github.com/cozy/DACC
|
|
396
|
+
*/
|
|
397
|
+
export type DACCAggregatesParams = {
|
|
398
|
+
/**
|
|
399
|
+
* - It must match an existing measure name on the DACC server
|
|
400
|
+
*/
|
|
401
|
+
measureName: string;
|
|
402
|
+
/**
|
|
403
|
+
* - Start of the aggregation period. Should be in YYYY-MM-DD format
|
|
404
|
+
*/
|
|
405
|
+
startDate: string;
|
|
406
|
+
/**
|
|
407
|
+
* - End of the aggregation period. Should be in YYYY-MM-DD format
|
|
408
|
+
*/
|
|
409
|
+
endDate: string;
|
|
410
|
+
};
|
|
411
|
+
/**
|
|
412
|
+
* See https://github.com/cozy/DACC
|
|
413
|
+
*/
|
|
414
|
+
export type DACCAggregatesResponse = DACCAggregate[];
|
|
415
|
+
/**
|
|
416
|
+
* See https://github.com/cozy/DACC
|
|
417
|
+
*/
|
|
418
|
+
export type DACCAggregate = {
|
|
419
|
+
/**
|
|
420
|
+
* - The name of the measures aggregate
|
|
421
|
+
*/
|
|
422
|
+
measureName: string;
|
|
423
|
+
/**
|
|
424
|
+
* - The aggregation start date
|
|
425
|
+
*/
|
|
426
|
+
startDate: string;
|
|
427
|
+
/**
|
|
428
|
+
* - The aggregate sum
|
|
429
|
+
*/
|
|
430
|
+
sum: number;
|
|
431
|
+
/**
|
|
432
|
+
* - The aggregate count
|
|
433
|
+
*/
|
|
434
|
+
count: number;
|
|
435
|
+
/**
|
|
436
|
+
* - The aggregate count of values different from zero
|
|
437
|
+
*/
|
|
438
|
+
countNotZero: number;
|
|
439
|
+
/**
|
|
440
|
+
* - The aggregate average
|
|
441
|
+
*/
|
|
442
|
+
avg: number;
|
|
443
|
+
/**
|
|
444
|
+
* - The aggregate min
|
|
445
|
+
*/
|
|
446
|
+
min: number;
|
|
447
|
+
/**
|
|
448
|
+
* - The aggregate max
|
|
449
|
+
*/
|
|
450
|
+
max: number;
|
|
451
|
+
/**
|
|
452
|
+
* - The aggregate standard deviation
|
|
453
|
+
*/
|
|
454
|
+
std: number;
|
|
455
|
+
};
|
|
393
456
|
/**
|
|
394
457
|
* Receives the URL to present to the user as a parameter, and should return a promise that resolves with the URL the user was redirected to after accepting the permissions.
|
|
395
458
|
*/
|