| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| import { ControlState, Dataset, Metric } from '@superset-ui/chart-controls'; |
| import { |
| Column, |
| isAdhocMetricSimple, |
| isAdhocMetricSQL, |
| isSavedMetric, |
| isSimpleAdhocFilter, |
| JsonValue, |
| SimpleAdhocFilter, |
| } from '@superset-ui/core'; |
| import { isEmpty } from 'lodash'; |
| import AdhocMetric from 'src/explore/components/controls/MetricControl/AdhocMetric'; |
| |
| const isControlValueCompatibleWithDatasource = ( |
| datasource: Dataset, |
| controlState: ControlState, |
| value: any, |
| ) => { |
| // A datasource might have been deleted, in which case we can't validate |
| // only using the control state since it might have been hydrated with |
| // the wrong options or columns (empty arrays). |
| if (controlState.options && typeof value === 'string') { |
| if ( |
| (!isEmpty(controlState.options) && |
| controlState.options.some( |
| (option: [string | number, string] | { column_name: string }) => |
| Array.isArray(option) |
| ? option[0] === value |
| : option.column_name === value, |
| )) || |
| !isEmpty(datasource?.columns) |
| ) { |
| return datasource.columns.some( |
| (column: Column) => column.column_name === value, |
| ); |
| } |
| } |
| if ( |
| controlState.savedMetrics && |
| isSavedMetric(value) && |
| (controlState.savedMetrics.some( |
| (savedMetric: Metric) => savedMetric.metric_name === value, |
| ) || |
| !isEmpty(datasource?.metrics)) |
| ) { |
| return datasource.metrics.some( |
| (metric: Metric) => metric.metric_name === value, |
| ); |
| } |
| if ( |
| controlState.columns && |
| (isAdhocMetricSimple(value) || isSimpleAdhocFilter(value)) && |
| ((!isEmpty(controlState.columns) && |
| controlState.columns.some( |
| (column: Column) => |
| column.column_name === (value as AdhocMetric).column?.column_name || |
| column.column_name === (value as SimpleAdhocFilter).subject, |
| )) || |
| !isEmpty(datasource?.columns)) |
| ) { |
| return datasource.columns.some( |
| (column: Column) => |
| column.column_name === (value as AdhocMetric).column?.column_name || |
| column.column_name === (value as SimpleAdhocFilter).subject, |
| ); |
| } |
| if (isAdhocMetricSQL(value)) { |
| Object.assign(value, { datasourceWarning: true }); |
| return true; |
| } |
| return false; |
| }; |
| |
| export const getControlValuesCompatibleWithDatasource = ( |
| datasource: Dataset, |
| controlState: ControlState, |
| value: JsonValue, |
| ) => { |
| if (value === undefined || value === null) { |
| return undefined; |
| } |
| if (Array.isArray(value)) { |
| const compatibleValues = value.filter(val => |
| isControlValueCompatibleWithDatasource(datasource, controlState, val), |
| ); |
| return compatibleValues.length > 0 |
| ? compatibleValues |
| : controlState.default; |
| } |
| return isControlValueCompatibleWithDatasource(datasource, controlState, value) |
| ? value |
| : controlState.default; |
| }; |