Skip to content

Commit a280798

Browse files
fedarsialitskifilak-sap
authored andcommitted
service: add implementation of count
Adapted commit of FedorSelitsky <[email protected]> from PR #14 Signed-off-by: Jakub Filak <[email protected]>
1 parent c626660 commit a280798

File tree

3 files changed

+112
-1
lines changed

3 files changed

+112
-1
lines changed

USAGE.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,22 @@ for smith in smith_employees_request.execute():
6262
print(smith.EmployeeID)
6363
```
6464

65+
### Get a count of entities
66+
67+
```python
68+
# Print a count of all employees
69+
count = client.entity_sets.Employees.get_entities().count().execute()
70+
print(count)
71+
```
72+
73+
### Get a count of entities via navigation property
74+
75+
```python
76+
# Print a count of all orders associated with Employee 1
77+
count = client.entity_sets.Employees.get_entity(1).nav('Orders').get_entities().count().execute()
78+
print(count)
79+
```
80+
6581
### Creating entity
6682

6783
You need to use the method set which accepts key value parameters:

pyodata/v2/service.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,7 @@ def __init__(self, url, connection, handler, last_segment):
543543
super(QueryRequest, self).__init__(url, connection, handler)
544544

545545
self._logger = logging.getLogger(LOGGER_NAME)
546+
self._count = None
546547
self._top = None
547548
self._skip = None
548549
self._order_by = None
@@ -559,6 +560,11 @@ def custom(self, name, value):
559560
self._customs[name] = value
560561
return self
561562

563+
def count(self):
564+
"""Sets a flag to return the number of items."""
565+
self._count = True
566+
return self
567+
562568
def expand(self, expand):
563569
"""Sets the expand expressions."""
564570
self._expand = expand
@@ -596,9 +602,15 @@ def top(self, top):
596602
return self
597603

598604
def get_path(self):
605+
if self._count:
606+
return urljoin(self._last_segment, '/$count')
607+
599608
return self._last_segment
600609

601610
def get_headers(self):
611+
if self._count:
612+
return {}
613+
602614
return {
603615
'Accept': 'application/json',
604616
}
@@ -1064,7 +1076,12 @@ def get_entities_handler(response):
10641076
raise HttpError('HTTP GET for Entity Set {0} failed with status code {1}'
10651077
.format(self._name, response.status_code), response)
10661078

1067-
entities = response.json()['d']['results']
1079+
content = response.json()
1080+
1081+
if isinstance(content, int):
1082+
return content
1083+
1084+
entities = content['d']['results']
10681085

10691086
result = []
10701087
for props in entities:

tests/test_service_v2.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,3 +1046,81 @@ def test_get_entity_set_query_filter_property_error(service):
10461046
with pytest.raises(KeyError) as e_info:
10471047
assert not request.Foo == 'bar'
10481048
assert e_info.value.args[0] == 'Foo'
1049+
1050+
1051+
@responses.activate
1052+
def test_count(service):
1053+
"""Check getting $count"""
1054+
1055+
# pylint: disable=redefined-outer-name
1056+
1057+
responses.add(
1058+
responses.GET,
1059+
"{0}/Employees/$count".format(service.url),
1060+
json=23,
1061+
status=200)
1062+
1063+
request = service.entity_sets.Employees.get_entities().count()
1064+
1065+
assert isinstance(request, pyodata.v2.service.GetEntitySetRequest)
1066+
1067+
assert request.execute() == 23
1068+
1069+
1070+
@responses.activate
1071+
def test_count_with_skip(service):
1072+
"""Check getting $count with $skip"""
1073+
1074+
# pylint: disable=redefined-outer-name
1075+
1076+
responses.add(
1077+
responses.GET,
1078+
"{0}/Employees/$count?$skip=12".format(service.url),
1079+
json=11,
1080+
status=200)
1081+
1082+
request = service.entity_sets.Employees.get_entities().skip(12).count()
1083+
1084+
assert isinstance(request, pyodata.v2.service.GetEntitySetRequest)
1085+
1086+
assert request.execute() == 11
1087+
1088+
1089+
@responses.activate
1090+
def test_navigation_count(service):
1091+
"""Check getting $count via navigation property"""
1092+
1093+
# pylint: disable=redefined-outer-name
1094+
1095+
responses.add(
1096+
responses.GET,
1097+
"{0}/Employees(23)/Addresses/$count".format(service.url),
1098+
json=458,
1099+
status=200)
1100+
1101+
addresses = service.entity_sets.Employees.get_entity(23).nav('Addresses').get_entities()
1102+
request = addresses.count()
1103+
1104+
assert isinstance(request, pyodata.v2.service.GetEntitySetRequest)
1105+
1106+
assert request.execute() == 458
1107+
1108+
1109+
@responses.activate
1110+
def test_navigation_count_with_filter(service):
1111+
"""Check getting $count via navigation property with $filter"""
1112+
1113+
# pylint: disable=redefined-outer-name
1114+
1115+
responses.add(
1116+
responses.GET,
1117+
"{0}/Employees(23)/Addresses/$count?$filter=City eq 'London'".format(service.url),
1118+
json=3,
1119+
status=200)
1120+
1121+
addresses = service.entity_sets.Employees.get_entity(23).nav('Addresses').get_entities()
1122+
request = addresses.filter(addresses.City == 'London').count()
1123+
1124+
assert isinstance(request, pyodata.v2.service.GetEntitySetRequest)
1125+
1126+
assert request.execute() == 3

0 commit comments

Comments
 (0)