Skip to content

Commit

Permalink
Merge pull request #5 from ngdaniels/master
Browse files Browse the repository at this point in the history
[ENHANCEMENT] Enable case insensitive query
[ENHANCEMENT] Test Case
  • Loading branch information
andreyreyand committed Nov 12, 2019
2 parents 51cb2a8 + b4e04f7 commit 8d270a0
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 13 deletions.
23 changes: 16 additions & 7 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -106,17 +106,26 @@ class QueryBuilder {
let whereString = '';

if (typeof where.column === 'string') {
whereString = where.column;
if (typeof where.value === 'string') {
whereString = `${where.column} ${where.operator} '${where.value}'`;
}
else {
whereString = `${where.column} ${where.operator} ${where.value}`;
}
}
else if (typeof where.column === 'object') {
whereString = `${where.column.tableName}."${where.column.columnName}"`
if (where.column.columnType === "string" && !where.caseSensitive) {
whereString = `LOWER (${where.column.tableName}."${where.column.columnName}") ${where.operator} LOWER ('${where.value}')`
}
else {
whereString = `${where.column.tableName}."${where.column.columnName}" ${where.operator} '${where.value}'`
}
}

if (index === this.whereField.length - 1) {
queryString += `${whereString} ${where.operator} '${where.value}' `;
if (index < this.whereField.length - 1) {
queryString += `${whereString} AND `;
}
else {
queryString += `${whereString} ${where.operator} '${where.value}' AND `;
queryString += `${whereString} `;
}
});
}
Expand Down Expand Up @@ -148,8 +157,8 @@ class QueryBuilder {
queryString += `OFFSET ${this.offset} `;
}
else if (this.datastore === 'sqlserver') {
queryString += `OFFSET ${this.offset} ROWS `;
queryString += `FETCH NEXT ${this.limit} ROWS ONLY `;
queryString += `OFFSET ${this.offset} ROWS `;
}
}

Expand Down
77 changes: 71 additions & 6 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ const expect = require('chai').expect;
const QueryBuilder = require('../index');

describe('Query String Builder', function () {
it('Test 0. Select ALL', function() {
let queryClass = new QueryBuilder;
let queryString = queryClass
.setFirstTable('user')
.generateQuery();
expect(queryString).to.equal(`SELECT * FROM user;`);
});

it('Test 1. Simple Select', function () {
let queryClass = new QueryBuilder;
let queryString = queryClass
Expand All @@ -16,9 +24,11 @@ describe('Query String Builder', function () {
it('Test 2. Simple Select with Multiple column', function () {
let queryClass = new QueryBuilder;
let queryString = queryClass
.addSelect('firstName')
.addSelect('lastName')
.addSelect('age')
.addMultipleSelect([
'firstName',
'lastName',
'age'
])
.setFirstTable('user')
.generateQuery();
expect(queryString).to.equal(`SELECT firstName, lastName, age FROM user;`);
Expand Down Expand Up @@ -125,8 +135,8 @@ describe('Query String Builder', function () {
expect(queryString).to.equal(`SELECT a."firstName", b."countryName", c."continentName" FROM user a FULL JOIN country b ON b."id" = a."country" FULL JOIN continent c ON c."id" = b."continent";`);
});

it('Test 6. Simple Select with limit and offset', function () {
let queryClass = new QueryBuilder;
it('Test 6a. [PostgreSQL] Simple Select with limit and offset', function () {
let queryClass = new QueryBuilder({ datastore: 'postgresql'});
let queryString = queryClass
.addSelect('firstName')
.addSelect('lastName')
Expand All @@ -138,6 +148,19 @@ describe('Query String Builder', function () {
expect(queryString).to.equal(`SELECT firstName, lastName, age FROM user LIMIT 10 OFFSET 20;`);
});

it('Test 6b. [SQL Server] Simple Select with limit and offset', function () {
let queryClass = new QueryBuilder({ datastore: 'sqlserver'});
let queryString = queryClass
.addSelect('firstName')
.addSelect('lastName')
.addSelect('age')
.setFirstTable('user')
.addLimit(10)
.addOffset(20)
.generateQuery();
expect(queryString).to.equal(`SELECT firstName, lastName, age FROM user FETCH NEXT 10 ROWS ONLY OFFSET 20 ROWS;`);
});

it('Test 7. Simple Select with column alias', function () {
let queryClass = new QueryBuilder;
let queryString = queryClass
Expand All @@ -153,7 +176,7 @@ describe('Query String Builder', function () {
expect(queryString).to.equal(`SELECT user."firstName" AS "user_first_name", lastName, age FROM user;`);
});

it('Test 8. Test with multiple where', function () {
it('Test 8. Select with Multiple where', function () {
let queryClass = new QueryBuilder;
let queryString = queryClass
.addSelect('firstName')
Expand All @@ -171,4 +194,46 @@ describe('Query String Builder', function () {
.generateQuery();
expect(queryString).to.equal(`SELECT firstName FROM user WHERE firstName = 'Agung' AND lastName = 'Hercules';`);
});

it(`Test 9. Select with Multiple where (2), operator is 'greater than' and value is an 'integer'`, function() {
let queryClass = new QueryBuilder;
let queryString = queryClass
.addSelect('firstName')
.setFirstTable('user')
.addWhere({
column: 'age',
operator: '>',
value: 25
})
.addWhere({
column: 'status',
operator: '=',
value: 'Single'
})
.generateQuery();
expect(queryString).to.equal(`SELECT firstName FROM user WHERE age > 25 AND status = 'Single';`);
})

it(`Test 9. Select with Multiple where (3), caseSensitive = false, lastName contains 'brown' `, function() {
let queryClass = new QueryBuilder;
let queryString = queryClass
.addSelect('firstName')
.setFirstTable('user')
.addWhere({
column: 'age',
operator: '>',
value: 25
})
.addWhere({
column: {
tableName: 'user',
columnName: 'lastName',
columnType: 'string'
},
operator: 'LIKE',
value: '%brown%'
})
.generateQuery();
expect(queryString).to.equal(`SELECT firstName FROM user WHERE age > 25 AND LOWER (user."lastName") LIKE LOWER ('%brown%');`);
})
});

0 comments on commit 8d270a0

Please sign in to comment.