Skip to content

Commit 13b7e39

Browse files
fix: selectedFields on getRows not working correctly (#712)
1 parent dd4c040 commit 13b7e39

File tree

3 files changed

+146
-7
lines changed

3 files changed

+146
-7
lines changed

src/bigquery.ts

+35-6
Original file line numberDiff line numberDiff line change
@@ -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': {

src/table.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -1678,7 +1678,11 @@ class Table extends common.ServiceObject {
16781678
callback!(err, null, null, resp);
16791679
return;
16801680
}
1681-
rows = BigQuery.mergeSchemaWithRows_(this.metadata.schema, rows || []);
1681+
rows = BigQuery.mergeSchemaWithRows_(
1682+
this.metadata.schema,
1683+
rows || [],
1684+
options.selectedFields ? options.selectedFields!.split(',') : []
1685+
);
16821686
callback!(null, rows, nextQuery, resp);
16831687
};
16841688

test/table.ts

+106
Original file line numberDiff line numberDiff line change
@@ -2025,6 +2025,112 @@ describe('BigQuery/Table', () => {
20252025
done();
20262026
});
20272027
});
2028+
2029+
it('should return selected fields', done => {
2030+
const selectedFields = 'age';
2031+
const rows = [{f: [{v: 40}]}];
2032+
const schema = {
2033+
fields: [
2034+
{name: 'name', type: 'string'},
2035+
{name: 'age', type: 'INTEGER'},
2036+
],
2037+
};
2038+
const result = [{age: 40}];
2039+
2040+
table.metadata = {schema};
2041+
2042+
sandbox.restore();
2043+
2044+
table.request = (reqOpts: DecorateRequestOptions, callback: Function) => {
2045+
callback(null, {rows});
2046+
};
2047+
2048+
table.getRows({selectedFields}, (err: Error, rows: {}) => {
2049+
assert.ifError(err);
2050+
assert.deepStrictEqual(rows, result);
2051+
done();
2052+
});
2053+
});
2054+
2055+
it('should return selected fields from nested objects', done => {
2056+
const selectedFields = 'objects.nested_object.nested_property_1';
2057+
const rows = [
2058+
{
2059+
f: [
2060+
{
2061+
v: [
2062+
{
2063+
v: {
2064+
f: [
2065+
{
2066+
v: {
2067+
f: [
2068+
{
2069+
v: 'nested_property_1_value',
2070+
},
2071+
],
2072+
},
2073+
},
2074+
],
2075+
},
2076+
},
2077+
],
2078+
},
2079+
],
2080+
},
2081+
];
2082+
const schema = {
2083+
fields: [
2084+
{name: 'name', type: 'string'},
2085+
{
2086+
name: 'objects',
2087+
type: 'RECORD',
2088+
mode: 'REPEATED',
2089+
fields: [
2090+
{
2091+
name: 'nested_object',
2092+
type: 'RECORD',
2093+
fields: [
2094+
{
2095+
name: 'nested_property',
2096+
type: 'STRING',
2097+
},
2098+
{
2099+
name: 'nested_property_1',
2100+
type: 'STRING',
2101+
},
2102+
],
2103+
},
2104+
],
2105+
},
2106+
],
2107+
};
2108+
const result = [
2109+
{
2110+
objects: [
2111+
{
2112+
nested_object: {
2113+
nested_property_1: 'nested_property_1_value',
2114+
},
2115+
},
2116+
],
2117+
},
2118+
];
2119+
2120+
table.metadata = {schema};
2121+
2122+
sandbox.restore();
2123+
2124+
table.request = (reqOpts: DecorateRequestOptions, callback: Function) => {
2125+
callback(null, {rows});
2126+
};
2127+
2128+
table.getRows({selectedFields}, (err: Error, rows: {}) => {
2129+
assert.ifError(err);
2130+
assert.deepStrictEqual(rows, result);
2131+
done();
2132+
});
2133+
});
20282134
});
20292135

20302136
describe('insert', () => {

0 commit comments

Comments
 (0)