diff --git a/index.js b/index.js index e86ca4f..7664b4e 100644 --- a/index.js +++ b/index.js @@ -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} `; } }); } @@ -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 `; } } diff --git a/test/test.js b/test/test.js index 6cf5191..a738b88 100644 --- a/test/test.js +++ b/test/test.js @@ -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 @@ -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;`); @@ -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') @@ -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 @@ -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') @@ -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%');`); + }) }); \ No newline at end of file