|
6 | 6 | from unittest.mock import MagicMock |
7 | 7 |
|
8 | 8 | from ydb import issues |
| 9 | +from ydb.convert import _ResultSet, aggregate_result_sets_by_index |
9 | 10 | from ydb.query.pool import QuerySessionPool |
10 | 11 | from ydb.query.session import QuerySession |
11 | 12 |
|
@@ -57,6 +58,56 @@ def release_after_delay(): |
57 | 58 | t.join() |
58 | 59 |
|
59 | 60 |
|
| 61 | +def _rs(index, rows, columns=None, truncated=False, data=None): |
| 62 | + return _ResultSet( |
| 63 | + columns=["id"] if columns is None else columns, |
| 64 | + rows=list(rows), |
| 65 | + truncated=truncated, |
| 66 | + index=index, |
| 67 | + data=data, |
| 68 | + ) |
| 69 | + |
| 70 | + |
| 71 | +class TestAggregateResultSetsByIndex(unittest.TestCase): |
| 72 | + def test_merges_parts_with_same_index_into_one_result_set(self): |
| 73 | + merged = aggregate_result_sets_by_index([_rs(0, [1, 2]), _rs(0, [3, 4]), _rs(0, [5])]) |
| 74 | + |
| 75 | + self.assertEqual(len(merged), 1) |
| 76 | + self.assertEqual(merged[0].index, 0) |
| 77 | + self.assertEqual(merged[0].rows, [1, 2, 3, 4, 5]) |
| 78 | + |
| 79 | + def test_keeps_distinct_indexes_separate_and_ordered(self): |
| 80 | + merged = aggregate_result_sets_by_index([_rs(0, [1]), _rs(0, [2]), _rs(1, [3]), _rs(2, [4]), _rs(2, [5])]) |
| 81 | + |
| 82 | + self.assertEqual([rs.index for rs in merged], [0, 1, 2]) |
| 83 | + self.assertEqual([rs.rows for rs in merged], [[1, 2], [3], [4, 5]]) |
| 84 | + |
| 85 | + def test_schema_kept_from_first_part_when_later_parts_omit_it(self): |
| 86 | + merged = aggregate_result_sets_by_index([_rs(0, [1], columns=["id", "name"]), _rs(0, [2], columns=[])]) |
| 87 | + |
| 88 | + self.assertEqual(merged[0].columns, ["id", "name"]) |
| 89 | + self.assertEqual(merged[0].rows, [1, 2]) |
| 90 | + |
| 91 | + def test_truncated_flag_is_propagated_from_any_part(self): |
| 92 | + merged = aggregate_result_sets_by_index([_rs(0, [1], truncated=False), _rs(0, [2], truncated=True)]) |
| 93 | + |
| 94 | + self.assertTrue(merged[0].truncated) |
| 95 | + |
| 96 | + def test_arrow_data_is_concatenated(self): |
| 97 | + merged = aggregate_result_sets_by_index([_rs(0, [], data=b"aa"), _rs(0, [], data=b"bb")]) |
| 98 | + |
| 99 | + self.assertEqual(merged[0].data, b"aabb") |
| 100 | + |
| 101 | + def test_interleaved_parts_are_merged_by_index(self): |
| 102 | + merged = aggregate_result_sets_by_index([_rs(0, [1]), _rs(1, [2]), _rs(0, [3]), _rs(1, [4])]) |
| 103 | + |
| 104 | + self.assertEqual([rs.index for rs in merged], [0, 1]) |
| 105 | + self.assertEqual([rs.rows for rs in merged], [[1, 3], [2, 4]]) |
| 106 | + |
| 107 | + def test_empty_input_returns_empty_list(self): |
| 108 | + self.assertEqual(aggregate_result_sets_by_index([]), []) |
| 109 | + |
| 110 | + |
60 | 111 | class TestRetryOperationSync(unittest.TestCase): |
61 | 112 | def test_retry_reacquires_invalidated_session_before_first_use(self): |
62 | 113 | pool = _make_pool(size=1) |
|
0 commit comments