Skip to content

Commit 3ecbae0

Browse files
authored
Support TypeParams in STRUCT [2.6] (#3055)
pr: #3054 issue: milvus-io/milvus#42148 Signed-off-by: SpadeA <tangchenjie1210@gmail.com>
1 parent bd87175 commit 3ecbae0

File tree

14 files changed

+828
-558
lines changed

14 files changed

+828
-558
lines changed

pymilvus/client/abstract.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ def __init__(self, raw: Any):
145145
self.name = None
146146
self.fields = []
147147
self.description = None
148+
self.params = {}
148149

149150
self.__pack(self._raw)
150151

@@ -154,14 +155,26 @@ def __pack(self, raw: Any):
154155
self.description = raw.description
155156
self.fields = [FieldSchema(f) for f in raw.fields]
156157

158+
self.params = {}
159+
for kv in raw.type_params:
160+
key = kv.key if kv.key != "mmap.enabled" else "mmap_enabled"
161+
try:
162+
value = orjson.loads(kv.value)
163+
except (orjson.JSONDecodeError, ValueError):
164+
value = kv.value
165+
self.params[key] = value
166+
157167
def dict(self):
158-
return {
168+
result = {
159169
"field_id": self.field_id,
160170
"name": self.name,
161171
"description": self.description,
162172
"type": DataType._ARRAY_OF_STRUCT,
163173
"fields": [f.dict() for f in self.fields],
164174
}
175+
if self.params:
176+
result["params"] = self.params
177+
return result
165178

166179

167180
class FunctionSchema:

pymilvus/client/prepare.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,19 @@ def get_schema_from_collection_schema(
182182
fields=[],
183183
description=struct.description,
184184
)
185+
186+
if struct.params:
187+
for k, v in struct.params.items():
188+
kv_pair = common_types.KeyValuePair(
189+
key=str(k) if k != "mmap_enabled" else "mmap.enabled",
190+
value=(
191+
orjson.dumps(v).decode(Config.EncodeProtocol)
192+
if not isinstance(v, str)
193+
else str(v)
194+
),
195+
)
196+
struct_schema.type_params.append(kv_pair)
197+
185198
for f in struct.fields:
186199
# Convert struct field types to backend representation
187200
# As struct itself only support array type, so all it's fields are array type

pymilvus/grpc_gen/common_pb2.py

Lines changed: 41 additions & 35 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pymilvus/grpc_gen/common_pb2.pyi

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@ class MsgType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
138138
DescribeAlias: _ClassVar[MsgType]
139139
ListAliases: _ClassVar[MsgType]
140140
AlterCollectionField: _ClassVar[MsgType]
141+
AddCollectionFunction: _ClassVar[MsgType]
142+
AlterCollectionFunction: _ClassVar[MsgType]
143+
DropCollectionFunction: _ClassVar[MsgType]
141144
CreatePartition: _ClassVar[MsgType]
142145
DropPartition: _ClassVar[MsgType]
143146
HasPartition: _ClassVar[MsgType]
@@ -351,6 +354,9 @@ class ObjectPrivilege(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
351354
PrivilegeAddFileResource: _ClassVar[ObjectPrivilege]
352355
PrivilegeRemoveFileResource: _ClassVar[ObjectPrivilege]
353356
PrivilegeListFileResources: _ClassVar[ObjectPrivilege]
357+
PrivilegeAddCollectionFunction: _ClassVar[ObjectPrivilege]
358+
PrivilegeAlterCollectionFunction: _ClassVar[ObjectPrivilege]
359+
PrivilegeDropCollectionFunction: _ClassVar[ObjectPrivilege]
354360

355361
class StateCode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
356362
__slots__ = ()
@@ -372,10 +378,6 @@ class LoadPriority(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
372378
HIGH: _ClassVar[LoadPriority]
373379
LOW: _ClassVar[LoadPriority]
374380

375-
class FileResourceType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
376-
__slots__ = ()
377-
ANALYZER_DICTIONARY: _ClassVar[FileResourceType]
378-
379381
class WALName(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
380382
__slots__ = ()
381383
Unknown: _ClassVar[WALName]
@@ -384,6 +386,11 @@ class WALName(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
384386
Kafka: _ClassVar[WALName]
385387
WoodPecker: _ClassVar[WALName]
386388
Test: _ClassVar[WALName]
389+
390+
class HighlightType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
391+
__slots__ = ()
392+
Lexical: _ClassVar[HighlightType]
393+
Semantic: _ClassVar[HighlightType]
387394
Success: ErrorCode
388395
UnexpectedError: ErrorCode
389396
ConnectFailed: ErrorCode
@@ -498,6 +505,9 @@ RenameCollection: MsgType
498505
DescribeAlias: MsgType
499506
ListAliases: MsgType
500507
AlterCollectionField: MsgType
508+
AddCollectionFunction: MsgType
509+
AlterCollectionFunction: MsgType
510+
DropCollectionFunction: MsgType
501511
CreatePartition: MsgType
502512
DropPartition: MsgType
503513
HasPartition: MsgType
@@ -693,6 +703,9 @@ PrivilegeAddCollectionField: ObjectPrivilege
693703
PrivilegeAddFileResource: ObjectPrivilege
694704
PrivilegeRemoveFileResource: ObjectPrivilege
695705
PrivilegeListFileResources: ObjectPrivilege
706+
PrivilegeAddCollectionFunction: ObjectPrivilege
707+
PrivilegeAlterCollectionFunction: ObjectPrivilege
708+
PrivilegeDropCollectionFunction: ObjectPrivilege
696709
Initializing: StateCode
697710
Healthy: StateCode
698711
Abnormal: StateCode
@@ -704,13 +717,14 @@ LoadStateLoading: LoadState
704717
LoadStateLoaded: LoadState
705718
HIGH: LoadPriority
706719
LOW: LoadPriority
707-
ANALYZER_DICTIONARY: FileResourceType
708720
Unknown: WALName
709721
RocksMQ: WALName
710722
Pulsar: WALName
711723
Kafka: WALName
712724
WoodPecker: WALName
713725
Test: WALName
726+
Lexical: HighlightType
727+
Semantic: HighlightType
714728
PRIVILEGE_EXT_OBJ_FIELD_NUMBER: _ClassVar[int]
715729
privilege_ext_obj: _descriptor.FieldDescriptor
716730

@@ -978,3 +992,25 @@ class ReplicateCheckpoint(_message.Message):
978992
message_id: MessageID
979993
time_tick: int
980994
def __init__(self, cluster_id: _Optional[str] = ..., pchannel: _Optional[str] = ..., message_id: _Optional[_Union[MessageID, _Mapping]] = ..., time_tick: _Optional[int] = ...) -> None: ...
995+
996+
class HighlightData(_message.Message):
997+
__slots__ = ("fragments",)
998+
FRAGMENTS_FIELD_NUMBER: _ClassVar[int]
999+
fragments: _containers.RepeatedScalarFieldContainer[str]
1000+
def __init__(self, fragments: _Optional[_Iterable[str]] = ...) -> None: ...
1001+
1002+
class HighlightResult(_message.Message):
1003+
__slots__ = ("field_name", "datas")
1004+
FIELD_NAME_FIELD_NUMBER: _ClassVar[int]
1005+
DATAS_FIELD_NUMBER: _ClassVar[int]
1006+
field_name: str
1007+
datas: _containers.RepeatedCompositeFieldContainer[HighlightData]
1008+
def __init__(self, field_name: _Optional[str] = ..., datas: _Optional[_Iterable[_Union[HighlightData, _Mapping]]] = ...) -> None: ...
1009+
1010+
class Highlighter(_message.Message):
1011+
__slots__ = ("type", "params")
1012+
TYPE_FIELD_NUMBER: _ClassVar[int]
1013+
PARAMS_FIELD_NUMBER: _ClassVar[int]
1014+
type: HighlightType
1015+
params: _containers.RepeatedCompositeFieldContainer[KeyValuePair]
1016+
def __init__(self, type: _Optional[_Union[HighlightType, str]] = ..., params: _Optional[_Iterable[_Union[KeyValuePair, _Mapping]]] = ...) -> None: ...

pymilvus/grpc_gen/milvus_pb2.py

Lines changed: 389 additions & 377 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pymilvus/grpc_gen/milvus_pb2.pyi

Lines changed: 60 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,50 @@ class AddCollectionFieldRequest(_message.Message):
787787
schema: bytes
788788
def __init__(self, base: _Optional[_Union[_common_pb2.MsgBase, _Mapping]] = ..., db_name: _Optional[str] = ..., collection_name: _Optional[str] = ..., collectionID: _Optional[int] = ..., schema: _Optional[bytes] = ...) -> None: ...
789789

790+
class AddCollectionFunctionRequest(_message.Message):
791+
__slots__ = ("base", "db_name", "collection_name", "collectionID", "functionSchema")
792+
BASE_FIELD_NUMBER: _ClassVar[int]
793+
DB_NAME_FIELD_NUMBER: _ClassVar[int]
794+
COLLECTION_NAME_FIELD_NUMBER: _ClassVar[int]
795+
COLLECTIONID_FIELD_NUMBER: _ClassVar[int]
796+
FUNCTIONSCHEMA_FIELD_NUMBER: _ClassVar[int]
797+
base: _common_pb2.MsgBase
798+
db_name: str
799+
collection_name: str
800+
collectionID: int
801+
functionSchema: _schema_pb2.FunctionSchema
802+
def __init__(self, base: _Optional[_Union[_common_pb2.MsgBase, _Mapping]] = ..., db_name: _Optional[str] = ..., collection_name: _Optional[str] = ..., collectionID: _Optional[int] = ..., functionSchema: _Optional[_Union[_schema_pb2.FunctionSchema, _Mapping]] = ...) -> None: ...
803+
804+
class AlterCollectionFunctionRequest(_message.Message):
805+
__slots__ = ("base", "db_name", "collection_name", "collectionID", "function_name", "functionSchema")
806+
BASE_FIELD_NUMBER: _ClassVar[int]
807+
DB_NAME_FIELD_NUMBER: _ClassVar[int]
808+
COLLECTION_NAME_FIELD_NUMBER: _ClassVar[int]
809+
COLLECTIONID_FIELD_NUMBER: _ClassVar[int]
810+
FUNCTION_NAME_FIELD_NUMBER: _ClassVar[int]
811+
FUNCTIONSCHEMA_FIELD_NUMBER: _ClassVar[int]
812+
base: _common_pb2.MsgBase
813+
db_name: str
814+
collection_name: str
815+
collectionID: int
816+
function_name: str
817+
functionSchema: _schema_pb2.FunctionSchema
818+
def __init__(self, base: _Optional[_Union[_common_pb2.MsgBase, _Mapping]] = ..., db_name: _Optional[str] = ..., collection_name: _Optional[str] = ..., collectionID: _Optional[int] = ..., function_name: _Optional[str] = ..., functionSchema: _Optional[_Union[_schema_pb2.FunctionSchema, _Mapping]] = ...) -> None: ...
819+
820+
class DropCollectionFunctionRequest(_message.Message):
821+
__slots__ = ("base", "db_name", "collection_name", "collectionID", "function_name")
822+
BASE_FIELD_NUMBER: _ClassVar[int]
823+
DB_NAME_FIELD_NUMBER: _ClassVar[int]
824+
COLLECTION_NAME_FIELD_NUMBER: _ClassVar[int]
825+
COLLECTIONID_FIELD_NUMBER: _ClassVar[int]
826+
FUNCTION_NAME_FIELD_NUMBER: _ClassVar[int]
827+
base: _common_pb2.MsgBase
828+
db_name: str
829+
collection_name: str
830+
collectionID: int
831+
function_name: str
832+
def __init__(self, base: _Optional[_Union[_common_pb2.MsgBase, _Mapping]] = ..., db_name: _Optional[str] = ..., collection_name: _Optional[str] = ..., collectionID: _Optional[int] = ..., function_name: _Optional[str] = ...) -> None: ...
833+
790834
class UpsertRequest(_message.Message):
791835
__slots__ = ("base", "db_name", "collection_name", "partition_name", "fields_data", "hash_keys", "num_rows", "schema_timestamp", "partial_update", "namespace")
792836
BASE_FIELD_NUMBER: _ClassVar[int]
@@ -886,7 +930,7 @@ class SubSearchRequest(_message.Message):
886930
def __init__(self, dsl: _Optional[str] = ..., placeholder_group: _Optional[bytes] = ..., dsl_type: _Optional[_Union[_common_pb2.DslType, str]] = ..., search_params: _Optional[_Iterable[_Union[_common_pb2.KeyValuePair, _Mapping]]] = ..., nq: _Optional[int] = ..., expr_template_values: _Optional[_Mapping[str, _schema_pb2.TemplateValue]] = ..., namespace: _Optional[str] = ...) -> None: ...
887931

888932
class SearchRequest(_message.Message):
889-
__slots__ = ("base", "db_name", "collection_name", "partition_names", "dsl", "placeholder_group", "dsl_type", "output_fields", "search_params", "travel_timestamp", "guarantee_timestamp", "nq", "not_return_all_meta", "consistency_level", "use_default_consistency", "search_by_primary_keys", "sub_reqs", "expr_template_values", "function_score", "namespace")
933+
__slots__ = ("base", "db_name", "collection_name", "partition_names", "dsl", "placeholder_group", "dsl_type", "output_fields", "search_params", "travel_timestamp", "guarantee_timestamp", "nq", "not_return_all_meta", "consistency_level", "use_default_consistency", "search_by_primary_keys", "sub_reqs", "expr_template_values", "function_score", "namespace", "highlighter")
890934
class ExprTemplateValuesEntry(_message.Message):
891935
__slots__ = ("key", "value")
892936
KEY_FIELD_NUMBER: _ClassVar[int]
@@ -914,6 +958,7 @@ class SearchRequest(_message.Message):
914958
EXPR_TEMPLATE_VALUES_FIELD_NUMBER: _ClassVar[int]
915959
FUNCTION_SCORE_FIELD_NUMBER: _ClassVar[int]
916960
NAMESPACE_FIELD_NUMBER: _ClassVar[int]
961+
HIGHLIGHTER_FIELD_NUMBER: _ClassVar[int]
917962
base: _common_pb2.MsgBase
918963
db_name: str
919964
collection_name: str
@@ -934,7 +979,8 @@ class SearchRequest(_message.Message):
934979
expr_template_values: _containers.MessageMap[str, _schema_pb2.TemplateValue]
935980
function_score: _schema_pb2.FunctionScore
936981
namespace: str
937-
def __init__(self, base: _Optional[_Union[_common_pb2.MsgBase, _Mapping]] = ..., db_name: _Optional[str] = ..., collection_name: _Optional[str] = ..., partition_names: _Optional[_Iterable[str]] = ..., dsl: _Optional[str] = ..., placeholder_group: _Optional[bytes] = ..., dsl_type: _Optional[_Union[_common_pb2.DslType, str]] = ..., output_fields: _Optional[_Iterable[str]] = ..., search_params: _Optional[_Iterable[_Union[_common_pb2.KeyValuePair, _Mapping]]] = ..., travel_timestamp: _Optional[int] = ..., guarantee_timestamp: _Optional[int] = ..., nq: _Optional[int] = ..., not_return_all_meta: bool = ..., consistency_level: _Optional[_Union[_common_pb2.ConsistencyLevel, str]] = ..., use_default_consistency: bool = ..., search_by_primary_keys: bool = ..., sub_reqs: _Optional[_Iterable[_Union[SubSearchRequest, _Mapping]]] = ..., expr_template_values: _Optional[_Mapping[str, _schema_pb2.TemplateValue]] = ..., function_score: _Optional[_Union[_schema_pb2.FunctionScore, _Mapping]] = ..., namespace: _Optional[str] = ...) -> None: ...
982+
highlighter: _common_pb2.Highlighter
983+
def __init__(self, base: _Optional[_Union[_common_pb2.MsgBase, _Mapping]] = ..., db_name: _Optional[str] = ..., collection_name: _Optional[str] = ..., partition_names: _Optional[_Iterable[str]] = ..., dsl: _Optional[str] = ..., placeholder_group: _Optional[bytes] = ..., dsl_type: _Optional[_Union[_common_pb2.DslType, str]] = ..., output_fields: _Optional[_Iterable[str]] = ..., search_params: _Optional[_Iterable[_Union[_common_pb2.KeyValuePair, _Mapping]]] = ..., travel_timestamp: _Optional[int] = ..., guarantee_timestamp: _Optional[int] = ..., nq: _Optional[int] = ..., not_return_all_meta: bool = ..., consistency_level: _Optional[_Union[_common_pb2.ConsistencyLevel, str]] = ..., use_default_consistency: bool = ..., search_by_primary_keys: bool = ..., sub_reqs: _Optional[_Iterable[_Union[SubSearchRequest, _Mapping]]] = ..., expr_template_values: _Optional[_Mapping[str, _schema_pb2.TemplateValue]] = ..., function_score: _Optional[_Union[_schema_pb2.FunctionScore, _Mapping]] = ..., namespace: _Optional[str] = ..., highlighter: _Optional[_Union[_common_pb2.Highlighter, _Mapping]] = ...) -> None: ...
938984

939985
class Hits(_message.Message):
940986
__slots__ = ("IDs", "row_data", "scores")
@@ -2432,28 +2478,24 @@ class RunAnalyzerResponse(_message.Message):
24322478
def __init__(self, status: _Optional[_Union[_common_pb2.Status, _Mapping]] = ..., results: _Optional[_Iterable[_Union[AnalyzerResult, _Mapping]]] = ...) -> None: ...
24332479

24342480
class FileResourceInfo(_message.Message):
2435-
__slots__ = ("id", "name", "path", "type")
2481+
__slots__ = ("id", "name", "path")
24362482
ID_FIELD_NUMBER: _ClassVar[int]
24372483
NAME_FIELD_NUMBER: _ClassVar[int]
24382484
PATH_FIELD_NUMBER: _ClassVar[int]
2439-
TYPE_FIELD_NUMBER: _ClassVar[int]
24402485
id: int
24412486
name: str
24422487
path: str
2443-
type: _common_pb2.FileResourceType
2444-
def __init__(self, id: _Optional[int] = ..., name: _Optional[str] = ..., path: _Optional[str] = ..., type: _Optional[_Union[_common_pb2.FileResourceType, str]] = ...) -> None: ...
2488+
def __init__(self, id: _Optional[int] = ..., name: _Optional[str] = ..., path: _Optional[str] = ...) -> None: ...
24452489

24462490
class AddFileResourceRequest(_message.Message):
2447-
__slots__ = ("base", "name", "path", "type")
2491+
__slots__ = ("base", "name", "path")
24482492
BASE_FIELD_NUMBER: _ClassVar[int]
24492493
NAME_FIELD_NUMBER: _ClassVar[int]
24502494
PATH_FIELD_NUMBER: _ClassVar[int]
2451-
TYPE_FIELD_NUMBER: _ClassVar[int]
24522495
base: _common_pb2.MsgBase
24532496
name: str
24542497
path: str
2455-
type: _common_pb2.FileResourceType
2456-
def __init__(self, base: _Optional[_Union[_common_pb2.MsgBase, _Mapping]] = ..., name: _Optional[str] = ..., path: _Optional[str] = ..., type: _Optional[_Union[_common_pb2.FileResourceType, str]] = ...) -> None: ...
2498+
def __init__(self, base: _Optional[_Union[_common_pb2.MsgBase, _Mapping]] = ..., name: _Optional[str] = ..., path: _Optional[str] = ...) -> None: ...
24572499

24582500
class RemoveFileResourceRequest(_message.Message):
24592501
__slots__ = ("base", "name")
@@ -2626,16 +2668,18 @@ class UpdateReplicateConfigurationRequest(_message.Message):
26262668
def __init__(self, replicate_configuration: _Optional[_Union[_common_pb2.ReplicateConfiguration, _Mapping]] = ...) -> None: ...
26272669

26282670
class GetReplicateInfoRequest(_message.Message):
2629-
__slots__ = ("source_cluster_id",)
2671+
__slots__ = ("source_cluster_id", "target_pchannel")
26302672
SOURCE_CLUSTER_ID_FIELD_NUMBER: _ClassVar[int]
2673+
TARGET_PCHANNEL_FIELD_NUMBER: _ClassVar[int]
26312674
source_cluster_id: str
2632-
def __init__(self, source_cluster_id: _Optional[str] = ...) -> None: ...
2675+
target_pchannel: str
2676+
def __init__(self, source_cluster_id: _Optional[str] = ..., target_pchannel: _Optional[str] = ...) -> None: ...
26332677

26342678
class GetReplicateInfoResponse(_message.Message):
2635-
__slots__ = ("checkpoints",)
2636-
CHECKPOINTS_FIELD_NUMBER: _ClassVar[int]
2637-
checkpoints: _containers.RepeatedCompositeFieldContainer[_common_pb2.ReplicateCheckpoint]
2638-
def __init__(self, checkpoints: _Optional[_Iterable[_Union[_common_pb2.ReplicateCheckpoint, _Mapping]]] = ...) -> None: ...
2679+
__slots__ = ("checkpoint",)
2680+
CHECKPOINT_FIELD_NUMBER: _ClassVar[int]
2681+
checkpoint: _common_pb2.ReplicateCheckpoint
2682+
def __init__(self, checkpoint: _Optional[_Union[_common_pb2.ReplicateCheckpoint, _Mapping]] = ...) -> None: ...
26392683

26402684
class ReplicateMessage(_message.Message):
26412685
__slots__ = ("source_cluster_id", "message")

0 commit comments

Comments
 (0)