4
4
These models define the structures used in SEA API responses.
5
5
"""
6
6
7
- from typing import Dict , List , Any , Optional , Union
8
- from dataclasses import dataclass , field
7
+ from typing import Dict , Any
8
+ from dataclasses import dataclass
9
9
10
10
from databricks .sql .backend .types import CommandState
11
11
from databricks .sql .backend .sea .models .base import (
14
14
ResultData ,
15
15
ServiceError ,
16
16
ExternalLink ,
17
- ColumnInfo ,
18
17
)
19
18
20
19
20
+ def _parse_status (data : Dict [str , Any ]) -> StatementStatus :
21
+ """Parse status from response data."""
22
+ status_data = data .get ("status" , {})
23
+ error = None
24
+ if "error" in status_data :
25
+ error_data = status_data ["error" ]
26
+ error = ServiceError (
27
+ message = error_data .get ("message" , "" ),
28
+ error_code = error_data .get ("error_code" ),
29
+ )
30
+
31
+ state = CommandState .from_sea_state (status_data .get ("state" , "" ))
32
+ if state is None :
33
+ raise ValueError (f"Invalid state: { status_data .get ('state' , '' )} " )
34
+
35
+ return StatementStatus (
36
+ state = state ,
37
+ error = error ,
38
+ sql_state = status_data .get ("sql_state" ),
39
+ )
40
+
41
+
42
+ def _parse_manifest (data : Dict [str , Any ]) -> ResultManifest :
43
+ """Parse manifest from response data."""
44
+
45
+ manifest_data = data .get ("manifest" , {})
46
+ return ResultManifest (
47
+ format = manifest_data .get ("format" , "" ),
48
+ schema = manifest_data .get ("schema" , {}),
49
+ total_row_count = manifest_data .get ("total_row_count" , 0 ),
50
+ total_byte_count = manifest_data .get ("total_byte_count" , 0 ),
51
+ total_chunk_count = manifest_data .get ("total_chunk_count" , 0 ),
52
+ truncated = manifest_data .get ("truncated" , False ),
53
+ chunks = manifest_data .get ("chunks" ),
54
+ result_compression = manifest_data .get ("result_compression" ),
55
+ )
56
+
57
+
58
+ def _parse_result (data : Dict [str , Any ]) -> ResultData :
59
+ """Parse result data from response data."""
60
+ result_data = data .get ("result" , {})
61
+ external_links = None
62
+
63
+ if "external_links" in result_data :
64
+ external_links = []
65
+ for link_data in result_data ["external_links" ]:
66
+ external_links .append (
67
+ ExternalLink (
68
+ external_link = link_data .get ("external_link" , "" ),
69
+ expiration = link_data .get ("expiration" , "" ),
70
+ chunk_index = link_data .get ("chunk_index" , 0 ),
71
+ byte_count = link_data .get ("byte_count" , 0 ),
72
+ row_count = link_data .get ("row_count" , 0 ),
73
+ row_offset = link_data .get ("row_offset" , 0 ),
74
+ next_chunk_index = link_data .get ("next_chunk_index" ),
75
+ next_chunk_internal_link = link_data .get ("next_chunk_internal_link" ),
76
+ http_headers = link_data .get ("http_headers" ),
77
+ )
78
+ )
79
+
80
+ return ResultData (
81
+ data = result_data .get ("data_array" ),
82
+ external_links = external_links ,
83
+ )
84
+
85
+
21
86
@dataclass
22
87
class ExecuteStatementResponse :
23
88
"""Response from executing a SQL statement."""
24
89
25
90
statement_id : str
26
91
status : StatementStatus
27
- manifest : Optional [ ResultManifest ] = None
28
- result : Optional [ ResultData ] = None
92
+ manifest : ResultManifest
93
+ result : ResultData
29
94
30
95
@classmethod
31
96
def from_dict (cls , data : Dict [str , Any ]) -> "ExecuteStatementResponse" :
32
97
"""Create an ExecuteStatementResponse from a dictionary."""
33
- status_data = data .get ("status" , {})
34
- error = None
35
- if "error" in status_data :
36
- error_data = status_data ["error" ]
37
- error = ServiceError (
38
- message = error_data .get ("message" , "" ),
39
- error_code = error_data .get ("error_code" ),
40
- )
41
-
42
- state = CommandState .from_sea_state (status_data .get ("state" , "" ))
43
- if state is None :
44
- raise ValueError (f"Invalid state: { status_data .get ('state' , '' )} " )
45
-
46
- status = StatementStatus (
47
- state = state ,
48
- error = error ,
49
- sql_state = status_data .get ("sql_state" ),
50
- )
51
-
52
- # Parse manifest
53
- manifest = None
54
- if "manifest" in data :
55
- manifest_data = data ["manifest" ]
56
- manifest = ResultManifest (
57
- format = manifest_data .get ("format" , "" ),
58
- schema = manifest_data .get ("schema" , {}),
59
- total_row_count = manifest_data .get ("total_row_count" , 0 ),
60
- total_byte_count = manifest_data .get ("total_byte_count" , 0 ),
61
- total_chunk_count = manifest_data .get ("total_chunk_count" , 0 ),
62
- truncated = manifest_data .get ("truncated" , False ),
63
- chunks = manifest_data .get ("chunks" ),
64
- result_compression = manifest_data .get ("result_compression" ),
65
- )
66
-
67
- # Parse result data
68
- result = None
69
- if "result" in data :
70
- result_data = data ["result" ]
71
- external_links = None
72
-
73
- if "external_links" in result_data :
74
- external_links = []
75
- for link_data in result_data ["external_links" ]:
76
- external_links .append (
77
- ExternalLink (
78
- external_link = link_data .get ("external_link" , "" ),
79
- expiration = link_data .get ("expiration" , "" ),
80
- chunk_index = link_data .get ("chunk_index" , 0 ),
81
- byte_count = link_data .get ("byte_count" , 0 ),
82
- row_count = link_data .get ("row_count" , 0 ),
83
- row_offset = link_data .get ("row_offset" , 0 ),
84
- next_chunk_index = link_data .get ("next_chunk_index" ),
85
- next_chunk_internal_link = link_data .get (
86
- "next_chunk_internal_link"
87
- ),
88
- http_headers = link_data .get ("http_headers" ),
89
- )
90
- )
91
-
92
- result = ResultData (
93
- data = result_data .get ("data_array" ),
94
- external_links = external_links ,
95
- )
96
-
97
98
return cls (
98
99
statement_id = data .get ("statement_id" , "" ),
99
- status = status ,
100
- manifest = manifest ,
101
- result = result ,
100
+ status = _parse_status ( data ) ,
101
+ manifest = _parse_manifest ( data ) ,
102
+ result = _parse_result ( data ) ,
102
103
)
103
104
104
105
@@ -108,81 +109,17 @@ class GetStatementResponse:
108
109
109
110
statement_id : str
110
111
status : StatementStatus
111
- manifest : Optional [ ResultManifest ] = None
112
- result : Optional [ ResultData ] = None
112
+ manifest : ResultManifest
113
+ result : ResultData
113
114
114
115
@classmethod
115
116
def from_dict (cls , data : Dict [str , Any ]) -> "GetStatementResponse" :
116
117
"""Create a GetStatementResponse from a dictionary."""
117
- status_data = data .get ("status" , {})
118
- error = None
119
- if "error" in status_data :
120
- error_data = status_data ["error" ]
121
- error = ServiceError (
122
- message = error_data .get ("message" , "" ),
123
- error_code = error_data .get ("error_code" ),
124
- )
125
-
126
- state = CommandState .from_sea_state (status_data .get ("state" , "" ))
127
- if state is None :
128
- raise ValueError (f"Invalid state: { status_data .get ('state' , '' )} " )
129
-
130
- status = StatementStatus (
131
- state = state ,
132
- error = error ,
133
- sql_state = status_data .get ("sql_state" ),
134
- )
135
-
136
- # Parse manifest
137
- manifest = None
138
- if "manifest" in data :
139
- manifest_data = data ["manifest" ]
140
- manifest = ResultManifest (
141
- format = manifest_data .get ("format" , "" ),
142
- schema = manifest_data .get ("schema" , {}),
143
- total_row_count = manifest_data .get ("total_row_count" , 0 ),
144
- total_byte_count = manifest_data .get ("total_byte_count" , 0 ),
145
- total_chunk_count = manifest_data .get ("total_chunk_count" , 0 ),
146
- truncated = manifest_data .get ("truncated" , False ),
147
- chunks = manifest_data .get ("chunks" ),
148
- result_compression = manifest_data .get ("result_compression" ),
149
- )
150
-
151
- # Parse result data
152
- result = None
153
- if "result" in data :
154
- result_data = data ["result" ]
155
- external_links = None
156
-
157
- if "external_links" in result_data :
158
- external_links = []
159
- for link_data in result_data ["external_links" ]:
160
- external_links .append (
161
- ExternalLink (
162
- external_link = link_data .get ("external_link" , "" ),
163
- expiration = link_data .get ("expiration" , "" ),
164
- chunk_index = link_data .get ("chunk_index" , 0 ),
165
- byte_count = link_data .get ("byte_count" , 0 ),
166
- row_count = link_data .get ("row_count" , 0 ),
167
- row_offset = link_data .get ("row_offset" , 0 ),
168
- next_chunk_index = link_data .get ("next_chunk_index" ),
169
- next_chunk_internal_link = link_data .get (
170
- "next_chunk_internal_link"
171
- ),
172
- http_headers = link_data .get ("http_headers" ),
173
- )
174
- )
175
-
176
- result = ResultData (
177
- data = result_data .get ("data_array" ),
178
- external_links = external_links ,
179
- )
180
-
181
118
return cls (
182
119
statement_id = data .get ("statement_id" , "" ),
183
- status = status ,
184
- manifest = manifest ,
185
- result = result ,
120
+ status = _parse_status ( data ) ,
121
+ manifest = _parse_manifest ( data ) ,
122
+ result = _parse_result ( data ) ,
186
123
)
187
124
188
125
0 commit comments