From eecf4ef13cb5138cea62c90b9371183af7c7b733 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Ma=C5=9Blanka?= <piotr.maslanka@henrietta.com.pl> Date: Mon, 14 Dec 2020 20:08:01 +0100 Subject: [PATCH] add getting current value for VarlenSeries --- tempsdb/database.pyx | 8 ++++++-- tempsdb/varlen.pxd | 3 ++- tempsdb/varlen.pyx | 20 ++++++++++++++++++++ tests/test_database.py | 2 ++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/tempsdb/database.pyx b/tempsdb/database.pyx index 5ddaaf4..1689a24 100644 --- a/tempsdb/database.pyx +++ b/tempsdb/database.pyx @@ -56,7 +56,9 @@ cdef class Database: cpdef int delete_series(self, str name) except -1: """ - Deletes a constant-length time series + Deletes a constant-length time series. + + Note that the series must either not be open, or closed. :param name: name of series to delete :raises ValueError: tried to delete "varlen" series @@ -77,7 +79,9 @@ cdef class Database: cpdef int delete_varlen_series(self, str name) except -1: """ - Deletes a variable-length time series + Deletes a variable-length time series. + + Note that the series must either not be open, or closed. :param name: name of series to delete :raises DoesNotExist: series does not exist diff --git a/tempsdb/varlen.pxd b/tempsdb/varlen.pxd index e792533..1657ccc 100644 --- a/tempsdb/varlen.pxd +++ b/tempsdb/varlen.pxd @@ -1,4 +1,4 @@ -from .series cimport TimeSeries, create_series +from .series cimport TimeSeries cdef class VarlenSeries: @@ -20,6 +20,7 @@ cdef class VarlenSeries: cpdef int mark_synced_up_to(self, unsigned long long timestamp) except -1 cpdef int close(self) except -1 cpdef int delete(self) except -1 + cpdef tuple get_current_value(self) cdef int get_length_for(self, int index) cpdef int trim(self, unsigned long long timestamp) except -1 cdef int add_series(self) except -1 diff --git a/tempsdb/varlen.pyx b/tempsdb/varlen.pyx index 3131c53..99d252c 100644 --- a/tempsdb/varlen.pyx +++ b/tempsdb/varlen.pyx @@ -435,6 +435,26 @@ cdef class VarlenSeries: """ return VarlenIterator(self, start, stop, direct_bytes=direct_bytes) + cpdef tuple get_current_value(self): + """ + Return latest value of this series + + :return: tuple of (timestamp, value) + :rtype: tp.Tuple[int, bytes] + :raises ValueError: series has no data + """ + if self.root_series.last_chunk is None: + raise ValueError('No data in series') + cdef: + VarlenIterator it = self.iterate_range(self.root_series.last_entry_ts, + self.root_series.last_entry_ts) + VarlenEntry et = it.get_next() + try: + return et.timestamp(), et.to_bytes() + finally: + et.close() + it.close() + def __init__(self, path: str, name: str): self.closed = False self.path = path diff --git a/tests/test_database.py b/tests/test_database.py index 2d1686d..24ab246 100644 --- a/tests/test_database.py +++ b/tests/test_database.py @@ -16,6 +16,7 @@ class TestDatabase(unittest.TestCase): ser.close() ser = self.db.get_series('hello-world') + self.assertEqual(ser.get_current_value(), (20, b'\x00')) self.assertEqual(ser.last_entry_ts, 20) ser.close() @@ -29,6 +30,7 @@ class TestDatabase(unittest.TestCase): ser.close() ser = self.db.get_varlen_series('hello-world') + self.assertEqual(ser.get_current_value(), (20, b'\x00\x00\x00')) self.assertEqual(ser.last_entry_ts, 20) ser.close() -- GitLab