diff --git a/lib/model.js b/lib/model.js index 5194867..8e05409 100644 --- a/lib/model.js +++ b/lib/model.js @@ -134,7 +134,11 @@ Model.find = function (query, fields, options, callback) { Object.keys(query).forEach(function (key) { if(_.isArray(query[key])) { q.where(key).in(query[key]); - } else { + } + else if ((_.isObject(query[key])) && query[key]['$regex']) { + q.where(key).regex(query[key]['$regex']); + } + else { q.where(key).equals(query[key]); } }); diff --git a/lib/query.js b/lib/query.js index 2a0641c..7c11587 100644 --- a/lib/query.js +++ b/lib/query.js @@ -444,6 +444,14 @@ Query.prototype.in = function () { return this; }; +Query.prototype.regex = function (regex) { + this.data.stmt.op = 'REGEXP'; + // Strip the forward slashes from the JS RegExp object + regex = regex.source; + this.data.stmt.value = regex; + return this; +} + Query.prototype.like = function (value) { this.data.stmt.op = 'LIKE'; this.data.stmt.value = value; @@ -493,6 +501,10 @@ var opPatterns = { return '('+values.map(function() { return '?'; }).join(',')+')'; }, + 'REGEXP': function (regex) { + return '?'; + }, + 'IS': function () { return 'NULL'; } diff --git a/test/query-select-regexp.js b/test/query-select-regexp.js new file mode 100644 index 0000000..3a69b26 --- /dev/null +++ b/test/query-select-regexp.js @@ -0,0 +1,31 @@ +var Query = require('../lib/query'); +var assert = require('assert'); +var seed = require('./fixtures/seed'); +var db = seed.db; +require('mocha'); + +describe('Select Query', function () { + describe('regexp', function () { + var expectedSQL = + "SELECT "+ + "`users`.`id` AS users_id, "+ + "`users`.`name` AS users_name "+ + "FROM `users` "+ + "WHERE `users`.`name` REGEXP ?"; + var expectedValues= ['.*[Ss]mith.*']; + + it('should generate the proper SQL', function () { + var query = new Query(db.model('User')); + var regex = new RegExp('.*[Ss]mith.*'); + query + .select('name') + .where('name') + .regex(regex); + var sql = query.toString(); + assert.equal(expectedSQL, sql); + assert.deepEqual(expectedValues, query.values()); + }); + + }); +}); +