Skip to content

Commit 4d1f468

Browse files
authored
Merge pull request #176 from poissoncorp/RDBC-685
RDBC-685 Python counters - session #2
2 parents ae6ff95 + 57aa6ae commit 4d1f468

File tree

9 files changed

+592
-181
lines changed

9 files changed

+592
-181
lines changed

ravendb/documents/session/in_memory_document_session_operations.py

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,7 @@ def __init__(self, store: "DocumentStore", key: uuid.UUID, options: SessionOptio
459459
self._included_documents_by_id = CaseInsensitiveDict()
460460
self._documents_by_entity: DocumentsByEntityHolder = DocumentsByEntityHolder()
461461

462-
self._counters_by_doc_id: Dict[str, List[Dict[str, int]]] = {}
462+
self._counters_by_doc_id: Dict[str, List[Dict[str, int]]] = CaseInsensitiveDict()
463463
self._time_series_by_doc_id: Dict[str, Dict[str, List[TimeSeriesRangeResult]]] = {}
464464

465465
self._deleted_entities: Union[
@@ -1244,38 +1244,44 @@ def __include(key):
12441244
continue
12451245
IncludesUtil.include(result, include, __include)
12461246

1247+
def register_counters_ids_list(
1248+
self, result_counters: dict, keys: List[str], counters_to_include: List[str], got_all: bool
1249+
) -> None:
1250+
if self.no_tracking:
1251+
return
1252+
1253+
if not result_counters:
1254+
if got_all:
1255+
for key in keys:
1256+
self.__set_got_all_counters_for_document(key)
1257+
1258+
return
1259+
else:
1260+
self._register_counters_internal(result_counters, None, False, got_all)
1261+
1262+
self.__register_missing_counters_for_keys(keys, counters_to_include)
1263+
12471264
def register_counters(
12481265
self,
12491266
result_counters: dict,
1250-
counters_to_include: Union[Dict[str, List[str]], List[str]],
1251-
keys: List[str] = None,
1252-
got_all: bool = None,
1253-
):
1254-
keys_case = keys is not None and got_all is not None
1267+
counters_to_include: Dict[str, List[str]],
1268+
) -> None:
12551269
if self.no_tracking:
12561270
return
1271+
12571272
if not result_counters:
1258-
if keys_case:
1259-
if got_all:
1260-
for key in keys:
1261-
self.__set_got_all_counters_for_document(key)
1262-
return
1263-
else:
1264-
self.__set_got_all_in_cache_if_needed(counters_to_include)
1273+
self.__set_got_all_in_cache_if_needed(counters_to_include)
12651274
else:
1266-
self._register_counters_internal(
1267-
result_counters,
1268-
{} if keys_case else counters_to_include,
1269-
not keys_case,
1270-
got_all if keys_case else False,
1271-
)
1275+
self._register_counters_internal(result_counters, counters_to_include, True, False)
12721276

1273-
self.__register_missing_counters_for_keys(
1274-
keys, counters_to_include
1275-
) if keys_case else self.__register_missing_counters(counters_to_include)
1277+
self.__register_missing_counters(counters_to_include)
12761278

12771279
def _register_counters_internal(
1278-
self, result_counters: dict, counters_to_include: Dict[str, List[str]], from_query_result: bool, got_all: bool
1280+
self,
1281+
result_counters: dict,
1282+
counters_to_include: Optional[Dict[str, List[str]]],
1283+
from_query_result: bool,
1284+
got_all: bool,
12791285
):
12801286
for key, result_counters in result_counters.items():
12811287
if not result_counters:
@@ -1361,8 +1367,8 @@ def __register_missing_counters_for_keys(self, keys: List[str], counters_to_incl
13611367

13621368
for counter in counters_to_include:
13631369
for key in keys:
1364-
cache = self._counters_by_doc_id.get(key)
1365-
if not cache:
1370+
cache = self._counters_by_doc_id.get(key, None)
1371+
if cache is None:
13661372
cache = [False, CaseInsensitiveDict()]
13671373
self._counters_by_doc_id[key] = cache
13681374

ravendb/documents/session/loaders/include.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from __future__ import annotations
22
import datetime
3-
from typing import Set, Tuple, Dict, Union, Optional
3+
from typing import Set, Tuple, Dict, Union, Optional, List
44
from ravendb.documents.conventions import DocumentConventions
55
from ravendb.data.timeseries import TimeSeriesRange
66
from ravendb.tools.utils import CaseInsensitiveDict, CaseInsensitiveSet
@@ -43,24 +43,21 @@ def _include_compare_exchange_value(self, path: str) -> None:
4343

4444
def _include_counter_with_alias(self, path: str, *names: str) -> None:
4545
self._with_alias()
46-
self._include_counters(path, *names)
46+
self._include_counters(path, list(names) if isinstance(names, tuple) else [names])
4747

4848
def _include_documents(self, path: str):
4949
if not self._documents_to_include:
5050
self._documents_to_include = set()
5151
self._documents_to_include.add(path)
5252

53-
def _include_counters(self, path: str, *names: str):
53+
def _include_counters(self, path: str, names: List[str]):
5454
if not names:
5555
raise ValueError("Expected at least one name")
5656

5757
self._assert_not_all_and_add_new_entry_if_needed(path)
5858
for name in names:
5959
if name.isspace():
6060
raise ValueError("Counters(names): 'names' should not contain null or whitespace elements")
61-
if isinstance(name, list):
62-
self._include_counters(path, *name)
63-
continue
6461
self._counters_to_include_by_source_path.get(path)[1].add(name)
6562

6663
def _include_all_counters_with_alias(self, path: str):
@@ -72,14 +69,14 @@ def _include_all_counters(self, source_path: str):
7269
self._counters_to_include_by_source_path = CaseInsensitiveDict()
7370
val = self._counters_to_include_by_source_path.get(source_path)
7471
if val is not None and val[1] is not None:
75-
raise ValueError("You cannot use all_counters() after using counters(*names)")
72+
raise RuntimeError("You cannot use all_counters() after using counters(*names)")
7673
self._counters_to_include_by_source_path[source_path] = (True, None)
7774

7875
def _assert_not_all_and_add_new_entry_if_needed(self, path: str):
7976
if self._counters_to_include_by_source_path is not None:
8077
val = self._counters_to_include_by_source_path.get(path, None)
8178
if val is not None and val[0]:
82-
raise ValueError("You cannot use counters(*names) after using all_counters()")
79+
raise RuntimeError("You cannot use counters(*names) after using all_counters()")
8380

8481
if self._counters_to_include_by_source_path is None:
8582
self._counters_to_include_by_source_path = CaseInsensitiveDict()
@@ -116,8 +113,13 @@ def include_documents(self, path: str) -> IncludeBuilderBase:
116113
self._include_documents(path)
117114
return self
118115

119-
def include_counter(self, *names: str) -> IncludeBuilderBase:
120-
self._include_counters("", *names)
116+
def include_counter(self, name: str) -> IncludeBuilderBase:
117+
self._include_counters("", [name])
118+
return self
119+
120+
def include_counters(self, *names: str) -> IncludeBuilderBase:
121+
for name in names:
122+
self.include_counter(name)
121123
return self
122124

123125
def include_all_counters(self) -> IncludeBuilderBase:
@@ -140,8 +142,12 @@ def include_compare_exchange_value(self, path: str) -> IncludeBuilderBase:
140142

141143

142144
class QueryIncludeBuilder(IncludeBuilderBase):
145+
def include_counter(self, name: str, path: Optional[str] = ""):
146+
self._include_counter_with_alias(path, name)
147+
return self
148+
143149
def include_counters(self, *names: str, path: Optional[str] = ""):
144-
self._include_counter_with_alias(path, *names)
150+
self._include_counter_with_alias(path, *names if isinstance(names, tuple) else names)
145151
return self
146152

147153
def include_all_counters(self, path: Optional[str] = ""):

ravendb/documents/session/operations/load_operation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ def set_result(self, result: GetDocumentsResult) -> None:
181181
self._session.register_includes(result.includes)
182182

183183
if self._include_all_counters or self._counters_to_include:
184-
self._session.register_counters(
184+
self._session.register_counters_ids_list(
185185
result.counter_includes, self._keys, self._counters_to_include, self._include_all_counters
186186
)
187187

ravendb/documents/session/operations/query.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,10 @@ def __complete_internal(
130130
query_result.results, query_result.includes, query_result.included_paths
131131
)
132132

133-
# todo: counters and timeseries
134133
if query_result.counter_includes is not None:
135-
raise NotImplementedError()
134+
self.__session.register_counters(query_result.counter_includes, query_result.included_counter_names)
136135

136+
# todo: timeseries
137137
if query_result.time_series_includes is not None:
138138
raise NotImplementedError()
139139

0 commit comments

Comments
 (0)