Skip to content

Commit 752c115

Browse files
committed
RDBC-1026: skip() without take() no longer forces 0 results
__build_pagination emitted _page_size or 0 = 0 when page_size was None, generating "limit n, 0" in RQL which told the server to return 0 items. Fix: pass None (null) as page_size when take() was not called, matching the C# reference which passes a null long? parameter. The server treats a null limit as no limit. Regression test: test_query_pagination.py verifies that skip(n) without a preceding take() call returns documents starting from offset n.
1 parent 4cd66c4 commit 752c115

2 files changed

Lines changed: 73 additions & 1 deletion

File tree

ravendb/documents/session/query.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -923,7 +923,7 @@ def __build_pagination(self, query_text: List[str]) -> None:
923923
query_text.append(" limit $")
924924
query_text.append(self.__add_query_parameter(self._start or 0))
925925
query_text.append(", $")
926-
query_text.append(self.__add_query_parameter(self._page_size or 0))
926+
query_text.append(self.__add_query_parameter(self._page_size))
927927

928928
def __build_include(self, query_text: List[str]) -> None:
929929
if (
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
"""
2+
Query pagination: skip() without take() returns the expected documents.
3+
4+
C# reference: FastTests/Issues/RavenDB_20542.cs
5+
AddLongSkipToLINQ
6+
"""
7+
8+
from ravendb.tests.test_base import TestBase
9+
10+
11+
class UserSkip:
12+
def __init__(self, name: str = ""):
13+
self.name = name
14+
15+
16+
class TestRavenDB20542(TestBase):
17+
def setUp(self):
18+
super().setUp()
19+
with self.store.open_session() as session:
20+
for name in ["AA", "BB", "CC"]:
21+
session.store(UserSkip(name=name))
22+
session.save_changes()
23+
24+
def test_skip_one_without_take_returns_remaining_documents(self):
25+
"""
26+
C# spec: session.Query<User>().Skip(1).ToList() → 2 results (AA, BB, CC minus 1).
27+
"""
28+
with self.store.open_session() as session:
29+
q = session.advanced.document_query(object_type=UserSkip)
30+
q = q.skip(1)
31+
results = list(q)
32+
33+
self.assertEqual(
34+
2,
35+
len(results),
36+
f"skip(1) on 3 documents should return 2, but got {len(results)}",
37+
)
38+
39+
def test_skip_with_max_long_returns_no_results(self):
40+
"""
41+
C# spec: session.Query<User>().Skip(long.MaxValue).ToList() → 0 results.
42+
Skipping past all documents returns an empty list.
43+
"""
44+
with self.store.open_session() as session:
45+
q = session.advanced.document_query(object_type=UserSkip)
46+
q = q.skip(9223372036854775807)
47+
results = list(q)
48+
49+
self.assertEqual(
50+
0,
51+
len(results),
52+
f"skip(long.MaxValue) should skip all documents and return 0, got {len(results)}",
53+
)
54+
55+
# ------------------------------------------------------------------ #
56+
# Baseline: skip() combined with take() #
57+
# ------------------------------------------------------------------ #
58+
59+
def test_skip_with_take_returns_correct_slice(self):
60+
"""
61+
Baseline: skip(1).take(10) on 3 documents returns 2.
62+
"""
63+
with self.store.open_session() as session:
64+
q = session.advanced.document_query(object_type=UserSkip)
65+
q = q.skip(1).take(10)
66+
results = list(q)
67+
68+
self.assertEqual(
69+
2,
70+
len(results),
71+
f"skip(1).take(10) on 3 documents should return 2, got {len(results)}",
72+
)

0 commit comments

Comments
 (0)