fix(Explore): Pivot table V2 sort by failure with D&D enabled (#18835)

* wip

* Add tests and clean up

* Clean up

* Remove unused import
This commit is contained in:
Geido 2022-02-28 18:56:13 +02:00 committed by GitHub
parent c56dc8eace
commit eafe0cfc6f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 38 additions and 2 deletions

View File

@ -21,9 +21,12 @@
import { import {
AdhocFilter, AdhocFilter,
QueryFieldAliases, QueryFieldAliases,
QueryFormColumn,
QueryFormData, QueryFormData,
QueryObject, QueryObject,
QueryObjectFilterClause, QueryObjectFilterClause,
isPhysicalColumn,
isAdhocColumn,
} from './types'; } from './types';
import processFilters from './processFilters'; import processFilters from './processFilters';
import extractExtras from './extractExtras'; import extractExtras from './extractExtras';
@ -89,6 +92,12 @@ export default function buildQueryObject<T extends QueryFormData>(
...extras, ...extras,
...filterFormData, ...filterFormData,
}); });
const normalizeSeriesLimitMetric = (column: QueryFormColumn | undefined) => {
if (isAdhocColumn(column) || isPhysicalColumn(column)) {
return column;
}
return undefined;
};
let queryObject: QueryObject = { let queryObject: QueryObject = {
// fallback `null` to `undefined` so they won't be sent to the backend // fallback `null` to `undefined` so they won't be sent to the backend
@ -113,13 +122,14 @@ export default function buildQueryObject<T extends QueryFormData>(
: numericRowOffset, : numericRowOffset,
series_columns, series_columns,
series_limit, series_limit,
series_limit_metric, series_limit_metric: normalizeSeriesLimitMetric(series_limit_metric),
timeseries_limit: limit ? Number(limit) : 0, timeseries_limit: limit ? Number(limit) : 0,
timeseries_limit_metric: timeseries_limit_metric || undefined, timeseries_limit_metric: timeseries_limit_metric || undefined,
order_desc: typeof order_desc === 'undefined' ? true : order_desc, order_desc: typeof order_desc === 'undefined' ? true : order_desc,
url_params: url_params || undefined, url_params: url_params || undefined,
custom_params, custom_params,
}; };
// override extra form data used by native and cross filters // override extra form data used by native and cross filters
queryObject = overrideExtraFormData(queryObject, overrides); queryObject = overrideExtraFormData(queryObject, overrides);

View File

@ -54,7 +54,11 @@ export interface Column {
export default {}; export default {};
export function isPhysicalColumn( export function isPhysicalColumn(
column: AdhocColumn | PhysicalColumn, column?: AdhocColumn | PhysicalColumn,
): column is PhysicalColumn { ): column is PhysicalColumn {
return typeof column === 'string'; return typeof column === 'string';
} }
export function isAdhocColumn(column?: AdhocColumn | PhysicalColumn) {
return (column as AdhocColumn)?.sqlExpression !== undefined;
}

View File

@ -152,6 +152,28 @@ describe('buildQueryObject', () => {
expect(query.timeseries_limit_metric).toEqual(metric); expect(query.timeseries_limit_metric).toEqual(metric);
}); });
it('should build series_limit_metric', () => {
const metric = 'country';
query = buildQueryObject({
datasource: '5__table',
granularity_sqla: 'ds',
viz_type: 'pivot_table_v2',
series_limit_metric: metric,
});
expect(query.series_limit_metric).toEqual(metric);
});
it('should build series_limit_metric as undefined when empty array', () => {
const metric: any = [];
query = buildQueryObject({
datasource: '5__table',
granularity_sqla: 'ds',
viz_type: 'pivot_table_v2',
series_limit_metric: metric,
});
expect(query.series_limit_metric).toEqual(undefined);
});
it('should handle null and non-numeric row_limit and row_offset', () => { it('should handle null and non-numeric row_limit and row_offset', () => {
const baseQuery = { const baseQuery = {
datasource: '5__table', datasource: '5__table',