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(