|
| 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