def _get_full( query_context: QueryContext, query_obj: QueryObject, force_cached: Optional[bool] = False, ) -> Dict[str, Any]: datasource = _get_datasource(query_context, query_obj) result_type = query_obj.result_type or query_context.result_type payload = query_context.get_df_payload(query_obj, force_cached=force_cached) applied_template_filters = payload.get("applied_template_filters", []) df = payload["df"] status = payload["status"] if status != QueryStatus.FAILED: payload["colnames"] = list(df.columns) payload["indexnames"] = list(df.index) payload["coltypes"] = extract_dataframe_dtypes(df, datasource) payload["data"] = query_context.get_data(df) payload["result_format"] = query_context.result_format del payload["df"] 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( datasource, query_obj.applied_time_extras ) payload["applied_filters"] = [ {"column": get_column_name(col)} for col in filter_columns if is_adhoc_column(col) or col in columns or col in applied_template_filters ] + applied_time_columns payload["rejected_filters"] = [ {"reason": ExtraFiltersReasonType.COL_NOT_IN_DATASOURCE, "column": col} for col in filter_columns if not is_adhoc_column(col) and col not in columns and col not in applied_template_filters ] + rejected_time_columns if result_type == ChartDataResultType.RESULTS and status != QueryStatus.FAILED: return { "data": payload.get("data"), "colnames": payload.get("colnames"), "coltypes": payload.get("coltypes"), } return payload
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