fix: dataset_macro (#23376)

This commit is contained in:
Beto Dealmeida 2023-03-14 16:29:12 -07:00 committed by GitHub
parent 1b95da7487
commit 1874f9a3b6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 10 deletions

View File

@ -876,12 +876,17 @@ class SqlaTable(Model, BaseDatasource): # pylint: disable=too-many-public-metho
def get_template_processor(self, **kwargs: Any) -> BaseTemplateProcessor:
return get_template_processor(table=self, database=self.database, **kwargs)
def get_query_str_extended(self, query_obj: QueryObjectDict) -> QueryStringExtended:
def get_query_str_extended(
self,
query_obj: QueryObjectDict,
mutate: bool = True,
) -> QueryStringExtended:
sqlaq = self.get_sqla_query(**query_obj)
sql = self.database.compile_sqla_query(sqlaq.sqla_query)
sql = self._apply_cte(sql, sqlaq.cte)
sql = sqlparse.format(sql, reindent=True)
sql = self.mutate_query_from_config(sql)
if mutate:
sql = self.mutate_query_from_config(sql)
return QueryStringExtended(
applied_template_filters=sqlaq.applied_template_filters,
applied_filter_columns=sqlaq.applied_filter_columns,

View File

@ -654,6 +654,6 @@ def dataset_macro(
"metrics": metrics if include_metrics else None,
"columns": columns,
}
sqla_query = dataset.get_query_str_extended(query_obj)
sqla_query = dataset.get_query_str_extended(query_obj, mutate=False)
sql = sqla_query.sql
return f"({sql}) AS dataset_{dataset_id}"
return f"(\n{sql}\n) AS dataset_{dataset_id}"

View File

@ -88,17 +88,20 @@ def test_dataset_macro(mocker: MockFixture) -> None:
assert (
dataset_macro(1)
== """(SELECT ds AS ds,
== """(
SELECT ds AS ds,
num_boys AS num_boys,
revenue AS revenue,
expenses AS expenses,
revenue-expenses AS profit
FROM my_schema.old_dataset) AS dataset_1"""
FROM my_schema.old_dataset
) AS dataset_1"""
)
assert (
dataset_macro(1, include_metrics=True)
== """(SELECT ds AS ds,
== """(
SELECT ds AS ds,
num_boys AS num_boys,
revenue AS revenue,
expenses AS expenses,
@ -109,18 +112,44 @@ GROUP BY ds,
num_boys,
revenue,
expenses,
revenue-expenses) AS dataset_1"""
revenue-expenses
) AS dataset_1"""
)
assert (
dataset_macro(1, include_metrics=True, columns=["ds"])
== """(SELECT ds AS ds,
== """(
SELECT ds AS ds,
COUNT(*) AS cnt
FROM my_schema.old_dataset
GROUP BY ds) AS dataset_1"""
GROUP BY ds
) AS dataset_1"""
)
DatasetDAO.find_by_id.return_value = None
with pytest.raises(DatasetNotFoundError) as excinfo:
dataset_macro(1)
assert str(excinfo.value) == "Dataset 1 not found!"
def test_dataset_macro_mutator_with_comments(mocker: MockFixture) -> None:
"""
Test ``dataset_macro`` when the mutator adds comment.
"""
def mutator(sql: str) -> str:
"""
A simple mutator that wraps the query in comments.
"""
return f"-- begin\n{sql}\n-- end"
DatasetDAO = mocker.patch("superset.datasets.dao.DatasetDAO")
DatasetDAO.find_by_id().get_query_str_extended().sql = mutator("SELECT 1")
assert (
dataset_macro(1)
== """(
-- begin
SELECT 1
-- end
) AS dataset_1"""
)