mirror of
https://github.com/apache/superset.git
synced 2026-04-19 16:14:52 +00:00
fix(bigquery): calculated column cannot orderby in BigQuery (#17196)
* fix(bigquery): calculated column cannot orderby in BigQuery * typo * add ut * fix lint
This commit is contained in:
@@ -19,6 +19,7 @@ from unittest import mock
|
||||
|
||||
import pytest
|
||||
|
||||
from superset.connectors.sqla.models import TableColumn
|
||||
from superset.db_engine_specs import get_engine_specs
|
||||
from superset.db_engine_specs.base import (
|
||||
BaseEngineSpec,
|
||||
@@ -34,6 +35,7 @@ from superset.utils.core import get_example_database
|
||||
from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec
|
||||
from tests.integration_tests.test_app import app
|
||||
|
||||
from ..fixtures.birth_names_dashboard import load_birth_names_dashboard_with_slices
|
||||
from ..fixtures.energy_dashboard import load_energy_table_with_slice
|
||||
from ..fixtures.pyodbcRow import Row
|
||||
|
||||
@@ -273,6 +275,38 @@ class TestDbEngineSpecs(TestDbEngineSpec):
|
||||
result = BaseEngineSpec.pyodbc_rows_to_tuples(data)
|
||||
self.assertListEqual(result, data)
|
||||
|
||||
@mock.patch("superset.models.core.Database.db_engine_spec", BaseEngineSpec)
|
||||
@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices")
|
||||
def test_calculated_column_in_order_by_base_engine_spec(self):
|
||||
table = self.get_table(name="birth_names")
|
||||
TableColumn(
|
||||
column_name="gender_cc",
|
||||
type="VARCHAR(255)",
|
||||
table=table,
|
||||
expression="""
|
||||
case
|
||||
when gender=true then "male"
|
||||
else "female"
|
||||
end
|
||||
""",
|
||||
)
|
||||
|
||||
table.database.sqlalchemy_uri = "sqlite://"
|
||||
query_obj = {
|
||||
"groupby": ["gender_cc"],
|
||||
"is_timeseries": False,
|
||||
"filter": [],
|
||||
"orderby": [["gender_cc", True]],
|
||||
}
|
||||
sql = table.get_query_str(query_obj)
|
||||
assert (
|
||||
"""ORDER BY case
|
||||
when gender=true then "male"
|
||||
else "female"
|
||||
end ASC;"""
|
||||
in sql
|
||||
)
|
||||
|
||||
|
||||
def test_is_readonly():
|
||||
def is_readonly(sql: str) -> bool:
|
||||
|
||||
@@ -17,14 +17,19 @@
|
||||
import sys
|
||||
import unittest.mock as mock
|
||||
|
||||
import pytest
|
||||
from pandas import DataFrame
|
||||
from sqlalchemy import column
|
||||
|
||||
from superset.connectors.sqla.models import TableColumn
|
||||
from superset.db_engine_specs.base import BaseEngineSpec
|
||||
from superset.db_engine_specs.bigquery import BigQueryEngineSpec
|
||||
from superset.errors import ErrorLevel, SupersetError, SupersetErrorType
|
||||
from superset.sql_parse import Table
|
||||
from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec
|
||||
from tests.integration_tests.fixtures.birth_names_dashboard import (
|
||||
load_birth_names_dashboard_with_slices,
|
||||
)
|
||||
|
||||
|
||||
class TestBigQueryDbEngineSpec(TestDbEngineSpec):
|
||||
@@ -333,3 +338,30 @@ class TestBigQueryDbEngineSpec(TestDbEngineSpec):
|
||||
},
|
||||
)
|
||||
]
|
||||
|
||||
@mock.patch("superset.models.core.Database.db_engine_spec", BigQueryEngineSpec)
|
||||
@mock.patch("pybigquery._helpers.create_bigquery_client", mock.Mock)
|
||||
@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices")
|
||||
def test_calculated_column_in_order_by(self):
|
||||
table = self.get_table(name="birth_names")
|
||||
TableColumn(
|
||||
column_name="gender_cc",
|
||||
type="VARCHAR(255)",
|
||||
table=table,
|
||||
expression="""
|
||||
case
|
||||
when gender=true then "male"
|
||||
else "female"
|
||||
end
|
||||
""",
|
||||
)
|
||||
|
||||
table.database.sqlalchemy_uri = "bigquery://"
|
||||
query_obj = {
|
||||
"groupby": ["gender_cc"],
|
||||
"is_timeseries": False,
|
||||
"filter": [],
|
||||
"orderby": [["gender_cc", True]],
|
||||
}
|
||||
sql = table.get_query_str(query_obj)
|
||||
assert "ORDER BY gender_cc ASC" in sql
|
||||
|
||||
Reference in New Issue
Block a user