Skip to content

Commit b60af25

Browse files
committed
RDBC-766 TimeSeriesDocumentQueryTest
1 parent 6041e81 commit b60af25

File tree

3 files changed

+114
-2
lines changed

3 files changed

+114
-2
lines changed

ravendb/documents/queries/time_series.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def __init__(self, count: Optional[int] = None, results: Optional[List[TimeSerie
2525

2626
@classmethod
2727
def from_json(cls, json_dict: Dict[str, Any]) -> TimeSeriesQueryResult:
28+
json_dict = json_dict["__timeSeriesQueryFunction"]
2829
return cls(
2930
json_dict["Count"],
3031
[TimeSeriesEntry.from_json(time_series_entry_json) for time_series_entry_json in json_dict["Results"]],

ravendb/documents/session/query.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1749,10 +1749,10 @@ def __init__(
17491749
)
17501750

17511751
def select_time_series(
1752-
self, ts_bindable_object_type: Type[_T_TS_Bindable], time_series_query: Callable[[TimeSeriesQueryBuilder], None]
1752+
self, projection_class: Type[_T_TS_Bindable], time_series_query: Callable[[TimeSeriesQueryBuilder], None]
17531753
) -> DocumentQuery[_T_TS_Bindable]:
17541754
query_data = self._create_time_series_query_data(time_series_query)
1755-
return self.select_fields_query_data(ts_bindable_object_type, query_data)
1755+
return self.select_fields_query_data(projection_class, query_data)
17561756

17571757
def distinct(self) -> DocumentQuery[_T]:
17581758
self._distinct()
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
from datetime import timedelta
2+
3+
from ravendb.documents.queries.time_series import TimeSeriesAggregationResult, TimeSeriesRawResult
4+
from ravendb.infrastructure.entities import User
5+
from ravendb.tests.test_base import TestBase
6+
from ravendb.tools.raven_test_helper import RavenTestHelper
7+
8+
9+
class TestTimeSeriesDocumentQuery(TestBase):
10+
def setUp(self):
11+
super().setUp()
12+
13+
def test_can_query_time_series_using_document_query(self):
14+
base_line = RavenTestHelper.utc_today()
15+
16+
with self.store.open_session() as session:
17+
user = User(name="Oren", age=35)
18+
session.store(user, "users/ayende")
19+
20+
tsf = session.time_series_for("users/ayende", "Heartrate")
21+
tsf.append_single(base_line + timedelta(minutes=61), 59, "watches/fitbit")
22+
tsf.append_single(base_line + timedelta(minutes=62), 79, "watches/apple")
23+
tsf.append_single(base_line + timedelta(minutes=63), 69, "watches/fitbit")
24+
25+
tsf.append(base_line + timedelta(days=31, minutes=61), [159], "watches/apple")
26+
tsf.append(base_line + timedelta(days=31, minutes=62), [179], "watches/apple")
27+
tsf.append(base_line + timedelta(days=31, minutes=63), [169], "watches/fitbit")
28+
29+
session.save_changes()
30+
31+
with self.store.open_session() as session:
32+
ts_query_text = (
33+
"from Heartrate between $start and $end\n"
34+
"where Tag = 'watches/fitbit'\n"
35+
"group by '1 month'\n"
36+
"select min(), max(), avg()"
37+
)
38+
39+
query = (
40+
session.advanced.document_query(object_type=User)
41+
.where_greater_than("age", 21)
42+
.select_time_series(TimeSeriesAggregationResult, lambda b: b.raw(ts_query_text))
43+
.add_parameter("start", base_line)
44+
.add_parameter("end", base_line + timedelta(days=92))
45+
)
46+
47+
result = list(query)
48+
49+
self.assertEqual(1, len(result))
50+
self.assertEqual(3, result[0].count)
51+
52+
agg = result[0].results
53+
self.assertEqual(2, len(agg))
54+
55+
self.assertEqual(69, agg[0].max[0])
56+
self.assertEqual(59, agg[0].min[0])
57+
self.assertEqual(64, agg[0].average[0])
58+
59+
self.assertEqual(169, agg[1].max[0])
60+
self.assertEqual(169, agg[1].min[0])
61+
self.assertEqual(169, agg[1].average[0])
62+
63+
def test_can_query_time_series_raw_values_using_document_query(self):
64+
base_line = RavenTestHelper.utc_today()
65+
66+
with self.store.open_session() as session:
67+
user = User(name="Oren", age=35)
68+
session.store(user, "users/ayende")
69+
70+
tsf = session.time_series_for("users/ayende", "Heartrate")
71+
tsf.append_single(base_line + timedelta(minutes=61), 59, "watches/fitbit")
72+
tsf.append_single(base_line + timedelta(minutes=62), 79, "watches/apple")
73+
tsf.append_single(base_line + timedelta(minutes=63), 69, "watches/fitbit")
74+
75+
tsf.append(base_line + timedelta(days=31, minutes=61), [159], "watches/apple")
76+
tsf.append(base_line + timedelta(days=31, minutes=62), [179], "watches/apple")
77+
tsf.append(base_line + timedelta(days=31, minutes=63), [169], "watches/fitbit")
78+
79+
session.save_changes()
80+
81+
with self.store.open_session() as session:
82+
ts_query_text = "from Heartrate between $start and $end\n" "where Tag = 'watches/fitbit'"
83+
84+
query = (
85+
session.advanced.document_query(object_type=User)
86+
.where_greater_than("age", 21)
87+
.select_time_series(TimeSeriesRawResult, lambda b: b.raw(ts_query_text))
88+
.add_parameter("start", base_line)
89+
.add_parameter("end", base_line + timedelta(days=92))
90+
)
91+
92+
result = list(query)
93+
94+
self.assertEqual(1, len(result))
95+
self.assertEqual(3, result[0].count)
96+
97+
values = result[0].results
98+
99+
self.assertEqual(3, len(values))
100+
101+
self.assertEqual([59], values[0].values)
102+
self.assertEqual("watches/fitbit", values[0].tag)
103+
self.assertEqual(base_line + timedelta(minutes=61), values[0].timestamp)
104+
105+
self.assertEqual([69], values[1].values)
106+
self.assertEqual("watches/fitbit", values[1].tag)
107+
self.assertEqual(base_line + timedelta(minutes=63), values[1].timestamp)
108+
109+
self.assertEqual([169], values[2].values)
110+
self.assertEqual("watches/fitbit", values[2].tag)
111+
self.assertEqual(base_line + timedelta(minutes=63, days=31), values[2].timestamp)

0 commit comments

Comments
 (0)