Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 52 additions & 55 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ optional = true
behave = "1.3.3"
coverage = "7.11.0"
moto = {extras = ["s3"], version = "4.2.14"}
cryptography = "48.0.1" # dependency of `moto`
cryptography = "50.0.0" # dependency of `moto`
requests = "2.33.0" # dependency of `moto`
Werkzeug = "3.1.6"
pytest = "9.0.3"
Expand Down Expand Up @@ -106,7 +106,7 @@ click = "8.2.1"
mkdocs = "1.6.1"
mkdocstrings = { version = "1.0.3", extras = ["python"] }
griffelib = "2.0.1"
pymdown-extensions = "10.21.3"
pymdown-extensions = "11.0.1"
zensical = "0.0.46"

[tool.ruff]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
from dve.core_engine.backends.utilities import DEFAULT_ISO_FORMATS, datetime_format_to_regex
from dve.core_engine.constants import RECORD_INDEX_COLUMN_NAME
from dve.core_engine.type_hints import URI, EntityName
from dve.metadata_parser.utilities import resilient_get
from dve.parser.file_handling.service import LocalFilesystemImplementation, _get_implementation


Expand Down Expand Up @@ -451,23 +452,27 @@ def get_duckdb_cast_statement_from_annotation(
raise ValueError(f"dict must be `typing.TypedDict` subclass, got {type_annotation!r}")

for type_ in type_annotation.mro():
_date_format: str = getattr( # type: ignore
type_, "DATE_FORMAT", DEFAULT_ISO_FORMATS.get(type_, DEFAULT_ISO_FORMATS.get(datetime))
)
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

# datetime is subclass of date, so needs to be handled first
if issubclass(type_, datetime):
stmt = rf"TRY_CAST({dt_cast_statement} as TIMESTAMP)"
return stmt
if issubclass(type_, date):
stmt = rf"TRY_CAST({dt_cast_statement} as DATE)"
return stmt
if issubclass(type_, time):
stmt = rf"TRY_CAST({dt_cast_statement} as TIME)"
return stmt
duck_type = get_duckdb_type_from_annotation(type_)
if duck_type:
stmt = f"TRIM({quoted_name})"
return _cast_as_ddb_type(stmt, type_) if parent_element else stmt
if issubclass(type_, (date, time)):
_date_format: str = resilient_get(
type_, "DATE_FORMAT", "TIME_FORMAT"
) or DEFAULT_ISO_FORMATS.get(
type_, DEFAULT_ISO_FORMATS.get(datetime)
) # type: ignore
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

# datetime is subclass of date, so needs to be handled first
if issubclass(type_, datetime):
stmt = rf"TRY_CAST({dt_cast_statement} as TIMESTAMP)"
return stmt
if issubclass(type_, date):
stmt = rf"TRY_CAST({dt_cast_statement} as DATE)"
return stmt
if issubclass(type_, time):
stmt = rf"TRY_CAST({dt_cast_statement} as TIME)"
return stmt
else:
duck_type = get_duckdb_type_from_annotation(type_)
if duck_type:
stmt = f"TRIM({quoted_name})"
return _cast_as_ddb_type(stmt, type_) if parent_element else stmt
raise ValueError(f"No equivalent DuckDB type for {type_annotation!r}")
Loading
Loading