Skip to content

Commit d3f1d5d

Browse files
refactor + unit tests + system test
1 parent 1e58fd6 commit d3f1d5d

4 files changed

Lines changed: 69 additions & 37 deletions

File tree

packages/spanner/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"dependencies": {
3636
"@google-cloud/common": "^0.13.0",
3737
"@google-cloud/common-grpc": "^0.3.0",
38+
"array-uniq": "^1.0.3",
3839
"arrify": "^1.0.1",
3940
"checkpoint-stream": "^0.1.0",
4041
"events-intercept": "^2.0.0",
@@ -44,6 +45,7 @@
4445
"google-proto-files": "^0.12.0",
4546
"is": "^3.1.0",
4647
"lodash.chunk": "^4.2.0",
48+
"lodash.flatten": "^4.4.0",
4749
"lodash.snakecase": "^4.1.1",
4850
"merge-stream": "^1.0.1",
4951
"methmeth": "^1.1.0",

packages/spanner/src/transaction-request.js

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
var arrify = require('arrify');
2424
var common = require('@google-cloud/common');
2525
var extend = require('extend');
26+
var flatten = require('lodash.flatten');
2627
var is = require('is');
28+
var uniq = require('array-uniq');
2729

2830
/**
2931
* @type {module:spanner/codec}
@@ -682,33 +684,17 @@ TransactionRequest.prototype.upsert = function(table, keyVals, callback) {
682684
TransactionRequest.prototype.mutate_ = function(method, table, keyVals, cb) {
683685
keyVals = arrify(keyVals);
684686

685-
var mutation = {};
686-
687-
var columns = keyVals.reduce(function(allKeys, keyVal) {
688-
var keys = Object.keys(keyVal);
689-
var key;
690-
691-
for (var i = 0, ii = keys.length; i < ii; ++i) {
692-
key = keys[i];
693-
694-
if (allKeys.indexOf(key) === -1) {
695-
allKeys.push(key);
696-
}
697-
}
698-
699-
return allKeys;
700-
}, []).sort();
687+
var columns = uniq(flatten(keyVals.map(Object.keys))).sort();
701688

702-
mutation[method] = {
703-
table: table,
704-
columns: columns,
705-
values: keyVals.map(function(keyVal) {
706-
return columns.map(function(key) {
707-
var value = keyVal[key];
689+
var values = keyVals.map(function(keyVal) {
690+
return columns.map(function(key) {
691+
var value = keyVal[key];
692+
return codec.encode(is.undefined(value) ? null : value);
693+
});
694+
});
708695

709-
return codec.encode(value === undefined ? null : value);
710-
});
711-
})
696+
var mutation = {
697+
[method]: { table, columns, values }
712698
};
713699

714700
if (this.transaction) {

packages/spanner/system-test/spanner.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,22 @@ var spanner = new Spanner(env);
108108
}, execAfterOperationComplete(done));
109109
});
110110

111+
describe('uneven rows', function() {
112+
it('should allow inserting uneven rows', function(done) {
113+
table.insert([
114+
{
115+
Key: generateName('id'),
116+
BoolValue: true
117+
},
118+
{
119+
Key: generateName('id'),
120+
BoolValue: true,
121+
IntValue: 10
122+
}
123+
], done);
124+
});
125+
});
126+
111127
describe('structs', function() {
112128
it('should correctly decode structs', function(done) {
113129
var query = 'SELECT ARRAY(SELECT as struct 1, "hello")';

packages/spanner/test/transaction-request.js

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -759,26 +759,30 @@ describe('TransactionRequest', function() {
759759
describe('mutate_', function() {
760760
var METHOD = 'methodName';
761761
var TABLE = 'table-name';
762-
var KEYVALS = { key: 'value' };
763-
764-
var ENCODED_VALUE = {
765-
encoded: true
766-
};
762+
var KEYVALS = [
763+
{ key: 'value', nullable: true },
764+
{ key: 'value' } // missing nullable value
765+
];
767766

768767
var EXPECTED_MUTATION = {};
769768
EXPECTED_MUTATION[METHOD] = {
770769
table: TABLE,
771-
columns: Object.keys(KEYVALS),
770+
columns: ['key', 'nullable'],
772771
values: [
773772
[
774-
ENCODED_VALUE
773+
KEYVALS[0].key,
774+
KEYVALS[0].nullable
775+
],
776+
[
777+
KEYVALS[1].key,
778+
null
775779
]
776780
]
777781
};
778782

779783
beforeEach(function() {
780-
fakeCodec.encode = function() {
781-
return ENCODED_VALUE;
784+
fakeCodec.encode = function(value) {
785+
return value;
782786
};
783787
});
784788

@@ -787,9 +791,33 @@ describe('TransactionRequest', function() {
787791

788792
function callback() {}
789793

790-
fakeCodec.encode = function(key) {
791-
assert.strictEqual(key, KEYVALS[Object.keys(KEYVALS)[0]]);
792-
return ENCODED_VALUE;
794+
var numEncodeRequests = 0;
795+
fakeCodec.encode = function(value) {
796+
numEncodeRequests++;
797+
798+
switch (numEncodeRequests) {
799+
case 1: {
800+
assert.strictEqual(value, KEYVALS[0].key);
801+
break;
802+
}
803+
804+
case 2: {
805+
assert.strictEqual(value, KEYVALS[0].nullable);
806+
break;
807+
}
808+
809+
case 3: {
810+
assert.strictEqual(value, KEYVALS[1].key);
811+
break;
812+
}
813+
814+
case 4: {
815+
assert.strictEqual(value, null);
816+
break;
817+
}
818+
}
819+
820+
return value;
793821
};
794822

795823
var expectedReqOpts = {

0 commit comments

Comments
 (0)