Skip to content

Commit b9b3644

Browse files
authored
Merge pull request #1417 from jorwoods/jorwoods/queryset_pagesize
feat: allow setting page_size in .all and .filter
2 parents 7822be0 + dcf89ab commit b9b3644

File tree

3 files changed

+35
-15
lines changed

3 files changed

+35
-15
lines changed

tableauserverclient/server/endpoint/endpoint.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -309,17 +309,17 @@ def wrapper(self, *args, **kwargs):
309309

310310
class QuerysetEndpoint(Endpoint, Generic[T]):
311311
@api(version="2.0")
312-
def all(self, *args, **kwargs) -> QuerySet[T]:
312+
def all(self, *args, page_size: Optional[int] = None, **kwargs) -> QuerySet[T]:
313313
if args or kwargs:
314314
raise ValueError(".all method takes no arguments.")
315-
queryset = QuerySet(self)
315+
queryset = QuerySet(self, page_size=page_size)
316316
return queryset
317317

318318
@api(version="2.0")
319-
def filter(self, *_, **kwargs) -> QuerySet[T]:
319+
def filter(self, *_, page_size: Optional[int] = None, **kwargs) -> QuerySet[T]:
320320
if _:
321321
raise RuntimeError("Only keyword arguments accepted.")
322-
queryset = QuerySet(self).filter(**kwargs)
322+
queryset = QuerySet(self, page_size=page_size).filter(**kwargs)
323323
return queryset
324324

325325
@api(version="2.0")

tableauserverclient/server/query.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ def to_camel_case(word: str) -> str:
3333

3434

3535
class QuerySet(Iterable[T], Sized):
36-
def __init__(self, model: "QuerysetEndpoint[T]") -> None:
36+
def __init__(self, model: "QuerysetEndpoint[T]", page_size: Optional[int] = None) -> None:
3737
self.model = model
38-
self.request_options = RequestOptions()
38+
self.request_options = RequestOptions(pagesize=page_size or 100)
3939
self._result_cache: List[T] = []
4040
self._pagination_item = PaginationItem()
4141

@@ -134,12 +134,15 @@ def page_size(self: Self) -> int:
134134
self._fetch_all()
135135
return self._pagination_item.page_size
136136

137-
def filter(self: Self, *invalid, **kwargs) -> Self:
137+
def filter(self: Self, *invalid, page_size: Optional[int] = None, **kwargs) -> Self:
138138
if invalid:
139139
raise RuntimeError("Only accepts keyword arguments.")
140140
for kwarg_key, value in kwargs.items():
141141
field_name, operator = self._parse_shorthand_filter(kwarg_key)
142142
self.request_options.filter.add(Filter(field_name, operator, value))
143+
144+
if page_size:
145+
self.request_options.pagesize = page_size
143146
return self
144147

145148
def order_by(self: Self, *args) -> Self:
@@ -155,11 +158,8 @@ def paginate(self: Self, **kwargs) -> Self:
155158
self.request_options.pagesize = kwargs["page_size"]
156159
return self
157160

158-
def with_page_size(self: Self, value: int) -> Self:
159-
self.request_options.pagesize = value
160-
return self
161-
162-
def _parse_shorthand_filter(self: Self, key: str) -> Tuple[str, str]:
161+
@staticmethod
162+
def _parse_shorthand_filter(key: str) -> Tuple[str, str]:
163163
tokens = key.split("__", 1)
164164
if len(tokens) == 1:
165165
operator = RequestOptions.Operator.Equals
@@ -173,7 +173,8 @@ def _parse_shorthand_filter(self: Self, key: str) -> Tuple[str, str]:
173173
raise ValueError("Field name `{}` is not valid.".format(field))
174174
return (field, operator)
175175

176-
def _parse_shorthand_sort(self: Self, key: str) -> Tuple[str, str]:
176+
@staticmethod
177+
def _parse_shorthand_sort(key: str) -> Tuple[str, str]:
177178
direction = RequestOptions.Direction.Asc
178179
if key.startswith("-"):
179180
direction = RequestOptions.Direction.Desc

test/test_request_option.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,10 +332,29 @@ def test_filtering_parameters(self) -> None:
332332
self.assertIn("type", query_params)
333333
self.assertIn("tabloid", query_params["type"])
334334

335-
def test_queryset_pagesize(self) -> None:
335+
def test_queryset_endpoint_pagesize_all(self) -> None:
336336
for page_size in (1, 10, 100, 1000):
337337
with self.subTest(page_size):
338338
with requests_mock.mock() as m:
339339
m.get(f"{self.baseurl}/views?pageSize={page_size}", text=SLICING_QUERYSET_PAGE_1.read_text())
340-
queryset = self.server.views.all().with_page_size(page_size)
340+
queryset = self.server.views.all(page_size=page_size)
341+
assert queryset.request_options.pagesize == page_size
342+
_ = list(queryset)
343+
344+
def test_queryset_endpoint_pagesize_filter(self) -> None:
345+
for page_size in (1, 10, 100, 1000):
346+
with self.subTest(page_size):
347+
with requests_mock.mock() as m:
348+
m.get(f"{self.baseurl}/views?pageSize={page_size}", text=SLICING_QUERYSET_PAGE_1.read_text())
349+
queryset = self.server.views.filter(page_size=page_size)
350+
assert queryset.request_options.pagesize == page_size
351+
_ = list(queryset)
352+
353+
def test_queryset_pagesize_filter(self) -> None:
354+
for page_size in (1, 10, 100, 1000):
355+
with self.subTest(page_size):
356+
with requests_mock.mock() as m:
357+
m.get(f"{self.baseurl}/views?pageSize={page_size}", text=SLICING_QUERYSET_PAGE_1.read_text())
358+
queryset = self.server.views.all().filter(page_size=page_size)
359+
assert queryset.request_options.pagesize == page_size
341360
_ = list(queryset)

0 commit comments

Comments
 (0)