Skip to content

Commit 10e806d

Browse files
committed
RDBC-698 TimeSeriesIncludesTest::canLoadAsyncWithIncludeTimeSeries_LastRange_ByCount
1 parent 26e13f6 commit 10e806d

File tree

4 files changed

+93
-9
lines changed

4 files changed

+93
-9
lines changed

ravendb/documents/commands/crud.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -250,14 +250,12 @@ def create_request(self, node: ServerNode) -> requests.Request:
250250
for include in self._includes:
251251
path_builder.append(f"&include={include}")
252252

253-
# todo: counters
254253
if self._include_all_counters:
255254
path_builder.append(f"&counter={constants.Counters.ALL}")
256255
elif self._counters:
257256
for counter in self._counters:
258257
path_builder.append(f"&counter={counter}")
259258

260-
# todo: time series
261259
if self._time_series_includes is not None:
262260
for ts_include in self._time_series_includes:
263261
if isinstance(ts_include, TimeSeriesRange):
@@ -279,7 +277,7 @@ def create_request(self, node: ServerNode) -> requests.Request:
279277
count_range: TimeSeriesCountRange = ts_include
280278
path_builder.append(
281279
f"&timeseriescount={count_range.name}"
282-
f"&countType={count_range.type}"
280+
f"&countType={count_range.type.value}"
283281
f"&countValue={count_range.count}"
284282
)
285283
else:

ravendb/documents/session/loaders/include.py

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@
88
from ravendb.primitives.time_series import TimeValue
99
from ravendb.tools.utils import CaseInsensitiveDict, CaseInsensitiveSet
1010

11-
from ravendb.documents.session.time_series import TimeSeriesRange, TimeSeriesTimeRange, TimeSeriesRangeType
11+
from ravendb.documents.session.time_series import (
12+
TimeSeriesRange,
13+
TimeSeriesTimeRange,
14+
TimeSeriesRangeType,
15+
TimeSeriesCountRange,
16+
)
1217

1318

