1313ResultManifest ,
1414ResultData ,
1515ServiceError ,
16+ ExternalLink ,
17+ ColumnInfo ,
1618)
1719
1820
@@ -37,20 +39,62 @@ def from_dict(cls, data: Dict[str, Any]) -> "ExecuteStatementResponse":
3739error_code = error_data .get ("error_code" ),
3840 )
3941
40- state = CommandState .from_sea_state (status_data .get ("state" ,"" ))
41- if state is None :
42- raise ValueError (f"Invalid state:{ status_data .get ('state' ,'' )} " )
4342status = StatementStatus (
44- state = state ,
43+ state = CommandState . from_sea_state ( status_data . get ( " state" , "" )) ,
4544error = error ,
4645sql_state = status_data .get ("sql_state" ),
4746 )
4847
48+ # Parse manifest
49+ manifest = None
50+ if "manifest" in data :
51+ manifest_data = data ["manifest" ]
52+ manifest = ResultManifest (
53+ format = manifest_data .get ("format" ,"" ),
54+ schema = manifest_data .get ("schema" , {}),
55+ total_row_count = manifest_data .get ("total_row_count" ,0 ),
56+ total_byte_count = manifest_data .get ("total_byte_count" ,0 ),
57+ total_chunk_count = manifest_data .get ("total_chunk_count" ,0 ),
58+ truncated = manifest_data .get ("truncated" ,False ),
59+ chunks = manifest_data .get ("chunks" ),
60+ result_compression = manifest_data .get ("result_compression" ),
61+ )
62+
63+ # Parse result data
64+ result = None
65+ if "result" in data :
66+ result_data = data ["result" ]
67+ external_links = None
68+
69+ if "external_links" in result_data :
70+ external_links = []
71+ for link_data in result_data ["external_links" ]:
72+ external_links .append (
73+ ExternalLink (
74+ external_link = link_data .get ("external_link" ,"" ),
75+ expiration = link_data .get ("expiration" ,"" ),
76+ chunk_index = link_data .get ("chunk_index" ,0 ),
77+ byte_count = link_data .get ("byte_count" ,0 ),
78+ row_count = link_data .get ("row_count" ,0 ),
79+ row_offset = link_data .get ("row_offset" ,0 ),
80+ next_chunk_index = link_data .get ("next_chunk_index" ),
81+ next_chunk_internal_link = link_data .get (
82+ "next_chunk_internal_link"
83+ ),
84+ http_headers = link_data .get ("http_headers" ),
85+ )
86+ )
87+
88+ result = ResultData (
89+ data = result_data .get ("data_array" ),
90+ external_links = external_links ,
91+ )
92+
4993return cls (
5094statement_id = data .get ("statement_id" ,"" ),
5195status = status ,
52- manifest = data . get ( " manifest" ), # We'll parse this more fully if needed
53- result = data . get ( " result" ), # We'll parse this more fully if needed
96+ manifest = manifest ,
97+ result = result ,
5498 )
5599
56100
@@ -75,21 +119,62 @@ def from_dict(cls, data: Dict[str, Any]) -> "GetStatementResponse":
75119error_code = error_data .get ("error_code" ),
76120 )
77121
78- state = CommandState .from_sea_state (status_data .get ("state" ,"" ))
79- if state is None :
80- raise ValueError (f"Invalid state:{ status_data .get ('state' ,'' )} " )
81-
82122status = StatementStatus (
83- state = state ,
123+ state = CommandState . from_sea_state ( status_data . get ( " state" , "" )) ,
84124error = error ,
85125sql_state = status_data .get ("sql_state" ),
86126 )
87127
128+ # Parse manifest
129+ manifest = None
130+ if "manifest" in data :
131+ manifest_data = data ["manifest" ]
132+ manifest = ResultManifest (
133+ format = manifest_data .get ("format" ,"" ),
134+ schema = manifest_data .get ("schema" , {}),
135+ total_row_count = manifest_data .get ("total_row_count" ,0 ),
136+ total_byte_count = manifest_data .get ("total_byte_count" ,0 ),
137+ total_chunk_count = manifest_data .get ("total_chunk_count" ,0 ),
138+ truncated = manifest_data .get ("truncated" ,False ),
139+ chunks = manifest_data .get ("chunks" ),
140+ result_compression = manifest_data .get ("result_compression" ),
141+ )
142+
143+ # Parse result data
144+ result = None
145+ if "result" in data :
146+ result_data = data ["result" ]
147+ external_links = None
148+
149+ if "external_links" in result_data :
150+ external_links = []
151+ for link_data in result_data ["external_links" ]:
152+ external_links .append (
153+ ExternalLink (
154+ external_link = link_data .get ("external_link" ,"" ),
155+ expiration = link_data .get ("expiration" ,"" ),
156+ chunk_index = link_data .get ("chunk_index" ,0 ),
157+ byte_count = link_data .get ("byte_count" ,0 ),
158+ row_count = link_data .get ("row_count" ,0 ),
159+ row_offset = link_data .get ("row_offset" ,0 ),
160+ next_chunk_index = link_data .get ("next_chunk_index" ),
161+ next_chunk_internal_link = link_data .get (
162+ "next_chunk_internal_link"
163+ ),
164+ http_headers = link_data .get ("http_headers" ),
165+ )
166+ )
167+
168+ result = ResultData (
169+ data = result_data .get ("data_array" ),
170+ external_links = external_links ,
171+ )
172+
88173return cls (
89174statement_id = data .get ("statement_id" ,"" ),
90175status = status ,
91- manifest = data . get ( " manifest" ), # We'll parse this more fully if needed
92- result = data . get ( " result" ), # We'll parse this more fully if needed
176+ manifest = manifest ,
177+ result = result ,
93178 )
94179
95180
@@ -103,3 +188,38 @@ class CreateSessionResponse:
103188def from_dict (cls ,data :Dict [str ,Any ])-> "CreateSessionResponse" :
104189"""Create a CreateSessionResponse from a dictionary."""
105190return cls (session_id = data .get ("session_id" ,"" ))
191+
192+
193+ @dataclass
194+ class GetChunksResponse :
195+ """Response from getting chunks for a statement."""
196+
197+ statement_id :str
198+ external_links :List [ExternalLink ]
199+
200+ @classmethod
201+ def from_dict (cls ,data :Dict [str ,Any ])-> "GetChunksResponse" :
202+ """Create a GetChunksResponse from a dictionary."""
203+ external_links = []
204+ if "external_links" in data :
205+ for link_data in data ["external_links" ]:
206+ external_links .append (
207+ ExternalLink (
208+ external_link = link_data .get ("external_link" ,"" ),
209+ expiration = link_data .get ("expiration" ,"" ),
210+ chunk_index = link_data .get ("chunk_index" ,0 ),
211+ byte_count = link_data .get ("byte_count" ,0 ),
212+ row_count = link_data .get ("row_count" ,0 ),
213+ row_offset = link_data .get ("row_offset" ,0 ),
214+ next_chunk_index = link_data .get ("next_chunk_index" ),
215+ next_chunk_internal_link = link_data .get (
216+ "next_chunk_internal_link"
217+ ),
218+ http_headers = link_data .get ("http_headers" ),
219+ )
220+ )
221+
222+ return cls (
223+ statement_id = data .get ("statement_id" ,"" ),
224+ external_links = external_links ,
225+ )