@@ -257,24 +257,51 @@ class CubejsApi {
257257 * @returns ResultSet
258258 * @private
259259 */
260- loadResponseInternal ( response ) {
260+ loadResponseInternal ( response , options = { } ) {
261261 if (
262- response . results . length &&
263- response . results [ 0 ] . query . responseFormat &&
264- response . results [ 0 ] . query . responseFormat === ResultType . COMPACT
262+ response . results . length
265263 ) {
266- response . results . forEach ( ( result , j ) => {
267- const data = [ ] ;
268- result . data . dataset . forEach ( ( r ) => {
269- const row = { } ;
270- result . data . members . forEach ( ( m , i ) => {
271- row [ m ] = r [ i ] ;
264+ if ( options . castNumerics ) {
265+ response . results . forEach ( ( result ) => {
266+ const numericMembers = Object . entries ( {
267+ ...result . annotation . measures ,
268+ ...result . annotation . dimensions ,
269+ } ) . map ( ( [ k , v ] ) => {
270+ if ( v . type === 'number' ) {
271+ return k ;
272+ }
273+
274+ return undefined ;
275+ } ) . filter ( Boolean ) ;
276+
277+ result . data = result . data . map ( ( row ) => {
278+ numericMembers . forEach ( ( key ) => {
279+ if ( row [ key ] != null ) {
280+ row [ key ] = Number ( row [ key ] ) ;
281+ }
282+ } ) ;
283+
284+ return row ;
272285 } ) ;
273- data . push ( row ) ;
274286 } ) ;
275- response . results [ j ] . data = data ;
276- } ) ;
287+ }
288+
289+ if ( response . results [ 0 ] . query . responseFormat &&
290+ response . results [ 0 ] . query . responseFormat === ResultType . COMPACT ) {
291+ response . results . forEach ( ( result , j ) => {
292+ const data = [ ] ;
293+ result . data . dataset . forEach ( ( r ) => {
294+ const row = { } ;
295+ result . data . members . forEach ( ( m , i ) => {
296+ row [ m ] = r [ i ] ;
297+ } ) ;
298+ data . push ( row ) ;
299+ } ) ;
300+ response . results [ j ] . data = data ;
301+ } ) ;
302+ }
277303 }
304+
278305 return new ResultSet ( response , {
279306 parseDateMeasures : this . parseDateMeasures
280307 } ) ;
@@ -293,7 +320,7 @@ class CubejsApi {
293320 query,
294321 queryType : 'multi' ,
295322 } ) ,
296- this . loadResponseInternal . bind ( this ) ,
323+ ( response ) => this . loadResponseInternal ( response , options ) ,
297324 options ,
298325 callback
299326 ) ;
@@ -312,7 +339,7 @@ class CubejsApi {
312339 query,
313340 queryType : 'multi' ,
314341 } ) ,
315- this . loadResponseInternal . bind ( this ) ,
342+ ( response ) => this . loadResponseInternal ( response , options ) ,
316343 { ...options , subscribe : true } ,
317344 callback
318345 ) ;
0 commit comments