1419
class IncludeBuilderBase:
@@ -169,6 +174,33 @@ def _include_time_series_by_range_type_and_time(
169174
time_range = TimeSeriesTimeRange(name, time, type_)
170175
hash_set.add(time_range)
171176

177+
def _include_time_series_by_range_type_and_count(
178+
self, alias: str, name: str, type_: TimeSeriesRangeType, count: int
179+
) -> None:
180+
self._assert_valid(alias, name)
181+
self._assert_valid_type_and_count(type_, count)
182+
183+
if self.time_series_to_include_by_source_alias is None:
184+
self._time_series_to_include_by_source_alias = {}
185+
186+
hash_set = self._time_series_to_include_by_source_alias.get(alias, None)
187+
if hash_set is None:
188+
hash_set = set()
189+
self._time_series_to_include_by_source_alias[alias] = hash_set
190+
191+
count_range = TimeSeriesCountRange(name, count, type_)
192+
hash_set.add(count_range)
193+
194+
@staticmethod
195+
def _assert_valid_type_and_count(type_: TimeSeriesRangeType, count: int) -> None:
196+
if type_ == TimeSeriesRangeType.NONE:
197+
raise ValueError("Time range type cannot be set to NONE when time is specified.")
198+
elif type_ == TimeSeriesRangeType.LAST:
199+
if count <= 0:
200+
raise ValueError("Count have to be positive")
201+
else:
202+
raise ValueError(f"Not supported time range type {type_.value}")
203+
172204
@staticmethod
173205
def _assert_valid_type(type_: TimeSeriesRangeType, time: TimeValue) -> None:
174206
if type_ == TimeSeriesRangeType.NONE:
@@ -216,13 +248,19 @@ def include_time_series(
216248
self._include_time_series_from_to(alias, name, from_date, to_date)
217249
return self
218250

219-
def include_time_series_time_value(
251+
def include_time_series_by_range_type_and_time(
220252
self, name: Optional[str], type_: TimeSeriesRangeType, time: TimeValue
221-
) -> IncludeBuilder:
253+
) -> IncludeBuilderBase:
222254
self._include_time_series_by_range_type_and_time("", name, type_, time)
223255
return self
224256

225-
def include_all_time_series(self, type_: TimeSeriesRangeType, time: TimeValue) -> IncludeBuilder:
257+
def include_time_series_by_range_type_and_count(
258+
self, name: str, type_: TimeSeriesRangeType, count: int
259+
) -> IncludeBuilderBase:
260+
self._include_time_series_by_range_type_and_count("", name, type_, count)
261+
return self
262+
263+
def include_all_time_series(self, type_: TimeSeriesRangeType, time: TimeValue) -> IncludeBuilderBase:
226264
self._include_time_series_by_range_type_and_time("", constants.TimeSeries.ALL, type_, time)
227265
return self
228266

ravendb/tests/jvm_migrated_tests/client_tests/time_series_tests/test_time_series_includes.py

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,9 @@ def test_include_time_series_and_merge_with_existing_ranges_in_cache(self):
509509
user = session.load(
510510
document_id,
511511
User,
512-
lambda i: i.include_time_series_time_value(ts_name, TimeSeriesRangeType.LAST, TimeValue.of_minutes(10)),
512+
lambda i: i.include_time_series_by_range_type_and_time(
513+
ts_name, TimeSeriesRangeType.LAST, TimeValue.of_minutes(10)
514+
),
513515
)
514516

515517
self.assertEqual(8, session.advanced.number_of_requests)
@@ -573,3 +575,49 @@ def test_query_with_include_time_series(self):
573575
self.assertEqual(tag, vals[0].tag)
574576
self.assertEqual(67, vals[0].values[0])
575577
self.assertEqual(base_line + timedelta(minutes=30), vals[180].timestamp)
578+
579+
def test_can_load_async_with_include_time_series_last_range_by_count(self):
580+
company_id = "companies/1-A"
581+
order_id = "orders/1-A"
582+
base_line = datetime(2023, 8, 20, 21, 30)
583+
ts_name = "Heartrate"
584+
tag = "watches/fitbit"
585+
586+
with self.store.open_session() as session:
587+
session.store(Company(name="HR"), company_id)
588+
session.store(Order(company=company_id), order_id)
589+
tsf = session.time_series_for(order_id, ts_name)
590+
591+
for i in range(15):
592+
tsf.append_single(base_line - timedelta(minutes=i), i, tag)
593+
594+
session.save_changes()
595+
596+
with self.store.open_session() as session:
597+
order = session.load(
598+
order_id,
599+
Order,
600+
lambda i: i.include_documents("company").include_time_series_by_range_type_and_count(
601+
ts_name, TimeSeriesRangeType.LAST, 11
602+
),
603+
)
604+
self.assertEqual(1, session.advanced.number_of_requests)
605+
606+
# should not go to server
607+
608+
company = session.load(order.company, Company)
609+
610+
self.assertEqual(1, session.advanced.number_of_requests)
611+
self.assertEqual("HR", company.name)
612+
613+
# should not go to server
614+
values = session.time_series_for(order_id, ts_name).get(base_line - timedelta(minutes=10), None)
615+
616+
self.assertEqual(1, session.advanced.number_of_requests)
617+
self.assertEqual(11, len(values))
618+
619+
for i in range(len(values)):
620+
self.assertEqual(1, len(values[i].values))
621+
self.assertEqual(len(values) - 1 - i, values[i].values[0])
622+
self.assertEqual(tag, values[i].tag)
623+
self.assertEqual(base_line - timedelta(minutes=len(values) - 1 - i), values[i].timestamp)

ravendb/tests/jvm_migrated_tests/issues_tests/test_ravenDB_16060.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ def test_include_time_series_and_merge_with_existing_ranges_in_cache_typed(self)
376376
user = session.load(
377377
doc_id,
378378
User,
379-
lambda i: i.include_time_series_time_value(
379+
lambda i: i.include_time_series_by_range_type_and_time(
380380
"heartRateMeasures", TimeSeriesRangeType.LAST, TimeValue.of_minutes(10)
381381
),
382382
)

0 commit comments

Comments
 (0)