This is an automated email from the ASF dual-hosted git repository. beto pushed a commit to branch sc-70535 in repository https://gitbox.apache.org/repos/asf/superset.git
commit 8a383d75b44a85321d700011d8827b3eea2266be Author: Beto Dealmeida <[email protected]> AuthorDate: Mon May 15 11:43:10 2023 -0700 fix: handle python_date_format in ExploreMixin --- superset/models/helpers.py | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/superset/models/helpers.py b/superset/models/helpers.py index b38089e381..e994eacd8e 100644 --- a/superset/models/helpers.py +++ b/superset/models/helpers.py @@ -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,23 @@ 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: + try: + tf = self.db_extra["python_date_format_by_column_name"][col.column_name] + except (KeyError, TypeError): + pass + + 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 @@ -1292,7 +1314,7 @@ class ExploreMixin: # pylint: disable=too-many-public-methods label: Optional[str] = "__time", template_processor: Optional[BaseTemplateProcessor] = None, ) -> ColumnElement: - col = ( + col_name = ( time_col.get_timestamp_expression( time_grain=time_grain, label=label, @@ -1303,20 +1325,23 @@ class ExploreMixin: # pylint: disable=too-many-public-methods time_col, label=label, template_processor=template_processor ) ) + col = [ + column for column in self.columns if column.column_name == str(col_name) + ][0] l = [] if start_dttm: l.append( - col + col_name >= self.db_engine_spec.get_text_clause( - self.dttm_sql_literal(start_dttm, time_col.type) + self.dttm_sql_literal(col, start_dttm, time_col.type) ) ) if end_dttm: l.append( - col + col_name < self.db_engine_spec.get_text_clause( - self.dttm_sql_literal(end_dttm, time_col.type) + self.dttm_sql_literal(col, end_dttm, time_col.type) ) ) return and_(*l)
