Skip to content

Commit 898ae7d

Browse files
bigquery: convert nested objects to their native types
1 parent 4bbeec0 commit 898ae7d

File tree

2 files changed

+76
-5
lines changed

2 files changed

+76
-5
lines changed

packages/bigquery/src/table.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,13 +188,20 @@ Table.createSchemaFromString_ = function(str) {
188188
* @return {array} Fields using their matching names from the table's schema.
189189
*/
190190
Table.mergeSchemaWithRows_ = function(schema, rows) {
191-
return rows.map(mergeSchema).map(flattenRows);
191+
return arrify(rows).map(mergeSchema).map(flattenRows);
192192

193193
function mergeSchema(row) {
194194
return row.f.map(function(field, index) {
195195
var schemaField = schema.fields[index];
196196
var value = field.v;
197197

198+
var fieldObject = {};
199+
200+
if (value === null) {
201+
fieldObject[schemaField.name] = null;
202+
return fieldObject;
203+
}
204+
198205
switch (schemaField.type) {
199206
case 'BOOLEAN': {
200207
value = value === 'true';
@@ -212,13 +219,23 @@ Table.mergeSchemaWithRows_ = function(schema, rows) {
212219
}
213220
break;
214221
}
222+
case 'RECORD': {
223+
if (schemaField.mode === 'REPEATED') {
224+
value = value.map(function(val) {
225+
return Table.mergeSchemaWithRows_(schemaField, val.v).pop();
226+
});
227+
} else {
228+
value = Table.mergeSchemaWithRows_(schemaField, value).pop();
229+
}
230+
231+
break;
232+
}
215233
case 'TIMESTAMP': {
216234
value = new Date(value * 1000);
217235
break;
218236
}
219237
}
220238

221-
var fieldObject = {};
222239
fieldObject[schemaField.name] = value;
223240
return fieldObject;
224241
});

packages/bigquery/test/table.js

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,21 +180,75 @@ describe('BigQuery/Table', function() {
180180
{ v: 'Milo' },
181181
{ v: String(now.valueOf() / 1000) },
182182
{ v: 'false' },
183-
{ v: '5.222330009847' }
183+
{ v: '5.222330009847' },
184+
{ v: null },
185+
{
186+
v: [
187+
{
188+
v: {
189+
f: [
190+
{
191+
v: {
192+
f: [
193+
{
194+
v: 'nested_value'
195+
}
196+
]
197+
}
198+
}
199+
]
200+
}
201+
}
202+
]
203+
}
184204
]
185205
},
186206
expected: {
187207
id: 3,
188208
name: 'Milo',
189209
dob: now,
190210
has_claws: false,
191-
hair_count: 5.222330009847
211+
hair_count: 5.222330009847,
212+
nullable: null,
213+
objects: [
214+
{
215+
nested_object: {
216+
nested_property: 'nested_value'
217+
}
218+
}
219+
]
192220
}
193221
}
194222
];
195223

224+
var schemaObject = extend(true, SCHEMA_OBJECT, {});
225+
226+
schemaObject.fields.push({
227+
name: 'nullable',
228+
type: 'STRING',
229+
mode: 'NULLABLE'
230+
});
231+
232+
schemaObject.fields.push({
233+
name: 'objects',
234+
type: 'RECORD',
235+
mode: 'REPEATED',
236+
fields: [
237+
{
238+
name: 'nested_object',
239+
type: 'RECORD',
240+
fields: [
241+
{
242+
name: 'nested_property',
243+
type: 'STRING'
244+
}
245+
]
246+
}
247+
]
248+
});
249+
196250
var rawRows = rows.map(prop('raw'));
197-
var mergedRows = Table.mergeSchemaWithRows_(SCHEMA_OBJECT, rawRows);
251+
var mergedRows = Table.mergeSchemaWithRows_(schemaObject, rawRows);
198252

199253
mergedRows.forEach(function(mergedRow, index) {
200254
assert.deepEqual(mergedRow, rows[index].expected);

0 commit comments

Comments
 (0)