Skip to content

Commit d44a1b4

Browse files
committed
Harmonizing limit and page_size parameters.
1 parent 2318d3e commit d44a1b4

File tree

12 files changed

+69
-26
lines changed

12 files changed

+69
-26
lines changed

c8y_api/model/_base.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,32 @@ def get_all_by_path(dictionary: dict, paths: list[str] | dict[str, Any]) -> tupl
6868
return tuple(get_by_path(dictionary, p) for p in paths)
6969

7070

71+
def harmonize_page_size(limit: int, page_size: int) -> int:
72+
"""Harmonize/sanitize page_size for a database query.
73+
74+
The page size should never exceed the given limit of a query. Hence,
75+
this function sets the page size to the limit if undefined or too large.
76+
A smaller page size passes as this can be a performance consideration.
77+
78+
Returns:
79+
Updated page size.
80+
"""
81+
if not page_size or (limit and page_size > limit):
82+
return limit
83+
return page_size
84+
85+
86+
# def harmonize_limit_and_page_size(limit: int, page_size: int) -> tuple:
87+
# """Harmonize/sanitize limit and page_size parameters for a database query.
88+
#
89+
#
90+
#
91+
# """
92+
# if not page_size or (limit and page_size > limit):
93+
# return limit, limit # page size to limit if not sensible
94+
# return limit, page_size
95+
96+
7197
class _DictWrapper(MutableMapping, dict):
7298

7399
def __init__(self, dictionary: dict, on_update=None):
@@ -772,7 +798,7 @@ def stringify(value):
772798
tuples.append(('series', series))
773799
return tuples
774800

775-
def _prepare_query(self, resource: str = None, expression: str = None, **kwargs):
801+
def _prepare_query(self, resource: str = None, expression: str = None, **kwargs: object) -> str | None:
776802
encoded = expression or urlencode(self._map_params(**kwargs))
777803
if not encoded:
778804
return resource or self.resource

c8y_api/model/administration.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from typing import Generator, List
99

