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)

Reply via email to