This is an automated email from the ASF dual-hosted git repository. suddjian pushed a commit to branch feature/filter-p0 in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
commit 42846702bdd085c3629131c58717244479a0e509 Author: David Aaron Suddjian <[email protected]> AuthorDate: Tue Sep 15 09:53:08 2020 -0700 refactor applied/rejected filters code --- .../dashboard/components/FiltersBadge/selectors.js | 99 ++++++++++++---------- superset/viz.py | 21 +++-- 2 files changed, 66 insertions(+), 54 deletions(-) diff --git a/superset-frontend/src/dashboard/components/FiltersBadge/selectors.js b/superset-frontend/src/dashboard/components/FiltersBadge/selectors.js index 6aedfe8..6bdd0b9 100644 --- a/superset-frontend/src/dashboard/components/FiltersBadge/selectors.js +++ b/superset-frontend/src/dashboard/components/FiltersBadge/selectors.js @@ -1,6 +1,6 @@ -import { getChartIdsInFilterScope } from "../../util/activeDashboardFilters"; -import { isNil, get } from "lodash"; -import {TIME_FILTER_MAP} from "../../../visualizations/FilterBox/FilterBox"; +import { getChartIdsInFilterScope } from '../../util/activeDashboardFilters'; +import { isNil, get } from 'lodash'; +import { TIME_FILTER_MAP } from '../../../visualizations/FilterBox/FilterBox'; export const UNSET = 'UNSET'; export const APPLIED = 'APPLIED'; @@ -42,30 +42,27 @@ const selectIndicatorValue = (columnKey, filter, datasource) => { if ( isNil(filter.columns[columnKey]) || (filter.isDateFilter && filter.columns[columnKey] === 'No filter') || - (Array.isArray(filter.columns[columnKey]) && filter.columns[columnKey].length === 0) + (Array.isArray(filter.columns[columnKey]) && + filter.columns[columnKey].length === 0) ) { return []; } if (filter.isDateFilter && TIME_GRANULARITY_FIELDS.has(columnKey)) { - const timeGranularityMap = (( - columnKey === TIME_FILTER_MAP.time_grain_sqla + const timeGranularityMap = ( + (columnKey === TIME_FILTER_MAP.time_grain_sqla ? datasource.time_grain_sqla - : datasource.granularity - ) || []) - .reduce( - (map, [key, value]) => ({ - ...map, - [key]: value, - }), - {}, - ) - ; - + : datasource.granularity) || [] + ).reduce( + (map, [key, value]) => ({ + ...map, + [key]: value, + }), + {}, + ); return [] .concat(filter.columns[columnKey]) - .map(value => timeGranularityMap[value] || value) - ; + .map(value => timeGranularityMap[value] || value); } return [].concat(filter.columns[columnKey]); @@ -75,46 +72,58 @@ const selectIndicatorStatus = (columnKey, filter, chart) => { if ( isNil(filter.columns[columnKey]) || (filter.isDateFilter && filter.columns[columnKey] === 'No filter') || - (Array.isArray(filter.columns[columnKey]) && filter.columns[columnKey].length === 0) + (Array.isArray(filter.columns[columnKey]) && + filter.columns[columnKey].length === 0) ) { return UNSET; } - if (!get(chart,'queryResponse.applied_filters',[]).includes(columnKey)) { + if (get(chart, 'queryResponse.rejected_filters', []).includes(columnKey)) { return INCOMPATIBLE; } return APPLIED; }; -const selectIndicatorsForChartFromFilter = (chartId, filter, filterDataSource, chart) => { - return Object - .keys(filter.columns) - .filter((key) => getChartIdsInFilterScope({ filterScope: filter.scopes[key] }).includes(chartId)) - .map((key) => ({ +const selectIndicatorsForChartFromFilter = ( + chartId, + filter, + filterDataSource, + chart, +) => { + return Object.keys(filter.columns) + .filter(key => + getChartIdsInFilterScope({ filterScope: filter.scopes[key] }).includes( + chartId, + ), + ) + .map(key => ({ id: key, name: filter.labels[key] || key, value: selectIndicatorValue(key, filter, filterDataSource), status: selectIndicatorStatus(key, filter, chart), path: filter.directPathToFilter, - })) - ; + })); }; -export const selectIndicatorsForChart = (chartId, filters, datasources, charts) => { - console.log(charts); - return Object - .values(filters) - .filter((filter) => filter.chartId !== chartId) - .reduce((acc, filter) => ( - acc.concat( - selectIndicatorsForChartFromFilter( - chartId, - filter, - datasources[filter.datasourceId] || {}, - charts[chartId], - ) - ) - ), []) - ; -}; \ No newline at end of file +export const selectIndicatorsForChart = ( + chartId, + filters, + datasources, + charts, +) => { + return Object.values(filters) + .filter(filter => filter.chartId !== chartId) + .reduce( + (acc, filter) => + acc.concat( + selectIndicatorsForChartFromFilter( + chartId, + filter, + datasources[filter.datasourceId] || {}, + charts[chartId], + ), + ), + [], + ); +}; diff --git a/superset/viz.py b/superset/viz.py index 6068605..bdf1f0b 100644 --- a/superset/viz.py +++ b/superset/viz.py @@ -173,6 +173,9 @@ class BaseViz: self.process_metrics() + self.applied_filters = [] + self.rejected_filters = [] + def process_metrics(self) -> None: # metrics in TableViz is order sensitive, so metric_dict should be # OrderedDict @@ -342,6 +345,12 @@ class BaseViz: merge_extra_filters(self.form_data) utils.split_adhoc_filters_into_base_filters(self.form_data) + filters = self.form_data.get("filters") + filter_columns = [flt.get("col") for flt in filters] + columns = set(self.datasource.column_names) + self.applied_filters = [{"column": col} for col in filter_columns if col in columns] + self.rejected_filters = [{"reason": "not_in_datasource", "column": col} for col in filter_columns if col not in columns] + def query_obj(self) -> QueryObjectDict: """Building a query object""" form_data = self.form_data @@ -474,20 +483,14 @@ class BaseViz: df = payload.get("df") - # Check incompatible filters. Probably a better spot for this. - filters = self.form_data.get("filters") - labels = set() - for flt in filters: - labels.add(flt.get("col")) - # This doesn't seem to work for the date-time columns. Probably due to date time fields getting prefixed - # with underscore like __ds. To fix, we need to try comparing with ds instead. - payload["applied_filters"] = labels.intersection(set(self.datasource.column_names)) - if self.status != utils.QueryStatus.FAILED: payload["data"] = self.get_data(df) if "df" in payload: del payload["df"] + payload["applied_filters"] = self.applied_filters + payload["rejected_filters"] = self.rejected_filters + return payload def get_df_payload(
