feat: add support for generic series limit (#16660)

* feat: add support for generic series limit

* refine series_columns logic

* update docs

* bump superset-ui

* add note to UPDATING.md

* remove default value for timeseries_limit
This commit is contained in:
Ville Brofeldt
2021-09-16 12:09:08 +03:00
committed by GitHub
parent 21f98ddc21
commit 836b5e2c86
14 changed files with 537 additions and 460 deletions

View File

@@ -35,7 +35,7 @@ import humanize
import prison
import pytest
import yaml
from sqlalchemy import and_, or_
from sqlalchemy import and_
from sqlalchemy.sql import func
from tests.integration_tests.fixtures.world_bank_dashboard import (
@@ -1956,3 +1956,24 @@ class TestChartApi(SupersetTestCase, ApiOwnersTestCaseMixin, InsertChartMixin):
"verbose_name",
"dtype",
]
@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices")
def test_chart_data_series_limit(self):
"""
Chart data API: Query total rows
"""
SERIES_LIMIT = 5
self.login(username="admin")
request_payload = get_query_context("birth_names")
request_payload["queries"][0]["columns"] = ["state", "name"]
request_payload["queries"][0]["series_columns"] = ["name"]
request_payload["queries"][0]["series_limit"] = SERIES_LIMIT
rv = self.post_assert_metric(CHART_DATA_URI, request_payload, "data")
response_payload = json.loads(rv.data.decode("utf-8"))
data = response_payload["result"][0]["data"]
unique_names = set(row["name"] for row in data)
self.maxDiff = None
self.assertEqual(len(unique_names), SERIES_LIMIT)
self.assertEqual(
set(column for column in data[0].keys()), {"state", "name", "sum__num"}
)

View File

@@ -29,7 +29,7 @@ query_birth_names = {
),
"time_grain_sqla": "P1D",
},
"groupby": ["name"],
"columns": ["name"],
"metrics": [{"label": "sum__num"}],
"orderby": [("sum__num", False)],
"row_limit": 100,

View File

@@ -432,6 +432,7 @@ class TestSqlaTableModel(SupersetTestCase):
from_dttm=None,
to_dttm=None,
extras=dict(time_grain_sqla="P1Y"),
series_limit=15 if inner_join and is_timeseries else None,
)
qr = tbl.query(query_obj)
self.assertEqual(qr.status, QueryStatus.SUCCESS)

View File

@@ -69,7 +69,7 @@ class TestQueryContext(SupersetTestCase):
# check basic properies
self.assertEqual(query.extras, payload_query["extras"])
self.assertEqual(query.filter, payload_query["filters"])
self.assertEqual(query.groupby, payload_query["groupby"])
self.assertEqual(query.columns, payload_query["columns"])
# metrics are mutated during creation
for metric_idx, metric in enumerate(query.metrics):
@@ -277,12 +277,20 @@ class TestQueryContext(SupersetTestCase):
"""
self.login(username="admin")
payload = get_query_context("birth_names")
columns = payload["queries"][0]["columns"]
payload["queries"][0]["groupby"] = columns
payload["queries"][0]["timeseries_limit"] = 99
payload["queries"][0]["timeseries_limit_metric"] = "sum__num"
del payload["queries"][0]["columns"]
payload["queries"][0]["granularity_sqla"] = "timecol"
payload["queries"][0]["having_filters"] = [{"col": "a", "op": "==", "val": "b"}]
query_context = ChartDataQueryContextSchema().load(payload)
self.assertEqual(len(query_context.queries), 1)
query_object = query_context.queries[0]
self.assertEqual(query_object.granularity, "timecol")
self.assertEqual(query_object.columns, columns)
self.assertEqual(query_object.series_limit, 99)
self.assertEqual(query_object.series_limit_metric, "sum__num")
self.assertIn("having_druid", query_object.extras)
@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices")