|
24 | 24 | from dve.core_engine.backends.utilities import DEFAULT_ISO_FORMATS, datetime_format_to_regex |
25 | 25 | from dve.core_engine.constants import RECORD_INDEX_COLUMN_NAME |
26 | 26 | from dve.core_engine.type_hints import URI, EntityName |
| 27 | +from dve.metadata_parser.utilities import resilient_get |
27 | 28 | from dve.parser.file_handling.service import LocalFilesystemImplementation, _get_implementation |
28 | 29 |
|
29 | 30 |
|
@@ -451,23 +452,27 @@ def get_duckdb_cast_statement_from_annotation( |
451 | 452 | raise ValueError(f"dict must be `typing.TypedDict` subclass, got {type_annotation!r}") |
452 | 453 |
|
453 | 454 | for type_ in type_annotation.mro(): |
454 | | - _date_format: str = getattr( # type: ignore |
455 | | - type_, "DATE_FORMAT", DEFAULT_ISO_FORMATS.get(type_, DEFAULT_ISO_FORMATS.get(datetime)) |
456 | | - ) |
457 | | - dt_cast_statement = rf"CASE WHEN REGEXP_FULL_MATCH(TRIM({quoted_name}), '{datetime_format_to_regex(_date_format)}') THEN TRY_STRPTIME(TRIM({quoted_name}), '{_date_format}') ELSE NULL END" # pylint: disable=C0301 |
458 | | - |
459 | | - # datetime is subclass of date, so needs to be handled first |
460 | | - if issubclass(type_, datetime): |
461 | | - stmt = rf"TRY_CAST({dt_cast_statement} as TIMESTAMP)" |
462 | | - return stmt |
463 | | - if issubclass(type_, date): |
464 | | - stmt = rf"TRY_CAST({dt_cast_statement} as DATE)" |
465 | | - return stmt |
466 | | - if issubclass(type_, time): |
467 | | - stmt = rf"TRY_CAST({dt_cast_statement} as TIME)" |
468 | | - return stmt |
469 | | - duck_type = get_duckdb_type_from_annotation(type_) |
470 | | - if duck_type: |
471 | | - stmt = f"TRIM({quoted_name})" |
472 | | - return _cast_as_ddb_type(stmt, type_) if parent_element else stmt |
| 455 | + if issubclass(type_, (date, time)): |
| 456 | + _date_format: str = resilient_get( |
| 457 | + type_, "DATE_FORMAT", "TIME_FORMAT" |
| 458 | + ) or DEFAULT_ISO_FORMATS.get( |
| 459 | + type_, DEFAULT_ISO_FORMATS.get(datetime) |
| 460 | + ) # type: ignore |
| 461 | + dt_cast_statement = rf"CASE WHEN REGEXP_FULL_MATCH(TRIM({quoted_name}), '{datetime_format_to_regex(_date_format)}') THEN TRY_STRPTIME(TRIM({quoted_name}), '{_date_format}') ELSE NULL END" # pylint: disable=C0301 |
| 462 | + |
| 463 | + # datetime is subclass of date, so needs to be handled first |
| 464 | + if issubclass(type_, datetime): |
| 465 | + stmt = rf"TRY_CAST({dt_cast_statement} as TIMESTAMP)" |
| 466 | + return stmt |
| 467 | + if issubclass(type_, date): |
| 468 | + stmt = rf"TRY_CAST({dt_cast_statement} as DATE)" |
| 469 | + return stmt |
| 470 | + if issubclass(type_, time): |
| 471 | + stmt = rf"TRY_CAST({dt_cast_statement} as TIME)" |
| 472 | + return stmt |
| 473 | + else: |
| 474 | + duck_type = get_duckdb_type_from_annotation(type_) |
| 475 | + if duck_type: |
| 476 | + stmt = f"TRIM({quoted_name})" |
| 477 | + return _cast_as_ddb_type(stmt, type_) if parent_element else stmt |
473 | 478 | raise ValueError(f"No equivalent DuckDB type for {type_annotation!r}") |
0 commit comments