From e480b4b94c1dc2ec5dc2f347764af1c1ca2bb8a4 Mon Sep 17 00:00:00 2001 From: Ville Brofeldt Date: Thu, 5 Aug 2021 12:32:24 +0300 Subject: [PATCH 01/11] feat(cross-filters): add support for temporal filters --- superset/charts/schemas.py | 5 +- superset/common/query_actions.py | 2 +- superset/common/query_object.py | 5 +- superset/connectors/sqla/models.py | 68 +++++++++++------ superset/db_engine_specs/base.py | 2 +- superset/typing.py | 2 +- superset/utils/core.py | 84 +++++++++++++-------- superset/viz.py | 6 +- tests/integration_tests/utils/core_tests.py | 45 +++++++++-- 9 files changed, 150 insertions(+), 69 deletions(-) diff --git a/superset/charts/schemas.py b/superset/charts/schemas.py index 726cf25d4b86b..ed14e918b7de6 100644 --- a/superset/charts/schemas.py +++ b/superset/charts/schemas.py @@ -756,7 +756,7 @@ class ChartDataPostProcessingOperationSchema(Schema): class ChartDataFilterSchema(Schema): col = fields.String( - description="The column to filter.", required=True, example="country" + description="The column to filter.", required=True, example="country", ) op = fields.String( # pylint: disable=invalid-name description="The comparison operator.", @@ -771,6 +771,9 @@ class ChartDataFilterSchema(Schema): "integer, decimal or list, depending on the operator.", example=["China", "France", "Japan"], ) + grain = fields.String( + description="Optional time grain for temporal filters", example="PT1M", + ) class ChartDataExtrasSchema(Schema): diff --git a/superset/common/query_actions.py b/superset/common/query_actions.py index d0ef7d3f26575..fa2175d22f69b 100644 --- a/superset/common/query_actions.py +++ b/superset/common/query_actions.py @@ -104,7 +104,7 @@ def _get_full( payload["data"] = query_context.get_data(df) del payload["df"] - filters = query_obj.filter + filters = query_obj.filter or [] filter_columns = cast(List[str], [flt.get("col") for flt in filters]) columns = set(datasource.column_names) applied_time_columns, rejected_time_columns = get_time_filter_status( diff --git a/superset/common/query_object.py b/superset/common/query_object.py index 8ab4c620f4c77..d6528db7ea704 100644 --- a/superset/common/query_object.py +++ b/superset/common/query_object.py @@ -36,6 +36,7 @@ get_metric_names, is_adhoc_metric, json_int_dttm_ser, + QueryObjectFilterClause, ) from superset.utils.date_parser import get_since_until, parse_human_timedelta from superset.utils.hashing import md5_sha_from_dict @@ -85,7 +86,7 @@ class QueryObject: metrics: Optional[List[Metric]] row_limit: int row_offset: int - filter: List[Dict[str, Any]] + filter: Optional[List[QueryObjectFilterClause]] timeseries_limit: int timeseries_limit_metric: Optional[Metric] order_desc: bool @@ -108,7 +109,7 @@ def __init__( granularity: Optional[str] = None, metrics: Optional[List[Metric]] = None, groupby: Optional[List[str]] = None, - filters: Optional[List[Dict[str, Any]]] = None, + filters: Optional[List[QueryObjectFilterClause]] = None, time_range: Optional[str] = None, time_shift: Optional[str] = None, is_timeseries: Optional[bool] = None, diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index 1a556073a5636..b41d0ca03cb7d 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -86,7 +86,11 @@ from superset.sql_parse import ParsedQuery from superset.typing import AdhocMetric, Metric, OrderBy, QueryObjectDict from superset.utils import core as utils -from superset.utils.core import GenericDataType, remove_duplicates +from superset.utils.core import ( + GenericDataType, + QueryObjectFilterClause, + remove_duplicates, +) config = app.config metadata = Model.metadata # pylint: disable=no-member @@ -303,13 +307,15 @@ def get_timestamp_expression( pdf = self.python_date_format is_epoch = pdf in ("epoch_s", "epoch_ms") + column_spec = self.db_engine_spec.get_column_spec(self.type) + type_ = column_spec.sqla_type if column_spec else DateTime if not self.expression and not time_grain and not is_epoch: - sqla_col = column(self.column_name, type_=DateTime) + sqla_col = column(self.column_name, type_=type_) return self.table.make_sqla_column_compatible(sqla_col, label) if self.expression: - col = literal_column(self.expression) + col = literal_column(self.expression, type_=type_) else: - col = column(self.column_name) + col = column(self.column_name, type_=type_) time_expr = self.db_engine_spec.get_timestamp_expr( col, pdf, time_grain, self.type ) @@ -935,7 +941,7 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma columns: Optional[List[str]] = None, groupby: Optional[List[str]] = None, filter: Optional[ # pylint: disable=redefined-builtin - List[Dict[str, Any]] + List[QueryObjectFilterClause] ] = None, is_timeseries: bool = True, timeseries_limit: int = 15, @@ -1056,6 +1062,8 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma # filter out the pseudo column __timestamp from columns columns = columns or [] columns = [col for col in columns if col != utils.DTTM_ALIAS] + time_grain = extras.get("time_grain_sqla") + dttm_col = columns_by_name.get(granularity) if granularity else None if need_groupby: # dedup columns while preserving order @@ -1063,7 +1071,6 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma for selected in columns: # if groupby field/expr equals granularity field/expr if selected == granularity: - time_grain = extras.get("time_grain_sqla") sqla_col = columns_by_name[selected] outer = sqla_col.get_timestamp_expression(time_grain, selected) # if groupby field equals a selected column @@ -1087,15 +1094,13 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma groupby_exprs_with_timestamp = OrderedDict(groupby_exprs_sans_timestamp.items()) if granularity: - if granularity not in columns_by_name: + if granularity not in columns_by_name or not dttm_col: raise QueryObjectValidationError( _( 'Time column "%(col)s" does not exist in dataset', col=granularity, ) ) - dttm_col = columns_by_name[granularity] - time_grain = extras.get("time_grain_sqla") time_filters = [] if is_timeseries: @@ -1150,7 +1155,19 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma col = flt["col"] val = flt.get("val") op = flt["op"].upper() - col_obj = columns_by_name.get(col) + if col == utils.DTTM_ALIAS and is_timeseries and dttm_col: + col_obj = dttm_col + elif col in columns_by_name: + col_obj = columns_by_name[col] + else: + raise QueryObjectValidationError( + _("Invalid column reference in filter: %(column)s", column=col) + ) + filter_grain = flt.get("grain") + if filter_grain: + sqla_col = col_obj.get_timestamp_expression(filter_grain) + else: + sqla_col = col_obj.get_sqla_col() if is_feature_enabled("ENABLE_TEMPLATE_REMOVE_FILTERS"): if col in removed_filters: @@ -1180,24 +1197,24 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma ) if None in eq: eq = [x for x in eq if x is not None] - is_null_cond = col_obj.get_sqla_col().is_(None) + is_null_cond = sqla_col.is_(None) if eq: - cond = or_(is_null_cond, col_obj.get_sqla_col().in_(eq)) + cond = or_(is_null_cond, sqla_col.in_(eq)) else: cond = is_null_cond else: - cond = col_obj.get_sqla_col().in_(eq) + cond = sqla_col.in_(eq) if op == utils.FilterOperator.NOT_IN.value: cond = ~cond where_clause_and.append(cond) elif op == utils.FilterOperator.IS_NULL.value: - where_clause_and.append(col_obj.get_sqla_col().is_(None)) + where_clause_and.append(sqla_col.is_(None)) elif op == utils.FilterOperator.IS_NOT_NULL.value: - where_clause_and.append(col_obj.get_sqla_col().isnot(None)) + where_clause_and.append(sqla_col.isnot(None)) elif op == utils.FilterOperator.IS_TRUE.value: - where_clause_and.append(col_obj.get_sqla_col().is_(True)) + where_clause_and.append(sqla_col.is_(True)) elif op == utils.FilterOperator.IS_FALSE.value: - where_clause_and.append(col_obj.get_sqla_col().is_(False)) + where_clause_and.append(sqla_col.is_(False)) else: if eq is None: raise QueryObjectValidationError( @@ -1207,21 +1224,21 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma ) ) if op == utils.FilterOperator.EQUALS.value: - where_clause_and.append(col_obj.get_sqla_col() == eq) + where_clause_and.append(sqla_col == eq) elif op == utils.FilterOperator.NOT_EQUALS.value: - where_clause_and.append(col_obj.get_sqla_col() != eq) + where_clause_and.append(sqla_col != eq) elif op == utils.FilterOperator.GREATER_THAN.value: - where_clause_and.append(col_obj.get_sqla_col() > eq) + where_clause_and.append(sqla_col > eq) elif op == utils.FilterOperator.LESS_THAN.value: - where_clause_and.append(col_obj.get_sqla_col() < eq) + where_clause_and.append(sqla_col < eq) elif op == utils.FilterOperator.GREATER_THAN_OR_EQUALS.value: - where_clause_and.append(col_obj.get_sqla_col() >= eq) + where_clause_and.append(sqla_col >= eq) elif op == utils.FilterOperator.LESS_THAN_OR_EQUALS.value: - where_clause_and.append(col_obj.get_sqla_col() <= eq) + where_clause_and.append(sqla_col <= eq) elif op == utils.FilterOperator.LIKE.value: - where_clause_and.append(col_obj.get_sqla_col().like(eq)) + where_clause_and.append(sqla_col.like(eq)) elif op == utils.FilterOperator.ILIKE.value: - where_clause_and.append(col_obj.get_sqla_col().ilike(eq)) + where_clause_and.append(sqla_col.ilike(eq)) else: raise QueryObjectValidationError( _("Invalid filter operation type: %(op)s", op=op) @@ -1281,6 +1298,7 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma and timeseries_limit and not time_groupby_inline and groupby_exprs_sans_timestamp + and dttm_col ): if db_engine_spec.allows_joins: # some sql dialects require for order by expressions diff --git a/superset/db_engine_specs/base.py b/superset/db_engine_specs/base.py index 1ce082c4f66f9..7e456ce96335c 100644 --- a/superset/db_engine_specs/base.py +++ b/superset/db_engine_specs/base.py @@ -381,7 +381,7 @@ def get_timestamp_expr( elif pdf == "epoch_ms": time_expr = time_expr.replace("{col}", cls.epoch_ms_to_dttm()) - return TimestampExpression(time_expr, col, type_=DateTime) + return TimestampExpression(time_expr, col, type_=col.type) @classmethod def get_time_grains(cls) -> Tuple[TimeGrain, ...]: diff --git a/superset/typing.py b/superset/typing.py index ed8ed0e0fe096..009c9d9460364 100644 --- a/superset/typing.py +++ b/superset/typing.py @@ -42,7 +42,7 @@ class AdhocMetric(TypedDict): ] DbapiDescription = Union[List[DbapiDescriptionRow], Tuple[DbapiDescriptionRow, ...]] DbapiResult = Sequence[Union[List[Any], Tuple[Any, ...]]] -FilterValue = Union[datetime, float, int, str] +FilterValue = Union[bool, datetime, float, int, str] FilterValues = Union[FilterValue, List[FilterValue], Tuple[FilterValue]] FormData = Dict[str, Any] Granularity = Union[str, Dict[str, Union[str, float]]] diff --git a/superset/utils/core.py b/superset/utils/core.py index 97392878ac040..fd81f26bd03e0 100644 --- a/superset/utils/core.py +++ b/superset/utils/core.py @@ -96,7 +96,7 @@ SupersetException, SupersetTimeoutException, ) -from superset.typing import AdhocMetric, FlaskResponse, FormData, Metric +from superset.typing import AdhocMetric, FilterValues, FlaskResponse, FormData, Metric from superset.utils.dates import datetime_to_epoch, EPOCH from superset.utils.hashing import md5_sha_from_dict, md5_sha_from_str @@ -189,6 +189,25 @@ class DatasourceDict(TypedDict): id: int +class AdhocFilterClause(TypedDict, total=False): + clause: str + expressionType: str + filterOptionName: Optional[str] + comparator: Optional[FilterValues] + operator: str + subject: str + isExtra: Optional[bool] + sqlExpression: Optional[str] + + +class QueryObjectFilterClause(TypedDict, total=False): + col: str + op: str + val: Optional[FilterValues] + grain: Optional[str] + isExtra: Optional[bool] + + class ExtraFiltersTimeColumnType(str, Enum): GRANULARITY = "__granularity" TIME_COL = "__time_col" @@ -988,28 +1007,29 @@ def zlib_decompress(blob: bytes, decode: Optional[bool] = True) -> Union[bytes, return decompressed.decode("utf-8") if decode else decompressed -def to_adhoc( - filt: Dict[str, Any], expression_type: str = "SIMPLE", clause: str = "where" -) -> Dict[str, Any]: - result = { - "clause": clause.upper(), - "expressionType": expression_type, +def simple_filter_to_adhoc(filt: QueryObjectFilterClause) -> AdhocFilterClause: + result: AdhocFilterClause = { + "clause": "WHERE", + "expressionType": "SIMPLE", "isExtra": bool(filt.get("isExtra")), + "comparator": filt.get("val"), + "operator": filt["op"], + "subject": filt["col"], } + result["filterOptionName"] = md5_sha_from_dict(cast(Dict[Any, Any], result)) + + return result - if expression_type == "SIMPLE": - result.update( - { - "comparator": filt.get("val"), - "operator": filt.get("op"), - "subject": filt.get("col"), - } - ) - elif expression_type == "SQL": - result.update({"sqlExpression": filt.get(clause)}) - deterministic_name = md5_sha_from_dict(result) - result["filterOptionName"] = deterministic_name +def form_data_to_adhoc(form_data: Dict[str, Any], clause: str,) -> AdhocFilterClause: + if clause not in ("where", "having"): + raise ValueError(__("Unsupported clause type: %(clause)s", clause=clause)) + result: AdhocFilterClause = { + "clause": clause.upper(), + "expressionType": "SQL", + "sqlExpression": form_data.get(clause), + } + result["filterOptionName"] = md5_sha_from_dict(cast(Dict[Any, Any], result)) return result @@ -1021,7 +1041,7 @@ def merge_extra_form_data(form_data: Dict[str, Any]) -> None: """ filter_keys = ["filters", "adhoc_filters"] extra_form_data = form_data.pop("extra_form_data", {}) - append_filters = extra_form_data.get("filters", None) + append_filters: List[QueryObjectFilterClause] = extra_form_data.get("filters", None) # merge append extras for key in [key for key in EXTRA_FORM_DATA_APPEND_KEYS if key not in filter_keys]: @@ -1046,13 +1066,15 @@ def merge_extra_form_data(form_data: Dict[str, Any]) -> None: if extras: form_data["extras"] = extras - adhoc_filters = form_data.get("adhoc_filters", []) + adhoc_filters: List[AdhocFilterClause] = form_data.get("adhoc_filters", []) form_data["adhoc_filters"] = adhoc_filters - append_adhoc_filters = extra_form_data.get("adhoc_filters", []) - adhoc_filters.extend({"isExtra": True, **fltr} for fltr in append_adhoc_filters) + append_adhoc_filters: List[AdhocFilterClause] = extra_form_data.get( + "adhoc_filters", [] + ) + adhoc_filters.extend({"isExtra": True, **fltr} for fltr in append_adhoc_filters) # type: ignore if append_filters: adhoc_filters.extend( - to_adhoc({"isExtra": True, **fltr}) for fltr in append_filters if fltr + simple_filter_to_adhoc({"isExtra": True, **fltr}) for fltr in append_filters if fltr # type: ignore ) @@ -1119,16 +1141,16 @@ def get_filter_key(f: Dict[str, Any]) -> str: # Add filters for unequal lists # order doesn't matter if set(existing_filters[filter_key]) != set(filtr["val"]): - adhoc_filters.append(to_adhoc(filtr)) + adhoc_filters.append(simple_filter_to_adhoc(filtr)) else: - adhoc_filters.append(to_adhoc(filtr)) + adhoc_filters.append(simple_filter_to_adhoc(filtr)) else: # Do not add filter if same value already exists if filtr["val"] != existing_filters[filter_key]: - adhoc_filters.append(to_adhoc(filtr)) + adhoc_filters.append(simple_filter_to_adhoc(filtr)) else: # Filter not found, add it - adhoc_filters.append(to_adhoc(filtr)) + adhoc_filters.append(simple_filter_to_adhoc(filtr)) # Remove extra filters from the form data since no longer needed del form_data["extra_filters"] @@ -1238,16 +1260,18 @@ def convert_legacy_filters_into_adhoc( # pylint: disable=invalid-name ) -> None: mapping = {"having": "having_filters", "where": "filters"} + adhoc_filters: List[AdhocFilterClause] = form_data.get("adhoc_filters", []) + form_data["adhoc_filters"] = adhoc_filters if not form_data.get("adhoc_filters"): form_data["adhoc_filters"] = [] for clause, filters in mapping.items(): if clause in form_data and form_data[clause] != "": - form_data["adhoc_filters"].append(to_adhoc(form_data, "SQL", clause)) + adhoc_filters.append(form_data_to_adhoc(form_data, clause)) if filters in form_data: for filt in filter(lambda x: x is not None, form_data[filters]): - form_data["adhoc_filters"].append(to_adhoc(filt, "SIMPLE", clause)) + adhoc_filters.append(simple_filter_to_adhoc(filt)) for key in ("filters", "having", "having_filters", "where"): if key in form_data: diff --git a/superset/viz.py b/superset/viz.py index 3dc799eae32bc..cd19807b11b19 100644 --- a/superset/viz.py +++ b/superset/viz.py @@ -74,7 +74,7 @@ JS_MAX_INTEGER, merge_extra_filters, QueryMode, - to_adhoc, + simple_filter_to_adhoc, ) from superset.utils.date_parser import get_since_until, parse_past_timedelta from superset.utils.dates import datetime_to_epoch @@ -2475,7 +2475,9 @@ def add_null_filters(self) -> None: spatial_columns.add(line_column) for column in sorted(spatial_columns): - filter_ = to_adhoc({"col": column, "op": "IS NOT NULL", "val": ""}) + filter_ = simple_filter_to_adhoc( + {"col": column, "op": "IS NOT NULL", "val": ""} + ) fd["adhoc_filters"].append(filter_) def query_obj(self) -> QueryObjectDict: diff --git a/tests/integration_tests/utils/core_tests.py b/tests/integration_tests/utils/core_tests.py index 8699dd7ea7f65..664d841ded2a2 100644 --- a/tests/integration_tests/utils/core_tests.py +++ b/tests/integration_tests/utils/core_tests.py @@ -17,10 +17,10 @@ # pylint: disable=no-self-use import pytest -from superset.utils.core import to_adhoc +from superset.utils.core import form_data_to_adhoc, simple_filter_to_adhoc -def test_to_adhoc_generates_deterministic_values(): +def test_simple_filter_to_adhoc_generates_deterministic_values(): input_1 = { "op": "IS NOT NULL", "col": "LATITUDE", @@ -30,8 +30,8 @@ def test_to_adhoc_generates_deterministic_values(): input_2 = {**input_1, "col": "LONGITUDE"} # The result is the same when given the same input - assert to_adhoc(input_1) == to_adhoc(input_1) - assert to_adhoc(input_1) == { + assert simple_filter_to_adhoc(input_1) == simple_filter_to_adhoc(input_1) + assert simple_filter_to_adhoc(input_1) == { "clause": "WHERE", "expressionType": "SIMPLE", "isExtra": False, @@ -42,8 +42,8 @@ def test_to_adhoc_generates_deterministic_values(): } # The result is different when given different input - assert to_adhoc(input_1) != to_adhoc(input_2) - assert to_adhoc(input_2) == { + assert simple_filter_to_adhoc(input_1) != simple_filter_to_adhoc(input_2) + assert simple_filter_to_adhoc(input_2) == { "clause": "WHERE", "expressionType": "SIMPLE", "isExtra": False, @@ -52,3 +52,36 @@ def test_to_adhoc_generates_deterministic_values(): "subject": "LONGITUDE", "filterOptionName": "c5f283f727d4dfc6258b351d4a8663bc", } + + +def test_form_data_to_adhoc_generates_deterministic_values(): + form_data = {"where": "1 = 1", "having": "count(*) > 1"} + + # The result is the same when given the same input + assert form_data_to_adhoc(form_data, "where") == form_data_to_adhoc( + form_data, "where" + ) + assert form_data_to_adhoc(form_data, "where") == { + "clause": "WHERE", + "expressionType": "SQL", + "sqlExpression": "1 = 1", + "filterOptionName": "99fe79985afbddea4492626dc6a87b74", + } + + # The result is different when given different input + assert form_data_to_adhoc(form_data, "having") == form_data_to_adhoc( + form_data, "having" + ) + assert form_data_to_adhoc(form_data, "having") == { + "clause": "HAVING", + "expressionType": "SQL", + "sqlExpression": "count(*) > 1", + "filterOptionName": "1da11f6b709c3190daeabb84f77fc8c2", + } + + +def test_form_data_to_adhoc_incorrect_clause_type(): + form_data = {"where": "1 = 1", "having": "count(*) > 1"} + + with pytest.raises(ValueError): + form_data_to_adhoc(form_data, "foobar") From a11c77a4ebacc4f15dfebeed5ad422a3b9dc3ae3 Mon Sep 17 00:00:00 2001 From: Ville Brofeldt Date: Mon, 9 Aug 2021 13:17:00 +0300 Subject: [PATCH 02/11] fix test --- superset/utils/core.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/superset/utils/core.py b/superset/utils/core.py index fd81f26bd03e0..5439efc514d85 100644 --- a/superset/utils/core.py +++ b/superset/utils/core.py @@ -1260,10 +1260,9 @@ def convert_legacy_filters_into_adhoc( # pylint: disable=invalid-name ) -> None: mapping = {"having": "having_filters", "where": "filters"} - adhoc_filters: List[AdhocFilterClause] = form_data.get("adhoc_filters", []) - form_data["adhoc_filters"] = adhoc_filters if not form_data.get("adhoc_filters"): - form_data["adhoc_filters"] = [] + adhoc_filters: List[AdhocFilterClause] = [] + form_data["adhoc_filters"] = adhoc_filters for clause, filters in mapping.items(): if clause in form_data and form_data[clause] != "": From 846abaafc8e58557f40a8fc33a04c5d82a625df3 Mon Sep 17 00:00:00 2001 From: Ville Brofeldt Date: Mon, 9 Aug 2021 13:40:19 +0300 Subject: [PATCH 03/11] make filter optional --- superset/connectors/sqla/models.py | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index b41d0ca03cb7d..cd93e46bb591d 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -1155,19 +1155,12 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma col = flt["col"] val = flt.get("val") op = flt["op"].upper() - if col == utils.DTTM_ALIAS and is_timeseries and dttm_col: - col_obj = dttm_col - elif col in columns_by_name: - col_obj = columns_by_name[col] - else: - raise QueryObjectValidationError( - _("Invalid column reference in filter: %(column)s", column=col) - ) + col_obj = ( + dttm_col + if col == utils.DTTM_ALIAS and is_timeseries and dttm_col + else columns_by_name.get(col) + ) filter_grain = flt.get("grain") - if filter_grain: - sqla_col = col_obj.get_timestamp_expression(filter_grain) - else: - sqla_col = col_obj.get_sqla_col() if is_feature_enabled("ENABLE_TEMPLATE_REMOVE_FILTERS"): if col in removed_filters: @@ -1175,6 +1168,10 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma continue if col_obj: + if filter_grain: + sqla_col = col_obj.get_timestamp_expression(filter_grain) + else: + sqla_col = col_obj.get_sqla_col() col_spec = db_engine_spec.get_column_spec(col_obj.type) is_list_target = op in ( utils.FilterOperator.IN.value, From 63251e9db68a8cf7de5771de7d8babd0cc024f41 Mon Sep 17 00:00:00 2001 From: Ville Brofeldt Date: Mon, 9 Aug 2021 14:42:08 +0300 Subject: [PATCH 04/11] remove mocks --- superset/utils/core.py | 13 +++--- tests/integration_tests/utils_tests.py | 60 ++++++++++++++------------ 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/superset/utils/core.py b/superset/utils/core.py index 5439efc514d85..a6680d2d8f309 100644 --- a/superset/utils/core.py +++ b/superset/utils/core.py @@ -1007,21 +1007,24 @@ def zlib_decompress(blob: bytes, decode: Optional[bool] = True) -> Union[bytes, return decompressed.decode("utf-8") if decode else decompressed -def simple_filter_to_adhoc(filt: QueryObjectFilterClause) -> AdhocFilterClause: +def simple_filter_to_adhoc( + filt: QueryObjectFilterClause, clause: str = "where", +) -> AdhocFilterClause: result: AdhocFilterClause = { - "clause": "WHERE", + "clause": clause.upper(), "expressionType": "SIMPLE", - "isExtra": bool(filt.get("isExtra")), "comparator": filt.get("val"), "operator": filt["op"], "subject": filt["col"], } + if filt.get("isExtra"): + result["isExtra"] = True result["filterOptionName"] = md5_sha_from_dict(cast(Dict[Any, Any], result)) return result -def form_data_to_adhoc(form_data: Dict[str, Any], clause: str,) -> AdhocFilterClause: +def form_data_to_adhoc(form_data: Dict[str, Any], clause: str) -> AdhocFilterClause: if clause not in ("where", "having"): raise ValueError(__("Unsupported clause type: %(clause)s", clause=clause)) result: AdhocFilterClause = { @@ -1270,7 +1273,7 @@ def convert_legacy_filters_into_adhoc( # pylint: disable=invalid-name if filters in form_data: for filt in filter(lambda x: x is not None, form_data[filters]): - adhoc_filters.append(simple_filter_to_adhoc(filt)) + adhoc_filters.append(simple_filter_to_adhoc(filt, clause)) for key in ("filters", "having", "having_filters", "where"): if key in form_data: diff --git a/tests/integration_tests/utils_tests.py b/tests/integration_tests/utils_tests.py index 2d668329d3ebf..07a444519ac63 100644 --- a/tests/integration_tests/utils_tests.py +++ b/tests/integration_tests/utils_tests.py @@ -85,19 +85,6 @@ from .fixtures.certificates import ssl_certificate -def mock_to_adhoc(filt, expressionType="SIMPLE", clause="where"): - result = {"clause": clause.upper(), "expressionType": expressionType} - - if expressionType == "SIMPLE": - result.update( - {"comparator": filt["val"], "operator": filt["op"], "subject": filt["col"]} - ) - elif expressionType == "SQL": - result.update({"sqlExpression": filt[clause]}) - - return result - - class TestUtils(SupersetTestCase): def test_json_int_dttm_ser(self): dttm = datetime(2020, 1, 1) @@ -137,7 +124,6 @@ def test_zlib_compression(self): got_str = zlib_decompress(blob) self.assertEqual(json_str, got_str) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_merge_extra_filters(self): # does nothing if no extra filters form_data = {"A": 1, "B": 2, "c": "test"} @@ -168,6 +154,8 @@ def test_merge_extra_filters(self): "clause": "WHERE", "comparator": "someval", "expressionType": "SIMPLE", + "filterOptionName": "90cfb3c34852eb3bc741b0cc20053b46", + "isExtra": True, "operator": "in", "subject": "a", }, @@ -175,6 +163,8 @@ def test_merge_extra_filters(self): "clause": "WHERE", "comparator": ["c1", "c2"], "expressionType": "SIMPLE", + "filterOptionName": "6c178d069965f1c02640661280415d96", + "isExtra": True, "operator": "==", "subject": "B", }, @@ -212,6 +202,8 @@ def test_merge_extra_filters(self): "clause": "WHERE", "comparator": "someval", "expressionType": "SIMPLE", + "filterOptionName": "90cfb3c34852eb3bc741b0cc20053b46", + "isExtra": True, "operator": "in", "subject": "a", }, @@ -219,6 +211,8 @@ def test_merge_extra_filters(self): "clause": "WHERE", "comparator": ["c1", "c2"], "expressionType": "SIMPLE", + "filterOptionName": "6c178d069965f1c02640661280415d96", + "isExtra": True, "operator": "==", "subject": "B", }, @@ -244,6 +238,8 @@ def test_merge_extra_filters(self): "clause": "WHERE", "comparator": "hello", "expressionType": "SIMPLE", + "filterOptionName": "e3cbdd92a2ae23ca92c6d7fca42e36a6", + "isExtra": True, "operator": "like", "subject": "A", } @@ -264,7 +260,6 @@ def test_merge_extra_filters(self): merge_extra_filters(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_merge_extra_filters_ignores_empty_filters(self): form_data = { "extra_filters": [ @@ -276,7 +271,6 @@ def test_merge_extra_filters_ignores_empty_filters(self): merge_extra_filters(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_merge_extra_filters_ignores_nones(self): form_data = { "adhoc_filters": [ @@ -305,7 +299,6 @@ def test_merge_extra_filters_ignores_nones(self): merge_extra_filters(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_merge_extra_filters_ignores_equal_filters(self): form_data = { "extra_filters": [ @@ -366,7 +359,6 @@ def test_merge_extra_filters_ignores_equal_filters(self): merge_extra_filters(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_merge_extra_filters_merges_different_val_types(self): form_data = { "extra_filters": [ @@ -410,6 +402,8 @@ def test_merge_extra_filters_merges_different_val_types(self): "clause": "WHERE", "comparator": ["g1", "g2"], "expressionType": "SIMPLE", + "filterOptionName": "c11969c994b40a83a4ae7d48ff1ea28e", + "isExtra": True, "operator": "in", "subject": "a", }, @@ -460,6 +454,8 @@ def test_merge_extra_filters_merges_different_val_types(self): "clause": "WHERE", "comparator": "someval", "expressionType": "SIMPLE", + "filterOptionName": "90cfb3c34852eb3bc741b0cc20053b46", + "isExtra": True, "operator": "in", "subject": "a", }, @@ -469,7 +465,6 @@ def test_merge_extra_filters_merges_different_val_types(self): merge_extra_filters(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_merge_extra_filters_adds_unequal_lists(self): form_data = { "extra_filters": [ @@ -513,6 +508,8 @@ def test_merge_extra_filters_adds_unequal_lists(self): "clause": "WHERE", "comparator": ["g1", "g2", "g3"], "expressionType": "SIMPLE", + "filterOptionName": "21cbb68af7b17e62b3b2f75e2190bfd7", + "isExtra": True, "operator": "in", "subject": "a", }, @@ -520,6 +517,8 @@ def test_merge_extra_filters_adds_unequal_lists(self): "clause": "WHERE", "comparator": ["c1", "c2", "c3"], "expressionType": "SIMPLE", + "filterOptionName": "0a8dcb928f1f4bba97643c6e68d672f1", + "isExtra": True, "operator": "==", "subject": "B", }, @@ -580,18 +579,21 @@ def test_validate_json(self): with self.assertRaises(SupersetException): validate_json(invalid) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_convert_legacy_filters_into_adhoc_where(self): form_data = {"where": "a = 1"} expected = { "adhoc_filters": [ - {"clause": "WHERE", "expressionType": "SQL", "sqlExpression": "a = 1"} + { + "clause": "WHERE", + "expressionType": "SQL", + "filterOptionName": "46fb6d7891e23596e42ae38da94a57e0", + "sqlExpression": "a = 1", + } ] } convert_legacy_filters_into_adhoc(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_convert_legacy_filters_into_adhoc_filters(self): form_data = {"filters": [{"col": "a", "op": "in", "val": "someval"}]} expected = { @@ -600,6 +602,7 @@ def test_convert_legacy_filters_into_adhoc_filters(self): "clause": "WHERE", "comparator": "someval", "expressionType": "SIMPLE", + "filterOptionName": "135c7ee246666b840a3d7a9c3a30cf38", "operator": "in", "subject": "a", } @@ -608,7 +611,6 @@ def test_convert_legacy_filters_into_adhoc_filters(self): convert_legacy_filters_into_adhoc(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_convert_legacy_filters_into_adhoc_having(self): form_data = {"having": "COUNT(1) = 1"} expected = { @@ -616,6 +618,7 @@ def test_convert_legacy_filters_into_adhoc_having(self): { "clause": "HAVING", "expressionType": "SQL", + "filterOptionName": "683f1c26466ab912f75a00842e0f2f7b", "sqlExpression": "COUNT(1) = 1", } ] @@ -623,7 +626,6 @@ def test_convert_legacy_filters_into_adhoc_having(self): convert_legacy_filters_into_adhoc(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_convert_legacy_filters_into_adhoc_having_filters(self): form_data = {"having_filters": [{"col": "COUNT(1)", "op": "==", "val": 1}]} expected = { @@ -632,6 +634,7 @@ def test_convert_legacy_filters_into_adhoc_having_filters(self): "clause": "HAVING", "comparator": 1, "expressionType": "SIMPLE", + "filterOptionName": "967d0fb409f6d9c7a6c03a46cf933c9c", "operator": "==", "subject": "COUNT(1)", } @@ -640,18 +643,21 @@ def test_convert_legacy_filters_into_adhoc_having_filters(self): convert_legacy_filters_into_adhoc(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_convert_legacy_filters_into_adhoc_present_and_empty(self): form_data = {"adhoc_filters": [], "where": "a = 1"} expected = { "adhoc_filters": [ - {"clause": "WHERE", "expressionType": "SQL", "sqlExpression": "a = 1"} + { + "clause": "WHERE", + "expressionType": "SQL", + "filterOptionName": "46fb6d7891e23596e42ae38da94a57e0", + "sqlExpression": "a = 1", + } ] } convert_legacy_filters_into_adhoc(form_data) self.assertEqual(form_data, expected) - @patch("superset.utils.core.to_adhoc", mock_to_adhoc) def test_convert_legacy_filters_into_adhoc_present_and_nonempty(self): form_data = { "adhoc_filters": [ From fc375cde70e603808102d188cd177dd98f3113c5 Mon Sep 17 00:00:00 2001 From: Ville Brofeldt Date: Mon, 9 Aug 2021 15:01:59 +0300 Subject: [PATCH 05/11] fix more tests --- superset/db_engine_specs/base.py | 2 +- superset/utils/core.py | 12 +++++++++--- tests/integration_tests/viz_tests.py | 13 +++++-------- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/superset/db_engine_specs/base.py b/superset/db_engine_specs/base.py index 7e456ce96335c..261bedee94dab 100644 --- a/superset/db_engine_specs/base.py +++ b/superset/db_engine_specs/base.py @@ -44,7 +44,7 @@ from flask_babel import gettext as __, lazy_gettext as _ from marshmallow import fields, Schema from marshmallow.validate import Range -from sqlalchemy import column, DateTime, select, types +from sqlalchemy import column, select, types from sqlalchemy.engine.base import Engine from sqlalchemy.engine.interfaces import Compiled, Dialect from sqlalchemy.engine.reflection import Inspector diff --git a/superset/utils/core.py b/superset/utils/core.py index a6680d2d8f309..712adacafb770 100644 --- a/superset/utils/core.py +++ b/superset/utils/core.py @@ -202,7 +202,7 @@ class AdhocFilterClause(TypedDict, total=False): class QueryObjectFilterClause(TypedDict, total=False): col: str - op: str + op: str # pylint: disable=invalid-name val: Optional[FilterValues] grain: Optional[str] isExtra: Optional[bool] @@ -1074,10 +1074,16 @@ def merge_extra_form_data(form_data: Dict[str, Any]) -> None: append_adhoc_filters: List[AdhocFilterClause] = extra_form_data.get( "adhoc_filters", [] ) - adhoc_filters.extend({"isExtra": True, **fltr} for fltr in append_adhoc_filters) # type: ignore + adhoc_filters.extend( + {"isExtra": True, **fltr} for fltr in append_adhoc_filters # type: ignore + ) if append_filters: adhoc_filters.extend( - simple_filter_to_adhoc({"isExtra": True, **fltr}) for fltr in append_filters if fltr # type: ignore + simple_filter_to_adhoc( + {"isExtra": True, **fltr} # type: ignore + ) + for fltr in append_filters + if fltr ) diff --git a/tests/integration_tests/viz_tests.py b/tests/integration_tests/viz_tests.py index c3370ab754fe2..4b154babb4c4b 100644 --- a/tests/integration_tests/viz_tests.py +++ b/tests/integration_tests/viz_tests.py @@ -1196,42 +1196,38 @@ def test_filter_nulls(self): { "clause": "WHERE", "expressionType": "SIMPLE", - "filterOptionName": "bfa3a42a6f3de3c781b7d4f8e8d6613d", + "filterOptionName": "c7f171cf3204bcbf456acfeac5cd9afd", "comparator": "", "operator": "IS NOT NULL", "subject": "lat", - "isExtra": False, }, { "clause": "WHERE", "expressionType": "SIMPLE", - "filterOptionName": "2d35d87b57c6f1a5ae139f1a6b0cbd0a", + "filterOptionName": "52634073fbb8ae0a3aa59ad48abac55e", "comparator": "", "operator": "IS NOT NULL", "subject": "lon", - "isExtra": False, }, ], "delimited_key": [ { "clause": "WHERE", "expressionType": "SIMPLE", - "filterOptionName": "89cc0fafe39a4eabc5df2cd52e4d6514", + "filterOptionName": "cae5c925c140593743da08499e6fb207", "comparator": "", "operator": "IS NOT NULL", "subject": "lonlat", - "isExtra": False, } ], "geohash_key": [ { "clause": "WHERE", "expressionType": "SIMPLE", - "filterOptionName": "fa734d9a7bab254a53b41540d46cdb6c", + "filterOptionName": "d84f55222d8e414e888fa5f990b341d2", "comparator": "", "operator": "IS NOT NULL", "subject": "geo", - "isExtra": False, } ], } @@ -1240,6 +1236,7 @@ def test_filter_nulls(self): test_viz_deckgl.spatial_control_keys = [mock_key] test_viz_deckgl.add_null_filters() adhoc_filters = test_viz_deckgl.form_data["adhoc_filters"] + self.assertEqual(expected_results.get(mock_key), adhoc_filters) assert expected_results.get(mock_key) == adhoc_filters From 9527819d31e19aa9aa4ab78c29aa22915e36b8cf Mon Sep 17 00:00:00 2001 From: Ville Brofeldt Date: Mon, 9 Aug 2021 15:12:51 +0300 Subject: [PATCH 06/11] remove unnecessary optionality --- superset/charts/schemas.py | 2 +- superset/common/query_actions.py | 2 +- superset/common/query_object.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/superset/charts/schemas.py b/superset/charts/schemas.py index ed14e918b7de6..27ebc26d73ec9 100644 --- a/superset/charts/schemas.py +++ b/superset/charts/schemas.py @@ -756,7 +756,7 @@ class ChartDataPostProcessingOperationSchema(Schema): class ChartDataFilterSchema(Schema): col = fields.String( - description="The column to filter.", required=True, example="country", + description="The column to filter.", required=True, example="country" ) op = fields.String( # pylint: disable=invalid-name description="The comparison operator.", diff --git a/superset/common/query_actions.py b/superset/common/query_actions.py index fa2175d22f69b..d0ef7d3f26575 100644 --- a/superset/common/query_actions.py +++ b/superset/common/query_actions.py @@ -104,7 +104,7 @@ def _get_full( payload["data"] = query_context.get_data(df) del payload["df"] - filters = query_obj.filter or [] + filters = query_obj.filter filter_columns = cast(List[str], [flt.get("col") for flt in filters]) columns = set(datasource.column_names) applied_time_columns, rejected_time_columns = get_time_filter_status( diff --git a/superset/common/query_object.py b/superset/common/query_object.py index d6528db7ea704..01ceaecbc4610 100644 --- a/superset/common/query_object.py +++ b/superset/common/query_object.py @@ -86,7 +86,7 @@ class QueryObject: metrics: Optional[List[Metric]] row_limit: int row_offset: int - filter: Optional[List[QueryObjectFilterClause]] + filter: List[QueryObjectFilterClause] timeseries_limit: int timeseries_limit_metric: Optional[Metric] order_desc: bool From b0271e65da7372169089c221da1afc8c7e70506b Mon Sep 17 00:00:00 2001 From: Ville Brofeldt Date: Mon, 9 Aug 2021 15:31:32 +0300 Subject: [PATCH 07/11] fix even more tests --- tests/integration_tests/utils/core_tests.py | 6 ++---- tests/integration_tests/viz_tests.py | 1 - 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/integration_tests/utils/core_tests.py b/tests/integration_tests/utils/core_tests.py index 664d841ded2a2..3ba39032e4265 100644 --- a/tests/integration_tests/utils/core_tests.py +++ b/tests/integration_tests/utils/core_tests.py @@ -34,11 +34,10 @@ def test_simple_filter_to_adhoc_generates_deterministic_values(): assert simple_filter_to_adhoc(input_1) == { "clause": "WHERE", "expressionType": "SIMPLE", - "isExtra": False, "comparator": "", "operator": "IS NOT NULL", "subject": "LATITUDE", - "filterOptionName": "d0908f77d950131db7a69fdc820cb739", + "filterOptionName": "6ac89d498115da22396f80a765cffc70", } # The result is different when given different input @@ -46,11 +45,10 @@ def test_simple_filter_to_adhoc_generates_deterministic_values(): assert simple_filter_to_adhoc(input_2) == { "clause": "WHERE", "expressionType": "SIMPLE", - "isExtra": False, "comparator": "", "operator": "IS NOT NULL", "subject": "LONGITUDE", - "filterOptionName": "c5f283f727d4dfc6258b351d4a8663bc", + "filterOptionName": "9c984bd3714883ca859948354ce26ab9", } diff --git a/tests/integration_tests/viz_tests.py b/tests/integration_tests/viz_tests.py index 4b154babb4c4b..aa4036734bb79 100644 --- a/tests/integration_tests/viz_tests.py +++ b/tests/integration_tests/viz_tests.py @@ -1236,7 +1236,6 @@ def test_filter_nulls(self): test_viz_deckgl.spatial_control_keys = [mock_key] test_viz_deckgl.add_null_filters() adhoc_filters = test_viz_deckgl.form_data["adhoc_filters"] - self.assertEqual(expected_results.get(mock_key), adhoc_filters) assert expected_results.get(mock_key) == adhoc_filters From c4aae4efa7d00657e01e4db7092f75e95e19f6ab Mon Sep 17 00:00:00 2001 From: Ville Brofeldt Date: Mon, 9 Aug 2021 16:35:26 +0300 Subject: [PATCH 08/11] bump superset-ui --- superset-frontend/package-lock.json | 604 ++++++++++++++-------------- superset-frontend/package.json | 56 +-- 2 files changed, 330 insertions(+), 330 deletions(-) diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index 12200bc7496d2..3b25a0b64fccd 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -15,35 +15,35 @@ "@emotion/babel-preset-css-prop": "^11.2.0", "@emotion/cache": "^11.1.3", "@emotion/react": "^11.1.5", - "@superset-ui/chart-controls": "^0.17.79", - "@superset-ui/core": "^0.17.75", - "@superset-ui/legacy-plugin-chart-calendar": "^0.17.79", - "@superset-ui/legacy-plugin-chart-chord": "^0.17.79", - "@superset-ui/legacy-plugin-chart-country-map": "^0.17.79", - "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.79", - "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.79", - "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.79", - "@superset-ui/legacy-plugin-chart-histogram": "^0.17.79", - "@superset-ui/legacy-plugin-chart-horizon": "^0.17.79", - "@superset-ui/legacy-plugin-chart-map-box": "^0.17.79", - "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.79", - "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.79", - "@superset-ui/legacy-plugin-chart-partition": "^0.17.79", - "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.79", - "@superset-ui/legacy-plugin-chart-rose": "^0.17.79", - "@superset-ui/legacy-plugin-chart-sankey": "^0.17.79", - "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.79", - "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.79", - "@superset-ui/legacy-plugin-chart-treemap": "^0.17.79", - "@superset-ui/legacy-plugin-chart-world-map": "^0.17.79", - "@superset-ui/legacy-preset-chart-big-number": "^0.17.79", + "@superset-ui/chart-controls": "^0.17.80", + "@superset-ui/core": "^0.17.80", + "@superset-ui/legacy-plugin-chart-calendar": "^0.17.80", + "@superset-ui/legacy-plugin-chart-chord": "^0.17.80", + "@superset-ui/legacy-plugin-chart-country-map": "^0.17.80", + "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.80", + "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.80", + "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.80", + "@superset-ui/legacy-plugin-chart-histogram": "^0.17.80", + "@superset-ui/legacy-plugin-chart-horizon": "^0.17.80", + "@superset-ui/legacy-plugin-chart-map-box": "^0.17.80", + "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.80", + "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.80", + "@superset-ui/legacy-plugin-chart-partition": "^0.17.80", + "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.80", + "@superset-ui/legacy-plugin-chart-rose": "^0.17.80", + "@superset-ui/legacy-plugin-chart-sankey": "^0.17.80", + "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.80", + "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.80", + "@superset-ui/legacy-plugin-chart-treemap": "^0.17.80", + "@superset-ui/legacy-plugin-chart-world-map": "^0.17.80", + "@superset-ui/legacy-preset-chart-big-number": "^0.17.80", "@superset-ui/legacy-preset-chart-deckgl": "^0.4.9", - "@superset-ui/legacy-preset-chart-nvd3": "^0.17.79", - "@superset-ui/plugin-chart-echarts": "^0.17.79", - "@superset-ui/plugin-chart-pivot-table": "^0.17.79", - "@superset-ui/plugin-chart-table": "^0.17.79", - "@superset-ui/plugin-chart-word-cloud": "^0.17.79", - "@superset-ui/preset-chart-xy": "^0.17.79", + "@superset-ui/legacy-preset-chart-nvd3": "^0.17.80", + "@superset-ui/plugin-chart-echarts": "^0.17.80", + "@superset-ui/plugin-chart-pivot-table": "^0.17.80", + "@superset-ui/plugin-chart-table": "^0.17.80", + "@superset-ui/plugin-chart-word-cloud": "^0.17.80", + "@superset-ui/preset-chart-xy": "^0.17.80", "@vx/responsive": "^0.0.195", "abortcontroller-polyfill": "^1.1.9", "antd": "^4.9.4", @@ -11688,12 +11688,12 @@ } }, "node_modules/@superset-ui/chart-controls": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.79.tgz", - "integrity": "sha512-Mdgi6/ZYZHrDSyA88+JJZGyp2g0ZVM/2n1aNkKk9pQYr4E7W8OcvFX4HksjyWvicEsR8sQR3q3PczHUuwbm5OA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.80.tgz", + "integrity": "sha512-40H8LPvAsl2Y7UrLMA8DoK7zpNcxPeWPPyb1WIaRVXyZS7F8IeapSuDgj7SnnYGZ6O6zNnS95x2WX7hB4owKZQ==", "dependencies": { "@react-icons/all-files": "^4.1.0", - "@superset-ui/core": "0.17.75", + "@superset-ui/core": "0.17.80", "lodash": "^4.17.15", "prop-types": "^15.7.2" }, @@ -11704,9 +11704,9 @@ } }, "node_modules/@superset-ui/core": { - "version": "0.17.75", - "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.75.tgz", - "integrity": "sha512-9g9YiQzsI4PFi9963DnizVghuejpHKSnbjGyyYkZa3SDSqTMLFkj4tuBd/s+Skayoo1DNoxzD2ZMMw41D81RcA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.80.tgz", + "integrity": "sha512-BrUF4ba6SyKyjRsDu4y67pywq8LJYVX7vpJ98qOR1Hu634H9a5in5PVu8N03tpfaQXpdao00YfP6T/3bTWMkmA==", "dependencies": { "@babel/runtime": "^7.1.2", "@emotion/styled": "^11.3.0", @@ -11828,12 +11828,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-calendar": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.79.tgz", - "integrity": "sha512-hgKVzR0m0eS6hP2BTk7f3dY/FnWDWKsNDmSie9TbFn04XdOYnf4H6p253rf+sI0TtQ6/G2DM39nKxUehm8wJfQ==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.80.tgz", + "integrity": "sha512-dFRBDDbSmPfA+EI31F5dWQdNZRlR6COPr+5NQXzXm7HGcHpBfmI4YjCzeLgwJxtOWjvl1k7yEs+dfdV3Vc6tuA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3-array": "^2.0.3", "d3-selection": "^1.4.0", "d3-tip": "^0.9.1", @@ -11852,24 +11852,24 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-chord": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.79.tgz", - "integrity": "sha512-okUKLettzXkqkcZ4GpeA8IchK6FMrb9CjuRYNB8U3jdXypNdwbYN1EKkuAm4H0AUvk3oBhr1k/2BTkG1y8UGeg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.80.tgz", + "integrity": "sha512-jhOvHRbG3p1HZa5t22jFphhs3OBfoz+Tfh4YtllLCBmezP0A+a/GxLERknBJyHiXLRWl7cWiLILrD5/D4rkVWA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "prop-types": "^15.6.2", "react": "^16.13.1" } }, "node_modules/@superset-ui/legacy-plugin-chart-country-map": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.79.tgz", - "integrity": "sha512-xQFCQ5Baf14HU/NOCLcCjRobGz+pYrjkz3aYXuj+db6xjz1wVdZUBtLM2atD7TzHM7Yn5jHdpQa8XRUUHQc2cg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.80.tgz", + "integrity": "sha512-IqAPteHUyt75TiouAWkDNcxSZrC4PT5CaP0jsjtVpbtww3bhS6R7tnB2onOhb5mqTNhkkqHxBxuFHPYwtjdGPw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-array": "^2.0.3", "prop-types": "^15.6.2" @@ -11884,13 +11884,13 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-event-flow": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.79.tgz", - "integrity": "sha512-hC0sen6ojNaZ+WIOtzEjEafPK2uJDUP3yF1dx9Z2QuoYATHthz74X5KHKWit/l5qi/R4jEH5ORw4M4qAFytwDw==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.80.tgz", + "integrity": "sha512-CODDrH4tGbHRomKlPlHtLxA8S6d1keTKxle3ADp440WR+JvuttNgT9+LdB/8eO8zMoU1g11CViFIW5duWZ+pnA==", "dependencies": { "@data-ui/event-flow": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "prop-types": "^15.6.2" }, "peerDependencies": { @@ -11898,12 +11898,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-force-directed": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.79.tgz", - "integrity": "sha512-nhXyFgXuLqxURu5qFHc66NaD8T/8nBmNQEzDjJ+o7qrrMJeldgzAEjZGjoN1O014qiktA/D+nNKtyVmGeGRbIg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.80.tgz", + "integrity": "sha512-W6MU/DY9ZAPDf5Q0cO9VyvrEic8wBiaSPMPNQ40IQv6UYmukjPoZhWhyQUex7ieCsqqKANCPbARPAK+F3/Y/uA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "prop-types": "^15.7.2" }, @@ -11912,12 +11912,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-heatmap": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.79.tgz", - "integrity": "sha512-EkcK1d/1F91Eu3+/7RqeUuBJgYebaFATI+nrRmcZ9S80V+iEw9V/9d9dm7UetSxMA2afcK2gNrvTcZ86x5z1Sw==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.80.tgz", + "integrity": "sha512-jn6U0fOvUo62wCyMmeCgSUYpjGTrHbhxPi4zZ3JmamkPnXsMxz8c57B7G2cNk9/WpntxJfw7urHjEvlGRZ/L9w==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-svg-legend": "^1.x", "d3-tip": "^0.9.1", @@ -11925,14 +11925,14 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-histogram": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.79.tgz", - "integrity": "sha512-v9j3s11yqv5KgLwn7UIXoDzkBvkCnGt94l8Mh3QMWWfqSt2EENWVQSQ+yc9wV4ytpbIZepY+z8BDC6TWAiZdwg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.80.tgz", + "integrity": "sha512-RoUJN0w4KFSva9A6tI3wz0IPqzP6ZojpjQWu/Xs95pgZsbHPhz3beTrpv28QaOV8zAEWoTM01u+piASAbPOIVg==", "dependencies": { "@data-ui/histogram": "^0.0.84", "@data-ui/theme": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@vx/legend": "^0.0.198", "@vx/responsive": "^0.0.199", "@vx/scale": "^0.0.197", @@ -12001,12 +12001,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-horizon": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.79.tgz", - "integrity": "sha512-rG+PBv6sPkDKQ1ycfusdgq3oUwv6cv1n4hIfoETelsSMqx2PNtwh4gWA4eWqBp2OJR59huAMuUzsvB3xdcNCJA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.80.tgz", + "integrity": "sha512-db2QyGn95Y71wAOdiircDYjmSimmKCNdZ8NjwhXvtreCjDT5IYU3jX14hHQ4HVD/R0PkcZSth4Xg33T0FMBxBw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3-array": "^2.0.3", "d3-scale": "^3.0.1", "prop-types": "^15.6.2" @@ -12036,12 +12036,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-map-box": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.79.tgz", - "integrity": "sha512-dlO+miiN9jnb3lCY1UwMSws/tr/wO6NBMRHeAzIh+j7I7qcDDtSuNnTG3kBc1LnvP6wqMhgCKU2e63K3aG0gYA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.80.tgz", + "integrity": "sha512-ajaJr3LPuibV5orFfQ2wEnsDadowapTrBYWnPz9LQb0o9DKMXrNKlwuYYKb1xm+7ZdVghFajvoYKQqH9Mm1GAw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "immutable": "^3.8.2", "mapbox-gl": "^0.53.0", "prop-types": "^15.6.2", @@ -12062,12 +12062,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-paired-t-test": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.79.tgz", - "integrity": "sha512-KWJvuXyM6viUVrARD33tupIjV2L6UGXkp64o3SnRybCuXFUbrLYrCfRlbv+t0IaSt8QgYvM2qT7pCt8iQ5RzMg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.80.tgz", + "integrity": "sha512-bKiHHOM20AooaMMAQDoHMUJjbaN6MftCtYLSXIhoS5vd4d7F6sIkOOtIjxlR/FbmDA5Dcg97hz8M7H3idCtZtg==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "distributions": "^1.0.0", "prop-types": "^15.6.2", "reactable": "^1.1.0" @@ -12077,12 +12077,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-parallel-coordinates": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.79.tgz", - "integrity": "sha512-aliDFjhVuojAXkSeisMZ2uuRK++09A9aCchM1DTiHsI44ZT5GJoUi6Te5Rm/kNRKGyHfFjrXGJmJ3wbJaqxUOA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.80.tgz", + "integrity": "sha512-8W8NhdUbZJrhFcjtOMoEfHv2QXIom0xncJW9xi/HFLsw3j8lbsKw0hfXs+DeqTFITa8ThxqUiw0c8vCiQ94iig==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "prop-types": "^15.7.2" }, @@ -12091,12 +12091,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-partition": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.79.tgz", - "integrity": "sha512-Xh7Ozb+IweXX2SVuQeXlXnVXw2neErTLJ2rFzZz4voyZvcGH93C/rfeKT25QQwButfcfFI6SIXCAXgIwJ0VsRw==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.80.tgz", + "integrity": "sha512-IohJ9/iXTjHZdbEYNe09ALy6AT0wBTovGFps6BUNJXPu8i/QrDDr+1gB5cLxw+lb0M4OS+huDd6bn14A2HczSQ==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-hierarchy": "^1.1.8", "prop-types": "^15.6.2" @@ -12106,24 +12106,24 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-pivot-table": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.79.tgz", - "integrity": "sha512-GsVxldm0sRbd9jjGKmgaQ8uyqwlVBr/CYiifsxVRP3VcHRYaMX+1JgYMeko7mImbOpoo4GR1lnQvbzQCWH0yFg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.80.tgz", + "integrity": "sha512-NF1yMET2MQ1FeBe3pPbNYtyftI12lC5DkDg/diblQq99CU3e8LfAsLuGOWVZiq6TSzFjySs4BaVTBt7BBL0YpQ==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "datatables.net-bs": "^1.10.15", "prop-types": "^15.6.2" } }, "node_modules/@superset-ui/legacy-plugin-chart-rose": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.79.tgz", - "integrity": "sha512-rDT+C+3a8gMnA+QCatETSJ3GL3IPsiZ2aHWCXWdcbZo5exNwLYD8gZfyHf8do6LLBc46tSrErE8bXs5TDV2LYg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.80.tgz", + "integrity": "sha512-JJWre7sJkCPrOEM/tlWCAzKGoYO/3VKgNf25luo7P0aMRFAjXYH6AHXqsitQMsUzgMQQ+53+6lE/RS2U9ukHzQ==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "nvd3": "1.8.6", "prop-types": "^15.6.2" @@ -12133,12 +12133,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-sankey": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.79.tgz", - "integrity": "sha512-3AMEH15bOInmSHF87f3lgSS9vwKTMYjo67h4NhIflfXMR3EveXCA8dIIJfgS6xYSmaGEE7OL6aeeQE5+rnj4pQ==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.80.tgz", + "integrity": "sha512-AT7Gm8oUCSqabtVR8OqhOhaNDArl/MFDlV4I2uKN/PdPr8FA8aJCPi0Ud9t6GpUxPMdV6wVUfnW8XfIJdRzwGA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-sankey": "^0.4.2", "prop-types": "^15.6.2" @@ -12148,47 +12148,47 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-sankey-loop": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.79.tgz", - "integrity": "sha512-OdFBPQbE+vkN/fw9XqeM7lZ8f0xB2itXiwyOKei6MeC6G1cN45/DUlnTAY436ulRvZFhwLhel7g91TN8djSDoA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.80.tgz", + "integrity": "sha512-qivsrBeObFF9ZeAcxyQva4cbA5CgDg6ia9oYWrv6ARWWPqJ121n2UyNbKJd9sGMi85cKT09uVjDNx36Od/7mKA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3-sankey-diagram": "^0.7.3", "d3-selection": "^1.4.0", "prop-types": "^15.6.2" } }, "node_modules/@superset-ui/legacy-plugin-chart-sunburst": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.79.tgz", - "integrity": "sha512-VmRsKn/XHUlDKrQ2AQ+C1TRXIJ6m6ittKKuXMqz0XxZWs3jn5RUkNv0W8GuYg814abmZl/e1e0/3lgmYX6LyZg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.80.tgz", + "integrity": "sha512-WAChRf6ECGMltGUEyhpLGWgrysktrChuCJl6BN28l2+/l+w0hIQmdNhtpO+PDLiaUGKCb19pAyr0jUuPoUB3/A==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "prop-types": "^15.6.2" } }, "node_modules/@superset-ui/legacy-plugin-chart-treemap": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.79.tgz", - "integrity": "sha512-b204bAeVodLiYyzout0a4HXmltptXD/81kX8aA94IIDCAoA7QhbAvb9W9wZcQiDJQwu7MVsS+KPqyyv35Mxo8A==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.80.tgz", + "integrity": "sha512-zm6kDJrSqlOdjp7mmuOCgHVXsjENptAccbon9LHuWcHWp2xByfqgykBNkKoh2v4KMulEmg6JIPI3AzGHJEh8mw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3-hierarchy": "^1.1.8", "d3-selection": "^1.4.0", "prop-types": "^15.6.2" } }, "node_modules/@superset-ui/legacy-plugin-chart-world-map": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.79.tgz", - "integrity": "sha512-4iVqpwn4zlI9T4b9venoRLgoEy0+lZKaWbccmUkXPvYL+gpUtkB3z7KuFfp/MWWyruLRCKCd1z2Fedm4wv8ELA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.80.tgz", + "integrity": "sha512-F173Yo6YUXiqH6ZrCZmtRT38b13Bf0Iq4jI3B9POu7fgZWJXmhFVGKzgjPMau5t/5BLjTnyKoTRZ28UqFOomCg==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-array": "^2.4.0", "d3-color": "^1.4.1", @@ -12213,13 +12213,13 @@ "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" }, "node_modules/@superset-ui/legacy-preset-chart-big-number": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.79.tgz", - "integrity": "sha512-+OjEbyYugynYGbnobP6pNI59bMXfsaqgX6z+oz7fxCtb5BWxTiciz9W7aKhAqT6XM+I8gkkHUKFj76cyjawY5g==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.80.tgz", + "integrity": "sha512-mwG2fvMIACPlVNnWlXS7Il48AI/TGqVXxEs6LVutyKJXxb9Yrl63hDaWzod7otAF5QW2qsMM17IvEljA8EGpiA==", "dependencies": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@types/d3-color": "^1.2.2", "@types/shortid": "^0.0.29", "d3-color": "^1.2.3", @@ -12260,13 +12260,13 @@ } }, "node_modules/@superset-ui/legacy-preset-chart-nvd3": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.79.tgz", - "integrity": "sha512-hmBof4w5aF6wZag+wnqQCCYjnxul2KBWqRAj0gWQYohUwgqxxuR3CaEwTP62SNVvmnt8R2iCHM9RpIxfcWpjeQ==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.80.tgz", + "integrity": "sha512-pWeL/9Es3pwYgm7rENXLoH3FAuTrA5cw02aE+lhClVTJVMruPi39yT3O0cfPx2JAsKhmENR7OFu+nG8wSwd7tw==", "dependencies": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-tip": "^0.9.1", "dompurify": "^2.0.6", @@ -12283,12 +12283,12 @@ } }, "node_modules/@superset-ui/plugin-chart-echarts": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.79.tgz", - "integrity": "sha512-+lZO5hbQC47G8dDvyqeI4dBsjD2CRSQDqCGFXoecnhKZTzRw3zLX7TYckCK6ZxvLDbgW0ncjRBdcCJtvFs+MAw==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.80.tgz", + "integrity": "sha512-Oz1BQI6IvtYAU1zsZvMzT8WPL7234OcLTmM/pfRRLbjDsY942tioGHAr/kOfnoeVmgtdhrZDt3ch1n+vrvK6Aw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@types/mathjs": "^6.0.7", "d3-array": "^1.2.0", "echarts": "^5.1.2", @@ -12300,12 +12300,12 @@ } }, "node_modules/@superset-ui/plugin-chart-pivot-table": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.79.tgz", - "integrity": "sha512-sz3FfM8Odm+r094rNCRO1DGxMNZl8j0ySnwFYQTbdZNFgqUvcQme9x7QC51IBk3OQ/TOm8oMJG5hTV1/4HrCKA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.80.tgz", + "integrity": "sha512-JP+fS5++2u1Cr+FjNETllJWwAauuXJGJ2q5Gv0mMAw+kB/9i5yZKRvM6VQyL4NvYO4VqYjL5g440G0OLqGeQ6A==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@superset-ui/react-pivottable": "^0.12.11" }, "peerDependencies": { @@ -12314,13 +12314,13 @@ } }, "node_modules/@superset-ui/plugin-chart-table": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.79.tgz", - "integrity": "sha512-gPXgLJntH72ligPD0V6XNT5Cj6eWzztL154/uhUf8qxXKSBB5wETrFqtIl00S99wJQeaPRN6UGER/eiuGqGOTA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.80.tgz", + "integrity": "sha512-0404twIq84jGiKbC/yfQwbYFh0RNBn8qMJnRO3oCtzvVmF3gelm8+mGKtUnxpd/OC6wiAXyorfoF3mlSW615oA==", "dependencies": { "@react-icons/all-files": "^4.1.0", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@types/d3-array": "^2.9.0", "@types/react-table": "^7.0.29", "d3-array": "^2.4.0", @@ -12345,12 +12345,12 @@ } }, "node_modules/@superset-ui/plugin-chart-word-cloud": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.79.tgz", - "integrity": "sha512-EpHMJ1Qd7GnykEjlC+3bOzzBauLTFwZZuFFuCHs8m0exozuFaHQS1VxmpR1h3zJsp6pjF3PRFU05fpQ5LUAbnA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.80.tgz", + "integrity": "sha512-BBXJywPpF5q5y/+7S4PxJFajEufcURKgbTDbVE2uVj85v5m1XtdM5UpvjJ6O4AmksxKD3J1PfSBXtXehttf3hg==", "dependencies": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@types/d3-cloud": "^1.2.1", "@types/d3-scale": "^2.0.2", "d3-cloud": "^1.2.5", @@ -12383,14 +12383,14 @@ } }, "node_modules/@superset-ui/preset-chart-xy": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.79.tgz", - "integrity": "sha512-JisKp00zIVa8VKSBXG1HNDj6hcRf70kHAGuSXHrQ8BUdfhy9Xc20oUMMFKeWSi0cc5NzPkgGg9Vl/vd3fvsO8Q==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.80.tgz", + "integrity": "sha512-AfxeBs9w0D7Af5NAKeJ1PmMfitjodpR2AELlsx1s9VkVXoz4Y3FgY9YkUCsphietzjF7Z1kSPYXPLY+wa57oMQ==", "dependencies": { "@data-ui/theme": "^0.0.84", "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@vx/axis": "^0.0.198", "@vx/legend": "^0.0.198", "@vx/scale": "^0.0.197", @@ -60547,20 +60547,20 @@ } }, "@superset-ui/chart-controls": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.79.tgz", - "integrity": "sha512-Mdgi6/ZYZHrDSyA88+JJZGyp2g0ZVM/2n1aNkKk9pQYr4E7W8OcvFX4HksjyWvicEsR8sQR3q3PczHUuwbm5OA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.80.tgz", + "integrity": "sha512-40H8LPvAsl2Y7UrLMA8DoK7zpNcxPeWPPyb1WIaRVXyZS7F8IeapSuDgj7SnnYGZ6O6zNnS95x2WX7hB4owKZQ==", "requires": { "@react-icons/all-files": "^4.1.0", - "@superset-ui/core": "0.17.75", + "@superset-ui/core": "0.17.80", "lodash": "^4.17.15", "prop-types": "^15.7.2" } }, "@superset-ui/core": { - "version": "0.17.75", - "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.75.tgz", - "integrity": "sha512-9g9YiQzsI4PFi9963DnizVghuejpHKSnbjGyyYkZa3SDSqTMLFkj4tuBd/s+Skayoo1DNoxzD2ZMMw41D81RcA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.80.tgz", + "integrity": "sha512-BrUF4ba6SyKyjRsDu4y67pywq8LJYVX7vpJ98qOR1Hu634H9a5in5PVu8N03tpfaQXpdao00YfP6T/3bTWMkmA==", "requires": { "@babel/runtime": "^7.1.2", "@emotion/styled": "^11.3.0", @@ -60680,12 +60680,12 @@ } }, "@superset-ui/legacy-plugin-chart-calendar": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.79.tgz", - "integrity": "sha512-hgKVzR0m0eS6hP2BTk7f3dY/FnWDWKsNDmSie9TbFn04XdOYnf4H6p253rf+sI0TtQ6/G2DM39nKxUehm8wJfQ==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.80.tgz", + "integrity": "sha512-dFRBDDbSmPfA+EI31F5dWQdNZRlR6COPr+5NQXzXm7HGcHpBfmI4YjCzeLgwJxtOWjvl1k7yEs+dfdV3Vc6tuA==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3-array": "^2.0.3", "d3-selection": "^1.4.0", "d3-tip": "^0.9.1", @@ -60703,24 +60703,24 @@ } }, "@superset-ui/legacy-plugin-chart-chord": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.79.tgz", - "integrity": "sha512-okUKLettzXkqkcZ4GpeA8IchK6FMrb9CjuRYNB8U3jdXypNdwbYN1EKkuAm4H0AUvk3oBhr1k/2BTkG1y8UGeg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.80.tgz", + "integrity": "sha512-jhOvHRbG3p1HZa5t22jFphhs3OBfoz+Tfh4YtllLCBmezP0A+a/GxLERknBJyHiXLRWl7cWiLILrD5/D4rkVWA==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "prop-types": "^15.6.2", "react": "^16.13.1" } }, "@superset-ui/legacy-plugin-chart-country-map": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.79.tgz", - "integrity": "sha512-xQFCQ5Baf14HU/NOCLcCjRobGz+pYrjkz3aYXuj+db6xjz1wVdZUBtLM2atD7TzHM7Yn5jHdpQa8XRUUHQc2cg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.80.tgz", + "integrity": "sha512-IqAPteHUyt75TiouAWkDNcxSZrC4PT5CaP0jsjtVpbtww3bhS6R7tnB2onOhb5mqTNhkkqHxBxuFHPYwtjdGPw==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-array": "^2.0.3", "prop-types": "^15.6.2" @@ -60737,34 +60737,34 @@ } }, "@superset-ui/legacy-plugin-chart-event-flow": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.79.tgz", - "integrity": "sha512-hC0sen6ojNaZ+WIOtzEjEafPK2uJDUP3yF1dx9Z2QuoYATHthz74X5KHKWit/l5qi/R4jEH5ORw4M4qAFytwDw==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.80.tgz", + "integrity": "sha512-CODDrH4tGbHRomKlPlHtLxA8S6d1keTKxle3ADp440WR+JvuttNgT9+LdB/8eO8zMoU1g11CViFIW5duWZ+pnA==", "requires": { "@data-ui/event-flow": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-force-directed": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.79.tgz", - "integrity": "sha512-nhXyFgXuLqxURu5qFHc66NaD8T/8nBmNQEzDjJ+o7qrrMJeldgzAEjZGjoN1O014qiktA/D+nNKtyVmGeGRbIg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.80.tgz", + "integrity": "sha512-W6MU/DY9ZAPDf5Q0cO9VyvrEic8wBiaSPMPNQ40IQv6UYmukjPoZhWhyQUex7ieCsqqKANCPbARPAK+F3/Y/uA==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "prop-types": "^15.7.2" } }, "@superset-ui/legacy-plugin-chart-heatmap": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.79.tgz", - "integrity": "sha512-EkcK1d/1F91Eu3+/7RqeUuBJgYebaFATI+nrRmcZ9S80V+iEw9V/9d9dm7UetSxMA2afcK2gNrvTcZ86x5z1Sw==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.80.tgz", + "integrity": "sha512-jn6U0fOvUo62wCyMmeCgSUYpjGTrHbhxPi4zZ3JmamkPnXsMxz8c57B7G2cNk9/WpntxJfw7urHjEvlGRZ/L9w==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-svg-legend": "^1.x", "d3-tip": "^0.9.1", @@ -60772,14 +60772,14 @@ } }, "@superset-ui/legacy-plugin-chart-histogram": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.79.tgz", - "integrity": "sha512-v9j3s11yqv5KgLwn7UIXoDzkBvkCnGt94l8Mh3QMWWfqSt2EENWVQSQ+yc9wV4ytpbIZepY+z8BDC6TWAiZdwg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.80.tgz", + "integrity": "sha512-RoUJN0w4KFSva9A6tI3wz0IPqzP6ZojpjQWu/Xs95pgZsbHPhz3beTrpv28QaOV8zAEWoTM01u+piASAbPOIVg==", "requires": { "@data-ui/histogram": "^0.0.84", "@data-ui/theme": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@vx/legend": "^0.0.198", "@vx/responsive": "^0.0.199", "@vx/scale": "^0.0.197", @@ -60847,12 +60847,12 @@ } }, "@superset-ui/legacy-plugin-chart-horizon": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.79.tgz", - "integrity": "sha512-rG+PBv6sPkDKQ1ycfusdgq3oUwv6cv1n4hIfoETelsSMqx2PNtwh4gWA4eWqBp2OJR59huAMuUzsvB3xdcNCJA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.80.tgz", + "integrity": "sha512-db2QyGn95Y71wAOdiircDYjmSimmKCNdZ8NjwhXvtreCjDT5IYU3jX14hHQ4HVD/R0PkcZSth4Xg33T0FMBxBw==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3-array": "^2.0.3", "d3-scale": "^3.0.1", "prop-types": "^15.6.2" @@ -60881,12 +60881,12 @@ } }, "@superset-ui/legacy-plugin-chart-map-box": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.79.tgz", - "integrity": "sha512-dlO+miiN9jnb3lCY1UwMSws/tr/wO6NBMRHeAzIh+j7I7qcDDtSuNnTG3kBc1LnvP6wqMhgCKU2e63K3aG0gYA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.80.tgz", + "integrity": "sha512-ajaJr3LPuibV5orFfQ2wEnsDadowapTrBYWnPz9LQb0o9DKMXrNKlwuYYKb1xm+7ZdVghFajvoYKQqH9Mm1GAw==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "immutable": "^3.8.2", "mapbox-gl": "^0.53.0", "prop-types": "^15.6.2", @@ -60903,118 +60903,118 @@ } }, "@superset-ui/legacy-plugin-chart-paired-t-test": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.79.tgz", - "integrity": "sha512-KWJvuXyM6viUVrARD33tupIjV2L6UGXkp64o3SnRybCuXFUbrLYrCfRlbv+t0IaSt8QgYvM2qT7pCt8iQ5RzMg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.80.tgz", + "integrity": "sha512-bKiHHOM20AooaMMAQDoHMUJjbaN6MftCtYLSXIhoS5vd4d7F6sIkOOtIjxlR/FbmDA5Dcg97hz8M7H3idCtZtg==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "distributions": "^1.0.0", "prop-types": "^15.6.2", "reactable": "^1.1.0" } }, "@superset-ui/legacy-plugin-chart-parallel-coordinates": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.79.tgz", - "integrity": "sha512-aliDFjhVuojAXkSeisMZ2uuRK++09A9aCchM1DTiHsI44ZT5GJoUi6Te5Rm/kNRKGyHfFjrXGJmJ3wbJaqxUOA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.80.tgz", + "integrity": "sha512-8W8NhdUbZJrhFcjtOMoEfHv2QXIom0xncJW9xi/HFLsw3j8lbsKw0hfXs+DeqTFITa8ThxqUiw0c8vCiQ94iig==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "prop-types": "^15.7.2" } }, "@superset-ui/legacy-plugin-chart-partition": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.79.tgz", - "integrity": "sha512-Xh7Ozb+IweXX2SVuQeXlXnVXw2neErTLJ2rFzZz4voyZvcGH93C/rfeKT25QQwButfcfFI6SIXCAXgIwJ0VsRw==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.80.tgz", + "integrity": "sha512-IohJ9/iXTjHZdbEYNe09ALy6AT0wBTovGFps6BUNJXPu8i/QrDDr+1gB5cLxw+lb0M4OS+huDd6bn14A2HczSQ==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-hierarchy": "^1.1.8", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-pivot-table": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.79.tgz", - "integrity": "sha512-GsVxldm0sRbd9jjGKmgaQ8uyqwlVBr/CYiifsxVRP3VcHRYaMX+1JgYMeko7mImbOpoo4GR1lnQvbzQCWH0yFg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.80.tgz", + "integrity": "sha512-NF1yMET2MQ1FeBe3pPbNYtyftI12lC5DkDg/diblQq99CU3e8LfAsLuGOWVZiq6TSzFjySs4BaVTBt7BBL0YpQ==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "datatables.net-bs": "^1.10.15", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-rose": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.79.tgz", - "integrity": "sha512-rDT+C+3a8gMnA+QCatETSJ3GL3IPsiZ2aHWCXWdcbZo5exNwLYD8gZfyHf8do6LLBc46tSrErE8bXs5TDV2LYg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.80.tgz", + "integrity": "sha512-JJWre7sJkCPrOEM/tlWCAzKGoYO/3VKgNf25luo7P0aMRFAjXYH6AHXqsitQMsUzgMQQ+53+6lE/RS2U9ukHzQ==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "nvd3": "1.8.6", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-sankey": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.79.tgz", - "integrity": "sha512-3AMEH15bOInmSHF87f3lgSS9vwKTMYjo67h4NhIflfXMR3EveXCA8dIIJfgS6xYSmaGEE7OL6aeeQE5+rnj4pQ==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.80.tgz", + "integrity": "sha512-AT7Gm8oUCSqabtVR8OqhOhaNDArl/MFDlV4I2uKN/PdPr8FA8aJCPi0Ud9t6GpUxPMdV6wVUfnW8XfIJdRzwGA==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-sankey": "^0.4.2", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-sankey-loop": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.79.tgz", - "integrity": "sha512-OdFBPQbE+vkN/fw9XqeM7lZ8f0xB2itXiwyOKei6MeC6G1cN45/DUlnTAY436ulRvZFhwLhel7g91TN8djSDoA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.80.tgz", + "integrity": "sha512-qivsrBeObFF9ZeAcxyQva4cbA5CgDg6ia9oYWrv6ARWWPqJ121n2UyNbKJd9sGMi85cKT09uVjDNx36Od/7mKA==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3-sankey-diagram": "^0.7.3", "d3-selection": "^1.4.0", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-sunburst": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.79.tgz", - "integrity": "sha512-VmRsKn/XHUlDKrQ2AQ+C1TRXIJ6m6ittKKuXMqz0XxZWs3jn5RUkNv0W8GuYg814abmZl/e1e0/3lgmYX6LyZg==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.80.tgz", + "integrity": "sha512-WAChRf6ECGMltGUEyhpLGWgrysktrChuCJl6BN28l2+/l+w0hIQmdNhtpO+PDLiaUGKCb19pAyr0jUuPoUB3/A==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-treemap": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.79.tgz", - "integrity": "sha512-b204bAeVodLiYyzout0a4HXmltptXD/81kX8aA94IIDCAoA7QhbAvb9W9wZcQiDJQwu7MVsS+KPqyyv35Mxo8A==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.80.tgz", + "integrity": "sha512-zm6kDJrSqlOdjp7mmuOCgHVXsjENptAccbon9LHuWcHWp2xByfqgykBNkKoh2v4KMulEmg6JIPI3AzGHJEh8mw==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3-hierarchy": "^1.1.8", "d3-selection": "^1.4.0", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-world-map": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.79.tgz", - "integrity": "sha512-4iVqpwn4zlI9T4b9venoRLgoEy0+lZKaWbccmUkXPvYL+gpUtkB3z7KuFfp/MWWyruLRCKCd1z2Fedm4wv8ELA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.80.tgz", + "integrity": "sha512-F173Yo6YUXiqH6ZrCZmtRT38b13Bf0Iq4jI3B9POu7fgZWJXmhFVGKzgjPMau5t/5BLjTnyKoTRZ28UqFOomCg==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-array": "^2.4.0", "d3-color": "^1.4.1", @@ -61038,13 +61038,13 @@ } }, "@superset-ui/legacy-preset-chart-big-number": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.79.tgz", - "integrity": "sha512-+OjEbyYugynYGbnobP6pNI59bMXfsaqgX6z+oz7fxCtb5BWxTiciz9W7aKhAqT6XM+I8gkkHUKFj76cyjawY5g==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.80.tgz", + "integrity": "sha512-mwG2fvMIACPlVNnWlXS7Il48AI/TGqVXxEs6LVutyKJXxb9Yrl63hDaWzod7otAF5QW2qsMM17IvEljA8EGpiA==", "requires": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@types/d3-color": "^1.2.2", "@types/shortid": "^0.0.29", "d3-color": "^1.2.3", @@ -61077,13 +61077,13 @@ } }, "@superset-ui/legacy-preset-chart-nvd3": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.79.tgz", - "integrity": "sha512-hmBof4w5aF6wZag+wnqQCCYjnxul2KBWqRAj0gWQYohUwgqxxuR3CaEwTP62SNVvmnt8R2iCHM9RpIxfcWpjeQ==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.80.tgz", + "integrity": "sha512-pWeL/9Es3pwYgm7rENXLoH3FAuTrA5cw02aE+lhClVTJVMruPi39yT3O0cfPx2JAsKhmENR7OFu+nG8wSwd7tw==", "requires": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "d3": "^3.5.17", "d3-tip": "^0.9.1", "dompurify": "^2.0.6", @@ -61097,12 +61097,12 @@ } }, "@superset-ui/plugin-chart-echarts": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.79.tgz", - "integrity": "sha512-+lZO5hbQC47G8dDvyqeI4dBsjD2CRSQDqCGFXoecnhKZTzRw3zLX7TYckCK6ZxvLDbgW0ncjRBdcCJtvFs+MAw==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.80.tgz", + "integrity": "sha512-Oz1BQI6IvtYAU1zsZvMzT8WPL7234OcLTmM/pfRRLbjDsY942tioGHAr/kOfnoeVmgtdhrZDt3ch1n+vrvK6Aw==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@types/mathjs": "^6.0.7", "d3-array": "^1.2.0", "echarts": "^5.1.2", @@ -61111,23 +61111,23 @@ } }, "@superset-ui/plugin-chart-pivot-table": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.79.tgz", - "integrity": "sha512-sz3FfM8Odm+r094rNCRO1DGxMNZl8j0ySnwFYQTbdZNFgqUvcQme9x7QC51IBk3OQ/TOm8oMJG5hTV1/4HrCKA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.80.tgz", + "integrity": "sha512-JP+fS5++2u1Cr+FjNETllJWwAauuXJGJ2q5Gv0mMAw+kB/9i5yZKRvM6VQyL4NvYO4VqYjL5g440G0OLqGeQ6A==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@superset-ui/react-pivottable": "^0.12.11" } }, "@superset-ui/plugin-chart-table": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.79.tgz", - "integrity": "sha512-gPXgLJntH72ligPD0V6XNT5Cj6eWzztL154/uhUf8qxXKSBB5wETrFqtIl00S99wJQeaPRN6UGER/eiuGqGOTA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.80.tgz", + "integrity": "sha512-0404twIq84jGiKbC/yfQwbYFh0RNBn8qMJnRO3oCtzvVmF3gelm8+mGKtUnxpd/OC6wiAXyorfoF3mlSW615oA==", "requires": { "@react-icons/all-files": "^4.1.0", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@types/d3-array": "^2.9.0", "@types/react-table": "^7.0.29", "d3-array": "^2.4.0", @@ -61149,12 +61149,12 @@ } }, "@superset-ui/plugin-chart-word-cloud": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.79.tgz", - "integrity": "sha512-EpHMJ1Qd7GnykEjlC+3bOzzBauLTFwZZuFFuCHs8m0exozuFaHQS1VxmpR1h3zJsp6pjF3PRFU05fpQ5LUAbnA==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.80.tgz", + "integrity": "sha512-BBXJywPpF5q5y/+7S4PxJFajEufcURKgbTDbVE2uVj85v5m1XtdM5UpvjJ6O4AmksxKD3J1PfSBXtXehttf3hg==", "requires": { - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@types/d3-cloud": "^1.2.1", "@types/d3-scale": "^2.0.2", "d3-cloud": "^1.2.5", @@ -61185,14 +61185,14 @@ } }, "@superset-ui/preset-chart-xy": { - "version": "0.17.79", - "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.79.tgz", - "integrity": "sha512-JisKp00zIVa8VKSBXG1HNDj6hcRf70kHAGuSXHrQ8BUdfhy9Xc20oUMMFKeWSi0cc5NzPkgGg9Vl/vd3fvsO8Q==", + "version": "0.17.80", + "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.80.tgz", + "integrity": "sha512-AfxeBs9w0D7Af5NAKeJ1PmMfitjodpR2AELlsx1s9VkVXoz4Y3FgY9YkUCsphietzjF7Z1kSPYXPLY+wa57oMQ==", "requires": { "@data-ui/theme": "^0.0.84", "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.79", - "@superset-ui/core": "0.17.75", + "@superset-ui/chart-controls": "0.17.80", + "@superset-ui/core": "0.17.80", "@vx/axis": "^0.0.198", "@vx/legend": "^0.0.198", "@vx/scale": "^0.0.197", diff --git a/superset-frontend/package.json b/superset-frontend/package.json index 338e8ccb92942..235e6c34fb47b 100644 --- a/superset-frontend/package.json +++ b/superset-frontend/package.json @@ -67,35 +67,35 @@ "@emotion/babel-preset-css-prop": "^11.2.0", "@emotion/cache": "^11.1.3", "@emotion/react": "^11.1.5", - "@superset-ui/chart-controls": "^0.17.79", - "@superset-ui/core": "^0.17.75", - "@superset-ui/legacy-plugin-chart-calendar": "^0.17.79", - "@superset-ui/legacy-plugin-chart-chord": "^0.17.79", - "@superset-ui/legacy-plugin-chart-country-map": "^0.17.79", - "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.79", - "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.79", - "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.79", - "@superset-ui/legacy-plugin-chart-histogram": "^0.17.79", - "@superset-ui/legacy-plugin-chart-horizon": "^0.17.79", - "@superset-ui/legacy-plugin-chart-map-box": "^0.17.79", - "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.79", - "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.79", - "@superset-ui/legacy-plugin-chart-partition": "^0.17.79", - "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.79", - "@superset-ui/legacy-plugin-chart-rose": "^0.17.79", - "@superset-ui/legacy-plugin-chart-sankey": "^0.17.79", - "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.79", - "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.79", - "@superset-ui/legacy-plugin-chart-treemap": "^0.17.79", - "@superset-ui/legacy-plugin-chart-world-map": "^0.17.79", - "@superset-ui/legacy-preset-chart-big-number": "^0.17.79", + "@superset-ui/chart-controls": "^0.17.80", + "@superset-ui/core": "^0.17.80", + "@superset-ui/legacy-plugin-chart-calendar": "^0.17.80", + "@superset-ui/legacy-plugin-chart-chord": "^0.17.80", + "@superset-ui/legacy-plugin-chart-country-map": "^0.17.80", + "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.80", + "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.80", + "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.80", + "@superset-ui/legacy-plugin-chart-histogram": "^0.17.80", + "@superset-ui/legacy-plugin-chart-horizon": "^0.17.80", + "@superset-ui/legacy-plugin-chart-map-box": "^0.17.80", + "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.80", + "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.80", + "@superset-ui/legacy-plugin-chart-partition": "^0.17.80", + "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.80", + "@superset-ui/legacy-plugin-chart-rose": "^0.17.80", + "@superset-ui/legacy-plugin-chart-sankey": "^0.17.80", + "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.80", + "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.80", + "@superset-ui/legacy-plugin-chart-treemap": "^0.17.80", + "@superset-ui/legacy-plugin-chart-world-map": "^0.17.80", + "@superset-ui/legacy-preset-chart-big-number": "^0.17.80", "@superset-ui/legacy-preset-chart-deckgl": "^0.4.9", - "@superset-ui/legacy-preset-chart-nvd3": "^0.17.79", - "@superset-ui/plugin-chart-echarts": "^0.17.79", - "@superset-ui/plugin-chart-pivot-table": "^0.17.79", - "@superset-ui/plugin-chart-table": "^0.17.79", - "@superset-ui/plugin-chart-word-cloud": "^0.17.79", - "@superset-ui/preset-chart-xy": "^0.17.79", + "@superset-ui/legacy-preset-chart-nvd3": "^0.17.80", + "@superset-ui/plugin-chart-echarts": "^0.17.80", + "@superset-ui/plugin-chart-pivot-table": "^0.17.80", + "@superset-ui/plugin-chart-table": "^0.17.80", + "@superset-ui/plugin-chart-word-cloud": "^0.17.80", + "@superset-ui/preset-chart-xy": "^0.17.80", "@vx/responsive": "^0.0.195", "abortcontroller-polyfill": "^1.1.9", "antd": "^4.9.4", From d71f3289acfc8fed62f636021d1e2bbc70e96ee8 Mon Sep 17 00:00:00 2001 From: Ville Brofeldt Date: Mon, 9 Aug 2021 16:43:44 +0300 Subject: [PATCH 09/11] add isExtra to schema --- superset/charts/schemas.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/superset/charts/schemas.py b/superset/charts/schemas.py index 27ebc26d73ec9..9968a0769ee46 100644 --- a/superset/charts/schemas.py +++ b/superset/charts/schemas.py @@ -293,6 +293,13 @@ class ChartDataAdhocMetricSchema(Schema): "will be generated.", example="metric_aec60732-fac0-4b17-b736-93f1a5c93e30", ) + timeGrain = fields.String( + description="Optional time grain for temporal filters", example="PT1M", + ) + isExtra = fields.Boolean( + description="Indicates if the filter has been added by a filter component as " + "opposed to being a part of the original query." + ) class ChartDataAggregateConfigField(fields.Dict): @@ -774,6 +781,10 @@ class ChartDataFilterSchema(Schema): grain = fields.String( description="Optional time grain for temporal filters", example="PT1M", ) + isExtra = fields.Boolean( + description="Indicates if the filter has been added by a filter component as " + "opposed to being a part of the original query." + ) class ChartDataExtrasSchema(Schema): From 7f11b8654366989a899e711608e39e724eaa6e03 Mon Sep 17 00:00:00 2001 From: Ville Brofeldt Date: Mon, 9 Aug 2021 19:22:13 +0300 Subject: [PATCH 10/11] address comments --- superset/utils/core.py | 10 +++++----- tests/integration_tests/model_tests.py | 4 +++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/superset/utils/core.py b/superset/utils/core.py index 712adacafb770..5f7114d6714f0 100644 --- a/superset/utils/core.py +++ b/superset/utils/core.py @@ -1008,16 +1008,16 @@ def zlib_decompress(blob: bytes, decode: Optional[bool] = True) -> Union[bytes, def simple_filter_to_adhoc( - filt: QueryObjectFilterClause, clause: str = "where", + filter_clause: QueryObjectFilterClause, clause: str = "where", ) -> AdhocFilterClause: result: AdhocFilterClause = { "clause": clause.upper(), "expressionType": "SIMPLE", - "comparator": filt.get("val"), - "operator": filt["op"], - "subject": filt["col"], + "comparator": filter_clause.get("val"), + "operator": filter_clause["op"], + "subject": filter_clause["col"], } - if filt.get("isExtra"): + if filter_clause.get("isExtra"): result["isExtra"] = True result["filterOptionName"] = md5_sha_from_dict(cast(Dict[Any, Any], result)) diff --git a/tests/integration_tests/model_tests.py b/tests/integration_tests/model_tests.py index ee9b3cd215f06..558239dc52ad7 100644 --- a/tests/integration_tests/model_tests.py +++ b/tests/integration_tests/model_tests.py @@ -22,7 +22,6 @@ load_birth_names_dashboard_with_slices, ) -import pandas import pytest from sqlalchemy.engine.url import make_url @@ -343,8 +342,10 @@ def test_get_timestamp_expression(self): ds_col = tbl.get_column("ds") sqla_literal = ds_col.get_timestamp_expression(None) self.assertEqual(str(sqla_literal.compile()), "ds") + assert type(sqla_literal.type).__name__ == "TemporalWrapperType" sqla_literal = ds_col.get_timestamp_expression("P1D") + assert type(sqla_literal.type).__name__ == "TemporalWrapperType" compiled = "{}".format(sqla_literal.compile()) if tbl.database.backend == "mysql": self.assertEqual(compiled, "DATE(ds)") @@ -352,6 +353,7 @@ def test_get_timestamp_expression(self): prev_ds_expr = ds_col.expression ds_col.expression = "DATE_ADD(ds, 1)" sqla_literal = ds_col.get_timestamp_expression("P1D") + assert type(sqla_literal.type).__name__ == "TemporalWrapperType" compiled = "{}".format(sqla_literal.compile()) if tbl.database.backend == "mysql": self.assertEqual(compiled, "DATE(DATE_ADD(ds, 1))") From 2ff35a80258272dca23ead6fab5d96226ca57b52 Mon Sep 17 00:00:00 2001 From: Ville Brofeldt Date: Mon, 9 Aug 2021 20:06:02 +0300 Subject: [PATCH 11/11] fix presto test --- tests/integration_tests/model_tests.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/integration_tests/model_tests.py b/tests/integration_tests/model_tests.py index 558239dc52ad7..deb78460b68a0 100644 --- a/tests/integration_tests/model_tests.py +++ b/tests/integration_tests/model_tests.py @@ -338,14 +338,19 @@ def test_multi_statement(self): class TestSqlaTableModel(SupersetTestCase): @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") def test_get_timestamp_expression(self): + col_type = ( + "VARCHAR" + if get_example_database().backend == "presto" + else "TemporalWrapperType" + ) tbl = self.get_table(name="birth_names") ds_col = tbl.get_column("ds") sqla_literal = ds_col.get_timestamp_expression(None) self.assertEqual(str(sqla_literal.compile()), "ds") - assert type(sqla_literal.type).__name__ == "TemporalWrapperType" + assert type(sqla_literal.type).__name__ == col_type sqla_literal = ds_col.get_timestamp_expression("P1D") - assert type(sqla_literal.type).__name__ == "TemporalWrapperType" + assert type(sqla_literal.type).__name__ == col_type compiled = "{}".format(sqla_literal.compile()) if tbl.database.backend == "mysql": self.assertEqual(compiled, "DATE(ds)") @@ -353,7 +358,7 @@ def test_get_timestamp_expression(self): prev_ds_expr = ds_col.expression ds_col.expression = "DATE_ADD(ds, 1)" sqla_literal = ds_col.get_timestamp_expression("P1D") - assert type(sqla_literal.type).__name__ == "TemporalWrapperType" + assert type(sqla_literal.type).__name__ == col_type compiled = "{}".format(sqla_literal.compile()) if tbl.database.backend == "mysql": self.assertEqual(compiled, "DATE(DATE_ADD(ds, 1))")