@@ -376,12 +376,33 @@ export class BigQuery extends common.Service {
376376 *
377377 * @param {object } schema
378378 * @param {array } rows
379+ * @param {array } selectedFields List of fields to return.
380+ * If unspecified, all fields are returned.
379381 * @returns {array } Fields using their matching names from the table's schema.
380382 */
381383 static mergeSchemaWithRows_ (
382384 schema : TableSchema | TableField ,
383- rows : TableRow [ ]
385+ rows : TableRow [ ] ,
386+ selectedFields ?: string [ ]
384387 ) {
388+ if ( selectedFields && selectedFields ! . length > 0 ) {
389+ const selectedFieldsArray = selectedFields ! . map ( c => {
390+ return c . split ( '.' ) ;
391+ } ) ;
392+
393+ const currentFields = selectedFieldsArray . map ( c => c . shift ( ) ) ;
394+ //filter schema fields based on selected fields.
395+ schema . fields = schema . fields ?. filter (
396+ field =>
397+ currentFields
398+ . map ( c => c ! . toLowerCase ( ) )
399+ . indexOf ( field . name ! . toLowerCase ( ) ) >= 0
400+ ) ;
401+ selectedFields = selectedFieldsArray
402+ . filter ( c => c . length > 0 )
403+ . map ( c => c . join ( '.' ) ) ;
404+ }
405+
385406 return arrify ( rows )
386407 . map ( mergeSchema )
387408 . map ( flattenRows ) ;
@@ -391,10 +412,10 @@ export class BigQuery extends common.Service {
391412 let value = field . v ;
392413 if ( schemaField . mode === 'REPEATED' ) {
393414 value = ( value as TableRowField [ ] ) . map ( val => {
394- return convert ( schemaField , val . v ) ;
415+ return convert ( schemaField , val . v , selectedFields ) ;
395416 } ) ;
396417 } else {
397- value = convert ( schemaField , value ) ;
418+ value = convert ( schemaField , value , selectedFields ) ;
398419 }
399420 // eslint-disable-next-line @typescript-eslint/no-explicit-any
400421 const fieldObject : any = { } ;
@@ -403,8 +424,12 @@ export class BigQuery extends common.Service {
403424 } ) ;
404425 }
405426
406- // eslint-disable-next-line @typescript-eslint/no-explicit-any
407- function convert ( schemaField : TableField , value : any ) {
427+ function convert (
428+ schemaField : TableField ,
429+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
430+ value : any ,
431+ selectedFields ?: string [ ]
432+ ) {
408433 if ( is . null ( value ) ) {
409434 return value ;
410435 }
@@ -434,7 +459,11 @@ export class BigQuery extends common.Service {
434459 break ;
435460 }
436461 case 'RECORD' : {
437- value = BigQuery . mergeSchemaWithRows_ ( schemaField , value ) . pop ( ) ;
462+ value = BigQuery . mergeSchemaWithRows_ (
463+ schemaField ,
464+ value ,
465+ selectedFields
466+ ) . pop ( ) ;
438467 break ;
439468 }
440469 case 'DATE' : {
0 commit comments