From a487eb57cd47eb4bef604c1d11d006601dcfe978 Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Tue, 17 Jun 2014 23:19:28 -0700 Subject: [PATCH] Add like/nlike support for memory connector --- lib/connectors/memory.js | 22 +++++++++- test/memory.test.js | 93 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 1 deletion(-) diff --git a/lib/connectors/memory.js b/lib/connectors/memory.js index de479c83..e86d7d27 100644 --- a/lib/connectors/memory.js +++ b/lib/connectors/memory.js @@ -363,8 +363,12 @@ function applyFilter(filter) { return pass; } + function replaceAll(string, find, replace) { + return string.replace(new RegExp(find, 'g'), replace); + } + function test(example, value) { - if (typeof value === 'string' && example && example.constructor.name === 'RegExp') { + if (typeof value === 'string' && (example instanceof RegExp)) { return value.match(example); } if (example === undefined || value === undefined) { @@ -386,6 +390,22 @@ function applyFilter(filter) { return false; } + if (example.like || example.nlike) { + + var like = example.like || example.nlike; + if (typeof like === 'string') { + like = replaceAll(like, '%', '.*'); + like = replaceAll(like, '_', '.'); + } + if (example.like) { + return !!new RegExp(like).test(value); + } + + if (example.nlike) { + return !new RegExp(like).test(value); + } + } + if (testInEquality(example, value)) { return true; } diff --git a/test/memory.test.js b/test/memory.test.js index 4c613270..b98462a1 100644 --- a/test/memory.test.js +++ b/test/memory.test.js @@ -4,6 +4,7 @@ var path = require('path'); var fs = require('fs'); var assert = require('assert'); var async = require('async'); +var should = require('./init.js'); describe('Memory connector', function () { var file = path.join(__dirname, 'memory.json'); @@ -91,5 +92,97 @@ describe('Memory connector', function () { }); }); + + describe('Query for memory connector', function () { + var ds = new DataSource({ + connector: 'memory' + }); + + var User = ds.define('User', { + seq: {type: Number, index: true}, + name: {type: String, index: true, sort: true}, + email: {type: String, index: true}, + birthday: {type: Date, index: true}, + role: {type: String, index: true}, + order: {type: Number, index: true, sort: true}, + vip: {type: Boolean} + }); + + before(seed); + it('should allow to find using like', function (done) { + User.find({where: {name: {like: '%St%'}}}, function (err, posts) { + should.not.exist(err); + posts.should.have.property('length', 2); + done(); + }); + }); + + it('should support like for no match', function (done) { + User.find({where: {name: {like: 'M%XY'}}}, function (err, posts) { + should.not.exist(err); + posts.should.have.property('length', 0); + done(); + }); + }); + + it('should allow to find using nlike', function (done) { + User.find({where: {name: {nlike: '%St%'}}}, function (err, posts) { + should.not.exist(err); + posts.should.have.property('length', 4); + done(); + }); + }); + + it('should support nlike for no match', function (done) { + User.find({where: {name: {nlike: 'M%XY'}}}, function (err, posts) { + should.not.exist(err); + posts.should.have.property('length', 6); + done(); + }); + }); + + function seed(done) { + var count = 0; + var beatles = [ + { + seq: 0, + name: 'John Lennon', + email: 'john@b3atl3s.co.uk', + role: 'lead', + birthday: new Date('1980-12-08'), + order: 2, + vip: true + }, + { + seq: 1, + name: 'Paul McCartney', + email: 'paul@b3atl3s.co.uk', + role: 'lead', + birthday: new Date('1942-06-18'), + order: 1, + vip: true + }, + {seq: 2, name: 'George Harrison', order: 5, vip: false}, + {seq: 3, name: 'Ringo Starr', order: 6, vip: false}, + {seq: 4, name: 'Pete Best', order: 4}, + {seq: 5, name: 'Stuart Sutcliffe', order: 3, vip: true} + ]; + User.destroyAll(function () { + beatles.forEach(function (beatle) { + User.create(beatle, ok); + }); + }); + + function ok() { + if (++count === beatles.length) { + done(); + } + } + } + + }); + }); + +