Skip to content

Commit ce2640c

Browse files
authored
fix: fix return empty array with STRUCT field (#3073)
issue: milvus-io/milvus#42148 If output_field is non-string element type, the empty array is returned such as : ``` ============== Search with element filter 3 (EmbeddingList with 2 embeddings of dimension 32 (float32)) - Total hits: 3 {'id': 462182756501698654, 'distance': -0.10249601304531097, 'entity': {'struct_field': []}} {'id': 462182756501698627, 'distance': -0.10412182658910751, 'entity': {'struct_field': []}} {'id': 462182756501698675, 'distance': -0.11959204822778702, 'entity': {'struct_field': []}} ``` This PR fixes this. Signed-off-by: SpadeA <tangchenjie1210@gmail.com>
1 parent 097f583 commit ce2640c

File tree

1 file changed

+36
-24
lines changed

1 file changed

+36
-24
lines changed

pymilvus/client/entity_helper.py

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,57 +1033,69 @@ def check_append(field_data: Any, row_data: Dict):
10331033

10341034
def get_array_length(array_item: Any) -> int:
10351035
"""Get the length of an array field from its data."""
1036-
if hasattr(array_item, "string_data") and array_item.string_data:
1037-
return len(array_item.string_data.data)
1038-
if hasattr(array_item, "int_data") and array_item.int_data:
1039-
return len(array_item.int_data.data)
1040-
if hasattr(array_item, "long_data") and array_item.long_data:
1041-
return len(array_item.long_data.data)
1042-
if hasattr(array_item, "float_data") and array_item.float_data:
1043-
return len(array_item.float_data.data)
1044-
if hasattr(array_item, "double_data") and array_item.double_data:
1045-
return len(array_item.double_data.data)
1046-
if hasattr(array_item, "bool_data") and array_item.bool_data:
1047-
return len(array_item.bool_data.data)
1036+
if hasattr(array_item, "string_data") and hasattr(array_item.string_data, "data"):
1037+
length = len(array_item.string_data.data)
1038+
if length > 0:
1039+
return length
1040+
if hasattr(array_item, "int_data") and hasattr(array_item.int_data, "data"):
1041+
length = len(array_item.int_data.data)
1042+
if length > 0:
1043+
return length
1044+
if hasattr(array_item, "long_data") and hasattr(array_item.long_data, "data"):
1045+
length = len(array_item.long_data.data)
1046+
if length > 0:
1047+
return length
1048+
if hasattr(array_item, "float_data") and hasattr(array_item.float_data, "data"):
1049+
length = len(array_item.float_data.data)
1050+
if length > 0:
1051+
return length
1052+
if hasattr(array_item, "double_data") and hasattr(array_item.double_data, "data"):
1053+
length = len(array_item.double_data.data)
1054+
if length > 0:
1055+
return length
1056+
if hasattr(array_item, "bool_data") and hasattr(array_item.bool_data, "data"):
1057+
length = len(array_item.bool_data.data)
1058+
if length > 0:
1059+
return length
10481060
return 0
10491061

10501062

10511063
def get_array_value_at_index(array_item: Any, idx: int) -> Any:
10521064
"""Get the value at a specific index from an array field."""
10531065
if (
10541066
hasattr(array_item, "string_data")
1055-
and array_item.string_data
1056-
and idx < len(array_item.string_data.data)
1067+
and hasattr(array_item.string_data, "data")
1068+
and len(array_item.string_data.data) > idx
10571069
):
10581070
return array_item.string_data.data[idx]
10591071
if (
10601072
hasattr(array_item, "int_data")
1061-
and array_item.int_data
1062-
and idx < len(array_item.int_data.data)
1073+
and hasattr(array_item.int_data, "data")
1074+
and len(array_item.int_data.data) > idx
10631075
):
10641076
return array_item.int_data.data[idx]
10651077
if (
10661078
hasattr(array_item, "long_data")
1067-
and array_item.long_data
1068-
and idx < len(array_item.long_data.data)
1079+
and hasattr(array_item.long_data, "data")
1080+
and len(array_item.long_data.data) > idx
10691081
):
10701082
return array_item.long_data.data[idx]
10711083
if (
10721084
hasattr(array_item, "float_data")
1073-
and array_item.float_data
1074-
and idx < len(array_item.float_data.data)
1085+
and hasattr(array_item.float_data, "data")
1086+
and len(array_item.float_data.data) > idx
10751087
):
10761088
return array_item.float_data.data[idx]
10771089
if (
10781090
hasattr(array_item, "double_data")
1079-
and array_item.double_data
1080-
and idx < len(array_item.double_data.data)
1091+
and hasattr(array_item.double_data, "data")
1092+
and len(array_item.double_data.data) > idx
10811093
):
10821094
return array_item.double_data.data[idx]
10831095
if (
10841096
hasattr(array_item, "bool_data")
1085-
and array_item.bool_data
1086-
and idx < len(array_item.bool_data.data)
1097+
and hasattr(array_item.bool_data, "data")
1098+
and len(array_item.bool_data.data) > idx
10871099
):
10881100
return array_item.bool_data.data[idx]
10891101
return None

0 commit comments

Comments
 (0)