5
5
import re
6
6
from typing import Any , Dict , Tuple , List , Optional , Union , TYPE_CHECKING , Set
7
7
8
- from databricks .sql .backend .sea .models .base import ResultManifest , StatementStatus
8
+ from databricks .sql .backend .sea .models .base import (
9
+ ExternalLink ,
10
+ ResultManifest ,
11
+ StatementStatus ,
12
+ )
13
+ from databricks .sql .backend .sea .models .responses import GetChunksResponse
9
14
from databricks .sql .backend .sea .utils .constants import (
10
15
ALLOWED_SESSION_CONF_TO_DEFAULT_VALUES_MAP ,
11
16
ResultFormat ,
19
24
if TYPE_CHECKING :
20
25
from databricks .sql .client import Cursor
21
26
22
- from databricks .sql .result_set import SeaResultSet
27
+ from databricks .sql .backend . sea . result_set import SeaResultSet
23
28
24
29
from databricks .sql .backend .databricks_client import DatabricksClient
25
30
from databricks .sql .backend .types import (
@@ -110,6 +115,7 @@ class SeaDatabricksClient(DatabricksClient):
110
115
STATEMENT_PATH = BASE_PATH + "statements"
111
116
STATEMENT_PATH_WITH_ID = STATEMENT_PATH + "/{}"
112
117
CANCEL_STATEMENT_PATH_WITH_ID = STATEMENT_PATH + "/{}/cancel"
118
+ CHUNK_PATH_WITH_ID_AND_INDEX = STATEMENT_PATH + "/{}/result/chunks/{}"
113
119
114
120
# SEA constants
115
121
POLL_INTERVAL_SECONDS = 0.2
@@ -296,7 +302,7 @@ def close_session(self, session_id: SessionId) -> None:
296
302
297
303
def _extract_description_from_manifest (
298
304
self , manifest : ResultManifest
299
- ) -> Optional [ List ]:
305
+ ) -> List [ Tuple ]:
300
306
"""
301
307
Extract column description from a manifest object, in the format defined by
302
308
the spec: https://peps.python.org/pep-0249/#description
@@ -311,9 +317,6 @@ def _extract_description_from_manifest(
311
317
schema_data = manifest .schema
312
318
columns_data = schema_data .get ("columns" , [])
313
319
314
- if not columns_data :
315
- return None
316
-
317
320
columns = []
318
321
for col_data in columns_data :
319
322
# Format: (name, type_code, display_size, internal_size, precision, scale, null_ok)
@@ -337,7 +340,7 @@ def _extract_description_from_manifest(
337
340
)
338
341
)
339
342
340
- return columns if columns else None
343
+ return columns
341
344
342
345
def _results_message_to_execute_response (
343
346
self , response : Union [ExecuteStatementResponse , GetStatementResponse ]
@@ -358,7 +361,7 @@ def _results_message_to_execute_response(
358
361
359
362
# Check for compression
360
363
lz4_compressed = (
361
- response .manifest .result_compression == ResultCompression .LZ4_FRAME
364
+ response .manifest .result_compression == ResultCompression .LZ4_FRAME . value
362
365
)
363
366
364
367
execute_response = ExecuteResponse (
@@ -647,6 +650,27 @@ def get_execution_result(
647
650
response = self ._poll_query (command_id )
648
651
return self ._response_to_result_set (response , cursor )
649
652
653
+ def get_chunk_links (
654
+ self , statement_id : str , chunk_index : int
655
+ ) -> List [ExternalLink ]:
656
+ """
657
+ Get links for chunks starting from the specified index.
658
+ Args:
659
+ statement_id: The statement ID
660
+ chunk_index: The starting chunk index
661
+ Returns:
662
+ ExternalLink: External link for the chunk
663
+ """
664
+
665
+ response_data = self ._http_client ._make_request (
666
+ method = "GET" ,
667
+ path = self .CHUNK_PATH_WITH_ID_AND_INDEX .format (statement_id , chunk_index ),
668
+ )
669
+ response = GetChunksResponse .from_dict (response_data )
670
+
671
+ links = response .external_links or []
672
+ return links
673
+
650
674
# == Metadata Operations ==
651
675
652
676
def get_catalogs (
0 commit comments