diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/buildQueryObject.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/buildQueryObject.ts index 7349ba464fc1..c8676d149146 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/buildQueryObject.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/buildQueryObject.ts @@ -36,10 +36,10 @@ export default function buildQueryObject(formData: T): const { metrics, groupby, columns } = extractQueryFields(residualFormData, queryFields); const groupbySet = new Set([...columns, ...groupby]); - const extraFilters = extractExtras(formData); + const extras = extractExtras(formData); const extrasAndfilters = processFilters({ ...formData, - ...extraFilters, + ...extras, }); return { @@ -47,7 +47,7 @@ export default function buildQueryObject(formData: T): since, until, granularity, - ...extraFilters, + ...extras, ...extrasAndfilters, groupby: processGroupby(Array.from(groupbySet)), is_timeseries: groupbySet.has(DTTM_ALIAS), diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/extractExtras.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/extractExtras.ts index 3df6b38d2043..f868977b867f 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/extractExtras.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/extractExtras.ts @@ -43,5 +43,10 @@ export default function extractExtras(formData: QueryFormData): Partial', '<', '>=', '<=', 'LIKE', 'REGEX'] as const; +const BINARY_OPERATORS = ['==', '!=', '>', '<', '>=', '<=', 'LIKE', 'REGEX'] as const; /** List of operators that require another operand that is a set */ const SET_OPERATORS = ['IN', 'NOT IN'] as const; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/types/QueryFormData.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/types/QueryFormData.ts index 8cec91ec5f9c..c9837244d4cd 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/types/QueryFormData.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/types/QueryFormData.ts @@ -11,6 +11,8 @@ export type QueryFormResidualData = { // eslint-disable-next-line @typescript-eslint/no-explicit-any [key: string]: any; }; +export type TimeRangeEndpoint = 'unknown' | 'inclusive' | 'exclusive'; +export type TimeRangeEndpoints = [TimeRangeEndpoint, TimeRangeEndpoint]; // Currently only Binary and Set filters are supported export type QueryFields = { @@ -69,6 +71,7 @@ export type BaseFormData = { result_format?: string; result_type?: string; queryFields?: QueryFields; + time_range_endpoints?: TimeRangeEndpoints; } & TimeRange & QueryFormResidualData; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/convertFilter.test.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/convertFilter.test.ts index 2947b82a4bfe..8d0bc9245074 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/convertFilter.test.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/convertFilter.test.ts @@ -21,12 +21,12 @@ describe('convertFilter', () => { expressionType: 'SIMPLE', clause: 'WHERE', subject: 'topping', - operator: '=', + operator: '==', comparator: 'grass jelly', }), ).toEqual({ col: 'topping', - op: '=', + op: '==', val: 'grass jelly', }); }); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/extractExtras.test.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/extractExtras.test.ts index 65e499539640..3572e154ceac 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/extractExtras.test.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/extractExtras.test.ts @@ -9,30 +9,31 @@ describe('extractExtras', () => { filters: [ { col: 'gender', - op: '=', + op: '==', val: 'girl', }, ], }; - it('should override formData with double underscored date options', () => { + it('should populate time range endpoints and override formData with double underscored date options', () => { expect( extractExtras({ ...baseQueryFormData, + time_range_endpoints: ['inclusive', 'exclusive'], extra_filters: [ { col: '__time_col', - op: '=', + op: '==', val: 'ds2', }, { col: '__time_grain', - op: '=', + op: '==', val: 'PT5M', }, { col: '__time_range', - op: '=', + op: '==', val: '2009-07-17T00:00:00 : 2020-07-17T00:00:00', }, ], @@ -40,11 +41,12 @@ describe('extractExtras', () => { ).toEqual({ extras: { time_grain_sqla: 'PT5M', + time_range_endpoints: ['inclusive', 'exclusive'], }, filters: [ { col: 'gender', - op: '=', + op: '==', val: 'girl', }, ], @@ -72,7 +74,7 @@ describe('extractExtras', () => { filters: [ { col: 'gender', - op: '=', + op: '==', val: 'girl', }, { diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/processFilters.test.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/processFilters.test.ts index 678fb762b38e..3274dff8242e 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/processFilters.test.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/processFilters.test.ts @@ -11,6 +11,48 @@ describe('processFilters', () => { ).toEqual({}); }); + it('should merge simple adhoc_filters and filters', () => { + expect( + processFilters({ + granularity: 'something', + viz_type: 'custom', + datasource: 'boba', + filters: [ + { + col: 'name', + op: '==', + val: 'Aaron', + }, + ], + adhoc_filters: [ + { + expressionType: 'SIMPLE', + clause: 'WHERE', + subject: 'gender', + operator: 'IS NOT NULL', + }, + ], + }), + ).toEqual({ + extras: { + having: '', + having_druid: [], + where: '', + }, + filters: [ + { + col: 'name', + op: '==', + val: 'Aaron', + }, + { + col: 'gender', + op: 'IS NOT NULL', + }, + ], + }); + }); + it('should handle an empty array', () => { expect( processFilters({ @@ -47,7 +89,7 @@ describe('processFilters', () => { expressionType: 'SIMPLE', clause: 'WHERE', subject: 'milk', - operator: '=', + operator: '==', comparator: 'almond', }, { @@ -110,7 +152,7 @@ describe('processFilters', () => { }, { col: 'milk', - op: '=', + op: '==', val: 'almond', }, ], diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/types/Filter.test.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/types/Filter.test.ts index 92035bde9c2b..de5645050fa7 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/types/Filter.test.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/types/Filter.test.ts @@ -18,7 +18,7 @@ describe('Filter type guards', () => { expressionType: 'SIMPLE', clause: 'WHERE', subject: 'tea', - operator: '=', + operator: '==', comparator: 'matcha', }), ).toEqual(false);