Skip to content

Commit e216b35

Browse files
author
Ace Nassri
committed
Move from gcloud to google-cloud/bigquery + tweak cmdline args
1 parent f7065fd commit e216b35

File tree

4 files changed

+59
-48
lines changed

4 files changed

+59
-48
lines changed

bigquery/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"system-test": "mocha -R spec -t 120000 --require intelli-espower-loader ../system-test/_setup.js system-test/*.test.js"
1010
},
1111
"dependencies": {
12+
"@google-cloud/bigquery": "^0.1.1",
1213
"async": "^1.5.2",
1314
"gcloud": "^0.37.0",
1415
"request": "^2.72.0"

bigquery/query.js

+31-20
Original file line numberDiff line numberDiff line change
@@ -27,24 +27,30 @@
2727
// by the GOOGLE_APPLICATION_CREDENTIALS environment variable and use the
2828
// project specified by the GCLOUD_PROJECT environment variable. See
2929
// https://googlecloudplatform.github.io/gcloud-node/#/docs/guides/authentication
30-
var gcloud = require('gcloud');
30+
var BigQuery = require('@google-cloud/bigquery');
3131

3232
// Instantiate the bigquery client
33-
var bigquery = gcloud.bigquery();
33+
var bigquery = BigQuery();
3434
// [END auth]
3535

3636
// [START sync_query]
3737
/**
3838
* Run a synchronous query.
39-
* @param {object} queryObj The BigQuery query to run, plus any additional options
40-
* listed at https://cloud.google.com/bigquery/docs/reference/v2/jobs/query
39+
* @param {string} query The BigQuery query to run, as a string
4140
* @param {function} callback Callback function to receive query results.
4241
*/
43-
function syncQuery (queryObj, callback) {
44-
if (!queryObj || !queryObj.query) {
45-
return callback(Error('queryObj must be an object with a "query" parameter'));
42+
function syncQuery (query, callback) {
43+
if (!query || typeof query !== 'string') {
44+
return callback(Error('"query" is required, and must be a string!'));
4645
}
4746

47+
// Construct query object
48+
// Query options list: https://cloud.google.com/bigquery/docs/reference/v2/jobs/query
49+
var queryObj = {
50+
query: query,
51+
timeoutMs: 10000 // Time out after 10 seconds
52+
};
53+
4854
bigquery.query(queryObj, function (err, rows) {
4955
if (err) {
5056
return callback(err);
@@ -59,15 +65,20 @@ function syncQuery (queryObj, callback) {
5965
// [START async_query]
6066
/**
6167
* Run an asynchronous query.
62-
* @param {object} queryObj The BigQuery query to run, plus any additional options
63-
* listed at https://cloud.google.com/bigquery/docs/reference/v2/jobs/query
68+
* @param {string} query The BigQuery query to run, as a string
6469
* @param {function} callback Callback function to receive job data.
6570
*/
66-
function asyncQuery (queryObj, callback) {
67-
if (!queryObj || !queryObj.query) {
68-
return callback(Error('queryObj must be an object with a "query" parameter'));
71+
function asyncQuery (query, callback) {
72+
if (!query || typeof query !== 'string') {
73+
return callback(Error('"query" is required, and must be a string!'));
6974
}
7075

76+
// Construct query object
77+
// Query options list: https://cloud.google.com/bigquery/docs/reference/v2/jobs/query
78+
var queryObj = {
79+
query: query
80+
};
81+
7182
bigquery.startQuery(queryObj, function (err, job) {
7283
if (err) {
7384
return callback(err);
@@ -117,12 +128,12 @@ function asyncPoll (jobId, callback) {
117128
function printUsage () {
118129
console.log('Usage:');
119130
console.log('\nCommands:\n');
120-
console.log('\tnode query sync-query QUERY');
121-
console.log('\tnode query async-query QUERY');
131+
console.log('\tnode query sync QUERY');
132+
console.log('\tnode query async QUERY');
122133
console.log('\tnode query poll JOB_ID');
123134
console.log('\nExamples:\n');
124-
console.log('\tnode query sync-query "SELECT * FROM publicdata:samples.natality LIMIT 5;"');
125-
console.log('\tnode query async-query "SELECT * FROM publicdata:samples.natality LIMIT 5;"');
135+
console.log('\tnode query sync "SELECT * FROM publicdata:samples.natality LIMIT 5;"');
136+
console.log('\tnode query async "SELECT * FROM publicdata:samples.natality LIMIT 5;"');
126137
console.log('\tnode query poll 12345');
127138
}
128139
// [END usage]
@@ -142,10 +153,10 @@ var program = {
142153
main: function (args, cb) {
143154
var command = args.shift();
144155
var arg = args.shift();
145-
if (command === 'sync-query') {
146-
this.syncQuery({ query: arg, timeoutMs: 10000 }, cb);
147-
} else if (command === 'async-query') {
148-
this.asyncQuery({ query: arg }, cb);
156+
if (command === 'sync') {
157+
this.syncQuery(arg, cb);
158+
} else if (command === 'async') {
159+
this.asyncQuery(arg, cb);
149160
} else if (command === 'poll') {
150161
this.asyncPoll(arg, cb);
151162
} else {

bigquery/system-test/query.test.js

+2-4
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ var example = require('../query');
1818
describe('bigquery:query', function () {
1919
describe('sync_query', function () {
2020
it('should fetch data given a query', function (done) {
21-
example.syncQuery(
22-
{ query: 'SELECT * FROM publicdata:samples.natality LIMIT 5;' },
21+
example.syncQuery('SELECT * FROM publicdata:samples.natality LIMIT 5;',
2322
function (err, data) {
2423
assert.ifError(err);
2524
assert.notEqual(data, null);
@@ -33,8 +32,7 @@ describe('bigquery:query', function () {
3332

3433
describe('async_query', function () {
3534
it('should submit a job and fetch its results', function (done) {
36-
example.asyncQuery(
37-
{ query: 'SELECT * FROM publicdata:samples.natality LIMIT 5;' },
35+
example.asyncQuery('SELECT * FROM publicdata:samples.natality LIMIT 5;',
3836
function (err, job) {
3937
assert.ifError(err);
4038
assert.notEqual(job.id, null);

bigquery/test/query.test.js

+25-24
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,15 @@ function getSample () {
3939
startQuery: sinon.stub().callsArgWith(1, null, jobMock),
4040
query: sinon.stub().callsArgWith(1, null, natalityMock)
4141
};
42-
var gcloudMock = {
43-
bigquery: sinon.stub().returns(bigqueryMock)
44-
};
42+
43+
var BigQueryMock = sinon.stub().returns(bigqueryMock);
44+
4545
return {
4646
program: proxyquire('../query', {
47-
gcloud: gcloudMock
47+
'@google-cloud/bigquery': BigQueryMock
4848
}),
4949
mocks: {
50-
gcloud: gcloudMock,
50+
BigQuery: BigQueryMock,
5151
bigquery: bigqueryMock,
5252
natality: natalityMock,
5353
metadata: metadataMock,
@@ -79,10 +79,10 @@ describe('bigquery:query', function () {
7979
sinon.stub(program, 'asyncQuery');
8080
sinon.stub(program, 'asyncPoll');
8181

82-
program.main(['sync-query']);
82+
program.main(['sync']);
8383
assert(program.syncQuery.calledOnce);
8484

85-
program.main(['async-query']);
85+
program.main(['async']);
8686
assert(program.asyncQuery.calledOnce);
8787

8888
program.main(['poll']);
@@ -102,14 +102,14 @@ describe('bigquery:query', function () {
102102
});
103103

104104
describe('syncQuery', function () {
105-
var queryObj = { query: 'foo' };
105+
var query = 'foo';
106106

107107
it('should return results', function () {
108108
var example = getSample();
109-
example.program.syncQuery(queryObj,
109+
example.program.syncQuery(query,
110110
function (err, data) {
111111
assert.ifError(err);
112-
assert(example.mocks.bigquery.query.calledWith(queryObj));
112+
assert(example.mocks.bigquery.query.called);
113113
assert.deepEqual(data, example.mocks.natality);
114114
assert(console.log.calledWith(
115115
'SyncQuery: found %d rows!',
@@ -119,12 +119,12 @@ describe('bigquery:query', function () {
119119
);
120120
});
121121

122-
it('should require a query', function () {
122+
it('should require a query as a string', function () {
123123
var example = getSample();
124124
example.program.syncQuery({}, function (err, data) {
125125
assert.deepEqual(
126126
err,
127-
Error('queryObj must be an object with a "query" parameter')
127+
Error('"query" is required, and must be a string!')
128128
);
129129
assert.equal(data, undefined);
130130
});
@@ -134,22 +134,22 @@ describe('bigquery:query', function () {
134134
var error = Error('syncQueryError');
135135
var example = getSample();
136136
example.mocks.bigquery.query = sinon.stub().callsArgWith(1, error);
137-
example.program.syncQuery(queryObj, function (err, data) {
137+
example.program.syncQuery(query, function (err, data) {
138138
assert.deepEqual(err, error);
139139
assert.equal(data, undefined);
140140
});
141141
});
142142
});
143143

144144
describe('asyncQuery', function () {
145-
var queryObj = { query: 'foo' };
145+
var query = 'foo';
146146

147147
it('should submit a job', function () {
148148
var example = getSample();
149-
example.program.asyncQuery(queryObj,
149+
example.program.asyncQuery(query,
150150
function (err, job) {
151151
assert.ifError(err);
152-
assert(example.mocks.bigquery.startQuery.calledWith(queryObj));
152+
assert(example.mocks.bigquery.startQuery.called);
153153
assert.deepEqual(example.mocks.job, job);
154154
assert(console.log.calledWith(
155155
'AsyncQuery: submitted job %s!', example.jobId
@@ -158,11 +158,11 @@ describe('bigquery:query', function () {
158158
);
159159
});
160160

161-
it('should require a query', function () {
161+
it('should require a query as a string', function () {
162162
var example = getSample();
163163
example.program.asyncQuery({}, function (err, job) {
164164
assert.deepEqual(err, Error(
165-
'queryObj must be an object with a "query" parameter'
165+
'"query" is required, and must be a string!'
166166
));
167167
assert.equal(job, undefined);
168168
});
@@ -172,7 +172,7 @@ describe('bigquery:query', function () {
172172
var error = Error('asyncQueryError');
173173
var example = getSample();
174174
example.mocks.bigquery.startQuery = sinon.stub().callsArgWith(1, error);
175-
example.program.asyncQuery(queryObj, function (err, job) {
175+
example.program.asyncQuery(query, function (err, job) {
176176
assert.deepEqual(err, error);
177177
assert.equal(job, undefined);
178178
});
@@ -215,8 +215,8 @@ describe('bigquery:query', function () {
215215
example.mocks.job.getMetadata = sinon.stub().callsArgWith(0, null, pendingState);
216216
example.program.asyncPoll(example.jobId, function (err, rows) {
217217
assert.deepEqual(err, Error('Job %s is not done', example.jobId));
218-
assert(example.mocks.job.getMetadata.called);
219218
assert(console.log.calledWith('Job status: %s', pendingState.status.state));
219+
assert(example.mocks.job.getMetadata.called);
220220
assert.equal(example.mocks.job.getQueryResults.called, false);
221221
assert.equal(rows, undefined);
222222
});
@@ -228,6 +228,7 @@ describe('bigquery:query', function () {
228228
assert(console.log.calledWith('Job status: %s', doneState.status.state));
229229
assert(example.mocks.job.getMetadata.called);
230230
assert(example.mocks.job.getQueryResults.called);
231+
assert.equal(rows, example.mocks.natality);
231232
});
232233
});
233234

@@ -256,12 +257,12 @@ describe('bigquery:query', function () {
256257
program.printUsage();
257258
assert(console.log.calledWith('Usage:'));
258259
assert(console.log.calledWith('\nCommands:\n'));
259-
assert(console.log.calledWith('\tnode query sync-query QUERY'));
260-
assert(console.log.calledWith('\tnode query async-query QUERY'));
260+
assert(console.log.calledWith('\tnode query sync QUERY'));
261+
assert(console.log.calledWith('\tnode query async QUERY'));
261262
assert(console.log.calledWith('\tnode query poll JOB_ID'));
262263
assert(console.log.calledWith('\nExamples:\n'));
263-
assert(console.log.calledWith('\tnode query sync-query "SELECT * FROM publicdata:samples.natality LIMIT 5;"'));
264-
assert(console.log.calledWith('\tnode query async-query "SELECT * FROM publicdata:samples.natality LIMIT 5;"'));
264+
assert(console.log.calledWith('\tnode query sync "SELECT * FROM publicdata:samples.natality LIMIT 5;"'));
265+
assert(console.log.calledWith('\tnode query async "SELECT * FROM publicdata:samples.natality LIMIT 5;"'));
265266
assert(console.log.calledWith('\tnode query poll 12345'));
266267
});
267268
});

0 commit comments

Comments
 (0)