1
+ from math import inf
2
+
1
3
import pytest
2
4
3
5
import redis .asyncio as redis
@@ -322,11 +324,11 @@ async def test_tdigest_reset(modclient: redis.Redis):
322
324
# reset on empty histogram
323
325
assert await modclient .tdigest ().reset ("tDigest" )
324
326
# insert data-points into sketch
325
- assert await modclient .tdigest ().add ("tDigest" , list (range (10 )), [1.0 ] * 10 )
327
+ assert await modclient .tdigest ().add ("tDigest" , list (range (10 )), [1 ] * 10 )
326
328
327
329
assert await modclient .tdigest ().reset ("tDigest" )
328
330
# assert we have 0 unmerged nodes
329
- assert 0 == (await modclient .tdigest ().info ("tDigest" )).unmergedNodes
331
+ assert 0 == (await modclient .tdigest ().info ("tDigest" )).unmerged_nodes
330
332
331
333
332
334
@pytest .mark .redismod
@@ -335,22 +337,32 @@ async def test_tdigest_merge(modclient: redis.Redis):
335
337
assert await modclient .tdigest ().create ("to-tDigest" , 10 )
336
338
assert await modclient .tdigest ().create ("from-tDigest" , 10 )
337
339
# insert data-points into sketch
338
- assert await modclient .tdigest ().add ("from-tDigest" , [1.0 ] * 10 , [1.0 ] * 10 )
339
- assert await modclient .tdigest ().add ("to-tDigest" , [2.0 ] * 10 , [10.0 ] * 10 )
340
+ assert await modclient .tdigest ().add ("from-tDigest" , [1.0 ] * 10 , [1 ] * 10 )
341
+ assert await modclient .tdigest ().add ("to-tDigest" , [2.0 ] * 10 , [10 ] * 10 )
340
342
# merge from-tdigest into to-tdigest
341
- assert await modclient .tdigest ().merge ("to-tDigest" , "from-tDigest" )
343
+ assert await modclient .tdigest ().merge ("to-tDigest" , 1 , "from-tDigest" )
342
344
# we should now have 110 weight on to-histogram
343
345
info = await modclient .tdigest ().info ("to-tDigest" )
344
- total_weight_to = float (info .mergedWeight ) + float (info .unmergedWeight )
346
+ total_weight_to = float (info .merged_weight ) + float (info .unmerged_weight )
345
347
assert 110 == total_weight_to
348
+ # test override
349
+ assert await modclient .tdigest ().create ("from-override" , 10 )
350
+ assert await modclient .tdigest ().create ("from-override-2" , 10 )
351
+ assert await modclient .tdigest ().add ("from-override" , [3.0 ] * 10 , [10 ] * 10 )
352
+ assert await modclient .tdigest ().add ("from-override-2" , [4.0 ] * 10 , [10 ] * 10 )
353
+ assert await modclient .tdigest ().merge (
354
+ "to-tDigest" , 2 , "from-override" , "from-override-2" , override = True
355
+ )
356
+ assert 3.0 == await modclient .tdigest ().min ("to-tDigest" )
357
+ assert 4.0 == await modclient .tdigest ().max ("to-tDigest" )
346
358
347
359
348
360
@pytest .mark .redismod
349
361
@pytest .mark .experimental
350
362
async def test_tdigest_min_and_max (modclient : redis .Redis ):
351
363
assert await modclient .tdigest ().create ("tDigest" , 100 )
352
364
# insert data-points into sketch
353
- assert await modclient .tdigest ().add ("tDigest" , [1 , 2 , 3 ], [1.0 ] * 3 )
365
+ assert await modclient .tdigest ().add ("tDigest" , [1 , 2 , 3 ], [1 ] * 3 )
354
366
# min/max
355
367
assert 3 == await modclient .tdigest ().max ("tDigest" )
356
368
assert 1 == await modclient .tdigest ().min ("tDigest" )
@@ -363,12 +375,12 @@ async def test_tdigest_quantile(modclient: redis.Redis):
363
375
assert await modclient .tdigest ().create ("tDigest" , 500 )
364
376
# insert data-points into sketch
365
377
assert await modclient .tdigest ().add (
366
- "tDigest" , list ([x * 0.01 for x in range (1 , 10000 )]), [1.0 ] * 10000
378
+ "tDigest" , list ([x * 0.01 for x in range (1 , 10000 )]), [1 ] * 10000
367
379
)
368
380
# assert min min/max have same result as quantile 0 and 1
369
381
assert (
370
382
await modclient .tdigest ().max ("tDigest" )
371
- == (await modclient .tdigest ().quantile ("tDigest" , 1.0 ))[0 ]
383
+ == (await modclient .tdigest ().quantile ("tDigest" , 1 ))[0 ]
372
384
)
373
385
assert (
374
386
await modclient .tdigest ().min ("tDigest" )
@@ -380,7 +392,7 @@ async def test_tdigest_quantile(modclient: redis.Redis):
380
392
381
393
# test multiple quantiles
382
394
assert await modclient .tdigest ().create ("t-digest" , 100 )
383
- assert await modclient .tdigest ().add ("t-digest" , [1 , 2 , 3 , 4 , 5 ], [1.0 ] * 5 )
395
+ assert await modclient .tdigest ().add ("t-digest" , [1 , 2 , 3 , 4 , 5 ], [1 ] * 5 )
384
396
res = await modclient .tdigest ().quantile ("t-digest" , 0.5 , 0.8 )
385
397
assert [3.0 , 5.0 ] == res
386
398
@@ -390,22 +402,67 @@ async def test_tdigest_quantile(modclient: redis.Redis):
390
402
async def test_tdigest_cdf (modclient : redis .Redis ):
391
403
assert await modclient .tdigest ().create ("tDigest" , 100 )
392
404
# insert data-points into sketch
393
- assert await modclient .tdigest ().add ("tDigest" , list (range (1 , 10 )), [1.0 ] * 10 )
394
- assert 0.1 == round (await modclient .tdigest ().cdf ("tDigest" , 1.0 ), 1 )
395
- assert 0.9 == round (await modclient .tdigest ().cdf ("tDigest" , 9.0 ), 1 )
405
+ assert await modclient .tdigest ().add ("tDigest" , list (range (1 , 10 )), [1 ] * 10 )
406
+ assert 0.1 == round ((await modclient .tdigest ().cdf ("tDigest" , 1.0 ))[0 ], 1 )
407
+ assert 0.9 == round ((await modclient .tdigest ().cdf ("tDigest" , 9.0 ))[0 ], 1 )
408
+ res = await modclient .tdigest ().cdf ("tDigest" , 1.0 , 9.0 )
409
+ assert [0.1 , 0.9 ] == [round (x , 1 ) for x in res ]
396
410
397
411
398
412
@pytest .mark .redismod
399
413
@pytest .mark .experimental
400
414
@skip_ifmodversion_lt ("2.4.0" , "bf" )
401
- async def test_tdigest_mergestore (modclient : redis .Redis ):
402
- assert await modclient .tdigest ().create ("sourcekey1" , 100 )
403
- assert await modclient .tdigest ().create ("sourcekey2" , 100 )
404
- assert await modclient .tdigest ().add ("sourcekey1" , [10 ], [1.0 ])
405
- assert await modclient .tdigest ().add ("sourcekey2" , [50 ], [1.0 ])
406
- assert await modclient .tdigest ().mergestore ("dest" , 2 , "sourcekey1" , "sourcekey2" )
407
- assert await modclient .tdigest ().max ("dest" ) == 50
408
- assert await modclient .tdigest ().min ("dest" ) == 10
415
+ async def test_tdigest_trimmed_mean (modclient : redis .Redis ):
416
+ assert await modclient .tdigest ().create ("tDigest" , 100 )
417
+ # insert data-points into sketch
418
+ assert await modclient .tdigest ().add ("tDigest" , list (range (1 , 10 )), [1 ] * 10 )
419
+ assert 5 == await modclient .tdigest ().trimmed_mean ("tDigest" , 0.1 , 0.9 )
420
+ assert 4.5 == await modclient .tdigest ().trimmed_mean ("tDigest" , 0.4 , 0.5 )
421
+
422
+
423
+ @pytest .mark .redismod
424
+ @pytest .mark .experimental
425
+ async def test_tdigest_rank (modclient : redis .Redis ):
426
+ assert await modclient .tdigest ().create ("t-digest" , 500 )
427
+ assert await modclient .tdigest ().add ("t-digest" , list (range (0 , 20 )), [1 ] * 20 )
428
+ assert - 1 == (await modclient .tdigest ().rank ("t-digest" , - 1 ))[0 ]
429
+ assert 1 == (await modclient .tdigest ().rank ("t-digest" , 0 ))[0 ]
430
+ assert 11 == (await modclient .tdigest ().rank ("t-digest" , 10 ))[0 ]
431
+ assert [- 1 , 20 , 10 ] == await modclient .tdigest ().rank ("t-digest" , - 20 , 20 , 9 )
432
+
433
+
434
+ @pytest .mark .redismod
435
+ @pytest .mark .experimental
436
+ async def test_tdigest_revrank (modclient : redis .Redis ):
437
+ assert await modclient .tdigest ().create ("t-digest" , 500 )
438
+ assert await modclient .tdigest ().add ("t-digest" , list (range (0 , 20 )), [1 ] * 20 )
439
+ assert - 1 == (await modclient .tdigest ().revrank ("t-digest" , 20 ))[0 ]
440
+ assert 20 == (await modclient .tdigest ().revrank ("t-digest" , 0 ))[0 ]
441
+ assert [- 1 , 20 , 10 ] == await modclient .tdigest ().revrank ("t-digest" , 21 , 0 , 10 )
442
+
443
+
444
+ @pytest .mark .redismod
445
+ @pytest .mark .experimental
446
+ async def test_tdigest_byrank (modclient : redis .Redis ):
447
+ assert await modclient .tdigest ().create ("t-digest" , 500 )
448
+ assert await modclient .tdigest ().add ("t-digest" , list (range (1 , 11 )), [1 ] * 20 )
449
+ assert 1 == (await modclient .tdigest ().byrank ("t-digest" , 0 ))[0 ]
450
+ assert 10 == (await modclient .tdigest ().byrank ("t-digest" , 9 ))[0 ]
451
+ assert (await modclient .tdigest ().byrank ("t-digest" , 100 ))[0 ] == inf
452
+ with pytest .raises (redis .ResponseError ):
453
+ (await modclient .tdigest ().byrank ("t-digest" , - 1 ))[0 ]
454
+
455
+
456
+ @pytest .mark .redismod
457
+ @pytest .mark .experimental
458
+ async def test_tdigest_byrevrank (modclient : redis .Redis ):
459
+ assert await modclient .tdigest ().create ("t-digest" , 500 )
460
+ assert await modclient .tdigest ().add ("t-digest" , list (range (1 , 11 )), [1 ] * 20 )
461
+ assert 10 == (await modclient .tdigest ().byrevrank ("t-digest" , 0 ))[0 ]
462
+ assert 2 == (await modclient .tdigest ().byrevrank ("t-digest" , 9 ))[0 ]
463
+ assert (await modclient .tdigest ().byrevrank ("t-digest" , 100 ))[0 ] == - inf
464
+ with pytest .raises (redis .ResponseError ):
465
+ (await modclient .tdigest ().byrevrank ("t-digest" , - 1 ))[0 ]
409
466
410
467
411
468
# @pytest.mark.redismod
0 commit comments