From af456b90623bc434a81d08076a50808e1063f5a1 Mon Sep 17 00:00:00 2001 From: Kevin Zheng Date: Tue, 23 Jul 2024 19:44:18 +0000 Subject: [PATCH 1/2] fix: Using end_cursor instead of skipped_cursor in Iterator to fix rare bug. --- google/cloud/datastore/query.py | 2 +- tests/unit/test_query.py | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/google/cloud/datastore/query.py b/google/cloud/datastore/query.py index 72d6fe51..c6d27855 100644 --- a/google/cloud/datastore/query.py +++ b/google/cloud/datastore/query.py @@ -825,7 +825,7 @@ def _next_page(self): old_query_pb = query_pb query_pb = query_pb2.Query() query_pb._pb.CopyFrom(old_query_pb._pb) # copy for testability - query_pb.start_cursor = response_pb.batch.skipped_cursor + query_pb.start_cursor = response_pb.batch.end_cursor query_pb.offset -= response_pb.batch.skipped_results request = { diff --git a/tests/unit/test_query.py b/tests/unit/test_query.py index 6c2063bb..275bafcc 100644 --- a/tests/unit/test_query.py +++ b/tests/unit/test_query.py @@ -1019,7 +1019,8 @@ def test_iterator__next_page_no_more(database_id): @pytest.mark.parametrize("database_id", [None, "somedb"]) -def test_iterator__next_page_w_skipped_lt_offset(database_id): +@pytest.mark.parametrize("skipped_cursor_1", [b"DEADBEEF", b""]) +def test_iterator__next_page_w_skipped_lt_offset(skipped_cursor_1, database_id): from google.api_core import page_iterator from google.cloud.datastore_v1.types import datastore as datastore_pb2 from google.cloud.datastore_v1.types import entity as entity_pb2 @@ -1028,16 +1029,17 @@ def test_iterator__next_page_w_skipped_lt_offset(database_id): project = "prujekt" skipped_1 = 100 - skipped_cursor_1 = b"DEADBEEF" + end_cursor_1 = b"DEADBEEF" skipped_2 = 50 - skipped_cursor_2 = b"FACEDACE" + end_cursor_2 = b"FACEDACE" more_enum = query_pb2.QueryResultBatch.MoreResultsType.NOT_FINISHED result_1 = _make_query_response([], b"", more_enum, skipped_1) result_1.batch.skipped_cursor = skipped_cursor_1 + result_1.batch.end_cursor = end_cursor_1 result_2 = _make_query_response([], b"", more_enum, skipped_2) - result_2.batch.skipped_cursor = skipped_cursor_2 + result_2.batch.end_cursor = end_cursor_2 ds_api = _make_datastore_api(result_1, result_2) client = _Client(project, datastore_api=ds_api, database=database_id) @@ -1056,7 +1058,7 @@ def test_iterator__next_page_w_skipped_lt_offset(database_id): query_1 = query_pb2.Query(offset=offset) query_2 = query_pb2.Query( - start_cursor=skipped_cursor_1, offset=(offset - skipped_1) + start_cursor=end_cursor_1, offset=(offset - skipped_1) ) expected_calls = [] for query in [query_1, query_2]: From f9d63d29de601a82ecfcd36ea9c5c7e87f2ae63a Mon Sep 17 00:00:00 2001 From: Owl Bot Date: Tue, 23 Jul 2024 19:52:00 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=A6=89=20Updates=20from=20OwlBot=20po?= =?UTF-8?q?st-processor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --- tests/unit/test_query.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/unit/test_query.py b/tests/unit/test_query.py index 275bafcc..fa7d63dc 100644 --- a/tests/unit/test_query.py +++ b/tests/unit/test_query.py @@ -1057,9 +1057,7 @@ def test_iterator__next_page_w_skipped_lt_offset(skipped_cursor_1, database_id): read_options = datastore_pb2.ReadOptions() query_1 = query_pb2.Query(offset=offset) - query_2 = query_pb2.Query( - start_cursor=end_cursor_1, offset=(offset - skipped_1) - ) + query_2 = query_pb2.Query(start_cursor=end_cursor_1, offset=(offset - skipped_1)) expected_calls = [] for query in [query_1, query_2]: expected_request = {