Skip to content

Commit ee910c3

Browse files
authored
Record additional parameters from BaseColumn subclasses in adapter.get_columns_for_relation (#1383)
1 parent 6f89d7c commit ee910c3

File tree

4 files changed

+84
-1
lines changed

4 files changed

+84
-1
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
kind: Under the Hood
2+
body: Record all fields in subclasses of BaseColumns when recording adapter.get_columns_in_relation
3+
time: 2025-10-10T15:32:03.863594-04:00
4+
custom:
5+
Author: michelleark
6+
Issue: "1383"

dbt-adapters/src/dbt/adapters/base/impl.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
AdapterConvertTypeRecord,
3232
AdapterStandardizeGrantsDictRecord,
3333
AdapterListRelationsWithoutCachingRecord,
34+
AdapterGetColumnsInRelationRecord,
3435
)
3536
from dbt_common.behavior_flags import Behavior, BehaviorFlag
3637
from dbt_common.clients.jinja import CallableMacroGenerator
@@ -745,7 +746,12 @@ def rename_relation(self, from_relation: BaseRelation, to_relation: BaseRelation
745746
"""
746747
raise NotImplementedError("`rename_relation` is not implemented for this adapter!")
747748

748-
@auto_record_function("AdapterGetColumnsInRelation", group="Available")
749+
@record_function(
750+
AdapterGetColumnsInRelationRecord,
751+
method=True,
752+
index_on_thread_id=True,
753+
id_field_name="thread_id",
754+
)
749755
@abc.abstractmethod
750756
@available.parse_list
751757
def get_columns_in_relation(self, relation: BaseRelation) -> List[BaseColumn]:

dbt-adapters/src/dbt/adapters/record/base.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
if TYPE_CHECKING:
1212
from agate import Table
1313
from dbt.adapters.base.relation import BaseRelation
14+
from dbt.adapters.base.column import Column as BaseColumn
1415

1516

1617
@dataclasses.dataclass
@@ -244,3 +245,47 @@ class AdapterListRelationsWithoutCachingRecord(Record):
244245
params_cls = AdapterListRelationsWithoutCachingParams
245246
result_cls = AdapterListRelationsWithoutCachingResult
246247
group = "Available"
248+
249+
250+
@dataclasses.dataclass
251+
class AdapterGetColumnsInRelationParams:
252+
thread_id: str
253+
relation: "BaseRelation"
254+
255+
def _to_dict(self):
256+
from dbt.adapters.record.serialization import serialize_base_relation
257+
258+
return {
259+
"thread_id": self.thread_id,
260+
"relation": serialize_base_relation(self.relation),
261+
}
262+
263+
def _from_dict(self, data: Dict[str, Any]):
264+
from dbt.adapters.record.serialization import deserialize_base_relation
265+
266+
self.thread_id = data["thread_id"]
267+
self.relation = deserialize_base_relation(data["relation"])
268+
269+
270+
@dataclasses.dataclass
271+
class AdapterGetColumnsInRelationResult:
272+
return_val: List["BaseColumn"]
273+
274+
def _to_dict(self):
275+
from dbt.adapters.record.serialization import serialize_base_column_list
276+
277+
return {"return_val": serialize_base_column_list(self.return_val)}
278+
279+
def _from_dict(self, data: Dict[str, Any]):
280+
from dbt.adapters.record.serialization import deserialize_base_column_list
281+
282+
self.return_val = deserialize_base_column_list(data["return_val"])
283+
284+
285+
@Recorder.register_record_type
286+
class AdapterGetColumnsInRelationRecord(Record):
287+
"""Implements record/replay support for the BaseAdapter.get_columns_in_relation() method."""
288+
289+
params_cls = AdapterGetColumnsInRelationParams
290+
result_cls = AdapterGetColumnsInRelationResult
291+
group = "Available"

dbt-adapters/src/dbt/adapters/record/serialization.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import dataclasses
12
from datetime import datetime, date
23
from decimal import Decimal
34
from typing import Any, Dict, TYPE_CHECKING, List, Union
45

56
if TYPE_CHECKING:
67
from agate import Table
78
from dbt.adapters.base.relation import BaseRelation
9+
from dbt.adapters.base.column import Column as BaseColumn
810

911

1012
def _column_filter(val: Any) -> Any:
@@ -61,3 +63,27 @@ def deserialize_base_relation(relation_dict: Dict[str, Any]) -> "BaseRelation":
6163
def deserialize_base_relation_list(relations_data: List[Dict[str, Any]]) -> List["BaseRelation"]:
6264
"""Deserialize a list of BaseRelation objects from dictionaries."""
6365
return [deserialize_base_relation(relation_dict) for relation_dict in relations_data]
66+
67+
68+
def serialize_base_column_list(columns: List["BaseColumn"]) -> List[Dict[str, Any]]:
69+
return [serialize_base_column(column) for column in columns]
70+
71+
72+
def serialize_base_column(column: "BaseColumn") -> Dict[str, Any]:
73+
column_dict = dataclasses.asdict(column)
74+
return column_dict
75+
76+
77+
def deserialize_base_column_list(columns_data: List[Dict[str, Any]]) -> List["BaseColumn"]:
78+
return [deserialize_base_column(column_dict) for column_dict in columns_data]
79+
80+
81+
def deserialize_base_column(column_dict: Dict[str, Any]) -> "BaseColumn":
82+
# Only include fields that are present in the base column class
83+
params_dict = {
84+
field.name: column_dict[field.name]
85+
for field in dataclasses.fields(BaseColumn)
86+
if field.name in column_dict
87+
}
88+
89+
return BaseColumn(**params_dict)

0 commit comments

Comments
 (0)