diff --git a/public/app/features/plugins/sql/ResponseParser.test.ts b/public/app/features/plugins/sql/ResponseParser.test.ts new file mode 100644 index 00000000000..1913fa298c0 --- /dev/null +++ b/public/app/features/plugins/sql/ResponseParser.test.ts @@ -0,0 +1,23 @@ +import { DataFrameDTO, FieldType, MutableDataFrame } from '@grafana/data'; + +import { ResponseParser } from './ResponseParser'; + +describe('transformMetricFindResponse function', () => { + it('should handle big arrays', () => { + const responseParser = new ResponseParser(); + const stringValues = new Array(150_000).fill('a'); + const numberValues = new Array(150_000).fill(1); + + const frame: DataFrameDTO = { + fields: [ + { name: 'name', type: FieldType.string, values: stringValues }, + { name: 'value', type: FieldType.number, values: numberValues }, + ], + }; + + const dataFrame = new MutableDataFrame(frame); + const result = responseParser.transformMetricFindResponse(dataFrame); + + expect(result).toHaveLength(2); + }); +}); diff --git a/public/app/features/plugins/sql/ResponseParser.ts b/public/app/features/plugins/sql/ResponseParser.ts index 3de28c88edd..fcb12f4e913 100644 --- a/public/app/features/plugins/sql/ResponseParser.ts +++ b/public/app/features/plugins/sql/ResponseParser.ts @@ -14,13 +14,11 @@ export class ResponseParser implements ResponseParserType { values.push({ text: '' + textField.values.get(i), value: '' + valueField.values.get(i) }); } } else { - values.push( - ...frame.fields - .flatMap((f) => f.values.toArray()) - .map((v) => ({ - text: v, - })) - ); + for (const field of frame.fields) { + for (const value of field.values.toArray()) { + values.push({ text: value }); + } + } } return uniqBy(values, 'text');