Skip to content

Commit dc2c1dc

Browse files
chore: Updating entity key serialization for multiple entities (feast-dev#4967)
1 parent 9fc89a3 commit dc2c1dc

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

sdk/python/feast/infra/key_encoding_utils.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ def serialize_entity_key(
8383
)
8484

8585
output: List[bytes] = []
86+
if entity_key_serialization_version > 2:
87+
output.append(struct.pack("<I", len(sorted_keys)))
8688
for k in sorted_keys:
8789
output.append(struct.pack("<I", ValueType.STRING))
8890
if entity_key_serialization_version > 2:
@@ -122,7 +124,11 @@ def deserialize_entity_key(
122124
offset = 0
123125
keys = []
124126
values = []
125-
while offset < len(serialized_entity_key):
127+
128+
num_keys = struct.unpack_from("<I", serialized_entity_key, offset)[0]
129+
offset += 4
130+
131+
for _ in range(num_keys):
126132
key_type = struct.unpack_from("<I", serialized_entity_key, offset)[0]
127133
offset += 4
128134

@@ -139,6 +145,7 @@ def deserialize_entity_key(
139145
else:
140146
raise ValueError(f"Unsupported key type: {key_type}")
141147

148+
while offset < len(serialized_entity_key):
142149
(value_type,) = struct.unpack_from("<I", serialized_entity_key, offset)
143150
offset += 4
144151

sdk/python/tests/unit/infra/test_key_encoding_utils.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,24 @@ def test_deserialize_entity_key():
5252
)
5353

5454

55+
def test_deserialize_multiple_entity_keys():
56+
entity_key_proto = EntityKeyProto(
57+
join_keys=["customer", "user"],
58+
entity_values=[ValueProto(string_val="test"), ValueProto(int64_val=int(2**15))],
59+
)
60+
61+
serialized_entity_key = serialize_entity_key(
62+
entity_key_proto,
63+
entity_key_serialization_version=3,
64+
)
65+
66+
deserialized_entity_key = deserialize_entity_key(
67+
serialized_entity_key,
68+
entity_key_serialization_version=3,
69+
)
70+
assert deserialized_entity_key == entity_key_proto
71+
72+
5573
def test_serialize_value():
5674
v, t = _serialize_val("string_val", ValueProto(string_val="test"))
5775
assert t == ValueType.STRING

0 commit comments

Comments
 (0)