Skip to content

Commit 0e58cf0

Browse files
committed
fix upsertGraph composite key select query weirdness
1 parent 22cab72 commit 0e58cf0

File tree

2 files changed

+47
-6
lines changed

2 files changed

+47
-6
lines changed

lib/queryBuilder/graph/GraphFetcher.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,13 @@ function createInputColumnSelector(nodes) {
121121
}
122122

123123
const selectArr = Array.from(selects.values());
124-
const idColumn = builder.fullIdColumn();
124+
const idColumns = asArray(builder.fullIdColumn());
125125

126-
if (!selectArr.includes(idColumn)) {
127-
// Always select the identifer.
128-
selectArr.push(idColumn);
126+
for (const idColumn of idColumns) {
127+
if (!selectArr.includes(idColumn)) {
128+
// Always select the identifers.
129+
selectArr.push(idColumn);
130+
}
129131
}
130132

131133
builder.select(selectArr);

tests/integration/compositeKeys.js

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,23 @@ const _ = require('lodash');
22
const { Model } = require('../../');
33
const expect = require('expect.js');
44
const Promise = require('bluebird');
5+
const mockKnexFactory = require('../../testUtils/mockKnex');
56

67
module.exports = session => {
78
describe('Composite keys', () => {
9+
let mockKnex;
10+
let queries;
11+
812
let A;
913
let B;
1014

15+
before(() => {
16+
mockKnex = mockKnexFactory(session.knex, function(mock, oldImpl, args) {
17+
queries.push(this.toSQL());
18+
return oldImpl.apply(this, args);
19+
});
20+
});
21+
1122
before(() => {
1223
return session.knex.schema
1324
.dropTableIfExists('A_B')
@@ -113,8 +124,12 @@ module.exports = session => {
113124
}
114125
}
115126

116-
A = ModelA.bindKnex(session.knex);
117-
B = ModelB.bindKnex(session.knex);
127+
A = ModelA.bindKnex(mockKnex);
128+
B = ModelB.bindKnex(mockKnex);
129+
});
130+
131+
beforeEach(() => {
132+
queries = [];
118133
});
119134

120135
describe('insert', () => {
@@ -326,6 +341,30 @@ module.exports = session => {
326341
]);
327342
});
328343

344+
it('should work when updating the root', async () => {
345+
queries = [];
346+
347+
const result = await A.query().upsertGraph({
348+
id1: 1,
349+
id2: '1',
350+
aval: 'updated'
351+
});
352+
353+
expect(result.aval).to.equal('updated');
354+
expect(queries.length).to.equal(2);
355+
expect(queries[0].bindings).to.eql([1, '1']);
356+
357+
if (session.isPostgres()) {
358+
expect(queries[0].sql).to.equal(
359+
'select "A"."id1", "A"."id2", "A"."aval" from "A" where ("A"."id1", "A"."id2") in ((?, ?))'
360+
);
361+
}
362+
363+
const fromDb = await A.query().findById([1, '1']);
364+
365+
expect(fromDb.aval).to.equal('updated');
366+
});
367+
329368
it('should work when `insertMissing` option is true', () => {
330369
return A.query()
331370
.upsertGraph(

0 commit comments

Comments
 (0)