|
1 | 1 | # Copyright (c) 2024 Airbyte, Inc., all rights reserved. |
2 | | - |
| 2 | +import copy |
3 | 3 | from copy import deepcopy |
4 | 4 | from datetime import datetime, timedelta |
5 | 5 | from typing import Any, List, Mapping, MutableMapping, Optional, Union |
@@ -721,6 +721,7 @@ def _run_read( |
721 | 721 | "cursor": {"created_at": VOTE_300_CREATED_AT}, |
722 | 722 | }, |
723 | 723 | ], |
| 724 | + "use_global_cursor": False, |
724 | 725 | "lookback_window": 1, |
725 | 726 | "parent_state": {}, |
726 | 727 | "state": {"created_at": VOTE_100_CREATED_AT}, |
@@ -1121,6 +1122,7 @@ def run_incremental_parent_state_test( |
1121 | 1122 | } |
1122 | 1123 | }, |
1123 | 1124 | "lookback_window": 1, |
| 1125 | + "use_global_cursor": False, |
1124 | 1126 | "states": [ |
1125 | 1127 | { |
1126 | 1128 | "partition": {"id": 10, "parent_slice": {"id": 1, "parent_slice": {}}}, |
@@ -1170,8 +1172,66 @@ def test_incremental_parent_state( |
1170 | 1172 | ) |
1171 | 1173 |
|
1172 | 1174 |
|
| 1175 | +STATE_MIGRATION_EXPECTED_STATE = { |
| 1176 | + "state": {"created_at": VOTE_100_CREATED_AT}, |
| 1177 | + "parent_state": { |
| 1178 | + "post_comments": { |
| 1179 | + "use_global_cursor": False, |
| 1180 | + "state": {"updated_at": COMMENT_10_UPDATED_AT}, |
| 1181 | + "parent_state": {"posts": {"updated_at": POST_1_UPDATED_AT}}, |
| 1182 | + "lookback_window": 1, |
| 1183 | + "states": [ |
| 1184 | + { |
| 1185 | + "partition": {"id": 1, "parent_slice": {}}, |
| 1186 | + "cursor": {"updated_at": COMMENT_10_UPDATED_AT}, |
| 1187 | + }, |
| 1188 | + { |
| 1189 | + "partition": {"id": 2, "parent_slice": {}}, |
| 1190 | + "cursor": {"updated_at": COMMENT_20_UPDATED_AT}, |
| 1191 | + }, |
| 1192 | + { |
| 1193 | + "partition": {"id": 3, "parent_slice": {}}, |
| 1194 | + "cursor": {"updated_at": COMMENT_30_UPDATED_AT}, |
| 1195 | + }, |
| 1196 | + ], |
| 1197 | + } |
| 1198 | + }, |
| 1199 | + "lookback_window": 1, |
| 1200 | + "use_global_cursor": False, |
| 1201 | + "states": [ |
| 1202 | + { |
| 1203 | + "partition": {"id": 10, "parent_slice": {"id": 1, "parent_slice": {}}}, |
| 1204 | + "cursor": {"created_at": VOTE_100_CREATED_AT}, |
| 1205 | + }, |
| 1206 | + { |
| 1207 | + "partition": {"id": 11, "parent_slice": {"id": 1, "parent_slice": {}}}, |
| 1208 | + "cursor": {"created_at": VOTE_111_CREATED_AT}, |
| 1209 | + }, |
| 1210 | + { |
| 1211 | + "partition": {"id": 12, "parent_slice": {"id": 1, "parent_slice": {}}}, |
| 1212 | + "cursor": {"created_at": PARTITION_SYNC_START_TIME}, |
| 1213 | + }, |
| 1214 | + { |
| 1215 | + "partition": {"id": 20, "parent_slice": {"id": 2, "parent_slice": {}}}, |
| 1216 | + "cursor": {"created_at": VOTE_200_CREATED_AT}, |
| 1217 | + }, |
| 1218 | + { |
| 1219 | + "partition": {"id": 21, "parent_slice": {"id": 2, "parent_slice": {}}}, |
| 1220 | + "cursor": {"created_at": VOTE_210_CREATED_AT}, |
| 1221 | + }, |
| 1222 | + { |
| 1223 | + "partition": {"id": 30, "parent_slice": {"id": 3, "parent_slice": {}}}, |
| 1224 | + "cursor": {"created_at": VOTE_300_CREATED_AT}, |
| 1225 | + }, |
| 1226 | + ], |
| 1227 | +} |
| 1228 | +STATE_MIGRATION_GLOBAL_EXPECTED_STATE = copy.deepcopy(STATE_MIGRATION_EXPECTED_STATE) |
| 1229 | +del STATE_MIGRATION_GLOBAL_EXPECTED_STATE["states"] |
| 1230 | +STATE_MIGRATION_GLOBAL_EXPECTED_STATE["use_global_cursor"] = True |
| 1231 | + |
| 1232 | + |
1173 | 1233 | @pytest.mark.parametrize( |
1174 | | - "test_name, manifest, mock_requests, expected_records, expected_state", |
| 1234 | + "test_name, manifest, mock_requests, expected_records", |
1175 | 1235 | [ |
1176 | 1236 | ( |
1177 | 1237 | "test_incremental_parent_state", |
@@ -1326,80 +1386,45 @@ def test_incremental_parent_state( |
1326 | 1386 | "id": 300, |
1327 | 1387 | }, |
1328 | 1388 | ], |
1329 | | - # Expected state |
| 1389 | + ), |
| 1390 | + ], |
| 1391 | +) |
| 1392 | +@pytest.mark.parametrize( |
| 1393 | + "initial_state, expected_state", |
| 1394 | + [ |
| 1395 | + ({"created_at": PARTITION_SYNC_START_TIME}, STATE_MIGRATION_EXPECTED_STATE), |
| 1396 | + ( |
1330 | 1397 | { |
1331 | | - "state": {"created_at": VOTE_100_CREATED_AT}, |
| 1398 | + "state": {"created_at": PARTITION_SYNC_START_TIME}, |
| 1399 | + "lookback_window": 0, |
| 1400 | + "use_global_cursor": False, |
1332 | 1401 | "parent_state": { |
1333 | 1402 | "post_comments": { |
1334 | | - "use_global_cursor": False, |
1335 | | - "state": {"updated_at": COMMENT_10_UPDATED_AT}, |
1336 | | - "parent_state": {"posts": {"updated_at": POST_1_UPDATED_AT}}, |
1337 | | - "lookback_window": 1, |
1338 | | - "states": [ |
1339 | | - { |
1340 | | - "partition": {"id": 1, "parent_slice": {}}, |
1341 | | - "cursor": {"updated_at": COMMENT_10_UPDATED_AT}, |
1342 | | - }, |
1343 | | - { |
1344 | | - "partition": {"id": 2, "parent_slice": {}}, |
1345 | | - "cursor": {"updated_at": COMMENT_20_UPDATED_AT}, |
1346 | | - }, |
1347 | | - { |
1348 | | - "partition": {"id": 3, "parent_slice": {}}, |
1349 | | - "cursor": {"updated_at": COMMENT_30_UPDATED_AT}, |
1350 | | - }, |
1351 | | - ], |
| 1403 | + "state": {"updated_at": PARTITION_SYNC_START_TIME}, |
| 1404 | + "parent_state": {"posts": {"updated_at": PARTITION_SYNC_START_TIME}}, |
| 1405 | + "lookback_window": 0, |
1352 | 1406 | } |
1353 | 1407 | }, |
1354 | | - "lookback_window": 1, |
1355 | | - "states": [ |
1356 | | - { |
1357 | | - "partition": {"id": 10, "parent_slice": {"id": 1, "parent_slice": {}}}, |
1358 | | - "cursor": {"created_at": VOTE_100_CREATED_AT}, |
1359 | | - }, |
1360 | | - { |
1361 | | - "partition": {"id": 11, "parent_slice": {"id": 1, "parent_slice": {}}}, |
1362 | | - "cursor": {"created_at": VOTE_111_CREATED_AT}, |
1363 | | - }, |
1364 | | - { |
1365 | | - "partition": {"id": 12, "parent_slice": {"id": 1, "parent_slice": {}}}, |
1366 | | - "cursor": {"created_at": PARTITION_SYNC_START_TIME}, |
1367 | | - }, |
1368 | | - { |
1369 | | - "partition": {"id": 20, "parent_slice": {"id": 2, "parent_slice": {}}}, |
1370 | | - "cursor": {"created_at": VOTE_200_CREATED_AT}, |
1371 | | - }, |
1372 | | - { |
1373 | | - "partition": {"id": 21, "parent_slice": {"id": 2, "parent_slice": {}}}, |
1374 | | - "cursor": {"created_at": VOTE_210_CREATED_AT}, |
1375 | | - }, |
1376 | | - { |
1377 | | - "partition": {"id": 30, "parent_slice": {"id": 3, "parent_slice": {}}}, |
1378 | | - "cursor": {"created_at": VOTE_300_CREATED_AT}, |
1379 | | - }, |
1380 | | - ], |
1381 | 1408 | }, |
| 1409 | + STATE_MIGRATION_EXPECTED_STATE, |
1382 | 1410 | ), |
1383 | | - ], |
1384 | | -) |
1385 | | -@pytest.mark.parametrize( |
1386 | | - "initial_state", |
1387 | | - [ |
1388 | | - {"created_at": PARTITION_SYNC_START_TIME}, |
1389 | | - { |
1390 | | - "state": {"created_at": PARTITION_SYNC_START_TIME}, |
1391 | | - "lookback_window": 0, |
1392 | | - "use_global_cursor": True, |
1393 | | - "parent_state": { |
1394 | | - "post_comments": { |
1395 | | - "state": {"updated_at": PARTITION_SYNC_START_TIME}, |
1396 | | - "parent_state": {"posts": {"updated_at": PARTITION_SYNC_START_TIME}}, |
1397 | | - "lookback_window": 0, |
1398 | | - } |
| 1411 | + ( |
| 1412 | + { |
| 1413 | + "state": {"created_at": PARTITION_SYNC_START_TIME}, |
| 1414 | + "lookback_window": 0, |
| 1415 | + "use_global_cursor": True, |
| 1416 | + "parent_state": { |
| 1417 | + "post_comments": { |
| 1418 | + "state": {"updated_at": PARTITION_SYNC_START_TIME}, |
| 1419 | + "parent_state": {"posts": {"updated_at": PARTITION_SYNC_START_TIME}}, |
| 1420 | + "lookback_window": 0, |
| 1421 | + } |
| 1422 | + }, |
1399 | 1423 | }, |
1400 | | - }, |
| 1424 | + STATE_MIGRATION_GLOBAL_EXPECTED_STATE, |
| 1425 | + ), |
1401 | 1426 | ], |
1402 | | - ids=["legacy_python_format", "low_code_global_format"], |
| 1427 | + ids=["legacy_python_format", "low_code_per_partition_state", "low_code_global_format"], |
1403 | 1428 | ) |
1404 | 1429 | def test_incremental_parent_state_migration( |
1405 | 1430 | test_name, manifest, mock_requests, expected_records, initial_state, expected_state |
@@ -1510,6 +1535,7 @@ def test_incremental_parent_state_migration( |
1510 | 1535 | ], |
1511 | 1536 | "state": {"created_at": INITIAL_GLOBAL_CURSOR}, |
1512 | 1537 | "lookback_window": 1, |
| 1538 | + "use_global_cursor": False, |
1513 | 1539 | }, |
1514 | 1540 | ), |
1515 | 1541 | ], |
@@ -1677,13 +1703,14 @@ def test_incremental_parent_state_no_slices( |
1677 | 1703 | "cursor": {"created_at": INITIAL_STATE_PARTITION_11_CURSOR}, |
1678 | 1704 | }, |
1679 | 1705 | ], |
1680 | | - "use_global_cursor": True, |
| 1706 | + "use_global_cursor": False, |
1681 | 1707 | "state": {"created_at": INITIAL_STATE_PARTITION_11_CURSOR}, |
1682 | 1708 | "lookback_window": 0, |
1683 | 1709 | }, |
1684 | 1710 | # Expected state |
1685 | 1711 | { |
1686 | 1712 | "lookback_window": 1, |
| 1713 | + "use_global_cursor": False, |
1687 | 1714 | "state": {"created_at": INITIAL_STATE_PARTITION_11_CURSOR}, |
1688 | 1715 | "states": [ |
1689 | 1716 | { |
@@ -1953,6 +1980,7 @@ def test_incremental_parent_state_no_records( |
1953 | 1980 | }, |
1954 | 1981 | "state": {"created_at": INITIAL_STATE_PARTITION_11_CURSOR}, |
1955 | 1982 | "lookback_window": 86400, |
| 1983 | + "use_global_cursor": False, |
1956 | 1984 | "states": [ |
1957 | 1985 | { |
1958 | 1986 | "partition": {"id": 10, "parent_slice": {"id": 1, "parent_slice": {}}}, |
@@ -2220,6 +2248,7 @@ def test_incremental_substream_error( |
2220 | 2248 | }, |
2221 | 2249 | # Expected state |
2222 | 2250 | { |
| 2251 | + "use_global_cursor": False, |
2223 | 2252 | "lookback_window": 1, |
2224 | 2253 | "state": {"updated_at": "2024-01-25T00:00:00Z"}, |
2225 | 2254 | "states": [ |
@@ -2318,6 +2347,7 @@ def test_incremental_list_partition_router( |
2318 | 2347 | # Expected state |
2319 | 2348 | { |
2320 | 2349 | "lookback_window": 0, |
| 2350 | + "use_global_cursor": False, |
2321 | 2351 | "state": {"updated_at": "2024-01-08T00:00:00Z"}, |
2322 | 2352 | "states": [ |
2323 | 2353 | {"cursor": {"updated_at": "2024-01-20T00:00:00Z"}, "partition": {"id": "1"}}, |
@@ -2845,6 +2875,7 @@ def test_incremental_error( |
2845 | 2875 | } |
2846 | 2876 | }, |
2847 | 2877 | "lookback_window": 1, |
| 2878 | + "use_global_cursor": False, |
2848 | 2879 | "states": [ |
2849 | 2880 | { |
2850 | 2881 | "partition": {"id": 10, "parent_slice": {"id": 1, "parent_slice": {}}}, |
|
0 commit comments