Skip to content

Commit 1da5694

Browse files
introduce models
Signed-off-by: varun-edachali-dbx <varun.edachali@databricks.com>
1 parent 0bba7f1 commit 1da5694

File tree

6 files changed

+665
-89
lines changed

6 files changed

+665
-89
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
"""
2+
Models for the SEA (Statement Execution API) backend.
3+
4+
This package contains data models for SEA API requests and responses.
5+
"""
6+
7+
from databricks.sql.backend.models.base import (
8+
ServiceError,
9+
StatementStatus,
10+
ExternalLink,
11+
ResultData,
12+
ColumnInfo,
13+
ResultManifest
14+
)
15+
16+
from databricks.sql.backend.models.requests import (
17+
StatementParameter,
18+
ExecuteStatementRequest,
19+
GetStatementRequest,
20+
CancelStatementRequest,
21+
CloseStatementRequest,
22+
CreateSessionRequest,
23+
DeleteSessionRequest
24+
)
25+
26+
from databricks.sql.backend.models.responses import (
27+
ExecuteStatementResponse,
28+
GetStatementResponse,
29+
CreateSessionResponse
30+
)
31+
32+
__all__ = [
33+
# Base models
34+
'ServiceError',
35+
'StatementStatus',
36+
'ExternalLink',
37+
'ResultData',
38+
'ColumnInfo',
39+
'ResultManifest',
40+
41+
# Request models
42+
'StatementParameter',
43+
'ExecuteStatementRequest',
44+
'GetStatementRequest',
45+
'CancelStatementRequest',
46+
'CloseStatementRequest',
47+
'CreateSessionRequest',
48+
'DeleteSessionRequest',
49+
50+
# Response models
51+
'ExecuteStatementResponse',
52+
'GetStatementResponse',
53+
'CreateSessionResponse'
54+
]
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
"""
2+
Base models for the SEA (Statement Execution API) backend.
3+
4+
These models define the common structures used in SEA API requests and responses.
5+
"""
6+
7+
from typing import Dict, List, Any, Optional, Union
8+
from dataclasses import dataclass, field
9+
10+
11+
@dataclass
12+
class ServiceError:
13+
"""Error information returned by the SEA API."""
14+
message: str
15+
error_code: Optional[str] = None
16+
17+
18+
@dataclass
19+
class StatementStatus:
20+
"""Status information for a statement execution."""
21+
state: str
22+
error: Optional[ServiceError] = None
23+
sql_state: Optional[str] = None
24+
25+
26+
@dataclass
27+
class ExternalLink:
28+
"""External link information for result data."""
29+
external_link: str
30+
expiration: str
31+
chunk_index: int
32+
33+
34+
@dataclass
35+
class ResultData:
36+
"""Result data from a statement execution."""
37+
data: Optional[List[List[Any]]] = None
38+
external_links: Optional[List[ExternalLink]] = None
39+
40+
41+
@dataclass
42+
class ColumnInfo:
43+
"""Information about a column in the result set."""
44+
name: str
45+
type_name: str
46+
type_text: str
47+
nullable: bool = True
48+
precision: Optional[int] = None
49+
scale: Optional[int] = None
50+
ordinal_position: Optional[int] = None
51+
52+
53+
@dataclass
54+
class ResultManifest:
55+
"""Manifest information for a result set."""
56+
schema: List[ColumnInfo]
57+
total_row_count: int
58+
total_byte_count: int
59+
truncated: bool = False
60+
chunk_count: Optional[int] = None
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
"""
2+
Request models for the SEA (Statement Execution API) backend.
3+
4+
These models define the structures used in SEA API requests.
5+
"""
6+
7+
from typing import Dict, List, Any, Optional, Union
8+
from dataclasses import dataclass, field
9+
10+
11+
@dataclass
12+
class StatementParameter:
13+
"""Parameter for a SQL statement."""
14+
name: str
15+
value: Optional[str] = None
16+
type: Optional[str] = None
17+
18+
19+
@dataclass
20+
class ExecuteStatementRequest:
21+
"""Request to execute a SQL statement."""
22+
warehouse_id: str
23+
statement: str
24+
session_id: str
25+
disposition: str = "EXTERNAL_LINKS"
26+
format: str = "JSON_ARRAY"
27+
wait_timeout: str = "10s"
28+
on_wait_timeout: str = "CONTINUE"
29+
row_limit: Optional[int] = None
30+
byte_limit: Optional[int] = None
31+
parameters: Optional[List[StatementParameter]] = None
32+
catalog: Optional[str] = None
33+
schema: Optional[str] = None
34+
35+
def to_dict(self) -> Dict[str, Any]:
36+
"""Convert the request to a dictionary for JSON serialization."""
37+
result = {
38+
"warehouse_id": self.warehouse_id,
39+
"session_id": self.session_id,
40+
"statement": self.statement,
41+
"disposition": self.disposition,
42+
"format": self.format,
43+
"wait_timeout": self.wait_timeout,
44+
"on_wait_timeout": self.on_wait_timeout,
45+
}
46+
47+
if self.row_limit is not None and self.row_limit > 0:
48+
result["row_limit"] = self.row_limit
49+
50+
if self.byte_limit is not None and self.byte_limit > 0:
51+
result["byte_limit"] = self.byte_limit
52+
53+
if self.catalog:
54+
result["catalog"] = self.catalog
55+
56+
if self.schema:
57+
result["schema"] = self.schema
58+
59+
if self.parameters:
60+
result["parameters"] = [
61+
{
62+
"name": param.name,
63+
**({"value": param.value} if param.value is not None else {}),
64+
**({"type": param.type} if param.type is not None else {})
65+
}
66+
for param in self.parameters
67+
]
68+
69+
return result
70+
71+
72+
@dataclass
73+
class GetStatementRequest:
74+
"""Request to get information about a statement."""
75+
warehouse_id: str
76+
statement_id: str
77+
78+
def to_dict(self) -> Dict[str, Any]:
79+
"""Convert the request to a dictionary for JSON serialization."""
80+
return {
81+
"warehouse_id": self.warehouse_id,
82+
"statement_id": self.statement_id
83+
}
84+
85+
86+
@dataclass
87+
class CancelStatementRequest:
88+
"""Request to cancel a statement."""
89+
warehouse_id: str
90+
statement_id: str
91+
92+
def to_dict(self) -> Dict[str, Any]:
93+
"""Convert the request to a dictionary for JSON serialization."""
94+
return {
95+
"warehouse_id": self.warehouse_id,
96+
"statement_id": self.statement_id
97+
}
98+
99+
100+
@dataclass
101+
class CloseStatementRequest:
102+
"""Request to close a statement."""
103+
warehouse_id: str
104+
statement_id: str
105+
106+
def to_dict(self) -> Dict[str, Any]:
107+
"""Convert the request to a dictionary for JSON serialization."""
108+
return {
109+
"warehouse_id": self.warehouse_id,
110+
"statement_id": self.statement_id
111+
}
112+
113+
114+
@dataclass
115+
class CreateSessionRequest:
116+
"""Request to create a new session."""
117+
warehouse_id: str
118+
session_confs: Optional[Dict[str, str]] = None
119+
catalog: Optional[str] = None
120+
schema: Optional[str] = None
121+
122+
def to_dict(self) -> Dict[str, Any]:
123+
"""Convert the request to a dictionary for JSON serialization."""
124+
result = {"warehouse_id": self.warehouse_id}
125+
126+
if self.session_confs:
127+
result["session_confs"] = self.session_confs
128+
129+
if self.catalog:
130+
result["catalog"] = self.catalog
131+
132+
if self.schema:
133+
result["schema"] = self.schema
134+
135+
return result
136+
137+
138+
@dataclass
139+
class DeleteSessionRequest:
140+
"""Request to delete a session."""
141+
warehouse_id: str
142+
session_id: str
143+
144+
def to_dict(self) -> Dict[str, Any]:
145+
"""Convert the request to a dictionary for JSON serialization."""
146+
return {
147+
"warehouse_id": self.warehouse_id,
148+
"session_id": self.session_id
149+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
"""
2+
Response models for the SEA (Statement Execution API) backend.
3+
4+
These models define the structures used in SEA API responses.
5+
"""
6+
7+
from typing import Dict, List, Any, Optional, Union
8+
from dataclasses import dataclass, field
9+
10+
from databricks.sql.backend.models.base import (
11+
StatementStatus, ResultManifest, ResultData
12+
)
13+
14+
15+
@dataclass
16+
class ExecuteStatementResponse:
17+
"""Response from executing a SQL statement."""
18+
statement_id: str
19+
status: StatementStatus
20+
manifest: Optional[ResultManifest] = None
21+
result: Optional[ResultData] = None
22+
23+
@classmethod
24+
def from_dict(cls, data: Dict[str, Any]) -> 'ExecuteStatementResponse':
25+
"""Create an ExecuteStatementResponse from a dictionary."""
26+
status_data = data.get("status", {})
27+
status = StatementStatus(
28+
state=status_data.get("state", ""),
29+
error=None if "error" not in status_data else {
30+
"message": status_data["error"].get("message", ""),
31+
"error_code": status_data["error"].get("error_code")
32+
},
33+
sql_state=status_data.get("sql_state")
34+
)
35+
36+
return cls(
37+
statement_id=data.get("statement_id", ""),
38+
status=status,
39+
manifest=data.get("manifest"), # We'll parse this more fully if needed
40+
result=data.get("result") # We'll parse this more fully if needed
41+
)
42+
43+
44+
@dataclass
45+
class GetStatementResponse:
46+
"""Response from getting information about a statement."""
47+
statement_id: str
48+
status: StatementStatus
49+
manifest: Optional[ResultManifest] = None
50+
result: Optional[ResultData] = None
51+
52+
@classmethod
53+
def from_dict(cls, data: Dict[str, Any]) -> 'GetStatementResponse':
54+
"""Create a GetStatementResponse from a dictionary."""
55+
status_data = data.get("status", {})
56+
status = StatementStatus(
57+
state=status_data.get("state", ""),
58+
error=None if "error" not in status_data else {
59+
"message": status_data["error"].get("message", ""),
60+
"error_code": status_data["error"].get("error_code")
61+
},
62+
sql_state=status_data.get("sql_state")
63+
)
64+
65+
return cls(
66+
statement_id=data.get("statement_id", ""),
67+
status=status,
68+
manifest=data.get("manifest"), # We'll parse this more fully if needed
69+
result=data.get("result") # We'll parse this more fully if needed
70+
)
71+
72+
73+
@dataclass
74+
class CreateSessionResponse:
75+
"""Response from creating a new session."""
76+
session_id: str
77+
78+
@classmethod
79+
def from_dict(cls, data: Dict[str, Any]) -> 'CreateSessionResponse':
80+
"""Create a CreateSessionResponse from a dictionary."""
81+
return cls(session_id=data.get("session_id", ""))

0 commit comments

Comments
 (0)