pyodps-catalog 0.1.1__py3-none-any.whl → 0.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
pyodps_catalog/models.py CHANGED
@@ -1,10 +1,156 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # This file is auto-generated, don't edit it. Thanks.
3
3
  from Tea.model import TeaModel
4
- from typing import List, Dict
4
+ from typing import Dict, List
5
5
 
6
6
 
7
- class PolicyTag(TeaModel):
7
+ class HttpResponse(TeaModel):
8
+ """
9
+ ==================================== Common ====================================\
10
+ """
11
+ def __init__(
12
+ self,
13
+ headers: Dict[str, str] = None,
14
+ status_code: int = None,
15
+ body: str = None,
16
+ ):
17
+ self.headers = headers
18
+ self.status_code = status_code
19
+ self.body = body
20
+
21
+ def validate(self):
22
+ pass
23
+
24
+ def to_map(self):
25
+ _map = super().to_map()
26
+ if _map is not None:
27
+ return _map
28
+
29
+ result = dict()
30
+ if self.headers is not None:
31
+ result['headers'] = self.headers
32
+ if self.status_code is not None:
33
+ result['statusCode'] = self.status_code
34
+ if self.body is not None:
35
+ result['body'] = self.body
36
+ return result
37
+
38
+ def from_map(self, m: dict = None):
39
+ m = m or dict()
40
+ if m.get('headers') is not None:
41
+ self.headers = m.get('headers')
42
+ if m.get('statusCode') is not None:
43
+ self.status_code = m.get('statusCode')
44
+ if m.get('body') is not None:
45
+ self.body = m.get('body')
46
+ return self
47
+
48
+
49
+ class Binding(TeaModel):
50
+ def __init__(
51
+ self,
52
+ role: str = None,
53
+ members: List[str] = None,
54
+ ):
55
+ self.role = role
56
+ self.members = members
57
+
58
+ def validate(self):
59
+ pass
60
+
61
+ def to_map(self):
62
+ _map = super().to_map()
63
+ if _map is not None:
64
+ return _map
65
+
66
+ result = dict()
67
+ if self.role is not None:
68
+ result['role'] = self.role
69
+ if self.members is not None:
70
+ result['members'] = self.members
71
+ return result
72
+
73
+ def from_map(self, m: dict = None):
74
+ m = m or dict()
75
+ if m.get('role') is not None:
76
+ self.role = m.get('role')
77
+ if m.get('members') is not None:
78
+ self.members = m.get('members')
79
+ return self
80
+
81
+
82
+ class Policy(TeaModel):
83
+ def __init__(
84
+ self,
85
+ etag: str = None,
86
+ bindings: List[Binding] = None,
87
+ ):
88
+ self.etag = etag
89
+ self.bindings = bindings
90
+
91
+ def validate(self):
92
+ if self.bindings:
93
+ for k in self.bindings:
94
+ if k:
95
+ k.validate()
96
+
97
+ def to_map(self):
98
+ _map = super().to_map()
99
+ if _map is not None:
100
+ return _map
101
+
102
+ result = dict()
103
+ if self.etag is not None:
104
+ result['etag'] = self.etag
105
+ result['bindings'] = []
106
+ if self.bindings is not None:
107
+ for k in self.bindings:
108
+ result['bindings'].append(k.to_map() if k else None)
109
+ return result
110
+
111
+ def from_map(self, m: dict = None):
112
+ m = m or dict()
113
+ if m.get('etag') is not None:
114
+ self.etag = m.get('etag')
115
+ self.bindings = []
116
+ if m.get('bindings') is not None:
117
+ for k in m.get('bindings'):
118
+ temp_model = Binding()
119
+ self.bindings.append(temp_model.from_map(k))
120
+ return self
121
+
122
+
123
+ class SetPolicyRequest(TeaModel):
124
+ def __init__(
125
+ self,
126
+ policy: Policy = None,
127
+ ):
128
+ # 设置的 Policy。
129
+ self.policy = policy
130
+
131
+ def validate(self):
132
+ if self.policy:
133
+ self.policy.validate()
134
+
135
+ def to_map(self):
136
+ _map = super().to_map()
137
+ if _map is not None:
138
+ return _map
139
+
140
+ result = dict()
141
+ if self.policy is not None:
142
+ result['policy'] = self.policy.to_map()
143
+ return result
144
+
145
+ def from_map(self, m: dict = None):
146
+ m = m or dict()
147
+ if m.get('policy') is not None:
148
+ temp_model = Policy()
149
+ self.policy = temp_model.from_map(m['policy'])
150
+ return self
151
+
152
+
153
+ class PolicyTags(TeaModel):
8
154
  def __init__(
9
155
  self,
10
156
  names: List[str] = None,
@@ -32,6 +178,9 @@ class PolicyTag(TeaModel):
32
178
 
33
179
 
34
180
  class TableFieldSchema(TeaModel):
181
+ """
182
+ ==================================== Table ====================================\
183
+ """
35
184
  def __init__(
36
185
  self,
37
186
  field_name: str = None,
@@ -40,7 +189,7 @@ class TableFieldSchema(TeaModel):
40
189
  mode: str = None,
41
190
  fields: List['TableFieldSchema'] = None,
42
191
  description: str = None,
43
- policy_tags: PolicyTag = None,
192
+ policy_tags: PolicyTags = None,
44
193
  max_length: str = None,
45
194
  precision: str = None,
46
195
  scale: str = None,
@@ -127,7 +276,7 @@ class TableFieldSchema(TeaModel):
127
276
  if m.get('description') is not None:
128
277
  self.description = m.get('description')
129
278
  if m.get('policyTags') is not None:
130
- temp_model = PolicyTag()
279
+ temp_model = PolicyTags()
131
280
  self.policy_tags = temp_model.from_map(m['policyTags'])
132
281
  if m.get('maxLength') is not None:
133
282
  self.max_length = m.get('maxLength')
@@ -333,13 +482,13 @@ class PartitionedColumn(TeaModel):
333
482
  class PartitionDefinition(TeaModel):
334
483
  def __init__(
335
484
  self,
336
- partitioned_column: List[PartitionedColumn] = None,
485
+ partitioned_columns: List[PartitionedColumn] = None,
337
486
  ):
338
- self.partitioned_column = partitioned_column
487
+ self.partitioned_columns = partitioned_columns
339
488
 
340
489
  def validate(self):
341
- if self.partitioned_column:
342
- for k in self.partitioned_column:
490
+ if self.partitioned_columns:
491
+ for k in self.partitioned_columns:
343
492
  if k:
344
493
  k.validate()
345
494
 
@@ -349,19 +498,19 @@ class PartitionDefinition(TeaModel):
349
498
  return _map
350
499
 
351
500
  result = dict()
352
- result['partitionedColumn'] = []
353
- if self.partitioned_column is not None:
354
- for k in self.partitioned_column:
355
- result['partitionedColumn'].append(k.to_map() if k else None)
501
+ result['partitionedColumns'] = []
502
+ if self.partitioned_columns is not None:
503
+ for k in self.partitioned_columns:
504
+ result['partitionedColumns'].append(k.to_map() if k else None)
356
505
  return result
357
506
 
358
507
  def from_map(self, m: dict = None):
359
508
  m = m or dict()
360
- self.partitioned_column = []
361
- if m.get('partitionedColumn') is not None:
362
- for k in m.get('partitionedColumn'):
509
+ self.partitioned_columns = []
510
+ if m.get('partitionedColumns') is not None:
511
+ for k in m.get('partitionedColumns'):
363
512
  temp_model = PartitionedColumn()
364
- self.partitioned_column.append(temp_model.from_map(k))
513
+ self.partitioned_columns.append(temp_model.from_map(k))
365
514
  return self
366
515
 
367
516
 
@@ -431,6 +580,48 @@ class ExpirationOptions(TeaModel):
431
580
  return self
432
581
 
433
582
 
583
+ class ExternalDataConfiguration(TeaModel):
584
+ def __init__(
585
+ self,
586
+ source_uris: List[str] = None,
587
+ source_format: str = None,
588
+ connection: str = None,
589
+ ):
590
+ # 表数据所在的 URI
591
+ self.source_uris = source_uris
592
+ # 支持格式:PAIMON/ICEBERG/ORC/PARQUET/CSV 等
593
+ self.source_format = source_format
594
+ # 关联的 Connection ID
595
+ self.connection = connection
596
+
597
+ def validate(self):
598
+ pass
599
+
600
+ def to_map(self):
601
+ _map = super().to_map()
602
+ if _map is not None:
603
+ return _map
604
+
605
+ result = dict()
606
+ if self.source_uris is not None:
607
+ result['sourceUris'] = self.source_uris
608
+ if self.source_format is not None:
609
+ result['sourceFormat'] = self.source_format
610
+ if self.connection is not None:
611
+ result['connection'] = self.connection
612
+ return result
613
+
614
+ def from_map(self, m: dict = None):
615
+ m = m or dict()
616
+ if m.get('sourceUris') is not None:
617
+ self.source_uris = m.get('sourceUris')
618
+ if m.get('sourceFormat') is not None:
619
+ self.source_format = m.get('sourceFormat')
620
+ if m.get('connection') is not None:
621
+ self.connection = m.get('connection')
622
+ return self
623
+
624
+
434
625
  class Table(TeaModel):
435
626
  def __init__(
436
627
  self,
@@ -450,6 +641,7 @@ class Table(TeaModel):
450
641
  last_modified_time: str = None,
451
642
  expiration_options: ExpirationOptions = None,
452
643
  labels: Dict[str, str] = None,
644
+ external_data_configuration: ExternalDataConfiguration = None,
453
645
  ):
454
646
  # 用于 read-modify-write 一致性校验。
455
647
  self.etag = etag
@@ -483,10 +675,10 @@ class Table(TeaModel):
483
675
  self.expiration_options = expiration_options
484
676
  # 可选。表上的标签。
485
677
  self.labels = labels
678
+ # 外部表配置
679
+ self.external_data_configuration = external_data_configuration
486
680
 
487
681
  def validate(self):
488
- self.validate_required(self.project_id, 'project_id')
489
- self.validate_required(self.table_name, 'table_name')
490
682
  if self.table_schema:
491
683
  self.table_schema.validate()
492
684
  if self.clustering:
@@ -499,6 +691,8 @@ class Table(TeaModel):
499
691
  self.table_format_definition.validate()
500
692
  if self.expiration_options:
501
693
  self.expiration_options.validate()
694
+ if self.external_data_configuration:
695
+ self.external_data_configuration.validate()
502
696
 
503
697
  def to_map(self):
504
698
  _map = super().to_map()
@@ -538,6 +732,8 @@ class Table(TeaModel):
538
732
  result['expirationOptions'] = self.expiration_options.to_map()
539
733
  if self.labels is not None:
540
734
  result['labels'] = self.labels
735
+ if self.external_data_configuration is not None:
736
+ result['externalDataConfiguration'] = self.external_data_configuration.to_map()
541
737
  return result
542
738
 
543
739
  def from_map(self, m: dict = None):
@@ -580,19 +776,63 @@ class Table(TeaModel):
580
776
  self.expiration_options = temp_model.from_map(m['expirationOptions'])
581
777
  if m.get('labels') is not None:
582
778
  self.labels = m.get('labels')
779
+ if m.get('externalDataConfiguration') is not None:
780
+ temp_model = ExternalDataConfiguration()
781
+ self.external_data_configuration = temp_model.from_map(m['externalDataConfiguration'])
583
782
  return self
584
783
 
585
784
 
586
- class HttpResponse(TeaModel):
785
+ class ListTablesResponse(TeaModel):
587
786
  def __init__(
588
787
  self,
589
- headers: Dict[str, str] = None,
590
- status_code: int = None,
591
- body: str = None,
788
+ tables: List[Table] = None,
789
+ next_page_token: str = None,
592
790
  ):
593
- self.headers = headers
594
- self.status_code = status_code
595
- self.body = body
791
+ self.tables = tables
792
+ self.next_page_token = next_page_token
793
+
794
+ def validate(self):
795
+ if self.tables:
796
+ for k in self.tables:
797
+ if k:
798
+ k.validate()
799
+
800
+ def to_map(self):
801
+ _map = super().to_map()
802
+ if _map is not None:
803
+ return _map
804
+
805
+ result = dict()
806
+ result['tables'] = []
807
+ if self.tables is not None:
808
+ for k in self.tables:
809
+ result['tables'].append(k.to_map() if k else None)
810
+ if self.next_page_token is not None:
811
+ result['nextPageToken'] = self.next_page_token
812
+ return result
813
+
814
+ def from_map(self, m: dict = None):
815
+ m = m or dict()
816
+ self.tables = []
817
+ if m.get('tables') is not None:
818
+ for k in m.get('tables'):
819
+ temp_model = Table()
820
+ self.tables.append(temp_model.from_map(k))
821
+ if m.get('nextPageToken') is not None:
822
+ self.next_page_token = m.get('nextPageToken')
823
+ return self
824
+
825
+
826
+ class CloudResourceOptions(TeaModel):
827
+ def __init__(
828
+ self,
829
+ delegated_account: str = None,
830
+ ram_role_arn: str = None,
831
+ ):
832
+ # 被委托的账号名。在创建 connection 时自动保存为创建者的账号。
833
+ self.delegated_account = delegated_account
834
+ # 授权给 MaxCompute 服务扮演的 RAM 角色 ARN。
835
+ self.ram_role_arn = ram_role_arn
596
836
 
597
837
  def validate(self):
598
838
  pass
@@ -603,22 +843,1997 @@ class HttpResponse(TeaModel):
603
843
  return _map
604
844
 
605
845
  result = dict()
606
- if self.headers is not None:
607
- result['headers'] = self.headers
608
- if self.status_code is not None:
609
- result['statusCode'] = self.status_code
610
- if self.body is not None:
611
- result['body'] = self.body
846
+ if self.delegated_account is not None:
847
+ result['delegatedAccount'] = self.delegated_account
848
+ if self.ram_role_arn is not None:
849
+ result['ramRoleArn'] = self.ram_role_arn
612
850
  return result
613
851
 
614
852
  def from_map(self, m: dict = None):
615
853
  m = m or dict()
616
- if m.get('headers') is not None:
617
- self.headers = m.get('headers')
618
- if m.get('statusCode') is not None:
619
- self.status_code = m.get('statusCode')
620
- if m.get('body') is not None:
621
- self.body = m.get('body')
854
+ if m.get('delegatedAccount') is not None:
855
+ self.delegated_account = m.get('delegatedAccount')
856
+ if m.get('ramRoleArn') is not None:
857
+ self.ram_role_arn = m.get('ramRoleArn')
858
+ return self
859
+
860
+
861
+ class Connection(TeaModel):
862
+ """
863
+ ==================================== Connection ====================================\
864
+ """
865
+ def __init__(
866
+ self,
867
+ name: str = None,
868
+ connection_name: str = None,
869
+ description: str = None,
870
+ creation_time: str = None,
871
+ last_modified_time: str = None,
872
+ connection_type: str = None,
873
+ cloud_resource: CloudResourceOptions = None,
874
+ region: str = None,
875
+ ):
876
+ # 资源全局唯一名:namespaces/{namespace_ID}/connections/{connectionName}
877
+ self.name = name
878
+ # namespace 内唯一。大小写敏感。包含字符:[a-z][A-Z][0-9]_,字节数范围 [3, 32]。
879
+ self.connection_name = connection_name
880
+ # 可选。最多 1KB。
881
+ self.description = description
882
+ # Connection 的创建时间(毫秒)
883
+ self.creation_time = creation_time
884
+ # 最后修改时间(毫秒)
885
+ self.last_modified_time = last_modified_time
886
+ # Connection 的类型。必需项。
887
+ self.connection_type = connection_type
888
+ # 云上资源类型的 connection 对应的选项配置。仅当 connectionType 为 CLOUD_RESOURCE 时才设置。
889
+ self.cloud_resource = cloud_resource
890
+ # 此 connection 所属的 region。
891
+ self.region = region
892
+
893
+ def validate(self):
894
+ if self.cloud_resource:
895
+ self.cloud_resource.validate()
896
+
897
+ def to_map(self):
898
+ _map = super().to_map()
899
+ if _map is not None:
900
+ return _map
901
+
902
+ result = dict()
903
+ if self.name is not None:
904
+ result['name'] = self.name
905
+ if self.connection_name is not None:
906
+ result['connectionName'] = self.connection_name
907
+ if self.description is not None:
908
+ result['description'] = self.description
909
+ if self.creation_time is not None:
910
+ result['creationTime'] = self.creation_time
911
+ if self.last_modified_time is not None:
912
+ result['lastModifiedTime'] = self.last_modified_time
913
+ if self.connection_type is not None:
914
+ result['connectionType'] = self.connection_type
915
+ if self.cloud_resource is not None:
916
+ result['cloudResource'] = self.cloud_resource.to_map()
917
+ if self.region is not None:
918
+ result['region'] = self.region
919
+ return result
920
+
921
+ def from_map(self, m: dict = None):
922
+ m = m or dict()
923
+ if m.get('name') is not None:
924
+ self.name = m.get('name')
925
+ if m.get('connectionName') is not None:
926
+ self.connection_name = m.get('connectionName')
927
+ if m.get('description') is not None:
928
+ self.description = m.get('description')
929
+ if m.get('creationTime') is not None:
930
+ self.creation_time = m.get('creationTime')
931
+ if m.get('lastModifiedTime') is not None:
932
+ self.last_modified_time = m.get('lastModifiedTime')
933
+ if m.get('connectionType') is not None:
934
+ self.connection_type = m.get('connectionType')
935
+ if m.get('cloudResource') is not None:
936
+ temp_model = CloudResourceOptions()
937
+ self.cloud_resource = temp_model.from_map(m['cloudResource'])
938
+ if m.get('region') is not None:
939
+ self.region = m.get('region')
940
+ return self
941
+
942
+
943
+ class ListConnectionsResponse(TeaModel):
944
+ def __init__(
945
+ self,
946
+ connections: List[Connection] = None,
947
+ next_page_token: str = None,
948
+ ):
949
+ self.connections = connections
950
+ self.next_page_token = next_page_token
951
+
952
+ def validate(self):
953
+ if self.connections:
954
+ for k in self.connections:
955
+ if k:
956
+ k.validate()
957
+
958
+ def to_map(self):
959
+ _map = super().to_map()
960
+ if _map is not None:
961
+ return _map
962
+
963
+ result = dict()
964
+ result['connections'] = []
965
+ if self.connections is not None:
966
+ for k in self.connections:
967
+ result['connections'].append(k.to_map() if k else None)
968
+ if self.next_page_token is not None:
969
+ result['nextPageToken'] = self.next_page_token
970
+ return result
971
+
972
+ def from_map(self, m: dict = None):
973
+ m = m or dict()
974
+ self.connections = []
975
+ if m.get('connections') is not None:
976
+ for k in m.get('connections'):
977
+ temp_model = Connection()
978
+ self.connections.append(temp_model.from_map(k))
979
+ if m.get('nextPageToken') is not None:
980
+ self.next_page_token = m.get('nextPageToken')
981
+ return self
982
+
983
+
984
+ class Role(TeaModel):
985
+ """
986
+ ==================================== Role ====================================\
987
+ """
988
+ def __init__(
989
+ self,
990
+ name: str = None,
991
+ role_name: str = None,
992
+ description: str = None,
993
+ included_permissions: List[str] = None,
994
+ etag: str = None,
995
+ deleted: bool = None,
996
+ ):
997
+ # 资源全局唯一名。e.g., namespaces/{namespace_ID}/roles/{roleName}
998
+ self.name = name
999
+ # namespace 内唯一。大小写敏感。包含字符:[a-z][A-Z][0-9]_,字节数范围 [3, 255]。
1000
+ self.role_name = role_name
1001
+ # 可选。最多 1KB。
1002
+ self.description = description
1003
+ # Role 包含的权限。
1004
+ self.included_permissions = included_permissions
1005
+ # 用于一致性校验。
1006
+ self.etag = etag
1007
+ # 表示是否被删除。
1008
+ self.deleted = deleted
1009
+ # ListRolesResponse model
1010
+
1011
+ def validate(self):
1012
+ pass
1013
+
1014
+ def to_map(self):
1015
+ _map = super().to_map()
1016
+ if _map is not None:
1017
+ return _map
1018
+
1019
+ result = dict()
1020
+ if self.name is not None:
1021
+ result['name'] = self.name
1022
+ if self.role_name is not None:
1023
+ result['roleName'] = self.role_name
1024
+ if self.description is not None:
1025
+ result['description'] = self.description
1026
+ if self.included_permissions is not None:
1027
+ result['includedPermissions'] = self.included_permissions
1028
+ if self.etag is not None:
1029
+ result['etag'] = self.etag
1030
+ if self.deleted is not None:
1031
+ result['deleted'] = self.deleted
1032
+ return result
1033
+
1034
+ def from_map(self, m: dict = None):
1035
+ m = m or dict()
1036
+ if m.get('name') is not None:
1037
+ self.name = m.get('name')
1038
+ if m.get('roleName') is not None:
1039
+ self.role_name = m.get('roleName')
1040
+ if m.get('description') is not None:
1041
+ self.description = m.get('description')
1042
+ if m.get('includedPermissions') is not None:
1043
+ self.included_permissions = m.get('includedPermissions')
1044
+ if m.get('etag') is not None:
1045
+ self.etag = m.get('etag')
1046
+ if m.get('deleted') is not None:
1047
+ self.deleted = m.get('deleted')
1048
+ return self
1049
+
1050
+
1051
+ class ListRolesResponse(TeaModel):
1052
+ def __init__(
1053
+ self,
1054
+ roles: List[Role] = None,
1055
+ next_page_token: str = None,
1056
+ ):
1057
+ # 角色列表。
1058
+ self.roles = roles
1059
+ # 下一页的token。
1060
+ self.next_page_token = next_page_token
1061
+ # Path generation helper
1062
+
1063
+ def validate(self):
1064
+ if self.roles:
1065
+ for k in self.roles:
1066
+ if k:
1067
+ k.validate()
1068
+
1069
+ def to_map(self):
1070
+ _map = super().to_map()
1071
+ if _map is not None:
1072
+ return _map
1073
+
1074
+ result = dict()
1075
+ result['roles'] = []
1076
+ if self.roles is not None:
1077
+ for k in self.roles:
1078
+ result['roles'].append(k.to_map() if k else None)
1079
+ if self.next_page_token is not None:
1080
+ result['nextPageToken'] = self.next_page_token
1081
+ return result
1082
+
1083
+ def from_map(self, m: dict = None):
1084
+ m = m or dict()
1085
+ self.roles = []
1086
+ if m.get('roles') is not None:
1087
+ for k in m.get('roles'):
1088
+ temp_model = Role()
1089
+ self.roles.append(temp_model.from_map(k))
1090
+ if m.get('nextPageToken') is not None:
1091
+ self.next_page_token = m.get('nextPageToken')
1092
+ return self
1093
+
1094
+
1095
+ class Taxonomy(TeaModel):
1096
+ """
1097
+ ==================================== Taxonomy ====================================\
1098
+ """
1099
+ def __init__(
1100
+ self,
1101
+ name: str = None,
1102
+ taxonomy_name: str = None,
1103
+ description: str = None,
1104
+ activated_policy_types: List[str] = None,
1105
+ policy_tag_count: int = None,
1106
+ create_time: str = None,
1107
+ last_modified_time: str = None,
1108
+ ):
1109
+ # 资源全局唯一名。e.g., namespaces/{namespace_ID}/taxonomies/{ID}
1110
+ self.name = name
1111
+ # namespace 内唯一。大小写敏感。包含字符:[a-z][A-Z][0-9]_,字节数范围 [3, 255]。
1112
+ self.taxonomy_name = taxonomy_name
1113
+ # 可选。最多 1KB。
1114
+ self.description = description
1115
+ # Taxonomy 下开启的 policy 类型列表,默认为 POLICY_TYPE_UNSPECIFIED
1116
+ self.activated_policy_types = activated_policy_types
1117
+ # 此 Taxonomy 内 policy tag 的个数。
1118
+ self.policy_tag_count = policy_tag_count
1119
+ # Taxonomy 的创建时间戳(毫秒)。仅输出。
1120
+ self.create_time = create_time
1121
+ # Taxonomy 的最后修改时间戳(毫秒)。仅输出。
1122
+ self.last_modified_time = last_modified_time
1123
+ # PolicyTag model
1124
+
1125
+ def validate(self):
1126
+ pass
1127
+
1128
+ def to_map(self):
1129
+ _map = super().to_map()
1130
+ if _map is not None:
1131
+ return _map
1132
+
1133
+ result = dict()
1134
+ if self.name is not None:
1135
+ result['name'] = self.name
1136
+ if self.taxonomy_name is not None:
1137
+ result['taxonomyName'] = self.taxonomy_name
1138
+ if self.description is not None:
1139
+ result['description'] = self.description
1140
+ if self.activated_policy_types is not None:
1141
+ result['activatedPolicyTypes'] = self.activated_policy_types
1142
+ if self.policy_tag_count is not None:
1143
+ result['policyTagCount'] = self.policy_tag_count
1144
+ if self.create_time is not None:
1145
+ result['createTime'] = self.create_time
1146
+ if self.last_modified_time is not None:
1147
+ result['lastModifiedTime'] = self.last_modified_time
1148
+ return result
1149
+
1150
+ def from_map(self, m: dict = None):
1151
+ m = m or dict()
1152
+ if m.get('name') is not None:
1153
+ self.name = m.get('name')
1154
+ if m.get('taxonomyName') is not None:
1155
+ self.taxonomy_name = m.get('taxonomyName')
1156
+ if m.get('description') is not None:
1157
+ self.description = m.get('description')
1158
+ if m.get('activatedPolicyTypes') is not None:
1159
+ self.activated_policy_types = m.get('activatedPolicyTypes')
1160
+ if m.get('policyTagCount') is not None:
1161
+ self.policy_tag_count = m.get('policyTagCount')
1162
+ if m.get('createTime') is not None:
1163
+ self.create_time = m.get('createTime')
1164
+ if m.get('lastModifiedTime') is not None:
1165
+ self.last_modified_time = m.get('lastModifiedTime')
1166
+ return self
1167
+
1168
+
1169
+ class PolicyTag(TeaModel):
1170
+ def __init__(
1171
+ self,
1172
+ name: str = None,
1173
+ policy_tag_name: str = None,
1174
+ description: str = None,
1175
+ parent_policy_tag: str = None,
1176
+ child_policy_tags: List[str] = None,
1177
+ ):
1178
+ # PolicyTag的完整路径。e.g., namespaces/{namespace_ID}/taxonomies/{TID}/policyTags/{ID}
1179
+ self.name = name
1180
+ # 父 Taxonomy 内唯一。大小写敏感。包含字符:[a-z][A-Z][0-9]_,字节数范围 [3, 255]。
1181
+ self.policy_tag_name = policy_tag_name
1182
+ # 可选。最多 1KB。
1183
+ self.description = description
1184
+ # 父节点的name。空代表根节点。
1185
+ self.parent_policy_tag = parent_policy_tag
1186
+ # 子节点的name列表。仅输出。
1187
+ self.child_policy_tags = child_policy_tags
1188
+ # List responses
1189
+
1190
+ def validate(self):
1191
+ pass
1192
+
1193
+ def to_map(self):
1194
+ _map = super().to_map()
1195
+ if _map is not None:
1196
+ return _map
1197
+
1198
+ result = dict()
1199
+ if self.name is not None:
1200
+ result['name'] = self.name
1201
+ if self.policy_tag_name is not None:
1202
+ result['policyTagName'] = self.policy_tag_name
1203
+ if self.description is not None:
1204
+ result['description'] = self.description
1205
+ if self.parent_policy_tag is not None:
1206
+ result['parentPolicyTag'] = self.parent_policy_tag
1207
+ if self.child_policy_tags is not None:
1208
+ result['childPolicyTags'] = self.child_policy_tags
1209
+ return result
1210
+
1211
+ def from_map(self, m: dict = None):
1212
+ m = m or dict()
1213
+ if m.get('name') is not None:
1214
+ self.name = m.get('name')
1215
+ if m.get('policyTagName') is not None:
1216
+ self.policy_tag_name = m.get('policyTagName')
1217
+ if m.get('description') is not None:
1218
+ self.description = m.get('description')
1219
+ if m.get('parentPolicyTag') is not None:
1220
+ self.parent_policy_tag = m.get('parentPolicyTag')
1221
+ if m.get('childPolicyTags') is not None:
1222
+ self.child_policy_tags = m.get('childPolicyTags')
1223
+ return self
1224
+
1225
+
1226
+ class ListTaxonomiesResponse(TeaModel):
1227
+ def __init__(
1228
+ self,
1229
+ taxonomies: List[Taxonomy] = None,
1230
+ next_page_token: str = None,
1231
+ ):
1232
+ # Taxonomy列表。
1233
+ self.taxonomies = taxonomies
1234
+ # 下一页的token。
1235
+ self.next_page_token = next_page_token
1236
+
1237
+ def validate(self):
1238
+ if self.taxonomies:
1239
+ for k in self.taxonomies:
1240
+ if k:
1241
+ k.validate()
1242
+
1243
+ def to_map(self):
1244
+ _map = super().to_map()
1245
+ if _map is not None:
1246
+ return _map
1247
+
1248
+ result = dict()
1249
+ result['taxonomies'] = []
1250
+ if self.taxonomies is not None:
1251
+ for k in self.taxonomies:
1252
+ result['taxonomies'].append(k.to_map() if k else None)
1253
+ if self.next_page_token is not None:
1254
+ result['nextPageToken'] = self.next_page_token
1255
+ return result
1256
+
1257
+ def from_map(self, m: dict = None):
1258
+ m = m or dict()
1259
+ self.taxonomies = []
1260
+ if m.get('taxonomies') is not None:
1261
+ for k in m.get('taxonomies'):
1262
+ temp_model = Taxonomy()
1263
+ self.taxonomies.append(temp_model.from_map(k))
1264
+ if m.get('nextPageToken') is not None:
1265
+ self.next_page_token = m.get('nextPageToken')
1266
+ return self
1267
+
1268
+
1269
+ class ListPolicyTagsResponse(TeaModel):
1270
+ def __init__(
1271
+ self,
1272
+ policy_tags: List[PolicyTag] = None,
1273
+ next_page_token: str = None,
1274
+ ):
1275
+ # PolicyTag列表。
1276
+ self.policy_tags = policy_tags
1277
+ # 下一页的token。
1278
+ self.next_page_token = next_page_token
1279
+ # Path generation helpers
1280
+
1281
+ def validate(self):
1282
+ if self.policy_tags:
1283
+ for k in self.policy_tags:
1284
+ if k:
1285
+ k.validate()
1286
+
1287
+ def to_map(self):
1288
+ _map = super().to_map()
1289
+ if _map is not None:
1290
+ return _map
1291
+
1292
+ result = dict()
1293
+ result['policyTags'] = []
1294
+ if self.policy_tags is not None:
1295
+ for k in self.policy_tags:
1296
+ result['policyTags'].append(k.to_map() if k else None)
1297
+ if self.next_page_token is not None:
1298
+ result['nextPageToken'] = self.next_page_token
1299
+ return result
1300
+
1301
+ def from_map(self, m: dict = None):
1302
+ m = m or dict()
1303
+ self.policy_tags = []
1304
+ if m.get('policyTags') is not None:
1305
+ for k in m.get('policyTags'):
1306
+ temp_model = PolicyTag()
1307
+ self.policy_tags.append(temp_model.from_map(k))
1308
+ if m.get('nextPageToken') is not None:
1309
+ self.next_page_token = m.get('nextPageToken')
1310
+ return self
1311
+
1312
+
1313
+ class DataMaskingPolicy(TeaModel):
1314
+ def __init__(
1315
+ self,
1316
+ predefined_expression: str = None,
1317
+ parameters: List[str] = None,
1318
+ ):
1319
+ # 预定义脱敏策略的类型。
1320
+ self.predefined_expression = predefined_expression
1321
+ # 预定义脱敏策略的参数。
1322
+ self.parameters = parameters
1323
+
1324
+ def validate(self):
1325
+ pass
1326
+
1327
+ def to_map(self):
1328
+ _map = super().to_map()
1329
+ if _map is not None:
1330
+ return _map
1331
+
1332
+ result = dict()
1333
+ if self.predefined_expression is not None:
1334
+ result['predefinedExpression'] = self.predefined_expression
1335
+ if self.parameters is not None:
1336
+ result['parameters'] = self.parameters
1337
+ return result
1338
+
1339
+ def from_map(self, m: dict = None):
1340
+ m = m or dict()
1341
+ if m.get('predefinedExpression') is not None:
1342
+ self.predefined_expression = m.get('predefinedExpression')
1343
+ if m.get('parameters') is not None:
1344
+ self.parameters = m.get('parameters')
1345
+ return self
1346
+
1347
+
1348
+ class DataPolicy(TeaModel):
1349
+ """
1350
+ ==================================== DataPolicy ====================================\
1351
+ """
1352
+ def __init__(
1353
+ self,
1354
+ name: str = None,
1355
+ data_policy_name: str = None,
1356
+ policy_tag: str = None,
1357
+ data_policy_type: str = None,
1358
+ data_masking_policy: DataMaskingPolicy = None,
1359
+ ):
1360
+ # namespaces/{namespace_ID}/dataPolicies/{dataPolicyName}。仅输出。
1361
+ self.name = name
1362
+ # 用户指定的 data policy 名,在账号级唯一。
1363
+ self.data_policy_name = data_policy_name
1364
+ # Data policy 绑定的 policy tag 资源全名。
1365
+ self.policy_tag = policy_tag
1366
+ # data policy 的类型,目前仅支持 DATA_MASKING_POLICY 类型。
1367
+ self.data_policy_type = data_policy_type
1368
+ # Data policy 上定义的脱敏规则。
1369
+ self.data_masking_policy = data_masking_policy
1370
+
1371
+ def validate(self):
1372
+ if self.data_masking_policy:
1373
+ self.data_masking_policy.validate()
1374
+
1375
+ def to_map(self):
1376
+ _map = super().to_map()
1377
+ if _map is not None:
1378
+ return _map
1379
+
1380
+ result = dict()
1381
+ if self.name is not None:
1382
+ result['name'] = self.name
1383
+ if self.data_policy_name is not None:
1384
+ result['dataPolicyName'] = self.data_policy_name
1385
+ if self.policy_tag is not None:
1386
+ result['policyTag'] = self.policy_tag
1387
+ if self.data_policy_type is not None:
1388
+ result['dataPolicyType'] = self.data_policy_type
1389
+ if self.data_masking_policy is not None:
1390
+ result['dataMaskingPolicy'] = self.data_masking_policy.to_map()
1391
+ return result
1392
+
1393
+ def from_map(self, m: dict = None):
1394
+ m = m or dict()
1395
+ if m.get('name') is not None:
1396
+ self.name = m.get('name')
1397
+ if m.get('dataPolicyName') is not None:
1398
+ self.data_policy_name = m.get('dataPolicyName')
1399
+ if m.get('policyTag') is not None:
1400
+ self.policy_tag = m.get('policyTag')
1401
+ if m.get('dataPolicyType') is not None:
1402
+ self.data_policy_type = m.get('dataPolicyType')
1403
+ if m.get('dataMaskingPolicy') is not None:
1404
+ temp_model = DataMaskingPolicy()
1405
+ self.data_masking_policy = temp_model.from_map(m['dataMaskingPolicy'])
1406
+ return self
1407
+
1408
+
1409
+ class ListDataPoliciesResponse(TeaModel):
1410
+ def __init__(
1411
+ self,
1412
+ data_policies: List[DataPolicy] = None,
1413
+ next_page_token: str = None,
1414
+ ):
1415
+ self.data_policies = data_policies
1416
+ # 分页标记。
1417
+ self.next_page_token = next_page_token
1418
+
1419
+ def validate(self):
1420
+ if self.data_policies:
1421
+ for k in self.data_policies:
1422
+ if k:
1423
+ k.validate()
1424
+
1425
+ def to_map(self):
1426
+ _map = super().to_map()
1427
+ if _map is not None:
1428
+ return _map
1429
+
1430
+ result = dict()
1431
+ result['dataPolicies'] = []
1432
+ if self.data_policies is not None:
1433
+ for k in self.data_policies:
1434
+ result['dataPolicies'].append(k.to_map() if k else None)
1435
+ if self.next_page_token is not None:
1436
+ result['nextPageToken'] = self.next_page_token
1437
+ return result
1438
+
1439
+ def from_map(self, m: dict = None):
1440
+ m = m or dict()
1441
+ self.data_policies = []
1442
+ if m.get('dataPolicies') is not None:
1443
+ for k in m.get('dataPolicies'):
1444
+ temp_model = DataPolicy()
1445
+ self.data_policies.append(temp_model.from_map(k))
1446
+ if m.get('nextPageToken') is not None:
1447
+ self.next_page_token = m.get('nextPageToken')
1448
+ return self
1449
+
1450
+
1451
+ class Project(TeaModel):
1452
+ """
1453
+ ==================================== Project/Schema ====================================\
1454
+ """
1455
+ def __init__(
1456
+ self,
1457
+ name: str = None,
1458
+ project_id: str = None,
1459
+ owner: str = None,
1460
+ description: str = None,
1461
+ create_time: str = None,
1462
+ last_modified_time: str = None,
1463
+ schema_enabled: bool = None,
1464
+ region: str = None,
1465
+ ):
1466
+ # Project的资源全名:projects/{projectId}。仅输出。
1467
+ self.name = name
1468
+ # Project唯一ID
1469
+ self.project_id = project_id
1470
+ # Project的拥有者
1471
+ self.owner = owner
1472
+ # Project描述
1473
+ self.description = description
1474
+ # 创建时间戳(UTC毫秒)
1475
+ self.create_time = create_time
1476
+ # 最后修改时间戳(UTC毫秒)
1477
+ self.last_modified_time = last_modified_time
1478
+ # 是否开启三层模型
1479
+ self.schema_enabled = schema_enabled
1480
+ # 所属region
1481
+ self.region = region
1482
+
1483
+ def validate(self):
1484
+ pass
1485
+
1486
+ def to_map(self):
1487
+ _map = super().to_map()
1488
+ if _map is not None:
1489
+ return _map
1490
+
1491
+ result = dict()
1492
+ if self.name is not None:
1493
+ result['name'] = self.name
1494
+ if self.project_id is not None:
1495
+ result['projectId'] = self.project_id
1496
+ if self.owner is not None:
1497
+ result['owner'] = self.owner
1498
+ if self.description is not None:
1499
+ result['description'] = self.description
1500
+ if self.create_time is not None:
1501
+ result['createTime'] = self.create_time
1502
+ if self.last_modified_time is not None:
1503
+ result['lastModifiedTime'] = self.last_modified_time
1504
+ if self.schema_enabled is not None:
1505
+ result['schemaEnabled'] = self.schema_enabled
1506
+ if self.region is not None:
1507
+ result['region'] = self.region
1508
+ return result
1509
+
1510
+ def from_map(self, m: dict = None):
1511
+ m = m or dict()
1512
+ if m.get('name') is not None:
1513
+ self.name = m.get('name')
1514
+ if m.get('projectId') is not None:
1515
+ self.project_id = m.get('projectId')
1516
+ if m.get('owner') is not None:
1517
+ self.owner = m.get('owner')
1518
+ if m.get('description') is not None:
1519
+ self.description = m.get('description')
1520
+ if m.get('createTime') is not None:
1521
+ self.create_time = m.get('createTime')
1522
+ if m.get('lastModifiedTime') is not None:
1523
+ self.last_modified_time = m.get('lastModifiedTime')
1524
+ if m.get('schemaEnabled') is not None:
1525
+ self.schema_enabled = m.get('schemaEnabled')
1526
+ if m.get('region') is not None:
1527
+ self.region = m.get('region')
1528
+ return self
1529
+
1530
+
1531
+ class ExternalCatalogSchemaOptions(TeaModel):
1532
+ def __init__(
1533
+ self,
1534
+ parameters: Dict[str, str] = None,
1535
+ ):
1536
+ # 外部schema属性配置
1537
+ self.parameters = parameters
1538
+
1539
+ def validate(self):
1540
+ pass
1541
+
1542
+ def to_map(self):
1543
+ _map = super().to_map()
1544
+ if _map is not None:
1545
+ return _map
1546
+
1547
+ result = dict()
1548
+ if self.parameters is not None:
1549
+ result['parameters'] = self.parameters
1550
+ return result
1551
+
1552
+ def from_map(self, m: dict = None):
1553
+ m = m or dict()
1554
+ if m.get('parameters') is not None:
1555
+ self.parameters = m.get('parameters')
1556
+ return self
1557
+
1558
+
1559
+ class ExternalSchemaConfiguration(TeaModel):
1560
+ def __init__(
1561
+ self,
1562
+ connection: str = None,
1563
+ external_catalog_schema_options: ExternalCatalogSchemaOptions = None,
1564
+ ):
1565
+ # 关联的connection ID
1566
+ self.connection = connection
1567
+ # 外部catalog schema配置
1568
+ self.external_catalog_schema_options = external_catalog_schema_options
1569
+
1570
+ def validate(self):
1571
+ if self.external_catalog_schema_options:
1572
+ self.external_catalog_schema_options.validate()
1573
+
1574
+ def to_map(self):
1575
+ _map = super().to_map()
1576
+ if _map is not None:
1577
+ return _map
1578
+
1579
+ result = dict()
1580
+ if self.connection is not None:
1581
+ result['connection'] = self.connection
1582
+ if self.external_catalog_schema_options is not None:
1583
+ result['externalCatalogSchemaOptions'] = self.external_catalog_schema_options.to_map()
1584
+ return result
1585
+
1586
+ def from_map(self, m: dict = None):
1587
+ m = m or dict()
1588
+ if m.get('connection') is not None:
1589
+ self.connection = m.get('connection')
1590
+ if m.get('externalCatalogSchemaOptions') is not None:
1591
+ temp_model = ExternalCatalogSchemaOptions()
1592
+ self.external_catalog_schema_options = temp_model.from_map(m['externalCatalogSchemaOptions'])
1593
+ return self
1594
+
1595
+
1596
+ class Schema(TeaModel):
1597
+ def __init__(
1598
+ self,
1599
+ name: str = None,
1600
+ schema_name: str = None,
1601
+ description: str = None,
1602
+ type: str = None,
1603
+ owner: str = None,
1604
+ external_schema_configuration: ExternalSchemaConfiguration = None,
1605
+ ):
1606
+ # Schema的资源全名:projects/{projectId}/schemas/{schemaName}。仅输出。
1607
+ self.name = name
1608
+ # Project下唯一名称
1609
+ self.schema_name = schema_name
1610
+ # 可选描述,不超过xxKB
1611
+ self.description = description
1612
+ # Schema类型:DEFAULT/EXTERNAL
1613
+ self.type = type
1614
+ # Schema拥有者
1615
+ self.owner = owner
1616
+ # 外部schema配置
1617
+ self.external_schema_configuration = external_schema_configuration
1618
+
1619
+ def validate(self):
1620
+ if self.schema_name is not None:
1621
+ self.validate_max_length(self.schema_name, 'schema_name', 128)
1622
+ if self.external_schema_configuration:
1623
+ self.external_schema_configuration.validate()
1624
+
1625
+ def to_map(self):
1626
+ _map = super().to_map()
1627
+ if _map is not None:
1628
+ return _map
1629
+
1630
+ result = dict()
1631
+ if self.name is not None:
1632
+ result['name'] = self.name
1633
+ if self.schema_name is not None:
1634
+ result['schemaName'] = self.schema_name
1635
+ if self.description is not None:
1636
+ result['description'] = self.description
1637
+ if self.type is not None:
1638
+ result['type'] = self.type
1639
+ if self.owner is not None:
1640
+ result['owner'] = self.owner
1641
+ if self.external_schema_configuration is not None:
1642
+ result['externalSchemaConfiguration'] = self.external_schema_configuration.to_map()
1643
+ return result
1644
+
1645
+ def from_map(self, m: dict = None):
1646
+ m = m or dict()
1647
+ if m.get('name') is not None:
1648
+ self.name = m.get('name')
1649
+ if m.get('schemaName') is not None:
1650
+ self.schema_name = m.get('schemaName')
1651
+ if m.get('description') is not None:
1652
+ self.description = m.get('description')
1653
+ if m.get('type') is not None:
1654
+ self.type = m.get('type')
1655
+ if m.get('owner') is not None:
1656
+ self.owner = m.get('owner')
1657
+ if m.get('externalSchemaConfiguration') is not None:
1658
+ temp_model = ExternalSchemaConfiguration()
1659
+ self.external_schema_configuration = temp_model.from_map(m['externalSchemaConfiguration'])
1660
+ return self
1661
+
1662
+
1663
+ class ListProjectsResponse(TeaModel):
1664
+ def __init__(
1665
+ self,
1666
+ projects: List[Project] = None,
1667
+ next_page_token: str = None,
1668
+ ):
1669
+ self.projects = projects
1670
+ self.next_page_token = next_page_token
1671
+
1672
+ def validate(self):
1673
+ if self.projects:
1674
+ for k in self.projects:
1675
+ if k:
1676
+ k.validate()
1677
+
1678
+ def to_map(self):
1679
+ _map = super().to_map()
1680
+ if _map is not None:
1681
+ return _map
1682
+
1683
+ result = dict()
1684
+ result['projects'] = []
1685
+ if self.projects is not None:
1686
+ for k in self.projects:
1687
+ result['projects'].append(k.to_map() if k else None)
1688
+ if self.next_page_token is not None:
1689
+ result['nextPageToken'] = self.next_page_token
1690
+ return result
1691
+
1692
+ def from_map(self, m: dict = None):
1693
+ m = m or dict()
1694
+ self.projects = []
1695
+ if m.get('projects') is not None:
1696
+ for k in m.get('projects'):
1697
+ temp_model = Project()
1698
+ self.projects.append(temp_model.from_map(k))
1699
+ if m.get('nextPageToken') is not None:
1700
+ self.next_page_token = m.get('nextPageToken')
1701
+ return self
1702
+
1703
+
1704
+ class ListSchemasResponse(TeaModel):
1705
+ def __init__(
1706
+ self,
1707
+ schemas: List[Schema] = None,
1708
+ next_page_token: str = None,
1709
+ ):
1710
+ self.schemas = schemas
1711
+ self.next_page_token = next_page_token
1712
+ # Paths
1713
+
1714
+ def validate(self):
1715
+ if self.schemas:
1716
+ for k in self.schemas:
1717
+ if k:
1718
+ k.validate()
1719
+
1720
+ def to_map(self):
1721
+ _map = super().to_map()
1722
+ if _map is not None:
1723
+ return _map
1724
+
1725
+ result = dict()
1726
+ result['schemas'] = []
1727
+ if self.schemas is not None:
1728
+ for k in self.schemas:
1729
+ result['schemas'].append(k.to_map() if k else None)
1730
+ if self.next_page_token is not None:
1731
+ result['nextPageToken'] = self.next_page_token
1732
+ return result
1733
+
1734
+ def from_map(self, m: dict = None):
1735
+ m = m or dict()
1736
+ self.schemas = []
1737
+ if m.get('schemas') is not None:
1738
+ for k in m.get('schemas'):
1739
+ temp_model = Schema()
1740
+ self.schemas.append(temp_model.from_map(k))
1741
+ if m.get('nextPageToken') is not None:
1742
+ self.next_page_token = m.get('nextPageToken')
1743
+ return self
1744
+
1745
+
1746
+ class Partition(TeaModel):
1747
+ """
1748
+ ==================================== Partition ====================================\
1749
+ """
1750
+ def __init__(
1751
+ self,
1752
+ spec: str = None,
1753
+ ):
1754
+ # 分区spec,格式样例为 bu=tt/ds=20250515
1755
+ self.spec = spec
1756
+
1757
+ def validate(self):
1758
+ pass
1759
+
1760
+ def to_map(self):
1761
+ _map = super().to_map()
1762
+ if _map is not None:
1763
+ return _map
1764
+
1765
+ result = dict()
1766
+ if self.spec is not None:
1767
+ result['spec'] = self.spec
1768
+ return result
1769
+
1770
+ def from_map(self, m: dict = None):
1771
+ m = m or dict()
1772
+ if m.get('spec') is not None:
1773
+ self.spec = m.get('spec')
1774
+ return self
1775
+
1776
+
1777
+ class ListPartitionsResponse(TeaModel):
1778
+ def __init__(
1779
+ self,
1780
+ partitions: List[Partition] = None,
1781
+ next_page_token: str = None,
1782
+ ):
1783
+ self.partitions = partitions
1784
+ self.next_page_token = next_page_token
1785
+ # Path Functions
1786
+
1787
+ def validate(self):
1788
+ if self.partitions:
1789
+ for k in self.partitions:
1790
+ if k:
1791
+ k.validate()
1792
+
1793
+ def to_map(self):
1794
+ _map = super().to_map()
1795
+ if _map is not None:
1796
+ return _map
1797
+
1798
+ result = dict()
1799
+ result['partitions'] = []
1800
+ if self.partitions is not None:
1801
+ for k in self.partitions:
1802
+ result['partitions'].append(k.to_map() if k else None)
1803
+ if self.next_page_token is not None:
1804
+ result['nextPageToken'] = self.next_page_token
1805
+ return result
1806
+
1807
+ def from_map(self, m: dict = None):
1808
+ m = m or dict()
1809
+ self.partitions = []
1810
+ if m.get('partitions') is not None:
1811
+ for k in m.get('partitions'):
1812
+ temp_model = Partition()
1813
+ self.partitions.append(temp_model.from_map(k))
1814
+ if m.get('nextPageToken') is not None:
1815
+ self.next_page_token = m.get('nextPageToken')
1816
+ return self
1817
+
1818
+
1819
+ class DataScanSource(TeaModel):
1820
+ """
1821
+ ==================================== DataScans ====================================\
1822
+ """
1823
+ def __init__(
1824
+ self,
1825
+ location: str = None,
1826
+ connection: str = None,
1827
+ ignores: List[str] = None,
1828
+ ):
1829
+ # location地址。支持oss、dlf 和 holo
1830
+ self.location = location
1831
+ # connection name。提供访问source需要的身份与网络信息。需要鉴权
1832
+ self.connection = connection
1833
+ # 忽略访问的路径。支持正则表达式
1834
+ self.ignores = ignores
1835
+
1836
+ def validate(self):
1837
+ pass
1838
+
1839
+ def to_map(self):
1840
+ _map = super().to_map()
1841
+ if _map is not None:
1842
+ return _map
1843
+
1844
+ result = dict()
1845
+ if self.location is not None:
1846
+ result['location'] = self.location
1847
+ if self.connection is not None:
1848
+ result['connection'] = self.connection
1849
+ if self.ignores is not None:
1850
+ result['ignores'] = self.ignores
1851
+ return result
1852
+
1853
+ def from_map(self, m: dict = None):
1854
+ m = m or dict()
1855
+ if m.get('location') is not None:
1856
+ self.location = m.get('location')
1857
+ if m.get('connection') is not None:
1858
+ self.connection = m.get('connection')
1859
+ if m.get('ignores') is not None:
1860
+ self.ignores = m.get('ignores')
1861
+ return self
1862
+
1863
+
1864
+ class DataScanTarget(TeaModel):
1865
+ def __init__(
1866
+ self,
1867
+ project: str = None,
1868
+ schema: str = None,
1869
+ name_prefix: str = None,
1870
+ properties: str = None,
1871
+ ):
1872
+ # 结果写入的project name。
1873
+ self.project = project
1874
+ # 当dataScan.type为table时,table写入的schema
1875
+ self.schema = schema
1876
+ # 爬取任务自动生成的table/schema名称的前缀,防止命名冲突。
1877
+ self.name_prefix = name_prefix
1878
+ # 用户可指定的最终表 / schema 的属性
1879
+ self.properties = properties
1880
+
1881
+ def validate(self):
1882
+ pass
1883
+
1884
+ def to_map(self):
1885
+ _map = super().to_map()
1886
+ if _map is not None:
1887
+ return _map
1888
+
1889
+ result = dict()
1890
+ if self.project is not None:
1891
+ result['project'] = self.project
1892
+ if self.schema is not None:
1893
+ result['schema'] = self.schema
1894
+ if self.name_prefix is not None:
1895
+ result['namePrefix'] = self.name_prefix
1896
+ if self.properties is not None:
1897
+ result['properties'] = self.properties
1898
+ return result
1899
+
1900
+ def from_map(self, m: dict = None):
1901
+ m = m or dict()
1902
+ if m.get('project') is not None:
1903
+ self.project = m.get('project')
1904
+ if m.get('schema') is not None:
1905
+ self.schema = m.get('schema')
1906
+ if m.get('namePrefix') is not None:
1907
+ self.name_prefix = m.get('namePrefix')
1908
+ if m.get('properties') is not None:
1909
+ self.properties = m.get('properties')
1910
+ return self
1911
+
1912
+
1913
+ class DataScanProperties(TeaModel):
1914
+ def __init__(
1915
+ self,
1916
+ format_filter: str = None,
1917
+ scan_mode: str = None,
1918
+ enable_stats: bool = None,
1919
+ options: str = None,
1920
+ pattern: str = None,
1921
+ update_policy: str = None,
1922
+ sync_remove: bool = None,
1923
+ auto_commit: bool = None,
1924
+ inventory_location: str = None,
1925
+ ):
1926
+ # AUTO/PARQUET/ORC/JSON/CSV。只爬取对应属性的数据。若指定,则忽略其他类型的文件。auto为不指定属性自动探测。
1927
+ self.format_filter = format_filter
1928
+ # enum SAMPLE/TOTAL。 默认为SAMPLE。扫描时抽样扫描或者完整扫描
1929
+ self.scan_mode = scan_mode
1930
+ # 是否统计信息用于查询优化
1931
+ self.enable_stats = enable_stats
1932
+ # 其余的配置可选项,如csv格式下的一些额外选项
1933
+ self.options = options
1934
+ # 分区路径识别的pattern, 例如{table}/{part1}={value1}/{part2}={value2}
1935
+ self.pattern = pattern
1936
+ # 发现表元数据发生变化时的处理策略。APPEND_ONLY/OVERWRITE/IGNORE
1937
+ self.update_policy = update_policy
1938
+ # 发现表删除时是否自动删除
1939
+ self.sync_remove = sync_remove
1940
+ # false代表爬取任务只输出结果,不提交ddl
1941
+ self.auto_commit = auto_commit
1942
+ # 指定 OSS Inventory 日志的存储位置,用于增量扫描功能
1943
+ self.inventory_location = inventory_location
1944
+
1945
+ def validate(self):
1946
+ pass
1947
+
1948
+ def to_map(self):
1949
+ _map = super().to_map()
1950
+ if _map is not None:
1951
+ return _map
1952
+
1953
+ result = dict()
1954
+ if self.format_filter is not None:
1955
+ result['formatFilter'] = self.format_filter
1956
+ if self.scan_mode is not None:
1957
+ result['scanMode'] = self.scan_mode
1958
+ if self.enable_stats is not None:
1959
+ result['enableStats'] = self.enable_stats
1960
+ if self.options is not None:
1961
+ result['options'] = self.options
1962
+ if self.pattern is not None:
1963
+ result['options'] = self.pattern
1964
+ if self.update_policy is not None:
1965
+ result['updatePolicy'] = self.update_policy
1966
+ if self.sync_remove is not None:
1967
+ result['syncRemove'] = self.sync_remove
1968
+ if self.auto_commit is not None:
1969
+ result['autoCommit'] = self.auto_commit
1970
+ if self.inventory_location is not None:
1971
+ result['inventoryLocation'] = self.inventory_location
1972
+ return result
1973
+
1974
+ def from_map(self, m: dict = None):
1975
+ m = m or dict()
1976
+ if m.get('formatFilter') is not None:
1977
+ self.format_filter = m.get('formatFilter')
1978
+ if m.get('scanMode') is not None:
1979
+ self.scan_mode = m.get('scanMode')
1980
+ if m.get('enableStats') is not None:
1981
+ self.enable_stats = m.get('enableStats')
1982
+ if m.get('options') is not None:
1983
+ self.options = m.get('options')
1984
+ if m.get('options') is not None:
1985
+ self.pattern = m.get('options')
1986
+ if m.get('updatePolicy') is not None:
1987
+ self.update_policy = m.get('updatePolicy')
1988
+ if m.get('syncRemove') is not None:
1989
+ self.sync_remove = m.get('syncRemove')
1990
+ if m.get('autoCommit') is not None:
1991
+ self.auto_commit = m.get('autoCommit')
1992
+ if m.get('inventoryLocation') is not None:
1993
+ self.inventory_location = m.get('inventoryLocation')
1994
+ return self
1995
+
1996
+
1997
+ class DataScan(TeaModel):
1998
+ def __init__(
1999
+ self,
2000
+ name: str = None,
2001
+ scan_name: str = None,
2002
+ type: str = None,
2003
+ creator: str = None,
2004
+ customer_id: str = None,
2005
+ namespace_id: str = None,
2006
+ description: str = None,
2007
+ scan_id: str = None,
2008
+ creation_time: int = None,
2009
+ last_modified_time: int = None,
2010
+ last_triggered_time: int = None,
2011
+ last_successful_schedule_time: int = None,
2012
+ last_triggered_by: str = None,
2013
+ scheduling_status: str = None,
2014
+ source: DataScanSource = None,
2015
+ target: DataScanTarget = None,
2016
+ properties: DataScanProperties = None,
2017
+ scheduler_mode: str = None,
2018
+ scheduler_interval: str = None,
2019
+ scheduled_count: int = None,
2020
+ ):
2021
+ # 资源全局唯一名。e.g., namespaces/{namespaceID}/dataScans/{dataScanName}
2022
+ self.name = name
2023
+ # 用户指定的爬取任务名称
2024
+ self.scan_name = scan_name
2025
+ # 取值范围为:TABLE_DISCOVERY, SCHEMA_DISCOVERY
2026
+ self.type = type
2027
+ # dataScan 的创建者
2028
+ self.creator = creator
2029
+ # 客户 ID
2030
+ self.customer_id = customer_id
2031
+ # dataScan 所属的 namespace
2032
+ self.namespace_id = namespace_id
2033
+ # 用户自定义的描述
2034
+ self.description = description
2035
+ # 系统自动生成的 scan ID,只读字段。展示项
2036
+ self.scan_id = scan_id
2037
+ # 创建的时间,UTC timestamp
2038
+ self.creation_time = creation_time
2039
+ # 上次修改的时间,UTC timestamp
2040
+ self.last_modified_time = last_modified_time
2041
+ # 爬取任务上次触发的时间(开始调度时间),UTC timestamp。未触发过默认值为 0
2042
+ self.last_triggered_time = last_triggered_time
2043
+ # 最近一次成功的 DatascanJob 的执行时间。 默认值为 0
2044
+ self.last_successful_schedule_time = last_successful_schedule_time
2045
+ # 触发当前调度的来源;具体用户或调度器
2046
+ self.last_triggered_by = last_triggered_by
2047
+ # dataScan 对象的调度状态。包含 IDLE/IMMEDIATE/PENDING/SCHEDULING 四种状态。dataScan 初始化状态为 IDLE,如果创建后立刻执行,设置为 IMMEDIATE
2048
+ self.scheduling_status = scheduling_status
2049
+ # 元数据爬取和发现来源,包括 location、connection 等信息
2050
+ self.source = source
2051
+ # 控制 dataScan 发现结果写入的参数,包含 project、namePrefix、以及透传的 Tbl Properties 等
2052
+ self.target = target
2053
+ # 爬取任务的可选参数,包含更新策略、分类器等
2054
+ self.properties = properties
2055
+ # manual/periodic,手动触发或者周期性自动触发
2056
+ self.scheduler_mode = scheduler_mode
2057
+ # 当 schedulerMode 为 periodic 时,两次爬取任务之间间隔的最大间隔,取值为 [1h-7d]
2058
+ self.scheduler_interval = scheduler_interval
2059
+ # 这个dataScan一共被调度了多少次
2060
+ self.scheduled_count = scheduled_count
2061
+
2062
+ def validate(self):
2063
+ if self.source:
2064
+ self.source.validate()
2065
+ if self.target:
2066
+ self.target.validate()
2067
+ if self.properties:
2068
+ self.properties.validate()
2069
+
2070
+ def to_map(self):
2071
+ _map = super().to_map()
2072
+ if _map is not None:
2073
+ return _map
2074
+
2075
+ result = dict()
2076
+ if self.name is not None:
2077
+ result['name'] = self.name
2078
+ if self.scan_name is not None:
2079
+ result['scanName'] = self.scan_name
2080
+ if self.type is not None:
2081
+ result['type'] = self.type
2082
+ if self.creator is not None:
2083
+ result['creator'] = self.creator
2084
+ if self.customer_id is not None:
2085
+ result['customerId'] = self.customer_id
2086
+ if self.namespace_id is not None:
2087
+ result['namespaceId'] = self.namespace_id
2088
+ if self.description is not None:
2089
+ result['description'] = self.description
2090
+ if self.scan_id is not None:
2091
+ result['scanId'] = self.scan_id
2092
+ if self.creation_time is not None:
2093
+ result['creationTime'] = self.creation_time
2094
+ if self.last_modified_time is not None:
2095
+ result['lastModifiedTime'] = self.last_modified_time
2096
+ if self.last_triggered_time is not None:
2097
+ result['lastTriggeredTime'] = self.last_triggered_time
2098
+ if self.last_successful_schedule_time is not None:
2099
+ result['lastSuccessfulScheduleTime'] = self.last_successful_schedule_time
2100
+ if self.last_triggered_by is not None:
2101
+ result['lastTriggeredBy'] = self.last_triggered_by
2102
+ if self.scheduling_status is not None:
2103
+ result['schedulingStatus'] = self.scheduling_status
2104
+ if self.source is not None:
2105
+ result['source'] = self.source.to_map()
2106
+ if self.target is not None:
2107
+ result['target'] = self.target.to_map()
2108
+ if self.properties is not None:
2109
+ result['properties'] = self.properties.to_map()
2110
+ if self.scheduler_mode is not None:
2111
+ result['schedulerMode'] = self.scheduler_mode
2112
+ if self.scheduler_interval is not None:
2113
+ result['schedulerInterval'] = self.scheduler_interval
2114
+ if self.scheduled_count is not None:
2115
+ result['scheduledCount'] = self.scheduled_count
2116
+ return result
2117
+
2118
+ def from_map(self, m: dict = None):
2119
+ m = m or dict()
2120
+ if m.get('name') is not None:
2121
+ self.name = m.get('name')
2122
+ if m.get('scanName') is not None:
2123
+ self.scan_name = m.get('scanName')
2124
+ if m.get('type') is not None:
2125
+ self.type = m.get('type')
2126
+ if m.get('creator') is not None:
2127
+ self.creator = m.get('creator')
2128
+ if m.get('customerId') is not None:
2129
+ self.customer_id = m.get('customerId')
2130
+ if m.get('namespaceId') is not None:
2131
+ self.namespace_id = m.get('namespaceId')
2132
+ if m.get('description') is not None:
2133
+ self.description = m.get('description')
2134
+ if m.get('scanId') is not None:
2135
+ self.scan_id = m.get('scanId')
2136
+ if m.get('creationTime') is not None:
2137
+ self.creation_time = m.get('creationTime')
2138
+ if m.get('lastModifiedTime') is not None:
2139
+ self.last_modified_time = m.get('lastModifiedTime')
2140
+ if m.get('lastTriggeredTime') is not None:
2141
+ self.last_triggered_time = m.get('lastTriggeredTime')
2142
+ if m.get('lastSuccessfulScheduleTime') is not None:
2143
+ self.last_successful_schedule_time = m.get('lastSuccessfulScheduleTime')
2144
+ if m.get('lastTriggeredBy') is not None:
2145
+ self.last_triggered_by = m.get('lastTriggeredBy')
2146
+ if m.get('schedulingStatus') is not None:
2147
+ self.scheduling_status = m.get('schedulingStatus')
2148
+ if m.get('source') is not None:
2149
+ temp_model = DataScanSource()
2150
+ self.source = temp_model.from_map(m['source'])
2151
+ if m.get('target') is not None:
2152
+ temp_model = DataScanTarget()
2153
+ self.target = temp_model.from_map(m['target'])
2154
+ if m.get('properties') is not None:
2155
+ temp_model = DataScanProperties()
2156
+ self.properties = temp_model.from_map(m['properties'])
2157
+ if m.get('schedulerMode') is not None:
2158
+ self.scheduler_mode = m.get('schedulerMode')
2159
+ if m.get('schedulerInterval') is not None:
2160
+ self.scheduler_interval = m.get('schedulerInterval')
2161
+ if m.get('scheduledCount') is not None:
2162
+ self.scheduled_count = m.get('scheduledCount')
2163
+ return self
2164
+
2165
+
2166
+ class ScanJob(TeaModel):
2167
+ def __init__(
2168
+ self,
2169
+ job_id: str = None,
2170
+ namespace_id: str = None,
2171
+ data_scan_id: str = None,
2172
+ data_scan_name: str = None,
2173
+ triggered_by: str = None,
2174
+ start_time: int = None,
2175
+ end_time: int = None,
2176
+ status: str = None,
2177
+ status_detail: str = None,
2178
+ ddl: str = None,
2179
+ stats: str = None,
2180
+ ):
2181
+ # Job ID
2182
+ self.job_id = job_id
2183
+ # 作业所属的 namespace
2184
+ self.namespace_id = namespace_id
2185
+ # 系统自动生成的 dataScan ID
2186
+ self.data_scan_id = data_scan_id
2187
+ # 所属爬取任务名称。此处为全称 namespace/$nsId/dataScan/$scanName
2188
+ self.data_scan_name = data_scan_name
2189
+ # 触发此次爬取作业的人,定时触发则为 scheduler
2190
+ self.triggered_by = triggered_by
2191
+ # 爬取作业开始时间,UTC timestamp
2192
+ self.start_time = start_time
2193
+ # 爬取作业结束时间,UTC timestamp
2194
+ self.end_time = end_time
2195
+ # 爬取作业状态,取值范围:Created/Running/Terminated/Failed
2196
+ self.status = status
2197
+ # 爬取作业状态详细信息,如报错信息
2198
+ self.status_detail = status_detail
2199
+ # 爬取作业返回的需要提交的 DDL 信息
2200
+ self.ddl = ddl
2201
+ # 爬取作业返回的 stats 信息,JSON 格式
2202
+ self.stats = stats
2203
+
2204
+ def validate(self):
2205
+ pass
2206
+
2207
+ def to_map(self):
2208
+ _map = super().to_map()
2209
+ if _map is not None:
2210
+ return _map
2211
+
2212
+ result = dict()
2213
+ if self.job_id is not None:
2214
+ result['jobId'] = self.job_id
2215
+ if self.namespace_id is not None:
2216
+ result['namespaceId'] = self.namespace_id
2217
+ if self.data_scan_id is not None:
2218
+ result['dataScanId'] = self.data_scan_id
2219
+ if self.data_scan_name is not None:
2220
+ result['dataScanName'] = self.data_scan_name
2221
+ if self.triggered_by is not None:
2222
+ result['triggeredBy'] = self.triggered_by
2223
+ if self.start_time is not None:
2224
+ result['startTime'] = self.start_time
2225
+ if self.end_time is not None:
2226
+ result['endTime'] = self.end_time
2227
+ if self.status is not None:
2228
+ result['status'] = self.status
2229
+ if self.status_detail is not None:
2230
+ result['statusDetail'] = self.status_detail
2231
+ if self.ddl is not None:
2232
+ result['ddl'] = self.ddl
2233
+ if self.stats is not None:
2234
+ result['stats'] = self.stats
2235
+ return result
2236
+
2237
+ def from_map(self, m: dict = None):
2238
+ m = m or dict()
2239
+ if m.get('jobId') is not None:
2240
+ self.job_id = m.get('jobId')
2241
+ if m.get('namespaceId') is not None:
2242
+ self.namespace_id = m.get('namespaceId')
2243
+ if m.get('dataScanId') is not None:
2244
+ self.data_scan_id = m.get('dataScanId')
2245
+ if m.get('dataScanName') is not None:
2246
+ self.data_scan_name = m.get('dataScanName')
2247
+ if m.get('triggeredBy') is not None:
2248
+ self.triggered_by = m.get('triggeredBy')
2249
+ if m.get('startTime') is not None:
2250
+ self.start_time = m.get('startTime')
2251
+ if m.get('endTime') is not None:
2252
+ self.end_time = m.get('endTime')
2253
+ if m.get('status') is not None:
2254
+ self.status = m.get('status')
2255
+ if m.get('statusDetail') is not None:
2256
+ self.status_detail = m.get('statusDetail')
2257
+ if m.get('ddl') is not None:
2258
+ self.ddl = m.get('ddl')
2259
+ if m.get('stats') is not None:
2260
+ self.stats = m.get('stats')
2261
+ return self
2262
+
2263
+
2264
+ class ListDataScansResponse(TeaModel):
2265
+ def __init__(
2266
+ self,
2267
+ next_page_token: str = None,
2268
+ data_scans: List[DataScan] = None,
2269
+ ):
2270
+ # 分页 token
2271
+ self.next_page_token = next_page_token
2272
+ # 返回所有的 dataScans 列表。
2273
+ self.data_scans = data_scans
2274
+
2275
+ def validate(self):
2276
+ if self.data_scans:
2277
+ for k in self.data_scans:
2278
+ if k:
2279
+ k.validate()
2280
+
2281
+ def to_map(self):
2282
+ _map = super().to_map()
2283
+ if _map is not None:
2284
+ return _map
2285
+
2286
+ result = dict()
2287
+ if self.next_page_token is not None:
2288
+ result['nextPageToken'] = self.next_page_token
2289
+ result['dataScans'] = []
2290
+ if self.data_scans is not None:
2291
+ for k in self.data_scans:
2292
+ result['dataScans'].append(k.to_map() if k else None)
2293
+ return result
2294
+
2295
+ def from_map(self, m: dict = None):
2296
+ m = m or dict()
2297
+ if m.get('nextPageToken') is not None:
2298
+ self.next_page_token = m.get('nextPageToken')
2299
+ self.data_scans = []
2300
+ if m.get('dataScans') is not None:
2301
+ for k in m.get('dataScans'):
2302
+ temp_model = DataScan()
2303
+ self.data_scans.append(temp_model.from_map(k))
2304
+ return self
2305
+
2306
+
2307
+ class ListDataScanJobsResponse(TeaModel):
2308
+ def __init__(
2309
+ self,
2310
+ scan_jobs: List[ScanJob] = None,
2311
+ next_page_token: str = None,
2312
+ ):
2313
+ # 返回所有的 dataScan jobs 列表
2314
+ self.scan_jobs = scan_jobs
2315
+ # 分页 token
2316
+ self.next_page_token = next_page_token
2317
+
2318
+ def validate(self):
2319
+ if self.scan_jobs:
2320
+ for k in self.scan_jobs:
2321
+ if k:
2322
+ k.validate()
2323
+
2324
+ def to_map(self):
2325
+ _map = super().to_map()
2326
+ if _map is not None:
2327
+ return _map
2328
+
2329
+ result = dict()
2330
+ result['scanJobs'] = []
2331
+ if self.scan_jobs is not None:
2332
+ for k in self.scan_jobs:
2333
+ result['scanJobs'].append(k.to_map() if k else None)
2334
+ if self.next_page_token is not None:
2335
+ result['nextPageToken'] = self.next_page_token
2336
+ return result
2337
+
2338
+ def from_map(self, m: dict = None):
2339
+ m = m or dict()
2340
+ self.scan_jobs = []
2341
+ if m.get('scanJobs') is not None:
2342
+ for k in m.get('scanJobs'):
2343
+ temp_model = ScanJob()
2344
+ self.scan_jobs.append(temp_model.from_map(k))
2345
+ if m.get('nextPageToken') is not None:
2346
+ self.next_page_token = m.get('nextPageToken')
2347
+ return self
2348
+
2349
+
2350
+ class ModelFieldSchema(TeaModel):
2351
+ def __init__(
2352
+ self,
2353
+ field_name: str = None,
2354
+ sql_type_definition: str = None,
2355
+ type_category: str = None,
2356
+ mode: str = None,
2357
+ fields: List['ModelFieldSchema'] = None,
2358
+ description: str = None,
2359
+ max_length: str = None,
2360
+ precision: str = None,
2361
+ scale: str = None,
2362
+ default_value_expression: str = None,
2363
+ ):
2364
+ # 列名或 struct 字段名
2365
+ self.field_name = field_name
2366
+ # SQL DDL 中的列类型定义
2367
+ self.sql_type_definition = sql_type_definition
2368
+ # 字段类型
2369
+ self.type_category = type_category
2370
+ # 字段模式:REQUIRED 或 NULLABLE
2371
+ self.mode = mode
2372
+ # STRUCT 类型的子字段
2373
+ self.fields = fields
2374
+ # 列的 comment
2375
+ self.description = description
2376
+ # CHAR/VARCHAR 类型的最大长度
2377
+ self.max_length = max_length
2378
+ # DECIMAL 类型的精度
2379
+ self.precision = precision
2380
+ # DECIMAL 类型的 scale
2381
+ self.scale = scale
2382
+ # 默认值的表达式字符串
2383
+ self.default_value_expression = default_value_expression
2384
+
2385
+ def validate(self):
2386
+ if self.fields:
2387
+ for k in self.fields:
2388
+ if k:
2389
+ k.validate()
2390
+
2391
+ def to_map(self):
2392
+ _map = super().to_map()
2393
+ if _map is not None:
2394
+ return _map
2395
+
2396
+ result = dict()
2397
+ if self.field_name is not None:
2398
+ result['fieldName'] = self.field_name
2399
+ if self.sql_type_definition is not None:
2400
+ result['sqlTypeDefinition'] = self.sql_type_definition
2401
+ if self.type_category is not None:
2402
+ result['typeCategory'] = self.type_category
2403
+ if self.mode is not None:
2404
+ result['mode'] = self.mode
2405
+ result['fields'] = []
2406
+ if self.fields is not None:
2407
+ for k in self.fields:
2408
+ result['fields'].append(k.to_map() if k else None)
2409
+ if self.description is not None:
2410
+ result['description'] = self.description
2411
+ if self.max_length is not None:
2412
+ result['maxLength'] = self.max_length
2413
+ if self.precision is not None:
2414
+ result['precision'] = self.precision
2415
+ if self.scale is not None:
2416
+ result['scale'] = self.scale
2417
+ if self.default_value_expression is not None:
2418
+ result['defaultValueExpression'] = self.default_value_expression
2419
+ return result
2420
+
2421
+ def from_map(self, m: dict = None):
2422
+ m = m or dict()
2423
+ if m.get('fieldName') is not None:
2424
+ self.field_name = m.get('fieldName')
2425
+ if m.get('sqlTypeDefinition') is not None:
2426
+ self.sql_type_definition = m.get('sqlTypeDefinition')
2427
+ if m.get('typeCategory') is not None:
2428
+ self.type_category = m.get('typeCategory')
2429
+ if m.get('mode') is not None:
2430
+ self.mode = m.get('mode')
2431
+ self.fields = []
2432
+ if m.get('fields') is not None:
2433
+ for k in m.get('fields'):
2434
+ temp_model = ModelFieldSchema()
2435
+ self.fields.append(temp_model.from_map(k))
2436
+ if m.get('description') is not None:
2437
+ self.description = m.get('description')
2438
+ if m.get('maxLength') is not None:
2439
+ self.max_length = m.get('maxLength')
2440
+ if m.get('precision') is not None:
2441
+ self.precision = m.get('precision')
2442
+ if m.get('scale') is not None:
2443
+ self.scale = m.get('scale')
2444
+ if m.get('defaultValueExpression') is not None:
2445
+ self.default_value_expression = m.get('defaultValueExpression')
2446
+ return self
2447
+
2448
+
2449
+ class Model(TeaModel):
2450
+ """
2451
+ ==================================== Models ====================================\
2452
+ """
2453
+ def __init__(
2454
+ self,
2455
+ name: str = None,
2456
+ model_name: str = None,
2457
+ version_name: str = None,
2458
+ default_version: str = None,
2459
+ create_time: str = None,
2460
+ update_time: str = None,
2461
+ version_create_time: str = None,
2462
+ version_update_time: str = None,
2463
+ description: str = None,
2464
+ version_description: str = None,
2465
+ expiration_days: int = None,
2466
+ version_expiration_days: int = None,
2467
+ source_type: str = None,
2468
+ model_type: str = None,
2469
+ labels: Dict[str, str] = None,
2470
+ transform: Dict[str, str] = None,
2471
+ path: str = None,
2472
+ options: Dict[str, str] = None,
2473
+ extra_info: Dict[str, str] = None,
2474
+ version_extra_info: Dict[str, str] = None,
2475
+ training_info: Dict[str, str] = None,
2476
+ inference_parameters: Dict[str, str] = None,
2477
+ feature_columns: ModelFieldSchema = None,
2478
+ tasks: List[str] = None,
2479
+ ):
2480
+ # 模型的完整路径。e.g., projects/{projectId}/schemas/{schemaName}/models/{modelName}
2481
+ self.name = name
2482
+ # 模型名。上级 Schema 内唯一。大小写不敏感。包含字符:[a-z][A-Z][0-9]_,字节个数范围 [3, 255]
2483
+ self.model_name = model_name
2484
+ # 版本名。同一 model 范围内唯一。大小写不敏感。包含字符:[a-z][A-Z][0-9]_,字节个数范围 [3, 255]
2485
+ self.version_name = version_name
2486
+ # 模型的默认版本名
2487
+ self.default_version = default_version
2488
+ # 模型的创建时间(毫秒)
2489
+ self.create_time = create_time
2490
+ # 模型的修改时间(毫秒)
2491
+ self.update_time = update_time
2492
+ # 版本的创建时间(毫秒)
2493
+ self.version_create_time = version_create_time
2494
+ # 版本的修改时间(毫秒)
2495
+ self.version_update_time = version_update_time
2496
+ # 模型的描述,最长 1KB
2497
+ self.description = description
2498
+ # 版本的描述,最长 1KB
2499
+ self.version_description = version_description
2500
+ # 模型基于最近更新时间的生命周期(天)
2501
+ self.expiration_days = expiration_days
2502
+ # 版本基于最近更新时间的生命周期(天)
2503
+ self.version_expiration_days = version_expiration_days
2504
+ # 模型的来源类型,创建后不支持修改
2505
+ self.source_type = source_type
2506
+ # 模型的类型,创建后不支持修改
2507
+ self.model_type = model_type
2508
+ # 模型的标签
2509
+ self.labels = labels
2510
+ # 版本的预处理信息
2511
+ self.transform = transform
2512
+ # 版本对应模型文件的路径
2513
+ self.path = path
2514
+ # 版本的参数
2515
+ self.options = options
2516
+ # 模型的额外信息
2517
+ self.extra_info = extra_info
2518
+ # 版本的额外信息
2519
+ self.version_extra_info = version_extra_info
2520
+ # 版本的训练信息
2521
+ self.training_info = training_info
2522
+ # 版本的推理参数
2523
+ self.inference_parameters = inference_parameters
2524
+ # 版本的列 schema 定义
2525
+ self.feature_columns = feature_columns
2526
+ # version 支持的所有 task 类型。要求:对于 LLM/MLLM 类型模型,可取值 text-generation,chat,sentence-embedding 中的一个或多个. 对于 BOOSTED_TREE_CLASSIFIER 类型模型,只能取值为 [predict, predict-proba, feature-importance](顺序任意). 对于 BOOSTED_TREE_REGRESSOR 类型模型,只能取值为 [predict, feature-importance](顺序任意)
2527
+ self.tasks = tasks
2528
+
2529
+ def validate(self):
2530
+ if self.feature_columns:
2531
+ self.feature_columns.validate()
2532
+
2533
+ def to_map(self):
2534
+ _map = super().to_map()
2535
+ if _map is not None:
2536
+ return _map
2537
+
2538
+ result = dict()
2539
+ if self.name is not None:
2540
+ result['name'] = self.name
2541
+ if self.model_name is not None:
2542
+ result['modelName'] = self.model_name
2543
+ if self.version_name is not None:
2544
+ result['versionName'] = self.version_name
2545
+ if self.default_version is not None:
2546
+ result['defaultVersion'] = self.default_version
2547
+ if self.create_time is not None:
2548
+ result['createTime'] = self.create_time
2549
+ if self.update_time is not None:
2550
+ result['updateTime'] = self.update_time
2551
+ if self.version_create_time is not None:
2552
+ result['versionCreateTime'] = self.version_create_time
2553
+ if self.version_update_time is not None:
2554
+ result['versionUpdateTime'] = self.version_update_time
2555
+ if self.description is not None:
2556
+ result['description'] = self.description
2557
+ if self.version_description is not None:
2558
+ result['versionDescription'] = self.version_description
2559
+ if self.expiration_days is not None:
2560
+ result['expirationDays'] = self.expiration_days
2561
+ if self.version_expiration_days is not None:
2562
+ result['versionExpirationDays'] = self.version_expiration_days
2563
+ if self.source_type is not None:
2564
+ result['sourceType'] = self.source_type
2565
+ if self.model_type is not None:
2566
+ result['modelType'] = self.model_type
2567
+ if self.labels is not None:
2568
+ result['labels'] = self.labels
2569
+ if self.transform is not None:
2570
+ result['transform'] = self.transform
2571
+ if self.path is not None:
2572
+ result['path'] = self.path
2573
+ if self.options is not None:
2574
+ result['options'] = self.options
2575
+ if self.extra_info is not None:
2576
+ result['extraInfo'] = self.extra_info
2577
+ if self.version_extra_info is not None:
2578
+ result['versionExtraInfo'] = self.version_extra_info
2579
+ if self.training_info is not None:
2580
+ result['trainingInfo'] = self.training_info
2581
+ if self.inference_parameters is not None:
2582
+ result['inferenceParameters'] = self.inference_parameters
2583
+ if self.feature_columns is not None:
2584
+ result['featureColumns'] = self.feature_columns.to_map()
2585
+ if self.tasks is not None:
2586
+ result['tasks'] = self.tasks
2587
+ return result
2588
+
2589
+ def from_map(self, m: dict = None):
2590
+ m = m or dict()
2591
+ if m.get('name') is not None:
2592
+ self.name = m.get('name')
2593
+ if m.get('modelName') is not None:
2594
+ self.model_name = m.get('modelName')
2595
+ if m.get('versionName') is not None:
2596
+ self.version_name = m.get('versionName')
2597
+ if m.get('defaultVersion') is not None:
2598
+ self.default_version = m.get('defaultVersion')
2599
+ if m.get('createTime') is not None:
2600
+ self.create_time = m.get('createTime')
2601
+ if m.get('updateTime') is not None:
2602
+ self.update_time = m.get('updateTime')
2603
+ if m.get('versionCreateTime') is not None:
2604
+ self.version_create_time = m.get('versionCreateTime')
2605
+ if m.get('versionUpdateTime') is not None:
2606
+ self.version_update_time = m.get('versionUpdateTime')
2607
+ if m.get('description') is not None:
2608
+ self.description = m.get('description')
2609
+ if m.get('versionDescription') is not None:
2610
+ self.version_description = m.get('versionDescription')
2611
+ if m.get('expirationDays') is not None:
2612
+ self.expiration_days = m.get('expirationDays')
2613
+ if m.get('versionExpirationDays') is not None:
2614
+ self.version_expiration_days = m.get('versionExpirationDays')
2615
+ if m.get('sourceType') is not None:
2616
+ self.source_type = m.get('sourceType')
2617
+ if m.get('modelType') is not None:
2618
+ self.model_type = m.get('modelType')
2619
+ if m.get('labels') is not None:
2620
+ self.labels = m.get('labels')
2621
+ if m.get('transform') is not None:
2622
+ self.transform = m.get('transform')
2623
+ if m.get('path') is not None:
2624
+ self.path = m.get('path')
2625
+ if m.get('options') is not None:
2626
+ self.options = m.get('options')
2627
+ if m.get('extraInfo') is not None:
2628
+ self.extra_info = m.get('extraInfo')
2629
+ if m.get('versionExtraInfo') is not None:
2630
+ self.version_extra_info = m.get('versionExtraInfo')
2631
+ if m.get('trainingInfo') is not None:
2632
+ self.training_info = m.get('trainingInfo')
2633
+ if m.get('inferenceParameters') is not None:
2634
+ self.inference_parameters = m.get('inferenceParameters')
2635
+ if m.get('featureColumns') is not None:
2636
+ temp_model = ModelFieldSchema()
2637
+ self.feature_columns = temp_model.from_map(m['featureColumns'])
2638
+ if m.get('tasks') is not None:
2639
+ self.tasks = m.get('tasks')
2640
+ return self
2641
+
2642
+
2643
+ class ListModelsResponse(TeaModel):
2644
+ def __init__(
2645
+ self,
2646
+ models: List[Model] = None,
2647
+ next_page_token: str = None,
2648
+ ):
2649
+ self.models = models
2650
+ self.next_page_token = next_page_token
2651
+
2652
+ def validate(self):
2653
+ if self.models:
2654
+ for k in self.models:
2655
+ if k:
2656
+ k.validate()
2657
+
2658
+ def to_map(self):
2659
+ _map = super().to_map()
2660
+ if _map is not None:
2661
+ return _map
2662
+
2663
+ result = dict()
2664
+ result['models'] = []
2665
+ if self.models is not None:
2666
+ for k in self.models:
2667
+ result['models'].append(k.to_map() if k else None)
2668
+ if self.next_page_token is not None:
2669
+ result['nextPageToken'] = self.next_page_token
2670
+ return result
2671
+
2672
+ def from_map(self, m: dict = None):
2673
+ m = m or dict()
2674
+ self.models = []
2675
+ if m.get('models') is not None:
2676
+ for k in m.get('models'):
2677
+ temp_model = Model()
2678
+ self.models.append(temp_model.from_map(k))
2679
+ if m.get('nextPageToken') is not None:
2680
+ self.next_page_token = m.get('nextPageToken')
2681
+ return self
2682
+
2683
+
2684
+ class ListModelVersionsResponse(TeaModel):
2685
+ def __init__(
2686
+ self,
2687
+ models: List[Model] = None,
2688
+ next_page_token: str = None,
2689
+ ):
2690
+ self.models = models
2691
+ self.next_page_token = next_page_token
2692
+ # 路径生成函数
2693
+
2694
+ def validate(self):
2695
+ if self.models:
2696
+ for k in self.models:
2697
+ if k:
2698
+ k.validate()
2699
+
2700
+ def to_map(self):
2701
+ _map = super().to_map()
2702
+ if _map is not None:
2703
+ return _map
2704
+
2705
+ result = dict()
2706
+ result['models'] = []
2707
+ if self.models is not None:
2708
+ for k in self.models:
2709
+ result['models'].append(k.to_map() if k else None)
2710
+ if self.next_page_token is not None:
2711
+ result['nextPageToken'] = self.next_page_token
2712
+ return result
2713
+
2714
+ def from_map(self, m: dict = None):
2715
+ m = m or dict()
2716
+ self.models = []
2717
+ if m.get('models') is not None:
2718
+ for k in m.get('models'):
2719
+ temp_model = Model()
2720
+ self.models.append(temp_model.from_map(k))
2721
+ if m.get('nextPageToken') is not None:
2722
+ self.next_page_token = m.get('nextPageToken')
2723
+ return self
2724
+
2725
+
2726
+ class SearchResultEntry(TeaModel):
2727
+ """
2728
+ ==================================== Search ====================================\
2729
+ """
2730
+ def __init__(
2731
+ self,
2732
+ name: str = None,
2733
+ display_name: str = None,
2734
+ type: str = None,
2735
+ aspects: Dict[str, str] = None,
2736
+ create_time: str = None,
2737
+ last_modified_time: str = None,
2738
+ description: str = None,
2739
+ ):
2740
+ # 实体的完整路径。e.g., projects/{projectId}/schemas/{schemaName}/tables/{tableName}
2741
+ self.name = name
2742
+ # 实体的名称
2743
+ self.display_name = display_name
2744
+ # 实体的类型,例如 TABLE、RESOURCE、SCHEMA 等
2745
+ self.type = type
2746
+ # 实体的其他信息
2747
+ self.aspects = aspects
2748
+ # 实体的创建时间(毫秒)
2749
+ self.create_time = create_time
2750
+ # 实体的修改时间(毫秒)
2751
+ self.last_modified_time = last_modified_time
2752
+ # 实体的描述
2753
+ self.description = description
2754
+
2755
+ def validate(self):
2756
+ pass
2757
+
2758
+ def to_map(self):
2759
+ _map = super().to_map()
2760
+ if _map is not None:
2761
+ return _map
2762
+
2763
+ result = dict()
2764
+ if self.name is not None:
2765
+ result['name'] = self.name
2766
+ if self.display_name is not None:
2767
+ result['displayName'] = self.display_name
2768
+ if self.type is not None:
2769
+ result['type'] = self.type
2770
+ if self.aspects is not None:
2771
+ result['aspects'] = self.aspects
2772
+ if self.create_time is not None:
2773
+ result['createTime'] = self.create_time
2774
+ if self.last_modified_time is not None:
2775
+ result['lastModifiedTime'] = self.last_modified_time
2776
+ if self.description is not None:
2777
+ result['description'] = self.description
2778
+ return result
2779
+
2780
+ def from_map(self, m: dict = None):
2781
+ m = m or dict()
2782
+ if m.get('name') is not None:
2783
+ self.name = m.get('name')
2784
+ if m.get('displayName') is not None:
2785
+ self.display_name = m.get('displayName')
2786
+ if m.get('type') is not None:
2787
+ self.type = m.get('type')
2788
+ if m.get('aspects') is not None:
2789
+ self.aspects = m.get('aspects')
2790
+ if m.get('createTime') is not None:
2791
+ self.create_time = m.get('createTime')
2792
+ if m.get('lastModifiedTime') is not None:
2793
+ self.last_modified_time = m.get('lastModifiedTime')
2794
+ if m.get('description') is not None:
2795
+ self.description = m.get('description')
2796
+ return self
2797
+
2798
+
2799
+ class SearchResponse(TeaModel):
2800
+ def __init__(
2801
+ self,
2802
+ entries: List[SearchResultEntry] = None,
2803
+ next_page_token: str = None,
2804
+ ):
2805
+ self.entries = entries
2806
+ self.next_page_token = next_page_token
2807
+
2808
+ def validate(self):
2809
+ if self.entries:
2810
+ for k in self.entries:
2811
+ if k:
2812
+ k.validate()
2813
+
2814
+ def to_map(self):
2815
+ _map = super().to_map()
2816
+ if _map is not None:
2817
+ return _map
2818
+
2819
+ result = dict()
2820
+ result['entries'] = []
2821
+ if self.entries is not None:
2822
+ for k in self.entries:
2823
+ result['entries'].append(k.to_map() if k else None)
2824
+ if self.next_page_token is not None:
2825
+ result['nextPageToken'] = self.next_page_token
2826
+ return result
2827
+
2828
+ def from_map(self, m: dict = None):
2829
+ m = m or dict()
2830
+ self.entries = []
2831
+ if m.get('entries') is not None:
2832
+ for k in m.get('entries'):
2833
+ temp_model = SearchResultEntry()
2834
+ self.entries.append(temp_model.from_map(k))
2835
+ if m.get('nextPageToken') is not None:
2836
+ self.next_page_token = m.get('nextPageToken')
622
2837
  return self
623
2838
 
624
2839