1010
from c8y_api._base_api import CumulocityRestApi, AccessDeniedError
11-
from c8y_api.model._base import CumulocityResource, SimpleObject
11+
from c8y_api.model._base import CumulocityResource, SimpleObject, harmonize_page_size
1212
from c8y_api.model._parser import SimpleObjectParser, ComplexObjectParser, as_values as parse_as_values
1313
from c8y_api.model._util import _DateUtil
1414
from c8y_api.model.matcher import JsonMatcher
@@ -1162,7 +1162,7 @@ def select(
11621162
owner=owner,
11631163
only_devices=only_devices,
11641164
with_subusers_count=with_subusers_count,
1165-
page_size=page_size,
1165+
page_size=harmonize_page_size(limit, page_size),
11661166
**kwargs
11671167
)
11681168
return super()._iterate(

c8y_api/model/applications.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from typing import Generator, List, BinaryIO
77

88
from c8y_api._base_api import CumulocityRestApi
9-
from c8y_api.model._base import SimpleObject, CumulocityResource
9+
from c8y_api.model._base import SimpleObject, CumulocityResource, harmonize_page_size
1010
from c8y_api.model._parser import SimpleObjectParser
1111

1212

@@ -316,7 +316,7 @@ def select(
316316
name=name, type=type, owner=owner, tenant=tenant,
317317
user=user, subscriber=subscriber, providedFor=provided_for,
318318
has_versions=has_versions,
319-
page_size=page_size,
319+
page_size=harmonize_page_size(limit, page_size),
320320
**kwargs
321321
)
322322
return super()._iterate(base_query, page_number, limit, None, None, Application.from_json)

c8y_api/model/audit.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
from c8y_api._base_api import CumulocityRestApi
1010
from c8y_api.model.matcher import JsonMatcher
11-
from c8y_api.model._base import CumulocityResource, ComplexObject
11+
from c8y_api.model._base import CumulocityResource, ComplexObject, harmonize_page_size
1212
from c8y_api.model._parser import ComplexObjectParser, SimpleObjectParser, as_values as parse_as_values
1313
from c8y_api.model._util import _DateUtil
1414

@@ -265,7 +265,7 @@ def select(
265265
before=before, after=after,
266266
min_age=min_age, max_age=max_age,
267267
reverse=reverse,
268-
page_size=page_size,
268+
page_size=harmonize_page_size(limit, page_size),
269269
**kwargs)
270270
return super()._iterate(
271271
base_query,

c8y_api/model/events.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
from c8y_api._base_api import CumulocityRestApi
1212
from c8y_api.model.matcher import JsonMatcher
13-
from c8y_api.model._base import CumulocityResource, SimpleObject, ComplexObject
13+
from c8y_api.model._base import CumulocityResource, SimpleObject, ComplexObject, harmonize_page_size
1414
from c8y_api.model._parser import as_values as parse_as_values, ComplexObjectParser
1515
from c8y_api.model._util import _DateUtil
1616

@@ -373,7 +373,7 @@ def select(self,
373373
reverse=reverse,
374374
with_source_assets=with_source_assets,
375375
with_source_devices=with_source_devices,
376-
page_size=page_size,
376+
page_size=harmonize_page_size(limit, page_size),
377377
**kwargs)
378378
return super()._iterate(
379379
base_query,

c8y_api/model/inventory.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from typing import Any, Generator, List
77

88
from c8y_api.model.matcher import JsonMatcher
9-
from c8y_api.model._base import CumulocityResource
9+
from c8y_api.model._base import CumulocityResource, harmonize_page_size
1010
from c8y_api.model._parser import as_values as parse_as_values
1111
from c8y_api.model._util import _QueryUtil
1212
from c8y_api.model.managedobjects import ManagedObjectUtil, ManagedObject, Device, Availability, DeviceGroup
@@ -341,7 +341,7 @@ def select(
341341
limit=limit,
342342
include=include,
343343
exclude=exclude,
344-
page_size=page_size,
344+
page_size=harmonize_page_size(limit, page_size),
345345
page_number=page_number,
346346
as_values=as_values,
347347
**kwargs)
@@ -802,7 +802,7 @@ def get_all( # noqa (changed signature)
802802
limit=limit,
803803
include=include,
804804
exclude=exclude,
805-
page_size=page_size,
805+
page_size=harmonize_page_size(limit, page_size),
806806
page_number=page_number,
807807
as_values=as_values,
808808
**kwargs))
@@ -1018,7 +1018,7 @@ def select( # noqa (changed signature)
10181018
limit=limit,
10191019
include=include,
10201020
exclude=exclude,
1021-
page_size=page_size,
1021+
page_size=harmonize_page_size(limit, page_size),
10221022
page_number=page_number,
10231023
as_values=as_values,
10241024
**kwargs)

c8y_api/model/measurements.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
from c8y_api._base_api import CumulocityRestApi
1010

11-
from c8y_api.model._base import CumulocityResource, ComplexObject
11+
from c8y_api.model._base import CumulocityResource, ComplexObject, harmonize_page_size
1212
from c8y_api.model._parser import as_values as parse_as_values, ComplexObjectParser
1313
from c8y_api.model._base import _DictWrapper
1414
from c8y_api.model._util import _DateUtil
@@ -561,7 +561,7 @@ def select(
561561
min_age=min_age,
562562
max_age=max_age,
563563
reverse=reverse,
564-
page_size=page_size,
564+
page_size=harmonize_page_size(limit, page_size),
565565
**kwargs
566566
)
567567
return super()._iterate(

c8y_api/model/notification2.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import uuid
99

1010
from c8y_api._base_api import CumulocityRestApi
11-
from c8y_api.model._base import SimpleObject, CumulocityResource
11+
from c8y_api.model._base import SimpleObject, CumulocityResource, harmonize_page_size
1212
from c8y_api.model._parser import SimpleObjectParser
1313

1414

@@ -214,7 +214,7 @@ def select(
214214
source=source,
215215
subscription=subscription,
216216
typeFilter=type_filter,
217-
page_size=page_size,
217+
page_size=harmonize_page_size(limit, page_size),
218218
**kwargs)
219219
return super()._iterate(base_query, page_number, limit, None, None, Subscription.from_json)
220220

c8y_api/model/operations.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from c8y_api._base_api import CumulocityRestApi
99
from c8y_api.model.matcher import JsonMatcher
10-
from c8y_api.model._base import CumulocityResource, ComplexObject, SimpleObject, _DictWrapper
10+
from c8y_api.model._base import CumulocityResource, ComplexObject, SimpleObject, _DictWrapper, harmonize_page_size
1111
from c8y_api.model._parser import ComplexObjectParser, as_values as parse_as_values
1212
from c8y_api.model._util import _DateUtil
1313

@@ -228,7 +228,7 @@ def select(
228228
before=before, after=after,
229229
min_age=min_age, max_age=max_age,
230230
date_from=date_from, date_to=date_to,
231-
reverse=reverse, page_size=page_size,
231+
reverse=reverse, page_size=harmonize_page_size(limit, page_size),
232232
**kwargs
233233
)
234234
return super()._iterate(
@@ -561,7 +561,7 @@ def select(self, limit: int = None, page_size: int = 1000, page_number: int = No
561561
Returns:
562562
Generator[BulkOperation]: Iterable of matching BulkOperation objects
563563
"""
564-
base_query = self._prepare_query(page_size=page_size)
564+
base_query = self._prepare_query(page_size=harmonize_page_size(limit, page_size))
565565
return super()._iterate(base_query, page_number, limit, None, None, BulkOperation.from_json)
566566

567567
def get_all(self, limit: int = None, page_size: int = 1000, page_number: int = None) -> List[BulkOperation]:

c8y_api/model/tenant_options.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from typing import Generator, List, Dict
66

77
from c8y_api._base_api import CumulocityRestApi
8-
from c8y_api.model._base import SimpleObject, CumulocityResource
8+
from c8y_api.model._base import SimpleObject, CumulocityResource, harmonize_page_size
99
from c8y_api.model._parser import SimpleObjectParser
1010

1111

@@ -150,7 +150,7 @@ def select(self, category: str = None, limit: int = None,
150150
"""
151151
if not category:
152152
# select all
153-
base_query = self._prepare_query(page_size=page_size)
153+
base_query = self._prepare_query(page_size=harmonize_page_size(limit, page_size))
154154
yield from super()._iterate(base_query, page_number, limit, None, None, TenantOption.from_json)
155155
else:
156156
# select by category, this is just a single request

0 commit comments

Comments
 (0)