Skip to content

Commit

Permalink
Merge 78272e0 into dfe0129
Browse files Browse the repository at this point in the history
  • Loading branch information
thekuom committed Mar 3, 2019
2 parents dfe0129 + 78272e0 commit d41352c
Show file tree
Hide file tree
Showing 5 changed files with 584 additions and 0 deletions.
26 changes: 26 additions & 0 deletions src/query/builder.js
Expand Up @@ -642,6 +642,32 @@ assign(Builder.prototype, {
return this;
},

// Adds an intersect statement to the query
intersect(callbacks, wrap) {
if (arguments.length === 1 || (arguments.length === 2 && isBoolean(wrap))) {
if (!Array.isArray(callbacks)) {
callbacks = [callbacks];
}
for (let i = 0, l = callbacks.length; i < l; i++) {
this._statements.push({
grouping: 'union',
clause: 'intersect',
value: callbacks[i],
wrap: wrap || false,
});
}
} else {
callbacks = toArray(arguments).slice(0, arguments.length - 1);
wrap = arguments[arguments.length - 1];
if (!isBoolean(wrap)) {
callbacks.push(wrap);
wrap = false;
}
this.intersect(callbacks, wrap);
}
return this;
},

// Adds a `having` clause to the query.
having(column, operator, value) {
if (column instanceof Raw && arguments.length === 1) {
Expand Down
1 change: 1 addition & 0 deletions src/query/methods.js
Expand Up @@ -56,6 +56,7 @@ export default [
'orderByRaw',
'union',
'unionAll',
'intersect',
'having',
'havingRaw',
'orHaving',
Expand Down
218 changes: 218 additions & 0 deletions test/integration/builder/unions.js
Expand Up @@ -2,6 +2,8 @@

'use strict';

const expect = require('chai').expect;

module.exports = function(knex) {
describe('unions', function() {
it('handles unions with a callback', function() {
Expand Down Expand Up @@ -112,4 +114,220 @@ module.exports = function(knex) {
);
});
});

if (
['pg', 'mssql', 'pg-redshift', 'oracledb', 'sqlite3'].includes(
knex.client.driverName
)
) {
describe('intersects', function() {
before(function() {
return knex.schema.createTable('intersect_test', function(t) {
t.integer('id');
t.integer('test_col_1');
t.integer('test_col_2');
t.integer('test_col_3');
});
});

beforeEach(function() {
return knex('intersect_test').insert([
{
id: 1,
test_col_1: 1,
test_col_2: 2,
test_col_3: 1,
},
{
id: 2,
test_col_1: 2,
test_col_2: 3,
test_col_3: 1,
},
{
id: 3,
test_col_1: 2,
test_col_2: 3,
test_col_3: 2,
},
{
id: 4,
test_col_1: 1,
test_col_2: 2,
test_col_3: 2,
},
{
id: 5,
test_col_1: 1,
test_col_2: 2,
test_col_3: 1,
},
]);
});

after(function() {
return knex.schema.dropTable('intersect_test');
});

it('handles intersects with a callback', function() {
return knex('intersect_test')
.select('*')
.where('test_col_1', '=', 1)
.intersect(function() {
this.select('*')
.from('intersect_test')
.where('test_col_2', 2);
})
.then(function(result) {
expect(result.length).to.equal(3);
expect(result.map((r) => r.id)).to.have.members([1, 4, 5]);
});
});

it('handles intersects with an array of callbacks', function() {
return knex('intersect_test')
.select('*')
.where('test_col_1', '=', 1)
.intersect([
function() {
this.select('*')
.from('intersect_test')
.where('test_col_2', 2);
},
function() {
this.select('*')
.from('intersect_test')
.where('test_col_3', 1);
},
])
.then(function(result) {
expect(result.length).to.equal(2);
expect(result.map((r) => r.id)).to.have.members([1, 5]);
});
});

it('handles intersects with a list of callbacks', function() {
return knex('intersect_test')
.select('*')
.where('test_col_1', '=', 1)
.intersect(
function() {
this.select('*')
.from('intersect_test')
.where('test_col_2', 2);
},
function() {
this.select('*')
.from('intersect_test')
.where('test_col_3', 1);
}
)
.then(function(result) {
expect(result.length).to.equal(2);
expect(result.map((r) => r.id)).to.have.members([1, 5]);
});
});

it('handles intersects with an array of builders', function() {
return knex('intersect_test')
.select('*')
.where('test_col_1', '=', 1)
.intersect([
knex
.select('*')
.from('intersect_test')
.where('test_col_2', 2),
knex
.select('*')
.from('intersect_test')
.where('test_col_3', 1),
])
.then(function(result) {
expect(result.length).to.equal(2);
expect(result.map((r) => r.id)).to.have.members([1, 5]);
});
});

it('handles intersects with a list of builders', function() {
return knex('intersect_test')
.select('*')
.where('test_col_1', '=', 1)
.intersect(
knex
.select('*')
.from('intersect_test')
.where('test_col_2', 2),
knex
.select('*')
.from('intersect_test')
.where('test_col_3', 1)
)
.then(function(result) {
expect(result.length).to.equal(2);
expect(result.map((r) => r.id)).to.have.members([1, 5]);
});
});

it('handles intersects with a raw query', function() {
return knex('intersect_test')
.select('*')
.where('test_col_1', '=', 2)
.intersect(
knex.raw('select * from ?? where ?? = ?', [
'intersect_test',
'test_col_2',
3,
])
)
.then(function(result) {
expect(result.length).to.equal(2);
expect(result.map((r) => r.id)).to.have.members([2, 3]);
});
});

it('handles intersects with an array raw queries', function() {
return knex('intersect_test')
.select('*')
.where('test_col_1', '=', 1)
.intersect([
knex.raw('select * from ?? where ?? = ?', [
'intersect_test',
'test_col_2',
2,
]),
knex.raw('select * from ?? where ?? = ?', [
'intersect_test',
'test_col_3',
1,
]),
])
.then(function(result) {
expect(result.length).to.equal(2);
expect(result.map((r) => r.id)).to.have.members([1, 5]);
});
});

it('handles intersects with a list of raw queries', function() {
return knex('intersect_test')
.select('*')
.where('test_col_1', '=', 1)
.intersect(
knex.raw('select * from ?? where ?? = ?', [
'intersect_test',
'test_col_2',
2,
]),
knex.raw('select * from ?? where ?? = ?', [
'intersect_test',
'test_col_3',
1,
])
)
.then(function(result) {
expect(result.length).to.equal(2);
expect(result.map((r) => r.id)).to.have.members([1, 5]);
});
});
});
}
};

0 comments on commit d41352c

Please sign in to comment.