1+ from math import inf
2+
13import pytest
24
35import redis .asyncio as redis
@@ -322,11 +324,11 @@ async def test_tdigest_reset(modclient: redis.Redis):
322324 # reset on empty histogram
323325 assert await modclient .tdigest ().reset ("tDigest" )
324326 # 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 )
326328
327329 assert await modclient .tdigest ().reset ("tDigest" )
328330 # 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
330332
331333
332334@pytest .mark .redismod
@@ -335,22 +337,32 @@ async def test_tdigest_merge(modclient: redis.Redis):
335337 assert await modclient .tdigest ().create ("to-tDigest" , 10 )
336338 assert await modclient .tdigest ().create ("from-tDigest" , 10 )
337339 # 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 )
340342 # 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" )
342344 # we should now have 110 weight on to-histogram
343345 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 )
345347 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" )
346358
347359
348360@pytest .mark .redismod
349361@pytest .mark .experimental
350362async def test_tdigest_min_and_max (modclient : redis .Redis ):
351363 assert await modclient .tdigest ().create ("tDigest" , 100 )
352364 # 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 )
354366 # min/max
355367 assert 3 == await modclient .tdigest ().max ("tDigest" )
356368 assert 1 == await modclient .tdigest ().min ("tDigest" )
@@ -363,12 +375,12 @@ async def test_tdigest_quantile(modclient: redis.Redis):
363375 assert await modclient .tdigest ().create ("tDigest" , 500 )
364376 # insert data-points into sketch
365377 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
367379 )
368380 # assert min min/max have same result as quantile 0 and 1
369381 assert (
370382 await modclient .tdigest ().max ("tDigest" )
371- == (await modclient .tdigest ().quantile ("tDigest" , 1.0 ))[0 ]
383+ == (await modclient .tdigest ().quantile ("tDigest" , 1 ))[0 ]
372384 )
373385 assert (
374386 await modclient .tdigest ().min ("tDigest" )
@@ -380,7 +392,7 @@ async def test_tdigest_quantile(modclient: redis.Redis):
380392
381393 # test multiple quantiles
382394 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 )
384396 res = await modclient .tdigest ().quantile ("t-digest" , 0.5 , 0.8 )
385397 assert [3.0 , 5.0 ] == res
386398
@@ -390,22 +402,67 @@ async def test_tdigest_quantile(modclient: redis.Redis):
390402async def test_tdigest_cdf (modclient : redis .Redis ):
391403 assert await modclient .tdigest ().create ("tDigest" , 100 )
392404 # 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 ]
396410
397411
398412@pytest .mark .redismod
399413@pytest .mark .experimental
400414@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 ]
409466
410467
411468# @pytest.mark.redismod
0 commit comments