diff --git a/packages/superset-ui-query/src/buildQueryObject.ts b/packages/superset-ui-query/src/buildQueryObject.ts index ff7a4fe3ad..9585ffc1e1 100644 --- a/packages/superset-ui-query/src/buildQueryObject.ts +++ b/packages/superset-ui-query/src/buildQueryObject.ts @@ -43,7 +43,7 @@ export default function buildQueryObject(formData: T): metrics: processMetrics(formData), order_desc: typeof order_desc === 'undefined' ? true : order_desc, orderby: [], - row_limit: row_limit == null || isNaN(numericRowLimit) ? undefined : numericRowLimit, + row_limit: row_limit == null || Number.isNaN(numericRowLimit) ? undefined : numericRowLimit, since, time_range, timeseries_limit: limit ? Number(limit) : 0, diff --git a/packages/superset-ui-query/src/types/QueryFormData.ts b/packages/superset-ui-query/src/types/QueryFormData.ts index fbd17594de..512e70bdfd 100644 --- a/packages/superset-ui-query/src/types/QueryFormData.ts +++ b/packages/superset-ui-query/src/types/QueryFormData.ts @@ -42,7 +42,7 @@ export type BaseFormData = { /** limit number of time series */ limit?: number; /** limit number of row in the results */ - row_limit?: number; + row_limit?: string | number | null; /** The metric used to order timeseries for limiting */ timeseries_limit_metric?: QueryFormDataMetric; } & TimeRange & diff --git a/packages/superset-ui-query/test/buildQueryContext.test.ts b/packages/superset-ui-query/test/buildQueryContext.test.ts index b51f0a1823..3e1ad6107a 100644 --- a/packages/superset-ui-query/test/buildQueryContext.test.ts +++ b/packages/superset-ui-query/test/buildQueryContext.test.ts @@ -1,6 +1,6 @@ import { buildQueryContext } from '../src'; -describe('queryContextBuilder', () => { +describe('buildQueryContext', () => { it('should build datasource for table sources', () => { const queryContext = buildQueryContext({ datasource: '5__table', diff --git a/packages/superset-ui-query/test/buildQueryObject.test.ts b/packages/superset-ui-query/test/buildQueryObject.test.ts index 76be285b02..e901b40403 100644 --- a/packages/superset-ui-query/test/buildQueryObject.test.ts +++ b/packages/superset-ui-query/test/buildQueryObject.test.ts @@ -1,6 +1,6 @@ import { buildQueryObject, QueryObject } from '../src'; -describe('queryObjectBuilder', () => { +describe('buildQueryObject', () => { let query: QueryObject; it('should build granularity for sql alchemy datasources', () => { @@ -63,4 +63,32 @@ describe('queryObjectBuilder', () => { }); expect(query.timeseries_limit_metric).toEqual({ label: metric }); }); + + it('should handle null and non-numeric row_limit', () => { + const baseQuery = { + datasource: '5__table', + granularity_sqla: 'ds', + viz_type: 'table', + row_limit: null, + }; + + // undefined + query = buildQueryObject({ ...baseQuery }); + expect(query.row_limit).toBeUndefined(); + + // null value + query = buildQueryObject({ ...baseQuery, row_limit: null }); + expect(query.row_limit).toBeUndefined(); + + query = buildQueryObject({ ...baseQuery, row_limit: 1000 }); + expect(query.row_limit).toStrictEqual(1000); + + // valid string + query = buildQueryObject({ ...baseQuery, row_limit: '200' }); + expect(query.row_limit).toStrictEqual(200); + + // invalid string + query = buildQueryObject({ ...baseQuery, row_limit: 'two hundred' }); + expect(query.row_limit).toBeUndefined(); + }); });