Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 52 additions & 63 deletions packages/bigquery/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -250,50 +250,51 @@ BigQuery.prototype.timestamp = function(value) {
* @return {string} - The type detected from the value.
*/
BigQuery.getType_ = function(value) {
if (value instanceof BigQuery.date) {
return 'DATE';
}

if (value instanceof BigQuery.datetime) {
return 'DATETIME';
}

if (value instanceof BigQuery.time) {
return 'TIME';
}

if (value instanceof BigQuery.timestamp) {
return 'TIMESTAMP';
}

if (value instanceof Buffer) {
return 'BYTES';
}

if (is.array(value)) {
return 'ARRAY';
}

if (is.bool(value)) {
return 'BOOL';
}
var typeName;

if (is.number(value)) {
return value % 1 === 0 ? 'INT64' : 'FLOAT64';
}

if (is.object(value)) {
return 'STRUCT';
if (value instanceof BigQuery.date) {
typeName = 'DATE';
} else if (value instanceof BigQuery.datetime) {
typeName = 'DATETIME';
} else if (value instanceof BigQuery.time) {
typeName = 'TIME';
} else if (value instanceof BigQuery.timestamp) {
typeName = 'TIMESTAMP';
} else if (value instanceof Buffer) {
typeName = 'BYTES';
} else if (is.array(value)) {
return {
type: 'ARRAY',
arrayType: BigQuery.getType_(value[0])
};
} else if (is.bool(value)) {
typeName = 'BOOL';
} else if (is.number(value)) {
typeName = value % 1 === 0 ? 'INT64' : 'FLOAT64';
} else if (is.object(value)) {
return {
type: 'STRUCT',
structTypes: Object.keys(value).map(function(prop) {
return {
name: prop,
type: BigQuery.getType_(value[prop])
};
})
};
} else if (is.string(value)) {
typeName = 'STRING';
}

if (is.string(value)) {
return 'STRING';
if (!typeName) {
throw new Error([
'This value could not be translated to a BigQuery data type.',
value
].join('\n'));
}

throw new Error([
'This value could not be translated to a BigQuery data type.',
value
].join('\n'));
return {

This comment was marked as spam.

This comment was marked as spam.

type: typeName
};
};

/**
Expand All @@ -311,42 +312,30 @@ BigQuery.valueToQueryParameter_ = function(value) {
value = BigQuery.timestamp(value);
}

var type = BigQuery.getType_(value);

var queryParameter = {
parameterType: {
type: type
},
parameterType: BigQuery.getType_(value),
parameterValue: {}
};

if (type.indexOf('TIME') > -1 || type.indexOf('DATE') > -1) {
var typeName = queryParameter.parameterType.type;

if (typeName.indexOf('TIME') > -1 || typeName.indexOf('DATE') > -1) {
value = value.value;
}

if (type === 'ARRAY') {
queryParameter.parameterType.arrayType = {
type: BigQuery.getType_(value[0])
};
if (typeName === 'ARRAY') {
queryParameter.parameterValue.arrayValues = value.map(function(value) {
return {
value: value
};
});
} else if (type === 'STRUCT') {
queryParameter.parameterType.structTypes = [];
queryParameter.parameterValue.structValues = {};

for (var prop in value) {
queryParameter.parameterType.structTypes.push({
name: prop,
type: BigQuery.getType_(value[prop])
});

queryParameter.parameterValue.structValues[prop] = {
value: value[prop]
};
}
} else if (typeName === 'STRUCT') {
queryParameter.parameterValue.structValues = Object.keys(value)
.reduce(function(structValues, prop) {
var nestedQueryParameter = BigQuery.valueToQueryParameter_(value[prop]);
structValues[prop] = nestedQueryParameter.parameterValue;
return structValues;
}, {});
} else {
queryParameter.parameterValue.value = value;
}
Expand Down
30 changes: 24 additions & 6 deletions packages/bigquery/system-test/bigquery.js
Original file line number Diff line number Diff line change
Expand Up @@ -681,10 +681,20 @@ describe('BigQuery', function() {
});
});

it.skip('should work with structs', function(done) {
it('should work with structs', function(done) {
bigquery.query({
query: '??',
params: []
query: 'SELECT ? obj',
params: [
{
b: true,
arr: [2,3,4],
d: bigquery.date('2016-12-7'),
f: 3.14,
nested: {
a: 3
}
}
]
}, function(err, rows) {
assert.ifError(err);
assert.equal(rows.length, 1);
Expand Down Expand Up @@ -860,11 +870,19 @@ describe('BigQuery', function() {
});
});

it.skip('should work with structs', function(done) {
it('should work with structs', function(done) {
bigquery.query({
query: '??',
query: 'SELECT @obj obj',
params: {
struct: {}
obj: {
b: true,
arr: [2,3,4],
d: bigquery.date('2016-12-7'),
f: 3.14,
nested: {
a: 3
}
}
}
}, function(err, rows) {
assert.ifError(err);
Expand Down
Loading