mirror of
https://github.com/apache/superset.git
synced 2024-09-16 02:29:39 -04:00
feat: Make Jinja template applied in timestamp columns (#17237)
* Update models.py * Add optional template processor to get_timestamp_expression() * Update models.py
This commit is contained in:
parent
93f59e055e
commit
5aaa3330a6
@ -303,7 +303,10 @@ class TableColumn(Model, BaseColumn, CertificationMixin):
|
|||||||
return and_(*l)
|
return and_(*l)
|
||||||
|
|
||||||
def get_timestamp_expression(
|
def get_timestamp_expression(
|
||||||
self, time_grain: Optional[str], label: Optional[str] = None
|
self,
|
||||||
|
time_grain: Optional[str],
|
||||||
|
label: Optional[str] = None,
|
||||||
|
template_processor: Optional[BaseTemplateProcessor] = None,
|
||||||
) -> Union[TimestampExpression, Label]:
|
) -> Union[TimestampExpression, Label]:
|
||||||
"""
|
"""
|
||||||
Return a SQLAlchemy Core element representation of self to be used in a query.
|
Return a SQLAlchemy Core element representation of self to be used in a query.
|
||||||
@ -322,7 +325,10 @@ class TableColumn(Model, BaseColumn, CertificationMixin):
|
|||||||
sqla_col = column(self.column_name, type_=type_)
|
sqla_col = column(self.column_name, type_=type_)
|
||||||
return self.table.make_sqla_column_compatible(sqla_col, label)
|
return self.table.make_sqla_column_compatible(sqla_col, label)
|
||||||
if self.expression:
|
if self.expression:
|
||||||
col = literal_column(self.expression, type_=type_)
|
expression = self.expression
|
||||||
|
if template_processor:
|
||||||
|
expression = template_processor.process_template(self.expression)
|
||||||
|
col = literal_column(expression, type_=type_)
|
||||||
else:
|
else:
|
||||||
col = column(self.column_name, type_=type_)
|
col = column(self.column_name, type_=type_)
|
||||||
time_expr = self.db_engine_spec.get_timestamp_expr(
|
time_expr = self.db_engine_spec.get_timestamp_expr(
|
||||||
@ -1088,7 +1094,11 @@ class SqlaTable(Model, BaseDatasource): # pylint: disable=too-many-public-metho
|
|||||||
# if groupby field/expr equals granularity field/expr
|
# if groupby field/expr equals granularity field/expr
|
||||||
table_col = columns_by_name.get(selected)
|
table_col = columns_by_name.get(selected)
|
||||||
if table_col and table_col.type_generic == GenericDataType.TEMPORAL:
|
if table_col and table_col.type_generic == GenericDataType.TEMPORAL:
|
||||||
outer = table_col.get_timestamp_expression(time_grain, selected)
|
outer = table_col.get_timestamp_expression(
|
||||||
|
time_grain=time_grain,
|
||||||
|
label=selected,
|
||||||
|
template_processor=template_processor,
|
||||||
|
)
|
||||||
# if groupby field equals a selected column
|
# if groupby field equals a selected column
|
||||||
elif table_col:
|
elif table_col:
|
||||||
outer = table_col.get_sqla_col()
|
outer = table_col.get_sqla_col()
|
||||||
@ -1121,7 +1131,9 @@ class SqlaTable(Model, BaseDatasource): # pylint: disable=too-many-public-metho
|
|||||||
time_filters = []
|
time_filters = []
|
||||||
|
|
||||||
if is_timeseries:
|
if is_timeseries:
|
||||||
timestamp = dttm_col.get_timestamp_expression(time_grain)
|
timestamp = dttm_col.get_timestamp_expression(
|
||||||
|
time_grain=time_grain, template_processor=template_processor
|
||||||
|
)
|
||||||
# always put timestamp as the first column
|
# always put timestamp as the first column
|
||||||
select_exprs.insert(0, timestamp)
|
select_exprs.insert(0, timestamp)
|
||||||
groupby_all_columns[timestamp.name] = timestamp
|
groupby_all_columns[timestamp.name] = timestamp
|
||||||
@ -1186,7 +1198,9 @@ class SqlaTable(Model, BaseDatasource): # pylint: disable=too-many-public-metho
|
|||||||
|
|
||||||
if col_obj:
|
if col_obj:
|
||||||
if filter_grain:
|
if filter_grain:
|
||||||
sqla_col = col_obj.get_timestamp_expression(filter_grain)
|
sqla_col = col_obj.get_timestamp_expression(
|
||||||
|
time_grain=filter_grain, template_processor=template_processor
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
sqla_col = col_obj.get_sqla_col()
|
sqla_col = col_obj.get_sqla_col()
|
||||||
col_spec = db_engine_spec.get_column_spec(col_obj.type)
|
col_spec = db_engine_spec.get_column_spec(col_obj.type)
|
||||||
|
Loading…
Reference in New Issue
Block a user