You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by kg...@apache.org on 2023/03/01 14:45:14 UTC

[superset] branch master updated: fix(explore): Dashboard filters on adhoc cols not working in Explore (#23239)

This is an automated email from the ASF dual-hosted git repository.

kgabryje pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git


The following commit(s) were added to refs/heads/master by this push:
     new 6076457b90 fix(explore): Dashboard filters on adhoc cols not working in Explore (#23239)
6076457b90 is described below

commit 6076457b90920da3f179cdd29c47ba83b1b018ab
Author: Kamil Gabryjelski <ka...@gmail.com>
AuthorDate: Wed Mar 1 15:45:00 2023 +0100

    fix(explore): Dashboard filters on adhoc cols not working in Explore (#23239)
---
 .../explore/components/ControlPanelsContainer.tsx  |  3 +-
 .../DndFilterSelect.test.tsx                       |  5 +-
 .../DndColumnSelectControl/DndFilterSelect.tsx     |  6 +-
 .../FilterControl/AdhocFilter/AdhocFilter.test.js  |  6 +-
 .../controls/FilterControl/AdhocFilter/index.js    | 51 +--------------
 .../AdhocFilterControl/AdhocFilterControl.test.jsx |  6 +-
 .../FilterControl/AdhocFilterControl/index.jsx     |  6 +-
 .../AdhocFilterEditPopover.test.jsx                |  6 +-
 .../FilterControl/AdhocFilterEditPopover/index.jsx |  5 +-
 ...AdhocFilterEditPopoverSimpleTabContent.test.tsx |  6 +-
 .../index.tsx                                      |  6 +-
 .../AdhocFilterEditPopoverSqlTabContent.test.jsx   |  6 +-
 .../AdhocFilterEditPopoverSqlTabContent/index.jsx  |  6 +-
 .../AdhocFilterOption/AdhocFilterOption.test.tsx   |  6 +-
 .../AdhocFilterPopoverTrigger.test.tsx             |  6 +-
 .../controls/FilterControl/adhocFilterType.js      |  2 +-
 .../FilterControl/{adhocFilterType.js => types.ts} | 27 +++-----
 .../controls/FilterControl/utils/translateToSQL.ts | 76 ++++++++++++++++++++++
 .../utils/useGetTimeRangeLabel.test.ts             |  3 +-
 .../FilterControl/utils/useGetTimeRangeLabel.tsx   |  3 +-
 .../getFormDataFromDashboardContext.test.ts        | 36 ++++++++++
 .../getFormDataWithDashboardContext.ts             | 54 ++++++++++-----
 superset-frontend/src/filters/utils.ts             |  8 ++-
 23 files changed, 201 insertions(+), 138 deletions(-)

diff --git a/superset-frontend/src/explore/components/ControlPanelsContainer.tsx b/superset-frontend/src/explore/components/ControlPanelsContainer.tsx
index 60aac1948b..018f0b0ac3 100644
--- a/superset-frontend/src/explore/components/ControlPanelsContainer.tsx
+++ b/superset-frontend/src/explore/components/ControlPanelsContainer.tsx
@@ -70,6 +70,7 @@ import Control from './Control';
 import { ExploreAlert } from './ExploreAlert';
 import { RunQueryButton } from './RunQueryButton';
 import { Operators } from '../constants';
+import { CLAUSES } from './controls/FilterControl/types';
 
 const { confirm } = Modal;
 
@@ -317,7 +318,7 @@ export const ControlPanelsContainer = (props: ControlPanelsContainerProps) => {
             setControlValue('adhoc_filters', [
               ...(adhoc_filters || []),
               {
-                clause: 'WHERE',
+                clause: CLAUSES.WHERE,
                 subject: x_axis,
                 operator: Operators.TEMPORAL_RANGE,
                 comparator: defaultTimeFilter || NO_TIME_RANGE,
diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.test.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.test.tsx
index b6f6c6fb9c..5bf79a3b83 100644
--- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.test.tsx
+++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.test.tsx
@@ -32,14 +32,13 @@ import { TimeseriesDefaultFormData } from '@superset-ui/plugin-chart-echarts';
 
 import { render, screen } from 'spec/helpers/testing-library';
 import AdhocMetric from 'src/explore/components/controls/MetricControl/AdhocMetric';
-import AdhocFilter, {
-  EXPRESSION_TYPES,
-} from 'src/explore/components/controls/FilterControl/AdhocFilter';
+import AdhocFilter from 'src/explore/components/controls/FilterControl/AdhocFilter';
 import {
   DndFilterSelect,
   DndFilterSelectProps,
 } from 'src/explore/components/controls/DndColumnSelectControl/DndFilterSelect';
 import { PLACEHOLDER_DATASOURCE } from 'src/dashboard/constants';
+import { EXPRESSION_TYPES } from '../FilterControl/types';
 
 const defaultProps: DndFilterSelectProps = {
   type: 'DndFilterSelect',
diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx
index 134678aa6f..b7d5232c20 100644
--- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx
+++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx
@@ -43,10 +43,7 @@ import { Datasource, OptionSortType } from 'src/explore/types';
 import { OptionValueType } from 'src/explore/components/controls/DndColumnSelectControl/types';
 import AdhocFilterPopoverTrigger from 'src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger';
 import DndSelectLabel from 'src/explore/components/controls/DndColumnSelectControl/DndSelectLabel';
-import AdhocFilter, {
-  CLAUSES,
-  EXPRESSION_TYPES,
-} from 'src/explore/components/controls/FilterControl/AdhocFilter';
+import AdhocFilter from 'src/explore/components/controls/FilterControl/AdhocFilter';
 import AdhocMetric from 'src/explore/components/controls/MetricControl/AdhocMetric';
 import {
   DatasourcePanelDndItem,
@@ -58,6 +55,7 @@ import { ControlComponentProps } from 'src/explore/components/Control';
 import AdhocFilterControl from '../FilterControl/AdhocFilterControl';
 import DndAdhocFilterOption from './DndAdhocFilterOption';
 import { useDefaultTimeFilter } from '../DateFilterControl/utils';
+import { CLAUSES, EXPRESSION_TYPES } from '../FilterControl/types';
 
 const { warning } = Modal;
 
diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/AdhocFilter.test.js b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/AdhocFilter.test.js
index f3e08d7a28..20f9576a47 100644
--- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/AdhocFilter.test.js
+++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/AdhocFilter.test.js
@@ -16,11 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import AdhocFilter, {
-  EXPRESSION_TYPES,
-  CLAUSES,
-} from 'src/explore/components/controls/FilterControl/AdhocFilter';
+import AdhocFilter from 'src/explore/components/controls/FilterControl/AdhocFilter';
 import { Operators } from 'src/explore/constants';
+import { EXPRESSION_TYPES, CLAUSES } from '../types';
 
 describe('AdhocFilter', () => {
   it('sets filterOptionName in constructor', () => {
diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/index.js b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/index.js
index 3b54a7dc1a..f00491b89f 100644
--- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/index.js
+++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/index.js
@@ -21,60 +21,13 @@ import {
   Operators,
   OPERATOR_ENUM_TO_OPERATOR_TYPE,
 } from 'src/explore/constants';
-import { getSimpleSQLExpression } from 'src/explore/exploreUtils';
-
-export const EXPRESSION_TYPES = {
-  SIMPLE: 'SIMPLE',
-  SQL: 'SQL',
-};
-
-export const CLAUSES = {
-  HAVING: 'HAVING',
-  WHERE: 'WHERE',
-};
-
-const OPERATORS_TO_SQL = {
-  '==': '=',
-  '!=': '<>',
-  '>': '>',
-  '<': '<',
-  '>=': '>=',
-  '<=': '<=',
-  IN: 'IN',
-  'NOT IN': 'NOT IN',
-  LIKE: 'LIKE',
-  ILIKE: 'ILIKE',
-  REGEX: 'REGEX',
-  'IS NOT NULL': 'IS NOT NULL',
-  'IS NULL': 'IS NULL',
-  'IS TRUE': 'IS TRUE',
-  'IS FALSE': 'IS FALSE',
-  'LATEST PARTITION': ({ datasource }) =>
-    `= '{{ presto.latest_partition('${datasource.schema}.${datasource.datasource_name}') }}'`,
-};
+import { translateToSql } from '../utils/translateToSQL';
+import { CLAUSES, EXPRESSION_TYPES } from '../types';
 
 const CUSTOM_OPERATIONS = [...CUSTOM_OPERATORS].map(
   op => OPERATOR_ENUM_TO_OPERATOR_TYPE[op].operation,
 );
 
-function translateToSql(adhocMetric, { useSimple } = {}) {
-  if (adhocMetric.expressionType === EXPRESSION_TYPES.SIMPLE || useSimple) {
-    const { subject, comparator } = adhocMetric;
-    const operator =
-      adhocMetric.operator &&
-      // 'LATEST PARTITION' supported callback only
-      adhocMetric.operator ===
-        OPERATOR_ENUM_TO_OPERATOR_TYPE[Operators.LATEST_PARTITION].operation
-        ? OPERATORS_TO_SQL[adhocMetric.operator](adhocMetric)
-        : OPERATORS_TO_SQL[adhocMetric.operator];
-    return getSimpleSQLExpression(subject, operator, comparator);
-  }
-  if (adhocMetric.expressionType === EXPRESSION_TYPES.SQL) {
-    return adhocMetric.sqlExpression;
-  }
-  return '';
-}
-
 export default class AdhocFilter {
   constructor(adhocFilter) {
     this.expressionType = adhocFilter.expressionType || EXPRESSION_TYPES.SIMPLE;
diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/AdhocFilterControl.test.jsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/AdhocFilterControl.test.jsx
index c7b13d55fa..964f0def00 100644
--- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/AdhocFilterControl.test.jsx
+++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/AdhocFilterControl.test.jsx
@@ -22,10 +22,7 @@ import sinon from 'sinon';
 import { shallow } from 'enzyme';
 import { supersetTheme } from '@superset-ui/core';
 
-import AdhocFilter, {
-  EXPRESSION_TYPES,
-  CLAUSES,
-} from 'src/explore/components/controls/FilterControl/AdhocFilter';
+import AdhocFilter from 'src/explore/components/controls/FilterControl/AdhocFilter';
 import { LabelsContainer } from 'src/explore/components/controls/OptionControls';
 import {
   AGGREGATES,
@@ -34,6 +31,7 @@ import {
 } from 'src/explore/constants';
 import AdhocMetric from 'src/explore/components/controls/MetricControl/AdhocMetric';
 import AdhocFilterControl from '.';
+import { CLAUSES, EXPRESSION_TYPES } from '../types';
 
 const simpleAdhocFilter = new AdhocFilter({
   expressionType: EXPRESSION_TYPES.SIMPLE,
diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.jsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.jsx
index c0750c7805..c1a95bc8f2 100644
--- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.jsx
+++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.jsx
@@ -45,12 +45,10 @@ import Icons from 'src/components/Icons';
 import Modal from 'src/components/Modal';
 import AdhocFilterPopoverTrigger from 'src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger';
 import AdhocFilterOption from 'src/explore/components/controls/FilterControl/AdhocFilterOption';
-import AdhocFilter, {
-  CLAUSES,
-  EXPRESSION_TYPES,
-} from 'src/explore/components/controls/FilterControl/AdhocFilter';
+import AdhocFilter from 'src/explore/components/controls/FilterControl/AdhocFilter';
 import adhocFilterType from 'src/explore/components/controls/FilterControl/adhocFilterType';
 import columnType from 'src/explore/components/controls/FilterControl/columnType';
+import { CLAUSES, EXPRESSION_TYPES } from '../types';
 
 const { warning } = Modal;
 
diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/AdhocFilterEditPopover.test.jsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/AdhocFilterEditPopover.test.jsx
index 3fec073f94..d81abdc079 100644
--- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/AdhocFilterEditPopover.test.jsx
+++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/AdhocFilterEditPopover.test.jsx
@@ -24,15 +24,13 @@ import Button from 'src/components/Button';
 
 import ErrorBoundary from 'src/components/ErrorBoundary';
 import Tabs from 'src/components/Tabs';
-import AdhocFilter, {
-  EXPRESSION_TYPES,
-  CLAUSES,
-} from 'src/explore/components/controls/FilterControl/AdhocFilter';
+import AdhocFilter from 'src/explore/components/controls/FilterControl/AdhocFilter';
 import { AGGREGATES } from 'src/explore/constants';
 import AdhocFilterEditPopoverSimpleTabContent from 'src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent';
 import AdhocFilterEditPopoverSqlTabContent from 'src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent';
 import AdhocMetric from 'src/explore/components/controls/MetricControl/AdhocMetric';
 import AdhocFilterEditPopover from '.';
+import { CLAUSES, EXPRESSION_TYPES } from '../types';
 
 const simpleAdhocFilter = new AdhocFilter({
   expressionType: EXPRESSION_TYPES.SIMPLE,
diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx
index 98c6da8f1c..7820ceb9d4 100644
--- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx
+++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx
@@ -24,9 +24,7 @@ import { styled, t } from '@superset-ui/core';
 import ErrorBoundary from 'src/components/ErrorBoundary';
 import Tabs from 'src/components/Tabs';
 import adhocMetricType from 'src/explore/components/controls/MetricControl/adhocMetricType';
-import AdhocFilter, {
-  EXPRESSION_TYPES,
-} from 'src/explore/components/controls/FilterControl/AdhocFilter';
+import AdhocFilter from 'src/explore/components/controls/FilterControl/AdhocFilter';
 import AdhocFilterEditPopoverSimpleTabContent from 'src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent';
 import AdhocFilterEditPopoverSqlTabContent from 'src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent';
 import columnType from 'src/explore/components/controls/FilterControl/columnType';
@@ -34,6 +32,7 @@ import {
   POPOVER_INITIAL_HEIGHT,
   POPOVER_INITIAL_WIDTH,
 } from 'src/explore/constants';
+import { EXPRESSION_TYPES } from '../types';
 
 const propTypes = {
   adhocFilter: PropTypes.instanceOf(AdhocFilter).isRequired,
diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/AdhocFilterEditPopoverSimpleTabContent.test.tsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/AdhocFilterEditPopoverSimpleTabContent.test.tsx
index 9d1b68bc6f..9ad90167b5 100644
--- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/AdhocFilterEditPopoverSimpleTabContent.test.tsx
+++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/AdhocFilterEditPopoverSimpleTabContent.test.tsx
@@ -25,10 +25,7 @@ import thunk from 'redux-thunk';
 import { Provider } from 'react-redux';
 import configureStore from 'redux-mock-store';
 
-import AdhocFilter, {
-  EXPRESSION_TYPES,
-  CLAUSES,
-} from 'src/explore/components/controls/FilterControl/AdhocFilter';
+import AdhocFilter from 'src/explore/components/controls/FilterControl/AdhocFilter';
 import {
   AGGREGATES,
   Operators,
@@ -46,6 +43,7 @@ import AdhocFilterEditPopoverSimpleTabContent, {
   useSimpleTabFilterProps,
   Props,
 } from '.';
+import { CLAUSES, EXPRESSION_TYPES } from '../types';
 
 const simpleAdhocFilter = new AdhocFilter({
   expressionType: EXPRESSION_TYPES.SIMPLE,
diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx
index f0b05d8f1f..84feb448f6 100644
--- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx
+++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx
@@ -38,10 +38,7 @@ import {
   OPERATOR_ENUM_TO_OPERATOR_TYPE,
 } from 'src/explore/constants';
 import FilterDefinitionOption from 'src/explore/components/controls/MetricControl/FilterDefinitionOption';
-import AdhocFilter, {
-  EXPRESSION_TYPES,
-  CLAUSES,
-} from 'src/explore/components/controls/FilterControl/AdhocFilter';
+import AdhocFilter from 'src/explore/components/controls/FilterControl/AdhocFilter';
 import { Tooltip } from 'src/components/Tooltip';
 import { Input } from 'src/components/Input';
 import { optionLabel } from 'src/utils/common';
@@ -54,6 +51,7 @@ import {
 import useAdvancedDataTypes from './useAdvancedDataTypes';
 import { useDatePickerInAdhocFilter } from '../utils';
 import { useDefaultTimeFilter } from '../../DateFilterControl/utils';
+import { CLAUSES, EXPRESSION_TYPES } from '../types';
 
 const StyledInput = styled(Input)`
   margin-bottom: ${({ theme }) => theme.gridUnit * 4}px;
diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/AdhocFilterEditPopoverSqlTabContent.test.jsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/AdhocFilterEditPopoverSqlTabContent.test.jsx
index 00969225f6..c0837fdb48 100644
--- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/AdhocFilterEditPopoverSqlTabContent.test.jsx
+++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/AdhocFilterEditPopoverSqlTabContent.test.jsx
@@ -21,11 +21,9 @@ import React from 'react';
 import sinon from 'sinon';
 import { shallow } from 'enzyme';
 
-import AdhocFilter, {
-  EXPRESSION_TYPES,
-  CLAUSES,
-} from 'src/explore/components/controls/FilterControl/AdhocFilter';
+import AdhocFilter from 'src/explore/components/controls/FilterControl/AdhocFilter';
 import AdhocFilterEditPopoverSqlTabContent from '.';
+import { CLAUSES, EXPRESSION_TYPES } from '../types';
 
 const sqlAdhocFilter = new AdhocFilter({
   expressionType: EXPRESSION_TYPES.SQL,
diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx
index 2c897c0994..2e46e07255 100644
--- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx
+++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx
@@ -25,10 +25,8 @@ import sqlKeywords from 'src/SqlLab/utils/sqlKeywords';
 
 import adhocMetricType from 'src/explore/components/controls/MetricControl/adhocMetricType';
 import columnType from 'src/explore/components/controls/FilterControl/columnType';
-import AdhocFilter, {
-  EXPRESSION_TYPES,
-  CLAUSES,
-} from 'src/explore/components/controls/FilterControl/AdhocFilter';
+import AdhocFilter from 'src/explore/components/controls/FilterControl/AdhocFilter';
+import { CLAUSES, EXPRESSION_TYPES } from '../types';
 
 const propTypes = {
   adhocFilter: PropTypes.instanceOf(AdhocFilter).isRequired,
diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterOption/AdhocFilterOption.test.tsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterOption/AdhocFilterOption.test.tsx
index 8513f452e5..514a10094d 100644
--- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterOption/AdhocFilterOption.test.tsx
+++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterOption/AdhocFilterOption.test.tsx
@@ -19,11 +19,9 @@
 import React from 'react';
 import { render, screen, waitFor } from 'spec/helpers/testing-library';
 import userEvent from '@testing-library/user-event';
-import AdhocFilter, {
-  EXPRESSION_TYPES,
-  CLAUSES,
-} from 'src/explore/components/controls/FilterControl/AdhocFilter';
+import AdhocFilter from 'src/explore/components/controls/FilterControl/AdhocFilter';
 import AdhocFilterOption, { AdhocFilterOptionProps } from '.';
+import { CLAUSES, EXPRESSION_TYPES } from '../types';
 
 const simpleAdhocFilter = new AdhocFilter({
   expressionType: EXPRESSION_TYPES.SIMPLE,
diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger/AdhocFilterPopoverTrigger.test.tsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger/AdhocFilterPopoverTrigger.test.tsx
index 36c711ebf0..b983c413ea 100644
--- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger/AdhocFilterPopoverTrigger.test.tsx
+++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger/AdhocFilterPopoverTrigger.test.tsx
@@ -19,11 +19,9 @@
 import React from 'react';
 import { render, screen } from 'spec/helpers/testing-library';
 import userEvent from '@testing-library/user-event';
-import AdhocFilter, {
-  EXPRESSION_TYPES,
-  CLAUSES,
-} from 'src/explore/components/controls/FilterControl/AdhocFilter';
+import AdhocFilter from 'src/explore/components/controls/FilterControl/AdhocFilter';
 import AdhocFilterPopoverTrigger from '.';
+import { CLAUSES, EXPRESSION_TYPES } from '../types';
 
 const simpleAdhocFilter = new AdhocFilter({
   expressionType: EXPRESSION_TYPES.SIMPLE,
diff --git a/superset-frontend/src/explore/components/controls/FilterControl/adhocFilterType.js b/superset-frontend/src/explore/components/controls/FilterControl/adhocFilterType.js
index c9eef05926..df9f43a5d6 100644
--- a/superset-frontend/src/explore/components/controls/FilterControl/adhocFilterType.js
+++ b/superset-frontend/src/explore/components/controls/FilterControl/adhocFilterType.js
@@ -17,7 +17,7 @@
  * under the License.
  */
 import PropTypes from 'prop-types';
-import { EXPRESSION_TYPES, CLAUSES } from './AdhocFilter';
+import { CLAUSES, EXPRESSION_TYPES } from './types';
 
 export default PropTypes.oneOfType([
   PropTypes.shape({
diff --git a/superset-frontend/src/explore/components/controls/FilterControl/adhocFilterType.js b/superset-frontend/src/explore/components/controls/FilterControl/types.ts
similarity index 53%
copy from superset-frontend/src/explore/components/controls/FilterControl/adhocFilterType.js
copy to superset-frontend/src/explore/components/controls/FilterControl/types.ts
index c9eef05926..4adceab217 100644
--- a/superset-frontend/src/explore/components/controls/FilterControl/adhocFilterType.js
+++ b/superset-frontend/src/explore/components/controls/FilterControl/types.ts
@@ -16,22 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import PropTypes from 'prop-types';
-import { EXPRESSION_TYPES, CLAUSES } from './AdhocFilter';
 
-export default PropTypes.oneOfType([
-  PropTypes.shape({
-    expressionType: PropTypes.oneOf([EXPRESSION_TYPES.SIMPLE]).isRequired,
-    clause: PropTypes.oneOf([CLAUSES.HAVING, CLAUSES.WHERE]).isRequired,
-    subject: PropTypes.string.isRequired,
-    comparator: PropTypes.oneOfType([
-      PropTypes.string,
-      PropTypes.arrayOf(PropTypes.string),
-    ]).isRequired,
-  }),
-  PropTypes.shape({
-    expressionType: PropTypes.oneOf([EXPRESSION_TYPES.SQL]).isRequired,
-    clause: PropTypes.oneOf([CLAUSES.WHERE, CLAUSES.HAVING]).isRequired,
-    sqlExpression: PropTypes.string.isRequired,
-  }),
-]);
+export enum EXPRESSION_TYPES {
+  SIMPLE = 'SIMPLE',
+  SQL = 'SQL',
+}
+
+export enum CLAUSES {
+  HAVING = 'HAVING',
+  WHERE = 'WHERE',
+}
diff --git a/superset-frontend/src/explore/components/controls/FilterControl/utils/translateToSQL.ts b/superset-frontend/src/explore/components/controls/FilterControl/utils/translateToSQL.ts
new file mode 100644
index 0000000000..e041a30fba
--- /dev/null
+++ b/superset-frontend/src/explore/components/controls/FilterControl/utils/translateToSQL.ts
@@ -0,0 +1,76 @@
+/**
+ * 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 {
+  AdhocFilter,
+  isFreeFormAdhocFilter,
+  isSimpleAdhocFilter,
+  SimpleAdhocFilter,
+} from '@superset-ui/core';
+import {
+  OPERATOR_ENUM_TO_OPERATOR_TYPE,
+  Operators,
+} from 'src/explore/constants';
+import { getSimpleSQLExpression } from 'src/explore/exploreUtils';
+
+export const OPERATORS_TO_SQL = {
+  '==': '=',
+  '!=': '<>',
+  '>': '>',
+  '<': '<',
+  '>=': '>=',
+  '<=': '<=',
+  IN: 'IN',
+  'NOT IN': 'NOT IN',
+  LIKE: 'LIKE',
+  ILIKE: 'ILIKE',
+  REGEX: 'REGEX',
+  'IS NOT NULL': 'IS NOT NULL',
+  'IS NULL': 'IS NULL',
+  'IS TRUE': 'IS TRUE',
+  'IS FALSE': 'IS FALSE',
+  'LATEST PARTITION': ({
+    datasource,
+  }: {
+    datasource: { schema: string; datasource_name: string };
+  }) =>
+    `= '{{ presto.latest_partition('${datasource.schema}.${datasource.datasource_name}') }}'`,
+};
+
+export const translateToSql = (
+  adhocFilter: AdhocFilter,
+  { useSimple }: { useSimple: boolean } = { useSimple: false },
+) => {
+  if (isSimpleAdhocFilter(adhocFilter) || useSimple) {
+    const { subject, operator } = adhocFilter as SimpleAdhocFilter;
+    const comparator =
+      'comparator' in adhocFilter ? adhocFilter.comparator : undefined;
+    const op =
+      operator &&
+      // 'LATEST PARTITION' supported callback only
+      operator ===
+        OPERATOR_ENUM_TO_OPERATOR_TYPE[Operators.LATEST_PARTITION].operation
+        ? OPERATORS_TO_SQL[operator](adhocFilter)
+        : OPERATORS_TO_SQL[operator];
+    return getSimpleSQLExpression(subject, op, comparator);
+  }
+  if (isFreeFormAdhocFilter(adhocFilter)) {
+    return adhocFilter.sqlExpression;
+  }
+  return '';
+};
diff --git a/superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.test.ts b/superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.test.ts
index 0d39ef8a27..4deb8fbc6a 100644
--- a/superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.test.ts
+++ b/superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.test.ts
@@ -21,7 +21,8 @@ import { NO_TIME_RANGE } from '@superset-ui/core';
 import { Operators } from 'src/explore/constants';
 import * as FetchTimeRangeModule from 'src/explore/components/controls/DateFilterControl';
 import { useGetTimeRangeLabel } from './useGetTimeRangeLabel';
-import AdhocFilter, { CLAUSES, EXPRESSION_TYPES } from '../AdhocFilter';
+import AdhocFilter from '../AdhocFilter';
+import { CLAUSES, EXPRESSION_TYPES } from '../types';
 
 test('should return empty object if operator is not TEMPORAL_RANGE', () => {
   const adhocFilter = new AdhocFilter({
diff --git a/superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.tsx b/superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.tsx
index abc2ad5b27..f06743ed5c 100644
--- a/superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.tsx
+++ b/superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.tsx
@@ -20,7 +20,8 @@ import { useEffect, useState } from 'react';
 import { NO_TIME_RANGE } from '@superset-ui/core';
 import { fetchTimeRange } from 'src/explore/components/controls/DateFilterControl';
 import { Operators } from 'src/explore/constants';
-import AdhocFilter, { EXPRESSION_TYPES } from '../AdhocFilter';
+import AdhocFilter from '../AdhocFilter';
+import { EXPRESSION_TYPES } from '../types';
 
 interface Results {
   actualTimeRange?: string;
diff --git a/superset-frontend/src/explore/controlUtils/getFormDataFromDashboardContext.test.ts b/superset-frontend/src/explore/controlUtils/getFormDataFromDashboardContext.test.ts
index f3584e1c70..ca10ae1193 100644
--- a/superset-frontend/src/explore/controlUtils/getFormDataFromDashboardContext.test.ts
+++ b/superset-frontend/src/explore/controlUtils/getFormDataFromDashboardContext.test.ts
@@ -129,6 +129,15 @@ const getDashboardFormData = (overrides: JsonObject = {}) => ({
         op: '<=',
         val: 10000,
       },
+      {
+        col: {
+          sqlExpression: 'totally viable sql expression',
+          expressionType: 'SQL',
+          label: 'My column',
+        },
+        op: 'IN',
+        val: ['Value1', 'Value2'],
+      },
     ],
     granularity_sqla: 'ds',
     time_range: 'Last month',
@@ -179,6 +188,7 @@ const getExpectedResultFormData = (overrides: JsonObject = {}) => ({
       clause: 'WHERE',
       expressionType: 'SIMPLE',
       operator: 'IN',
+      operatorId: 'IN',
       subject: 'name',
       comparator: ['Aaron'],
       isExtra: true,
@@ -188,11 +198,19 @@ const getExpectedResultFormData = (overrides: JsonObject = {}) => ({
       clause: 'WHERE',
       expressionType: 'SIMPLE',
       operator: '<=',
+      operatorId: 'LESS_THAN_OR_EQUAL',
       subject: 'num_boys',
       comparator: 10000,
       isExtra: true,
       filterOptionName: expect.any(String),
     },
+    {
+      clause: 'WHERE',
+      expressionType: 'SQL',
+      sqlExpression: `(totally viable sql expression) IN ('Value1', 'Value2')`,
+      filterOptionName: expect.any(String),
+      isExtra: true,
+    },
   ],
   adhoc_filters_b: [
     {
@@ -208,6 +226,7 @@ const getExpectedResultFormData = (overrides: JsonObject = {}) => ({
       clause: 'WHERE',
       expressionType: 'SIMPLE',
       operator: 'IN',
+      operatorId: 'IN',
       subject: 'name',
       comparator: ['Aaron'],
       isExtra: true,
@@ -217,11 +236,19 @@ const getExpectedResultFormData = (overrides: JsonObject = {}) => ({
       clause: 'WHERE',
       expressionType: 'SIMPLE',
       operator: '<=',
+      operatorId: 'LESS_THAN_OR_EQUAL',
       subject: 'num_boys',
       comparator: 10000,
       isExtra: true,
       filterOptionName: expect.any(String),
     },
+    {
+      clause: 'WHERE',
+      expressionType: 'SQL',
+      sqlExpression: `(totally viable sql expression) IN ('Value1', 'Value2')`,
+      filterOptionName: expect.any(String),
+      isExtra: true,
+    },
   ],
   applied_time_extras: {
     __time_grain: 'P1D',
@@ -282,6 +309,15 @@ const getExpectedResultFormData = (overrides: JsonObject = {}) => ({
         op: '<=',
         val: 10000,
       },
+      {
+        col: {
+          expressionType: 'SQL',
+          label: 'My column',
+          sqlExpression: 'totally viable sql expression',
+        },
+        op: 'IN',
+        val: ['Value1', 'Value2'],
+      },
     ],
     granularity_sqla: 'ds',
     time_range: 'Last month',
diff --git a/superset-frontend/src/explore/controlUtils/getFormDataWithDashboardContext.ts b/superset-frontend/src/explore/controlUtils/getFormDataWithDashboardContext.ts
index 9565b48ddf..d686b70013 100644
--- a/superset-frontend/src/explore/controlUtils/getFormDataWithDashboardContext.ts
+++ b/superset-frontend/src/explore/controlUtils/getFormDataWithDashboardContext.ts
@@ -18,31 +18,55 @@
  */
 import isEqual from 'lodash/isEqual';
 import {
-  EXTRA_FORM_DATA_OVERRIDE_REGULAR_MAPPINGS,
+  AdhocFilter,
+  ensureIsArray,
   EXTRA_FORM_DATA_OVERRIDE_EXTRA_KEYS,
+  EXTRA_FORM_DATA_OVERRIDE_REGULAR_MAPPINGS,
+  isAdhocColumn,
   isDefined,
-  JsonObject,
-  ensureIsArray,
-  QueryObjectFilterClause,
-  SimpleAdhocFilter,
-  QueryFormData,
-  AdhocFilter,
   isFreeFormAdhocFilter,
   isSimpleAdhocFilter,
+  JsonObject,
   NO_TIME_RANGE,
+  QueryFormData,
+  QueryObjectFilterClause,
+  SimpleAdhocFilter,
 } from '@superset-ui/core';
+import { OPERATOR_ENUM_TO_OPERATOR_TYPE } from '../constants';
+import { translateToSql } from '../components/controls/FilterControl/utils/translateToSQL';
+import {
+  CLAUSES,
+  EXPRESSION_TYPES,
+} from '../components/controls/FilterControl/types';
 
 const simpleFilterToAdhoc = (
   filterClause: QueryObjectFilterClause,
-  clause = 'where',
+  clause: CLAUSES = CLAUSES.WHERE,
 ) => {
-  const result = {
-    clause: clause.toUpperCase(),
-    expressionType: 'SIMPLE',
-    operator: filterClause.op,
-    subject: filterClause.col,
-    comparator: 'val' in filterClause ? filterClause.val : undefined,
-  } as SimpleAdhocFilter;
+  let result: AdhocFilter;
+  if (isAdhocColumn(filterClause.col)) {
+    result = {
+      expressionType: 'SQL',
+      clause,
+      sqlExpression: translateToSql({
+        expressionType: EXPRESSION_TYPES.SIMPLE,
+        subject: `(${filterClause.col.sqlExpression})`,
+        operator: filterClause.op,
+        comparator: 'val' in filterClause ? filterClause.val : undefined,
+      } as SimpleAdhocFilter),
+    };
+  } else {
+    result = {
+      expressionType: 'SIMPLE',
+      clause,
+      operator: filterClause.op,
+      operatorId: Object.entries(OPERATOR_ENUM_TO_OPERATOR_TYPE).find(
+        operatorEntry => operatorEntry[1].operation === filterClause.op,
+      )?.[0],
+      subject: filterClause.col,
+      comparator: 'val' in filterClause ? filterClause.val : undefined,
+    } as SimpleAdhocFilter;
+  }
   if (filterClause.isExtra) {
     Object.assign(result, {
       isExtra: true,
diff --git a/superset-frontend/src/filters/utils.ts b/superset-frontend/src/filters/utils.ts
index 4908f1a289..69ca82f58e 100644
--- a/superset-frontend/src/filters/utils.ts
+++ b/superset-frontend/src/filters/utils.ts
@@ -25,6 +25,10 @@ import {
   ExtraFormData,
 } from '@superset-ui/core';
 import { FALSE_STRING, NULL_STRING, TRUE_STRING } from 'src/utils/common';
+import {
+  CLAUSES,
+  EXPRESSION_TYPES,
+} from '../explore/components/controls/FilterControl/types';
 
 export const getSelectExtraFormData = (
   col: string,
@@ -36,8 +40,8 @@ export const getSelectExtraFormData = (
   if (emptyFilter) {
     extra.adhoc_filters = [
       {
-        expressionType: 'SQL',
-        clause: 'WHERE',
+        expressionType: EXPRESSION_TYPES.SQL,
+        clause: CLAUSES.WHERE,
         sqlExpression: '1 = 0',
       },
     ];