Skip to content

Commit 82f293b

Browse files
bigquery: assign record type for nested schemas
1 parent bf9929e commit 82f293b

3 files changed

Lines changed: 159 additions & 48 deletions

File tree

packages/bigquery/src/dataset.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,16 @@ Dataset.prototype.createTable = function(id, options, callback) {
199199
};
200200
}
201201

202+
if (body.schema && body.schema.fields) {
203+
body.schema.fields = body.schema.fields.map(function(field) {
204+
if (field.fields) {
205+
field.type = 'RECORD';
206+
}
207+
208+
return field;
209+
});
210+
}
211+
202212
this.request({
203213
method: 'POST',
204214
uri: '/tables',

packages/bigquery/system-test/bigquery.js

Lines changed: 125 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -30,63 +30,42 @@ var bigquery = require('../')(env);
3030
var storage = require('@google-cloud/storage')(env);
3131

3232
describe('BigQuery', function() {
33-
var DATASET_ID = ('gcloud_test_dataset_temp' + uuid.v1()).replace(/-/g, '_');
34-
var dataset = bigquery.dataset(DATASET_ID);
35-
var TABLE_ID = 'myKittens';
36-
var table = dataset.table(TABLE_ID);
37-
var BUCKET_NAME = 'gcloud-test-bucket-temp-' + uuid.v1();
38-
var bucket = storage.bucket(BUCKET_NAME);
33+
var GCLOUD_TESTS_PREFIX = 'gcloud_test_';
34+
35+
var dataset = bigquery.dataset(generateName('dataset'));
36+
var table = dataset.table(generateName('table'));
37+
var bucket = storage.bucket(generateName('bucket'));
3938

4039
var query = 'SELECT url FROM [publicdata:samples.github_nested] LIMIT 100';
4140

4241
before(function(done) {
4342
async.series([
43+
// Remove buckets created for the tests.
44+
deleteBuckets,
45+
46+
// Remove datasets created for the tests.
47+
deleteDatasets,
48+
4449
// Create the test dataset.
45-
function(next) {
46-
dataset.create(next);
47-
},
50+
dataset.create.bind(dataset),
4851

4952
// Create the test table.
50-
function(next) {
51-
table.create({
52-
schema: 'id:integer,breed,name,dob:timestamp,around:boolean'
53-
}, next);
54-
},
53+
table.create.bind(table, {
54+
schema: 'id:integer,breed,name,dob:timestamp,around:boolean'
55+
}),
5556

5657
// Create a Bucket.
57-
function(next) {
58-
bucket.create(next);
59-
}
58+
bucket.create.bind(bucket)
6059
], done);
6160
});
6261

6362
after(function(done) {
6463
async.parallel([
65-
// Delete the bucket we used.
66-
function(next) {
67-
bucket.getFiles(function(err, files) {
68-
if (err) {
69-
next(err);
70-
return;
71-
}
72-
73-
async.map(files, function(file, onComplete) {
74-
file.delete(onComplete);
75-
}, function(err) {
76-
if (err) {
77-
next(err);
78-
return;
79-
}
80-
81-
bucket.delete(next);
82-
});
83-
});
84-
},
64+
// Remove buckets created for the tests.
65+
deleteBuckets,
8566

86-
// Delete the test dataset.
87-
function(next) {
88-
dataset.delete({ force: true }, next);
89-
}
67+
// Remove datasets created for the tests.
68+
deleteDatasets
9069
], done);
9170
});
9271

@@ -113,11 +92,6 @@ describe('BigQuery', function() {
11392

11493
bigquery.getDatasets({ maxApiCalls: maxApiCalls }, function(err) {
11594
assert.ifError(err);
116-
117-
// Even though the request interceptor is called, the request can still be
118-
// prevented if the `maxApiCalls` limit was reached.
119-
numRequestsMade -= 1;
120-
12195
assert.strictEqual(numRequestsMade, 1);
12296
done();
12397
});
@@ -281,6 +255,57 @@ describe('BigQuery', function() {
281255
done();
282256
});
283257
});
258+
259+
it('should create a Table with a nested schema', function(done) {
260+
var table = dataset.table(generateName('table'));
261+
262+
table.create({
263+
schema: {
264+
fields: [
265+
{
266+
name: 'id',
267+
type: 'INTEGER'
268+
},
269+
{
270+
name: 'details',
271+
fields: [
272+
{
273+
name: 'nested_id',
274+
type: 'INTEGER'
275+
}
276+
]
277+
}
278+
]
279+
}
280+
}, function(err) {
281+
assert.ifError(err);
282+
283+
table.getMetadata(function(err, metadata) {
284+
assert.ifError(err);
285+
286+
assert.deepEqual(metadata.schema, {
287+
fields: [
288+
{
289+
name: 'id',
290+
type: 'INTEGER'
291+
},
292+
{
293+
name: 'details',
294+
type: 'RECORD',
295+
fields: [
296+
{
297+
name: 'nested_id',
298+
type: 'INTEGER'
299+
}
300+
]
301+
}
302+
]
303+
});
304+
305+
done();
306+
});
307+
});
308+
});
284309
});
285310

286311
describe('BigQuery/Table', function() {
@@ -384,7 +409,7 @@ describe('BigQuery', function() {
384409
function query(callback) {
385410
var row;
386411

387-
table.query('SELECT * FROM ' + TABLE_ID + ' WHERE id = ' + data.id)
412+
table.query('SELECT * FROM ' + table.id + ' WHERE id = ' + data.id)
388413
.on('error', callback)
389414
.once('data', function(row_) { row = row_; })
390415
.on('end', function() {
@@ -420,4 +445,57 @@ describe('BigQuery', function() {
420445
});
421446
});
422447
});
448+
449+
function generateName(resourceType) {
450+
return (GCLOUD_TESTS_PREFIX + resourceType + '_' + uuid.v1())
451+
.replace(/-/g, '_');
452+
}
453+
454+
function deleteBuckets(callback) {
455+
function deleteBucket(bucket, callback) {
456+
bucket.getFiles(function(err, files) {
457+
if (err) {
458+
callback(err);
459+
return;
460+
}
461+
462+
async.each(files, function(file, next) {
463+
file.delete(next);
464+
}, function(err) {
465+
if (err) {
466+
callback(err);
467+
return;
468+
}
469+
470+
bucket.delete(callback);
471+
});
472+
});
473+
}
474+
475+
storage.getBuckets({
476+
prefix: GCLOUD_TESTS_PREFIX
477+
}, function(err, buckets) {
478+
if (err) {
479+
callback(err);
480+
return;
481+
}
482+
483+
async.each(buckets, deleteBucket, callback);
484+
});
485+
}
486+
487+
function deleteDatasets(callback) {
488+
bigquery.getDatasets({
489+
prefix: GCLOUD_TESTS_PREFIX
490+
}, function(err, datasets) {
491+
if (err) {
492+
callback(err);
493+
return;
494+
}
495+
496+
async.each(datasets, function(dataset, next) {
497+
dataset.delete({ force: true }, next);
498+
}, callback);
499+
});
500+
}
423501
});

packages/bigquery/test/dataset.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ describe('BigQuery/Dataset', function() {
179179

180180
it('should wrap an array schema', function(done) {
181181
ds.request = function(reqOpts) {
182-
assert.strictEqual(reqOpts.json.schema.fields, SCHEMA_OBJECT.fields);
182+
assert.deepEqual(reqOpts.json.schema.fields, SCHEMA_OBJECT.fields);
183183
done();
184184
};
185185

@@ -188,6 +188,29 @@ describe('BigQuery/Dataset', function() {
188188
}, assert.ifError);
189189
});
190190

191+
it('should assign record type to nested schemas', function(done) {
192+
var nestedField = {
193+
id: 'nested',
194+
fields: [
195+
{ id: 'nested_name', type: 'STRING' }
196+
]
197+
};
198+
199+
ds.request = function(reqOpts) {
200+
assert.strictEqual(reqOpts.json.schema.fields[1].type, 'RECORD');
201+
done();
202+
};
203+
204+
ds.createTable(TABLE_ID, {
205+
schema: {
206+
fields: [
207+
{ id: 'name', type: 'STRING' },
208+
nestedField
209+
]
210+
}
211+
}, assert.ifError);
212+
});
213+
191214
it('should return an error to the callback', function(done) {
192215
var error = new Error('Error.');
193216

0 commit comments

Comments
 (0)