You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by su...@apache.org on 2020/09/17 15:58:49 UTC
[incubator-superset] 02/03: refactor applied/rejected filters code
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 <aa...@gmail.com>
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(