8
8
use Palicao \PhpRedisTimeSeries \Exception \RedisClientException ;
9
9
use RedisException ;
10
10
11
- class TimeSeries
11
+ final class TimeSeries
12
12
{
13
13
/** @var RedisClientInterface */
14
14
private $ redis ;
@@ -100,11 +100,16 @@ public function addMany(array $samples): array
100
100
$ params [] = $ sampleParam ;
101
101
}
102
102
}
103
+ /** @var int[] $timestamps */
103
104
$ timestamps = $ this ->redis ->executeCommand ($ params );
104
105
$ count = count ($ timestamps );
105
106
$ results = [];
106
107
for ($ i = 0 ; $ i < $ count ; $ i ++) {
107
- $ results [] = Sample::createFromTimestamp ($ samples [$ i ]->getKey (), $ samples [$ i ]->getValue (), $ timestamps [$ i ]);
108
+ $ results [] = Sample::createFromTimestamp (
109
+ $ samples [$ i ]->getKey (),
110
+ $ samples [$ i ]->getValue (),
111
+ $ timestamps [$ i ]
112
+ );
108
113
}
109
114
return $ results ;
110
115
}
@@ -157,10 +162,10 @@ private function incrementOrDecrementBy(
157
162
array $ labels = []
158
163
): void
159
164
{
160
- $ params = [$ op , $ sample ->getKey (), $ sample ->getValue ()];
165
+ $ params = [$ op , $ sample ->getKey (), ( string ) $ sample ->getValue ()];
161
166
if ($ resetMs !== null ) {
162
167
$ params [] = 'RESET ' ;
163
- $ params [] = $ resetMs ;
168
+ $ params [] = ( string ) $ resetMs ;
164
169
}
165
170
if ($ sample ->getDateTime () !== null ) {
166
171
$ params [] = 'TIMESTAMP ' ;
@@ -214,6 +219,7 @@ public function deleteRule(string $sourceKey, string $destKey): void
214
219
* @param DateTimeInterface|null $to
215
220
* @param int|null $count
216
221
* @param AggregationRule|null $rule
222
+ * @param bool $reverse
217
223
* @return Sample[]
218
224
* @throws RedisClientException
219
225
* @throws RedisException
@@ -223,16 +229,18 @@ public function range(
223
229
?DateTimeInterface $ from = null ,
224
230
?DateTimeInterface $ to = null ,
225
231
?int $ count = null ,
226
- ?AggregationRule $ rule = null
232
+ ?AggregationRule $ rule = null ,
233
+ bool $ reverse = false
227
234
): array
228
235
{
229
- $ fromTs = $ from ? DateTimeUtils::timestampWithMsFromDateTime ($ from ) : '- ' ;
230
- $ toTs = $ to ? DateTimeUtils::timestampWithMsFromDateTime ($ to ) : '+ ' ;
236
+ $ fromTs = $ from ? ( string ) DateTimeUtils::timestampWithMsFromDateTime ($ from ) : '- ' ;
237
+ $ toTs = $ to ? ( string ) DateTimeUtils::timestampWithMsFromDateTime ($ to ) : '+ ' ;
231
238
232
- $ params = ['TS.RANGE ' , $ key , $ fromTs , $ toTs ];
239
+ $ command = $ reverse ? 'TS.REVRANGE ' : 'TS.RANGE ' ;
240
+ $ params = [$ command , $ key , $ fromTs , $ toTs ];
233
241
if ($ count !== null ) {
234
242
$ params [] = 'COUNT ' ;
235
- $ params [] = $ count ;
243
+ $ params [] = ( string ) $ count ;
236
244
}
237
245
238
246
$ rawResults = $ this ->redis ->executeCommand (array_merge ($ params , $ this ->getAggregationParams ($ rule )));
@@ -251,6 +259,7 @@ public function range(
251
259
* @param DateTimeInterface|null $to
252
260
* @param int|null $count
253
261
* @param AggregationRule|null $rule
262
+ * @param bool $reverse
254
263
* @return Sample[]
255
264
* @throws RedisClientException
256
265
* @throws RedisException
@@ -260,10 +269,11 @@ public function multiRange(
260
269
?DateTimeInterface $ from = null ,
261
270
?DateTimeInterface $ to = null ,
262
271
?int $ count = null ,
263
- ?AggregationRule $ rule = null
272
+ ?AggregationRule $ rule = null ,
273
+ bool $ reverse = false
264
274
): array
265
275
{
266
- $ results = $ this ->multiRangeRaw ($ filter , $ from , $ to , $ count , $ rule );
276
+ $ results = $ this ->multiRangeRaw ($ filter , $ from , $ to , $ count , $ rule, $ reverse );
267
277
268
278
$ samples = [];
269
279
foreach ($ results as $ groupByKey ) {
@@ -281,33 +291,82 @@ public function multiRange(
281
291
* @param DateTimeInterface|null $to
282
292
* @param int|null $count
283
293
* @param AggregationRule|null $rule
284
- * @return array The row result from Redis (including labels)
294
+ * @param bool $reverse
295
+ * @return SampleWithLabels[]
285
296
* @throws RedisClientException
286
297
* @throws RedisException
287
298
*/
288
- public function multiRangeRaw (
299
+ public function multiRangeWithLabels (
289
300
Filter $ filter ,
290
301
?DateTimeInterface $ from = null ,
291
302
?DateTimeInterface $ to = null ,
292
303
?int $ count = null ,
293
- ?AggregationRule $ rule = null
304
+ ?AggregationRule $ rule = null ,
305
+ bool $ reverse = false
294
306
): array
295
307
{
296
- $ fromTs = $ from ? DateTimeUtils::timestampWithMsFromDateTime ($ from ) : '- ' ;
297
- $ toTs = $ to ? DateTimeUtils::timestampWithMsFromDateTime ($ to ) : '+ ' ;
308
+ $ results = $ this ->multiRangeRaw ($ filter , $ from , $ to , $ count , $ rule , $ reverse , true );
309
+
310
+ $ samples = [];
311
+ foreach ($ results as $ groupByKey ) {
312
+ $ key = $ groupByKey [0 ];
313
+ $ labels = [];
314
+ foreach ($ groupByKey [1 ] as $ label ) {
315
+ $ labels [] = new Label ($ label [0 ], $ label [1 ]);
316
+ }
317
+ foreach ($ groupByKey [2 ] as $ result ) {
318
+ $ samples [] = SampleWithLabels::createFromTimestampAndLabels (
319
+ $ key ,
320
+ (float )$ result [1 ],
321
+ $ result [0 ],
322
+ $ labels
323
+ );
324
+ }
325
+ }
326
+ return $ samples ;
327
+ }
328
+
329
+ /**
330
+ * @param Filter $filter
331
+ * @param DateTimeInterface|null $from
332
+ * @param DateTimeInterface|null $to
333
+ * @param int|null $count
334
+ * @param AggregationRule|null $rule
335
+ * @param bool $reverse
336
+ * @param bool $withLabels
337
+ * @return array
338
+ * @throws RedisException
339
+ */
340
+ private function multiRangeRaw (
341
+ Filter $ filter ,
342
+ ?DateTimeInterface $ from = null ,
343
+ ?DateTimeInterface $ to = null ,
344
+ ?int $ count = null ,
345
+ ?AggregationRule $ rule = null ,
346
+ bool $ reverse = false ,
347
+ bool $ withLabels = false
348
+ ): array
349
+ {
350
+ $ fromTs = $ from ? (string )DateTimeUtils::timestampWithMsFromDateTime ($ from ) : '- ' ;
351
+ $ toTs = $ to ? (string )DateTimeUtils::timestampWithMsFromDateTime ($ to ) : '+ ' ;
352
+
353
+ $ command = $ reverse ? 'TS.MREVRANGE ' : 'TS.MRANGE ' ;
354
+ $ params = [$ command , $ fromTs , $ toTs ];
298
355
299
- $ params = ['TS.MRANGE ' , $ fromTs , $ toTs ];
300
356
if ($ count !== null ) {
301
357
$ params [] = 'COUNT ' ;
302
- $ params [] = $ count ;
358
+ $ params [] = ( string ) $ count ;
303
359
}
304
360
305
- return $ this ->redis ->executeCommand (array_merge (
306
- $ params ,
307
- $ this ->getAggregationParams ($ rule ),
308
- ['FILTER ' ],
309
- $ filter ->toRedisParams ()
310
- ));
361
+ $ params = array_merge ($ params , $ this ->getAggregationParams ($ rule ));
362
+
363
+ if ($ withLabels ) {
364
+ $ params [] = 'WITHLABELS ' ;
365
+ }
366
+
367
+ $ params = array_merge ($ params , ['FILTER ' ], $ filter ->toRedisParams ());
368
+
369
+ return $ this ->redis ->executeCommand ($ params );
311
370
}
312
371
313
372
/**
@@ -385,17 +444,21 @@ public function getKeysByFilter(Filter $filter): array
385
444
);
386
445
}
387
446
447
+ /**
448
+ * @param int|null $retentionMs
449
+ * @return string[]
450
+ */
388
451
private function getRetentionParams (?int $ retentionMs = null ): array
389
452
{
390
453
if ($ retentionMs === null ) {
391
454
return [];
392
455
}
393
- return ['RETENTION ' , $ retentionMs ];
456
+ return ['RETENTION ' , ( string ) $ retentionMs ];
394
457
}
395
458
396
459
/**
397
460
* @param Label ...$labels
398
- * @return array
461
+ * @return string[]
399
462
*/
400
463
private function getLabelsParams (Label ...$ labels ): array
401
464
{
@@ -413,11 +476,15 @@ private function getLabelsParams(Label ...$labels): array
413
476
return $ params ;
414
477
}
415
478
479
+ /**
480
+ * @param AggregationRule|null $rule
481
+ * @return string[]
482
+ */
416
483
private function getAggregationParams (?AggregationRule $ rule = null ): array
417
484
{
418
485
if ($ rule === null ) {
419
486
return [];
420
487
}
421
- return ['AGGREGATION ' , $ rule ->getType (), $ rule ->getTimeBucketMs ()];
488
+ return ['AGGREGATION ' , $ rule ->getType (), ( string ) $ rule ->getTimeBucketMs ()];
422
489
}
423
490
}
0 commit comments