fix(Jinja): Extra cache keys for Jinja columns (#30715)

This commit is contained in:
Geido 2024-10-25 19:11:28 +03:00 committed by GitHub
parent 1c56857f0c
commit a12ccf2c1d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 55 additions and 1 deletions

View File

@ -116,7 +116,7 @@ from superset.superset_typing import (
)
from superset.utils import core as utils, json
from superset.utils.backports import StrEnum
from superset.utils.core import GenericDataType, MediumText
from superset.utils.core import GenericDataType, is_adhoc_column, MediumText
config = app.config
metadata = Model.metadata # pylint: disable=no-member
@ -1980,6 +1980,10 @@ class SqlaTable(
templatable_statements.append(extras["where"])
if "having" in extras:
templatable_statements.append(extras["having"])
if "columns" in query_obj:
templatable_statements += [
c["sqlExpression"] for c in query_obj["columns"] if is_adhoc_column(c)
]
if self.is_rls_supported:
templatable_statements += [
f.clause for f in security_manager.get_rls_filters(self)

View File

@ -911,6 +911,56 @@ def test_extra_cache_keys_in_sql_expression(
assert extra_cache_keys == expected_cache_keys
@pytest.mark.usefixtures("app_context")
@pytest.mark.parametrize(
"sql_expression,expected_cache_keys,has_extra_cache_keys",
[
("'{{ current_username() }}'", ["abc"], True),
("(user != 'abc')", [], False),
],
)
@patch("superset.jinja_context.get_user_id", return_value=1)
@patch("superset.jinja_context.get_username", return_value="abc")
@patch("superset.jinja_context.get_user_email", return_value="abc@test.com")
def test_extra_cache_keys_in_columns(
mock_user_email,
mock_username,
mock_user_id,
sql_expression,
expected_cache_keys,
has_extra_cache_keys,
):
table = SqlaTable(
table_name="test_has_no_extra_cache_keys_table",
sql="SELECT 'abc' as user",
database=get_example_database(),
)
base_query_obj = {
"granularity": None,
"from_dttm": None,
"to_dttm": None,
"groupby": [],
"metrics": [],
"is_timeseries": False,
"filter": [],
}
query_obj = dict(
**base_query_obj,
columns=[
{
"label": None,
"expressionType": "SQL",
"sqlExpression": sql_expression,
}
],
)
extra_cache_keys = table.get_extra_cache_keys(query_obj)
assert table.has_extra_cache_key_calls(query_obj) == has_extra_cache_keys
assert extra_cache_keys == expected_cache_keys
@pytest.mark.usefixtures("app_context")
@pytest.mark.parametrize(
"row,dimension,result",