2014-09-01 17:18:45 +02:00
|
|
|
/*global describe, it*/
|
|
|
|
|
|
|
|
'use strict';
|
|
|
|
|
2013-09-11 23:36:55 -04:00
|
|
|
module.exports = function(knex) {
|
|
|
|
|
2013-09-12 13:30:47 -04:00
|
|
|
describe('Aggregate', function() {
|
2013-09-11 23:36:55 -04:00
|
|
|
|
2013-09-12 01:00:44 -04:00
|
|
|
it('has a sum', function() {
|
2013-09-11 23:36:55 -04:00
|
|
|
|
2015-04-28 23:32:41 -04:00
|
|
|
return knex('accounts').sum('logins').testSql(function(tester) {
|
2013-12-27 14:44:21 -05:00
|
|
|
tester(
|
|
|
|
'mysql',
|
|
|
|
'select sum(`logins`) from `accounts`',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'sum(`logins`)': 10
|
|
|
|
}]
|
|
|
|
);
|
2015-04-22 10:34:14 -04:00
|
|
|
tester(
|
|
|
|
'mysql2',
|
|
|
|
'select sum(`logins`) from `accounts`',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'sum(`logins`)': '10'
|
|
|
|
}]
|
|
|
|
);
|
2013-12-27 14:44:21 -05:00
|
|
|
tester(
|
2018-06-29 10:47:06 +03:00
|
|
|
'pg',
|
2013-12-27 14:44:21 -05:00
|
|
|
'select sum("logins") from "accounts"',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
sum: '10'
|
|
|
|
}]
|
|
|
|
);
|
2018-02-03 08:33:02 -05:00
|
|
|
tester(
|
|
|
|
'pg-redshift',
|
|
|
|
'select sum("logins") from "accounts"',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
sum: '10'
|
|
|
|
}]
|
|
|
|
);
|
2013-12-27 14:44:21 -05:00
|
|
|
tester(
|
|
|
|
'sqlite3',
|
2017-05-28 22:48:18 +02:00
|
|
|
'select sum(`logins`) from `accounts`',
|
2013-12-27 14:44:21 -05:00
|
|
|
[],
|
|
|
|
[{
|
2017-05-28 22:48:18 +02:00
|
|
|
'sum(`logins`)': 10
|
2013-12-27 14:44:21 -05:00
|
|
|
}]
|
|
|
|
);
|
2014-08-21 23:39:12 +02:00
|
|
|
tester(
|
2018-07-08 14:10:51 +03:00
|
|
|
'oracledb',
|
2014-08-21 23:39:12 +02:00
|
|
|
'select sum("logins") from "accounts"',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'SUM("LOGINS")': 10
|
|
|
|
}]
|
|
|
|
);
|
2015-12-09 17:53:53 -06:00
|
|
|
tester(
|
|
|
|
'mssql',
|
|
|
|
'select sum([logins]) from [accounts]',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'': 10
|
|
|
|
}]
|
|
|
|
);
|
2013-12-27 14:44:21 -05:00
|
|
|
});
|
2013-09-11 23:36:55 -04:00
|
|
|
});
|
|
|
|
|
2014-01-19 15:00:15 -05:00
|
|
|
it('has an avg', function() {
|
|
|
|
|
2014-04-16 02:50:19 -04:00
|
|
|
return knex('accounts').avg('logins').testSql(function(tester) {
|
2014-08-21 23:39:12 +02:00
|
|
|
|
|
|
|
function checkResRange(key, resp) {
|
|
|
|
return Math.abs(10/6 - +(resp[0][key])) < 0.001;
|
|
|
|
}
|
2018-02-03 08:33:02 -05:00
|
|
|
function checkResRangeMssql(key, resp) {
|
2015-12-10 13:35:37 -06:00
|
|
|
return +(resp[0][key]) === 1;
|
2015-12-09 17:53:53 -06:00
|
|
|
}
|
2014-08-21 23:39:12 +02:00
|
|
|
|
|
|
|
// mysql: 1.6667
|
|
|
|
tester('mysql', 'select avg(`logins`) from `accounts`', [], checkResRange.bind(null, 'avg(`logins`)'));
|
|
|
|
// sqlite: 1.6666666666666667
|
2017-05-28 22:48:18 +02:00
|
|
|
tester('sqlite3', 'select avg(`logins`) from `accounts`', [], checkResRange.bind(null, 'avg(`logins`)'));
|
2018-07-08 14:10:51 +03:00
|
|
|
// pg: '1.6666666666666667'
|
2018-06-29 10:47:06 +03:00
|
|
|
tester('pg', 'select avg("logins") from "accounts"', [], checkResRange.bind(null, 'avg'));
|
2018-07-08 14:10:51 +03:00
|
|
|
// pg-redshift: '1.6666666666666667'
|
2018-02-03 08:33:02 -05:00
|
|
|
tester('pg-redshift', 'select avg("logins") from "accounts"', [], checkResRangeMssql.bind(null, 'avg'));
|
2014-08-21 23:39:12 +02:00
|
|
|
// oracle: 1.66666666666667
|
2018-07-08 14:10:51 +03:00
|
|
|
tester('oracledb', 'select avg("logins") from "accounts"', [], checkResRange.bind(null, 'AVG("LOGINS")'));
|
2015-12-09 17:53:53 -06:00
|
|
|
// mssql: 1
|
|
|
|
tester('mssql', 'select avg([logins]) from [accounts]', [], checkResRangeMssql.bind(null, ''));
|
2014-04-16 02:50:19 -04:00
|
|
|
});
|
2014-01-19 15:00:15 -05:00
|
|
|
|
|
|
|
});
|
|
|
|
|
2013-09-12 01:00:44 -04:00
|
|
|
it('has a count', function() {
|
2013-09-11 23:36:55 -04:00
|
|
|
|
2013-12-27 14:44:21 -05:00
|
|
|
return knex('accounts').count('id').testSql(function(tester) {
|
2015-12-09 17:53:53 -06:00
|
|
|
tester(
|
2013-12-27 14:44:21 -05:00
|
|
|
'mysql',
|
|
|
|
'select count(`id`) from `accounts`',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'count(`id`)': 6
|
|
|
|
}]
|
|
|
|
);
|
|
|
|
tester(
|
2018-06-29 10:47:06 +03:00
|
|
|
'pg',
|
2013-12-27 14:44:21 -05:00
|
|
|
'select count("id") from "accounts"',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
count: '6'
|
|
|
|
}]
|
|
|
|
);
|
2018-02-03 08:33:02 -05:00
|
|
|
tester(
|
|
|
|
'pg-redshift',
|
|
|
|
'select count("id") from "accounts"',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
count: '6'
|
|
|
|
}]
|
|
|
|
);
|
2013-12-27 14:44:21 -05:00
|
|
|
tester(
|
|
|
|
'sqlite3',
|
2017-05-28 22:48:18 +02:00
|
|
|
'select count(`id`) from `accounts`',
|
2013-12-27 14:44:21 -05:00
|
|
|
[],
|
|
|
|
[{
|
2017-05-28 22:48:18 +02:00
|
|
|
'count(`id`)': 6
|
2013-12-27 14:44:21 -05:00
|
|
|
}]
|
|
|
|
);
|
2014-08-21 23:39:12 +02:00
|
|
|
tester(
|
2018-07-08 14:10:51 +03:00
|
|
|
'oracledb',
|
2014-08-21 23:39:12 +02:00
|
|
|
'select count("id") from "accounts"',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'COUNT("ID")': 6
|
|
|
|
}]
|
|
|
|
);
|
2015-12-09 17:53:53 -06:00
|
|
|
tester(
|
|
|
|
'mssql',
|
|
|
|
'select count([id]) from [accounts]',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'': 6
|
|
|
|
}]
|
|
|
|
);
|
2013-12-27 14:44:21 -05:00
|
|
|
});
|
2013-09-11 23:36:55 -04:00
|
|
|
|
|
|
|
});
|
|
|
|
|
2013-11-23 12:10:01 -05:00
|
|
|
it('supports multiple aggregate functions', function() {
|
|
|
|
|
2013-12-27 14:44:21 -05:00
|
|
|
return knex('accounts').count('id').max('logins').min('logins').testSql(function(tester) {
|
|
|
|
tester(
|
|
|
|
'mysql',
|
|
|
|
'select count(`id`), max(`logins`), min(`logins`) from `accounts`',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'count(`id`)': 6,
|
|
|
|
'max(`logins`)': 2,
|
|
|
|
'min(`logins`)': 1
|
|
|
|
}]
|
|
|
|
);
|
|
|
|
tester(
|
2018-06-29 10:47:06 +03:00
|
|
|
'pg',
|
2013-12-27 14:44:21 -05:00
|
|
|
'select count("id"), max("logins"), min("logins") from "accounts"',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
count: '6',
|
|
|
|
max: 2,
|
|
|
|
min: 1
|
|
|
|
}]
|
|
|
|
);
|
2018-02-03 08:33:02 -05:00
|
|
|
tester(
|
|
|
|
'pg-redshift',
|
|
|
|
'select count("id"), max("logins"), min("logins") from "accounts"',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
count: '6',
|
|
|
|
max: 2,
|
|
|
|
min: 1
|
|
|
|
}]
|
|
|
|
);
|
2013-12-27 14:44:21 -05:00
|
|
|
tester(
|
|
|
|
'sqlite3',
|
2017-05-28 22:48:18 +02:00
|
|
|
'select count(`id`), max(`logins`), min(`logins`) from `accounts`',
|
2013-12-27 14:44:21 -05:00
|
|
|
[],
|
|
|
|
[{
|
2017-05-28 22:48:18 +02:00
|
|
|
'count(`id`)': 6,
|
|
|
|
'max(`logins`)': 2,
|
|
|
|
'min(`logins`)': 1
|
2013-12-27 14:44:21 -05:00
|
|
|
}]
|
|
|
|
);
|
2014-08-21 23:39:12 +02:00
|
|
|
tester(
|
2018-07-08 14:10:51 +03:00
|
|
|
'oracledb',
|
2014-08-21 23:39:12 +02:00
|
|
|
'select count("id"), max("logins"), min("logins") from "accounts"',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'COUNT("ID")': 6,
|
|
|
|
'MAX("LOGINS")': 2,
|
|
|
|
'MIN("LOGINS")': 1
|
|
|
|
}]
|
2015-11-04 12:23:20 +00:00
|
|
|
);
|
2015-12-09 17:53:53 -06:00
|
|
|
tester(
|
|
|
|
'mssql',
|
|
|
|
'select count([id]), max([logins]), min([logins]) from [accounts]',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'': [6, 2, 1]
|
|
|
|
}]
|
|
|
|
);
|
2015-11-04 12:23:20 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
it('has distinct modifier for aggregates', function() {
|
|
|
|
|
|
|
|
return knex('accounts').countDistinct('id').sumDistinct('logins').avgDistinct('logins').testSql(function(tester) {
|
|
|
|
tester(
|
|
|
|
'mysql',
|
|
|
|
'select count(distinct `id`), sum(distinct `logins`), avg(distinct `logins`) from `accounts`',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'count(distinct `id`)': 6,
|
|
|
|
'sum(distinct `logins`)': 3,
|
|
|
|
'avg(distinct `logins`)': 1.5
|
|
|
|
}]
|
|
|
|
);
|
|
|
|
tester(
|
2018-06-29 10:47:06 +03:00
|
|
|
'pg',
|
2015-11-04 12:23:20 +00:00
|
|
|
'select count(distinct "id"), sum(distinct "logins"), avg(distinct "logins") from "accounts"',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
count: '6',
|
2018-06-29 10:47:06 +03:00
|
|
|
sum: "3",
|
|
|
|
avg: "1.5000000000000000"
|
2015-11-04 12:23:20 +00:00
|
|
|
}]
|
|
|
|
);
|
2018-02-03 08:33:02 -05:00
|
|
|
tester(
|
|
|
|
'pg-redshift',
|
|
|
|
'select count(distinct "id"), sum(distinct "logins"), avg(distinct "logins") from "accounts"',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
count: '6',
|
|
|
|
sum: '3',
|
|
|
|
avg: '1'
|
|
|
|
}]
|
|
|
|
);
|
2015-11-04 12:23:20 +00:00
|
|
|
tester(
|
|
|
|
'sqlite3',
|
2017-05-28 22:48:18 +02:00
|
|
|
'select count(distinct `id`), sum(distinct `logins`), avg(distinct `logins`) from `accounts`',
|
2015-11-04 12:23:20 +00:00
|
|
|
[],
|
|
|
|
[{
|
2017-05-28 22:48:18 +02:00
|
|
|
'count(distinct `id`)': 6,
|
|
|
|
'sum(distinct `logins`)': 3,
|
|
|
|
'avg(distinct `logins`)': 1.5
|
2015-11-04 12:23:20 +00:00
|
|
|
}]
|
|
|
|
);
|
|
|
|
tester(
|
2018-07-08 14:10:51 +03:00
|
|
|
'oracledb',
|
2015-11-04 12:23:20 +00:00
|
|
|
'select count(distinct "id"), sum(distinct "logins"), avg(distinct "logins") from "accounts"',
|
|
|
|
[],
|
|
|
|
[{
|
2018-07-08 14:10:51 +03:00
|
|
|
'COUNT(DISTINCT"ID")': 6,
|
|
|
|
'SUM(DISTINCT"LOGINS")': 3,
|
|
|
|
'AVG(DISTINCT"LOGINS")': 1.5
|
2015-11-04 12:23:20 +00:00
|
|
|
}]
|
2014-08-21 23:39:12 +02:00
|
|
|
);
|
2015-12-09 17:53:53 -06:00
|
|
|
tester(
|
|
|
|
'mssql',
|
|
|
|
'select count(distinct [id]), sum(distinct [logins]), avg(distinct [logins]) from [accounts]',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'': [6, 3, 1]
|
|
|
|
}]
|
|
|
|
);
|
2013-12-27 14:44:21 -05:00
|
|
|
});
|
2013-11-23 12:10:01 -05:00
|
|
|
|
|
|
|
});
|
|
|
|
|
2018-03-12 22:42:43 +01:00
|
|
|
const testWithMultipleColumns = knex.client.driverName === 'mysql' ||
|
2018-07-08 14:10:51 +03:00
|
|
|
knex.client.driverName === 'pg';
|
2018-03-12 22:42:43 +01:00
|
|
|
|
|
|
|
it('supports countDistinct with multiple columns', function() {
|
|
|
|
if (!testWithMultipleColumns) {
|
|
|
|
return this.skip();
|
|
|
|
}
|
|
|
|
|
|
|
|
return knex('accounts').countDistinct('id', 'logins').testSql(function(tester) {
|
|
|
|
tester(
|
|
|
|
'mysql',
|
|
|
|
'select count(distinct `id`, `logins`) from `accounts`',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'count(distinct `id`, `logins`)': 6
|
|
|
|
}]
|
|
|
|
);
|
|
|
|
tester(
|
2018-06-29 10:47:06 +03:00
|
|
|
'pg',
|
2018-03-12 22:42:43 +01:00
|
|
|
'select count(distinct("id", "logins")) from "accounts"',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
count: '6'
|
|
|
|
}]
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
it('supports countDistinct with multiple columns with alias', function () {
|
|
|
|
if (!testWithMultipleColumns) {
|
|
|
|
return this.skip();
|
|
|
|
}
|
|
|
|
|
|
|
|
return knex('accounts').countDistinct({ count: ['id', 'logins'] })
|
|
|
|
.testSql(function (tester) {
|
|
|
|
tester(
|
|
|
|
'mysql',
|
|
|
|
'select count(distinct `id`, `logins`) as `count` from `accounts`',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
count: 6
|
|
|
|
}]
|
|
|
|
);
|
|
|
|
tester(
|
2018-06-29 10:47:06 +03:00
|
|
|
'pg',
|
2018-03-12 22:42:43 +01:00
|
|
|
'select count(distinct("id", "logins")) as "count" from "accounts"',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
count: '6'
|
|
|
|
}]
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
2013-09-12 01:00:44 -04:00
|
|
|
it("support the groupBy function", function() {
|
|
|
|
|
2018-02-03 08:33:02 -05:00
|
|
|
return knex('accounts').count('id').groupBy('logins').orderBy('logins', 'asc').testSql(function(tester) {
|
2013-12-27 14:44:21 -05:00
|
|
|
tester(
|
|
|
|
'mysql',
|
2018-02-03 08:33:02 -05:00
|
|
|
'select count(`id`) from `accounts` group by `logins` order by `logins` asc',
|
2013-12-27 14:44:21 -05:00
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'count(`id`)': 2
|
|
|
|
},{
|
|
|
|
'count(`id`)': 4
|
|
|
|
}]
|
|
|
|
);
|
|
|
|
tester(
|
2018-06-29 10:47:06 +03:00
|
|
|
'pg',
|
2018-02-03 08:33:02 -05:00
|
|
|
'select count("id") from "accounts" group by "logins" order by "logins" asc',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
count: '2'
|
|
|
|
},{
|
|
|
|
count: '4'
|
|
|
|
}]
|
|
|
|
);
|
|
|
|
tester(
|
|
|
|
'pg-redshift',
|
|
|
|
'select count("id") from "accounts" group by "logins" order by "logins" asc',
|
2013-12-27 14:44:21 -05:00
|
|
|
[],
|
|
|
|
[{
|
|
|
|
count: '2'
|
|
|
|
},{
|
|
|
|
count: '4'
|
|
|
|
}]
|
|
|
|
);
|
|
|
|
tester(
|
|
|
|
'sqlite3',
|
2018-02-03 08:33:02 -05:00
|
|
|
'select count(`id`) from `accounts` group by `logins` order by `logins` asc',
|
2013-12-27 14:44:21 -05:00
|
|
|
[],
|
|
|
|
[{
|
2017-05-28 22:48:18 +02:00
|
|
|
'count(`id`)': 2
|
2013-12-27 14:44:21 -05:00
|
|
|
},{
|
2017-05-28 22:48:18 +02:00
|
|
|
'count(`id`)': 4
|
2013-12-27 14:44:21 -05:00
|
|
|
}]
|
|
|
|
);
|
2014-08-21 23:39:12 +02:00
|
|
|
tester(
|
2018-07-08 14:10:51 +03:00
|
|
|
'oracledb',
|
2018-02-03 08:33:02 -05:00
|
|
|
'select count("id") from "accounts" group by "logins" order by "logins" asc',
|
2014-08-21 23:39:12 +02:00
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'COUNT("ID")': 2
|
|
|
|
},{
|
|
|
|
'COUNT("ID")': 4
|
|
|
|
}]
|
|
|
|
);
|
2015-12-09 17:53:53 -06:00
|
|
|
tester(
|
|
|
|
'mssql',
|
2018-02-03 08:33:02 -05:00
|
|
|
'select count([id]) from [accounts] group by [logins] order by [logins] asc',
|
2015-12-09 17:53:53 -06:00
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'': 2
|
|
|
|
},{
|
|
|
|
'': 4
|
|
|
|
}]
|
|
|
|
);
|
2013-12-27 14:44:21 -05:00
|
|
|
|
|
|
|
}).then(function() {
|
|
|
|
return knex('accounts').count('id').groupBy('first_name').testSql(function(tester) {
|
|
|
|
tester(
|
|
|
|
'mysql',
|
|
|
|
'select count(`id`) from `accounts` group by `first_name`',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'count(`id`)': 6
|
|
|
|
}]
|
|
|
|
);
|
|
|
|
tester(
|
2018-06-29 10:47:06 +03:00
|
|
|
'pg',
|
2013-12-27 14:44:21 -05:00
|
|
|
'select count("id") from "accounts" group by "first_name"',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
count: '6'
|
|
|
|
}]
|
|
|
|
);
|
2018-02-03 08:33:02 -05:00
|
|
|
tester(
|
|
|
|
'pg-redshift',
|
|
|
|
'select count("id") from "accounts" group by "first_name"',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
count: '6'
|
|
|
|
}]
|
|
|
|
);
|
2013-12-27 14:44:21 -05:00
|
|
|
tester(
|
|
|
|
'sqlite3',
|
2017-05-28 22:48:18 +02:00
|
|
|
'select count(`id`) from `accounts` group by `first_name`',
|
2013-12-27 14:44:21 -05:00
|
|
|
[],
|
|
|
|
[{
|
2017-05-28 22:48:18 +02:00
|
|
|
'count(`id`)': 6
|
2013-12-27 14:44:21 -05:00
|
|
|
}]
|
|
|
|
);
|
2014-08-21 23:39:12 +02:00
|
|
|
tester(
|
2018-07-08 14:10:51 +03:00
|
|
|
'oracledb',
|
2014-08-21 23:39:12 +02:00
|
|
|
'select count("id") from "accounts" group by "first_name"',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'COUNT("ID")': 6
|
|
|
|
}]
|
|
|
|
);
|
2015-12-09 17:53:53 -06:00
|
|
|
tester(
|
|
|
|
'mssql',
|
|
|
|
'select count([id]) from [accounts] group by [first_name]',
|
|
|
|
[],
|
|
|
|
[{
|
|
|
|
'': 6
|
|
|
|
}]
|
|
|
|
);
|
2014-08-21 23:39:12 +02:00
|
|
|
});
|
2014-02-21 20:37:24 -05:00
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
2013-09-11 23:36:55 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
};
|