Skip to content

Commit d6ec255

Browse files
authored
allows to apply table level hints via make_hints (#2365)
* allows to apply table level hints via make_hints * sets duckdb to 1.2.0 via dev deps * skips ICEBERG scanner activation for 1.2.0 duckdb
1 parent 1738b13 commit d6ec255

File tree

6 files changed

+105
-74
lines changed

6 files changed

+105
-74
lines changed

dlt/destinations/impl/filesystem/sql_client.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,8 @@ def _setup_iceberg(conn: duckdb.DuckDBPyConnection) -> None:
358358

359359
# `duckdb_iceberg` extension does not support autoloading
360360
# https://github.com/duckdb/duckdb_iceberg/issues/71
361-
conn.execute("INSTALL Iceberg FROM core_nightly; LOAD iceberg;")
361+
if semver.Version.parse(duckdb.__version__) < semver.Version.parse("1.2.0"):
362+
conn.execute("INSTALL Iceberg FROM core_nightly; LOAD iceberg;")
362363

363364
# allow unsafe version resolution
364365
conn.execute("SET unsafe_enable_version_guessing=true;")

dlt/extract/hints.py

+27-15
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class TResourceHints(TResourceHintsBase, total=False):
6464
file_format: TTableHintTemplate[TFileFormat]
6565
validator: ValidateItem
6666
original_columns: TTableHintTemplate[TAnySchemaColumns]
67+
additional_table_hints: Optional[Dict[str, TTableHintTemplate[Any]]]
6768

6869

6970
class HintsMeta:
@@ -87,6 +88,7 @@ def make_hints(
8788
schema_contract: TTableHintTemplate[TSchemaContract] = None,
8889
table_format: TTableHintTemplate[TTableFormat] = None,
8990
file_format: TTableHintTemplate[TFileFormat] = None,
91+
additional_table_hints: Optional[Dict[str, TTableHintTemplate[Any]]] = None,
9092
references: TTableHintTemplate[TTableReferenceParam] = None,
9193
incremental: TIncrementalConfig = None,
9294
) -> TResourceHints:
@@ -121,6 +123,8 @@ def make_hints(
121123
new_template["merge_key"] = merge_key
122124
if validator:
123125
new_template["validator"] = validator
126+
if additional_table_hints is not None:
127+
new_template["additional_table_hints"] = additional_table_hints
124128
DltResourceHints.validate_dynamic_hints(new_template)
125129
if incremental is not None: # TODO: Validate
126130
new_template["incremental"] = Incremental.ensure_instance(incremental)
@@ -277,16 +281,16 @@ def apply_hints(
277281
# if there is no template yet, create and set a new one.
278282
default_wd = None if parent_table_name else DEFAULT_WRITE_DISPOSITION
279283
t = make_hints(
280-
table_name,
281-
parent_table_name,
282-
write_disposition or default_wd,
283-
columns,
284-
primary_key,
285-
merge_key,
286-
schema_contract,
287-
table_format,
288-
file_format,
289-
references,
284+
table_name=table_name,
285+
parent_table_name=parent_table_name,
286+
write_disposition=write_disposition or default_wd,
287+
columns=columns,
288+
primary_key=primary_key,
289+
merge_key=merge_key,
290+
schema_contract=schema_contract,
291+
table_format=table_format,
292+
file_format=file_format,
293+
references=references,
290294
)
291295
else:
292296
t = self._clone_hints(t)
@@ -332,12 +336,14 @@ def apply_hints(
332336
else:
333337
t.pop("schema_contract", None)
334338
if additional_table_hints is not None:
335-
for k, v in additional_table_hints.items():
336-
if v:
337-
t[k] = v # type: ignore[literal-required]
339+
if additional_table_hints:
340+
if t.get("additional_table_hints") is not None:
341+
for k, v in additional_table_hints.items():
342+
t["additional_table_hints"][k] = v
338343
else:
339-
t.pop(k, None) # type: ignore[misc]
340-
t.pop("additional_table_hints", None) # type: ignore
344+
t["additional_table_hints"] = additional_table_hints
345+
else:
346+
t.pop("additional_table_hints", None)
341347

342348
# recreate validator if column definition or contract changed
343349
if schema_contract is not None or columns is not None:
@@ -425,6 +431,7 @@ def merge_hints(
425431
schema_contract=hints_template.get("schema_contract"),
426432
table_format=hints_template.get("table_format"),
427433
file_format=hints_template.get("file_format"),
434+
additional_table_hints=hints_template.get("additional_table_hints"),
428435
references=hints_template.get("references"),
429436
create_table_variant=create_table_variant,
430437
)
@@ -546,6 +553,11 @@ def _create_table_schema(resource_hints: TResourceHints, resource_name: str) ->
546553
if "incremental" in resource_hints:
547554
DltResourceHints._merge_incremental_column_hint(resource_hints) # type: ignore[arg-type]
548555
dict_ = cast(TTableSchema, resource_hints)
556+
# apply table hints
557+
if additional_table_hints := resource_hints.get("additional_table_hints"):
558+
for k, v in additional_table_hints.items():
559+
dict_[k] = v # type: ignore[literal-required]
560+
resource_hints.pop("additional_table_hints", None)
549561
dict_["resource"] = resource_name
550562
return dict_
551563

dlt/extract/resource.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@
4646
ItemTransformFunctionWithMeta,
4747
)
4848
from dlt.extract.pipe_iterator import ManagedPipeIterator
49-
from dlt.extract.pipe import Pipe, TPipeStep
50-
from dlt.extract.hints import DltResourceHints, HintsMeta, TResourceHints, make_hints
49+
from dlt.extract.pipe import Pipe
50+
from dlt.extract.hints import DltResourceHints, HintsMeta, TResourceHints
5151
from dlt.extract.incremental import Incremental, IncrementalResourceWrapper
5252
from dlt.extract.exceptions import (
5353
InvalidTransformerDataTypeGeneratorFunctionRequired,

0 commit comments

Comments
 (0)