Skip to content

Commit a109084

Browse files
committed
python(feat): Add support for querying byte channels
1 parent 65db1e0 commit a109084

2 files changed

Lines changed: 62 additions & 0 deletions

File tree

python/lib/sift_py/data/_deserialize.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from sift.data.v2.data_pb2 import (
77
BitFieldValues,
88
BoolValues,
9+
BytesValues,
910
DoubleValues,
1011
EnumValues,
1112
FloatValues,
@@ -34,6 +35,7 @@ class ChannelValues(Enum):
3435
INT64_VALUES = "sift.data.v2.Int64Values"
3536
UINT32_VALUES = "sift.data.v2.Uint32Values"
3637
UINT64_VALUES = "sift.data.v2.Uint64Values"
38+
BYTES_VALUES = "sift.data.v2.BytesValues"
3739

3840

3941
def try_deserialize_channel_data(channel_values: Any) -> List[Tuple[Metadata, ChannelTimeSeries]]:
@@ -204,5 +206,20 @@ def try_deserialize_channel_data(channel_values: Any) -> List[Tuple[Metadata, Ch
204206
parsed_data.append((md_copy, time_series))
205207

206208
return parsed_data
209+
elif ChannelValues.BYTES_VALUES.value in channel_values.type_url:
210+
bytes_values = cast(BytesValues, BytesValues.FromString(channel_values.value))
211+
metadata = bytes_values.metadata
212+
213+
time_column = []
214+
bytes_value_column = []
215+
216+
for bytes_v in bytes_values.values:
217+
time_column.append(to_timestamp_nanos(bytes_v.timestamp))
218+
bytes_value_column.append(bytes_v.value)
219+
220+
time_series = ChannelTimeSeries(
221+
ChannelDataType.from_pb(metadata.data_type), time_column, bytes_value_column
222+
)
223+
return [(metadata, time_series)]
207224

208225
raise SiftError(f"Received an unknown channel-type '{channel_values.type_url}'.")

python/lib/sift_py/data/_deserialize_test.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22
from sift.common.type.v1.channel_bit_field_element_pb2 import ChannelBitFieldElement
33
from sift.common.type.v1.channel_data_type_pb2 import (
44
CHANNEL_DATA_TYPE_BIT_FIELD,
5+
CHANNEL_DATA_TYPE_BYTES,
56
CHANNEL_DATA_TYPE_DOUBLE,
67
)
78
from sift.data.v2.data_pb2 import (
89
BitFieldElementValues,
910
BitFieldValue,
1011
BitFieldValues,
12+
BytesValue,
13+
BytesValues,
1114
DoubleValue,
1215
DoubleValues,
1316
Metadata,
@@ -58,6 +61,48 @@ def test_try_deserialize_channel_data_double():
5861
assert time_series.time_column[1] == to_timestamp_nanos(time_b)
5962

6063

64+
def test_try_deserialize_channel_data_bytes():
65+
66+
metadata = Metadata(
67+
data_type=CHANNEL_DATA_TYPE_BYTES, channel=Metadata.Channel(name="bytes-channel")
68+
)
69+
70+
time_a = "2024-07-04T18:09:08.555-07:00"
71+
time_b = "2024-07-04T18:09:09.555-07:00"
72+
73+
bytes_values = BytesValues(
74+
metadata=metadata,
75+
values=[
76+
BytesValue(
77+
timestamp=to_timestamp_pb(time_a),
78+
value=b"abc",
79+
),
80+
BytesValue(
81+
timestamp=to_timestamp_pb(time_b),
82+
value=b"def",
83+
),
84+
],
85+
)
86+
87+
raw_values = Any()
88+
raw_values.Pack(bytes_values)
89+
90+
deserialized_data = try_deserialize_channel_data(raw_values)
91+
92+
assert len(deserialized_data) == 1
93+
94+
metadata, time_series = deserialized_data[0]
95+
96+
assert metadata.data_type == CHANNEL_DATA_TYPE_DOUBLE
97+
assert metadata.channel.name == "bytes-channel"
98+
assert len(time_series.time_column) == 2
99+
assert len(time_series.value_column) == 2
100+
assert time_series.value_column[0] == b"abc"
101+
assert time_series.value_column[1] == b"def"
102+
assert time_series.time_column[0] == to_timestamp_nanos(time_a)
103+
assert time_series.time_column[1] == to_timestamp_nanos(time_b)
104+
105+
61106
def test_try_deserialize_channel_data_bit_field_elements():
62107
metadata = Metadata(
63108
data_type=CHANNEL_DATA_TYPE_BIT_FIELD,

0 commit comments

Comments
 (0)