fix: handle `python_date_format` in ExploreMixin (#24062)

This commit is contained in:
Beto Dealmeida 2023-05-15 14:51:14 -07:00 committed by GitHub
parent de96372ba7
commit 2938c5dc03
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 24 additions and 3 deletions

View File

@ -1269,7 +1269,12 @@ class ExploreMixin: # pylint: disable=too-many-public-methods
return or_(*groups)
def dttm_sql_literal(self, dttm: sa.DateTime, col_type: Optional[str]) -> str:
def dttm_sql_literal(
self,
col: "TableColumn",
dttm: sa.DateTime,
col_type: Optional[str],
) -> str:
"""Convert datetime object to a SQL expression string"""
sql = (
@ -1281,6 +1286,22 @@ class ExploreMixin: # pylint: disable=too-many-public-methods
if sql:
return sql
tf = col.python_date_format
# Fallback to the default format (if defined).
if not tf and self.db_extra:
tf = self.db_extra.get("python_date_format_by_column_name", {}).get(
col.column_name
)
if tf:
if tf in {"epoch_ms", "epoch_s"}:
seconds_since_epoch = int(dttm.timestamp())
if tf == "epoch_s":
return str(seconds_since_epoch)
return str(seconds_since_epoch * 1000)
return f"'{dttm.strftime(tf)}'"
return f"""'{dttm.strftime("%Y-%m-%d %H:%M:%S.%f")}'"""
def get_time_filter( # pylint: disable=too-many-arguments
@ -1309,14 +1330,14 @@ class ExploreMixin: # pylint: disable=too-many-public-methods
l.append(
col
>= self.db_engine_spec.get_text_clause(
self.dttm_sql_literal(start_dttm, time_col.type)
self.dttm_sql_literal(time_col, start_dttm, time_col.type)
)
)
if end_dttm:
l.append(
col
< self.db_engine_spec.get_text_clause(
self.dttm_sql_literal(end_dttm, time_col.type)
self.dttm_sql_literal(time_col, end_dttm, time_col.type)
)
)
return and_(*l)