Skip to content

Commit 18f62df

Browse files
author
Sakib Hasan
authored
Merge pull request #57 from strongloop/fix/override-buildExpression
Override buildExpression from base connector
2 parents 3e12f49 + da7661a commit 18f62df

1 file changed

Lines changed: 89 additions & 0 deletions

File tree

lib/ibmdb.js

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ var async = require('async');
1919
var ParameterizedSQL = IBMDB.ParameterizedSQL = SQLConnector.ParameterizedSQL;
2020
var Transaction = IBMDB.Transaction = SQLConnector.Transaction;
2121

22+
// The generic placeholder
23+
var PLACEHOLDER = SQLConnector.PLACEHOLDER = ParameterizedSQL.PLACEHOLDER;
24+
2225
/**
2326
* Initialize the IBMDB connector for the given data source
2427
*
@@ -820,6 +823,92 @@ IBMDB.prototype.buildColumnDefinitions = function(model) {
820823
return sql.join(',\n');
821824
};
822825

826+
/**
827+
* Build SQL expression
828+
* @param {String} columnName Escaped column name
829+
* @param {String} operator SQL operator
830+
* @param {*} columnValue Column value
831+
* @param {*} propertyValue Property value
832+
* @returns {ParameterizedSQL} The SQL expression
833+
*/
834+
IBMDB.prototype.buildExpression =
835+
function(columnName, operator, columnValue, propertyValue) {
836+
function buildClause(columnValue, separator, grouping) {
837+
var values = [];
838+
for (var i = 0, n = columnValue.length; i < n; i++) {
839+
if (columnValue[i] instanceof ParameterizedSQL) {
840+
values.push(columnValue[i]);
841+
} else {
842+
values.push(new ParameterizedSQL(PLACEHOLDER, [columnValue[i]]));
843+
}
844+
}
845+
separator = separator || ',';
846+
var clause = ParameterizedSQL.join(values, separator);
847+
if (grouping) {
848+
clause.sql = '(' + clause.sql + ')';
849+
}
850+
return clause;
851+
}
852+
853+
var self = this;
854+
var sqlExp = columnName;
855+
var clause, stmt;
856+
if (columnValue instanceof ParameterizedSQL) {
857+
clause = columnValue;
858+
} else {
859+
clause = new ParameterizedSQL(PLACEHOLDER, [columnValue]);
860+
}
861+
switch (operator) {
862+
case 'gt':
863+
sqlExp += '>';
864+
break;
865+
case 'gte':
866+
sqlExp += '>=';
867+
break;
868+
case 'lt':
869+
sqlExp += '<';
870+
break;
871+
case 'lte':
872+
sqlExp += '<=';
873+
break;
874+
case 'between':
875+
sqlExp += ' BETWEEN ';
876+
clause = buildClause(columnValue, ' AND ', false);
877+
break;
878+
case 'inq':
879+
sqlExp += ' IN ';
880+
clause = buildClause(columnValue, ',', true);
881+
break;
882+
case 'nin':
883+
sqlExp += ' NOT IN ';
884+
clause = buildClause(columnValue, ',', true);
885+
break;
886+
case 'neq':
887+
if (columnValue == null) {
888+
return new ParameterizedSQL(sqlExp + ' IS NOT NULL');
889+
}
890+
sqlExp += '!=';
891+
break;
892+
case 'like':
893+
sqlExp += ' LIKE ';
894+
break;
895+
case 'nlike':
896+
sqlExp += ' NOT LIKE ';
897+
break;
898+
case 'regexp':
899+
// doc on `regexp_like`: https://www.ibm.com/support/knowledgecenter/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0061494.html
900+
var ignCaseFlag = columnValue.ignoreCase ? 'i' : 'c';
901+
var multiLineFlag = columnValue.multiline ? 'm' : '';
902+
var flags = ignCaseFlag + multiLineFlag;
903+
904+
sqlExp = `REGEXP_LIKE(${columnName}, '${columnValue.source}',
905+
'${flags}')`;
906+
return sqlExp;
907+
}
908+
stmt = ParameterizedSQL.join([sqlExp, clause], '');
909+
return stmt;
910+
};
911+
823912
IBMDB.prototype.buildIndex = function(model, property) {
824913
debug('IBMDB.prototype.buildIndex');
825914
var self = this;

0 commit comments

Comments
 (0)