def data_for_slices(self, slices: List[Slice]) -> Dict[str, Any]: """ The representation of the datasource containing only the required data to render the provided slices. Used to reduce the payload when loading a dashboard. """ data = self.data metric_names = set() column_names = set() for slc in slices: form_data = slc.form_data # pull out all required metrics from the form_data for param in METRIC_FORM_DATA_PARAMS: for metric in utils.get_iterable(form_data.get(param) or []): metric_names.add(utils.get_metric_name(metric)) if utils.is_adhoc_metric(metric): column_names.add((metric.get("column") or {}).get("column_name")) # pull out all required columns from the form_data for filter_ in form_data.get("adhoc_filters") or []: if filter_["clause"] == "WHERE" and filter_.get("subject"): column_names.add(filter_.get("subject")) for param in COLUMN_FORM_DATA_PARAMS: for column in utils.get_iterable(form_data.get(param) or []): column_names.add(column) filtered_metrics = [ metric for metric in data["metrics"] if metric["metric_name"] in metric_names ] filtered_columns = [ column for column in data["columns"] if column["column_name"] in column_names ] del data["description"] data.update({"metrics": filtered_metrics}) data.update({"columns": filtered_columns}) verbose_map = {"__timestamp": "Time"} verbose_map.update({ metric["metric_name"]: metric["verbose_name"] or metric["metric_name"] for metric in filtered_metrics }) verbose_map.update({ column["column_name"]: column["verbose_name"] or column["column_name"] for column in filtered_columns }) data["verbose_map"] = verbose_map return data
def test_get_iterable(self): self.assertListEqual(get_iterable(123), [123]) self.assertListEqual(get_iterable([123]), [123]) self.assertListEqual(get_iterable("foo"), ["foo"])
def data_for_slices(self, slices: List[Slice]) -> Dict[str, Any]: """ The representation of the datasource containing only the required data to render the provided slices. Used to reduce the payload when loading a dashboard. """ data = self.data metric_names = set() column_names = set() for slc in slices: form_data = slc.form_data # pull out all required metrics from the form_data for param in METRIC_FORM_DATA_PARAMS: for metric in utils.get_iterable(form_data.get(param) or []): metric_names.add(utils.get_metric_name(metric)) if utils.is_adhoc_metric(metric): column_names.add( (metric.get("column") or {}).get("column_name") ) # Columns used in query filters column_names.update( filter_["subject"] for filter_ in form_data.get("adhoc_filters") or [] if filter_.get("clause") == "WHERE" and filter_.get("subject") ) # columns used by Filter Box column_names.update( filter_config["column"] for filter_config in form_data.get("filter_configs") or [] if "column" in filter_config ) column_names.update( column for column in utils.get_iterable(form_data.get(param) or []) for param in COLUMN_FORM_DATA_PARAMS ) filtered_metrics = [ metric for metric in data["metrics"] if metric["metric_name"] in metric_names ] filtered_columns: List[Column] = [] column_types: Set[GenericDataType] = set() for column in data["columns"]: generic_type = column.get("type_generic") if generic_type is not None: column_types.add(generic_type) if column["column_name"] in column_names: filtered_columns.append(column) data["column_types"] = list(column_types) del data["description"] data.update({"metrics": filtered_metrics}) data.update({"columns": filtered_columns}) verbose_map = {"__timestamp": "Time"} verbose_map.update( { metric["metric_name"]: metric["verbose_name"] or metric["metric_name"] for metric in filtered_metrics } ) verbose_map.update( { column["column_name"]: column["verbose_name"] or column["column_name"] for column in filtered_columns } ) data["verbose_map"] = verbose_map return data
def data_for_slices( # pylint: disable=too-many-locals self, slices: List[Slice]) -> Dict[str, Any]: """ The representation of the datasource containing only the required data to render the provided slices. Used to reduce the payload when loading a dashboard. """ data = self.data metric_names = set() column_names = set() for slc in slices: form_data = slc.form_data # pull out all required metrics from the form_data for metric_param in METRIC_FORM_DATA_PARAMS: for metric in utils.get_iterable( form_data.get(metric_param) or []): metric_names.add(utils.get_metric_name(metric)) if utils.is_adhoc_metric(metric): column_names.add((metric.get("column") or {}).get("column_name")) # Columns used in query filters column_names.update( filter_["subject"] for filter_ in form_data.get("adhoc_filters") or [] if filter_.get("clause") == "WHERE" and filter_.get("subject")) # columns used by Filter Box column_names.update( filter_config["column"] for filter_config in form_data.get("filter_configs") or [] if "column" in filter_config) # for legacy dashboard imports which have the wrong query_context in them try: query_context = slc.get_query_context() except DatasetNotFoundError: query_context = None # legacy charts don't have query_context charts if query_context: column_names.update([ utils.get_column_name(column) for query in query_context.queries for column in query.columns ] or []) else: _columns = [ utils.get_column_name(column) if utils.is_adhoc_column(column) else column for column_param in COLUMN_FORM_DATA_PARAMS for column in utils.get_iterable( form_data.get(column_param) or []) ] column_names.update(_columns) filtered_metrics = [ metric for metric in data["metrics"] if metric["metric_name"] in metric_names ] filtered_columns: List[Column] = [] column_types: Set[GenericDataType] = set() for column in data["columns"]: generic_type = column.get("type_generic") if generic_type is not None: column_types.add(generic_type) if column["column_name"] in column_names: filtered_columns.append(column) data["column_types"] = list(column_types) del data["description"] data.update({"metrics": filtered_metrics}) data.update({"columns": filtered_columns}) verbose_map = {"__timestamp": "Time"} verbose_map.update({ metric["metric_name"]: metric["verbose_name"] or metric["metric_name"] for metric in filtered_metrics }) verbose_map.update({ column["column_name"]: column["verbose_name"] or column["column_name"] for column in filtered_columns }) data["verbose_map"] = verbose_map return data