| 417 | @pytest.mark.onlynoncluster |
| 418 | @pytest.mark.redismod |
| 419 | async def test_tdigest_merge(decoded_r: redis.Redis): |
| 420 | assert await decoded_r.tdigest().create("to-tDigest", 10) |
| 421 | assert await decoded_r.tdigest().create("from-tDigest", 10) |
| 422 | # insert data-points into sketch |
| 423 | assert await decoded_r.tdigest().add("from-tDigest", [1.0] * 10) |
| 424 | assert await decoded_r.tdigest().add("to-tDigest", [2.0] * 10) |
| 425 | # merge from-tdigest into to-tdigest |
| 426 | assert await decoded_r.tdigest().merge("to-tDigest", 1, "from-tDigest") |
| 427 | # we should now have 110 weight on to-histogram |
| 428 | info = await decoded_r.tdigest().info("to-tDigest") |
| 429 | if expected_response_shape(decoded_r) == "legacy_resp3": |
| 430 | # Native RESP3 map from the server (no module callback registered for |
| 431 | # ``protocol=3`` with ``legacy_responses=True``); keys are title-case. |
| 432 | assert 20 == float(info["Merged weight"]) + float(info["Unmerged weight"]) |
| 433 | else: |
| 434 | # ``TDigestInfo`` wrapper exposes snake_case keys for both the |
| 435 | # ``legacy_resp2`` and ``unified`` shapes. |
| 436 | assert 20 == float(info["merged_weight"]) + float(info["unmerged_weight"]) |
| 437 | # test override |
| 438 | assert await decoded_r.tdigest().create("from-override", 10) |
| 439 | assert await decoded_r.tdigest().create("from-override-2", 10) |
| 440 | assert await decoded_r.tdigest().add("from-override", [3.0] * 10) |
| 441 | assert await decoded_r.tdigest().add("from-override-2", [4.0] * 10) |
| 442 | assert await decoded_r.tdigest().merge( |
| 443 | "to-tDigest", 2, "from-override", "from-override-2", override=True |
| 444 | ) |
| 445 | assert 3.0 == await decoded_r.tdigest().min("to-tDigest") |
| 446 | assert 4.0 == await decoded_r.tdigest().max("to-tDigest") |
| 447 | |
| 448 | |
| 449 | @pytest.mark.experimental |