1414
1515
1616import flatbuffers
17+ import flatbuffers .flexbuffers
18+ from typing import Generic
1719import numpy as np
1820from math import floor
1921from datetime import datetime
@@ -74,6 +76,7 @@ def fill_properties(self):
7476 OBXPropertyType_LongVector ,
7577 OBXPropertyType_FloatVector ,
7678 OBXPropertyType_DoubleVector ,
79+ OBXPropertyType_Flex ,
7780 ], "programming error - invalid type OB & FB type combination"
7881 self .offset_properties .append (prop )
7982
@@ -90,11 +93,13 @@ def get_value(self, object, prop: Property):
9093 if prop ._py_type == np .ndarray :
9194 if (val == np .array (prop )).all ():
9295 return np .array ([])
93- elif prop ._py_type == datetime :
94- if val == prop :
95- return datetime .fromtimestamp (0 )
9696 elif val == prop :
97- return prop ._py_type () # default (empty) value for the given type
97+ if prop ._py_type == datetime :
98+ return datetime .fromtimestamp (0 )
99+ if prop ._py_type == Generic :
100+ return {}
101+ else :
102+ return prop ._py_type () # default (empty) value for the given type
98103 return val
99104
100105 def get_object_id (self , object ) -> int :
@@ -122,6 +127,9 @@ def marshal(self, object, id: int) -> bytearray:
122127 offsets [prop ._id ] = builder .CreateNumpyVector (np .array (val , dtype = np .float32 ))
123128 elif prop ._ob_type == OBXPropertyType_DoubleVector :
124129 offsets [prop ._id ] = builder .CreateNumpyVector (np .array (val , dtype = np .float64 ))
130+ elif prop ._ob_type == OBXPropertyType_Flex :
131+ buffer = flatbuffers .flexbuffers .Dumps (val )
132+ offsets [prop ._id ] = builder .CreateByteVector (bytes (buffer ))
125133 else :
126134 assert False , "programming error - invalid type OB & FB type combination"
127135
@@ -186,6 +194,13 @@ def unmarshal(self, data: bytes):
186194 val = table .GetVectorAsNumpy (flatbuffers .number_types .Float32Flags , o )
187195 elif prop ._ob_type == OBXPropertyType_DoubleVector :
188196 val = table .GetVectorAsNumpy (flatbuffers .number_types .Float64Flags , o )
197+ elif prop ._ob_type == OBXPropertyType_Flex :
198+ # access the FB byte vector information
199+ start = table .Vector (o )
200+ size = table .VectorLen (o )
201+ # slice the vector as bytes
202+ buf = table .Bytes [start :start + size ]
203+ val = flatbuffers .flexbuffers .Loads (buf )
189204 else :
190205 val = table .Get (prop ._fb_type , o + table .Pos )
191206 if prop ._py_type == list :
0 commit comments