@@ -19,6 +19,9 @@ var async = require('async');
1919var ParameterizedSQL = IBMDB . ParameterizedSQL = SQLConnector . ParameterizedSQL ;
2020var 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+
823912IBMDB . prototype . buildIndex = function ( model , property ) {
824913 debug ( 'IBMDB.prototype.buildIndex' ) ;
825914 var self = this ;
0 commit comments