From f8f6f4d9953a6a9bc316086db8aa532a3944fccd Mon Sep 17 00:00:00 2001 From: Julien Guimont Date: Fri, 16 Dec 2011 21:42:13 -0500 Subject: [PATCH] limit/offset and order clause for redis adapter Conflicts: lib/adapters/redis.js --- lib/adapters/redis.js | 61 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 8 deletions(-) diff --git a/lib/adapters/redis.js b/lib/adapters/redis.js index 08aa05b7..cc497958 100644 --- a/lib/adapters/redis.js +++ b/lib/adapters/redis.js @@ -79,6 +79,11 @@ BridgeToRedis.prototype.create = function (model, data, callback) { callback(err, id); } }); + + // push the id to the list of user ids for sorting + log('SADD s:' + model + ':' + data.id + ' ...'); + this.client.sadd("s:" + model, data.id); + }.bind(this)); }; @@ -111,6 +116,8 @@ BridgeToRedis.prototype.destroy = function destroy(model, id, callback) { this.log('DEL ' + model + ':' + id, t1); callback(err); }.bind(this)); + this.log('SREM s:' + model, t1); + this.client.srem("s:" + model, id); }; BridgeToRedis.prototype.possibleIndexes = function (model, filter) { @@ -132,15 +139,53 @@ BridgeToRedis.prototype.all = function all(model, filter, callback) { var log = this.log; var t1 = Date.now(); var cmd; + var that = this; + var sortCmd = []; - var indexes = this.possibleIndexes(model, filter); - if (indexes.length) { - cmd = 'SINTER "' + indexes.join('" "') + '"'; - indexes.push(handleKeys); - client.sinter.apply(client, indexes); - } else { - cmd = 'KEYS ' + model + ':*'; - client.keys(model + ':*', handleKeys); + // ORDER + if (filter && filter.order){ + var orders = filter.order; + if (typeof filter.order === "string"){ + orders = [filter.order]; + } + orders.forEach( function (key){ + sortCmd.push("BY", model + ":*->" + key); + }); + } + // LIMIT + if (filter && filter.limit){ + var from = (filter.offset || 0), to = from + filter.limit; + sortCmd.push("LIMIT", from, to); + } + + // do we need to sort or to query normally + if(sortCmd.length){ + sortCmd.unshift("s:" + model); + sortCmd.push("GET", "#"); + cmd = "sort " + sortCmd.join(" "); + sortCmd.push(function(err, ids){ + console.log( ids); + if (err) { + return callback(err, []); + } + var keys = ids.map(function (i) { + return model + ":" + i; + }); + console.log(keys); + handleKeys(err, keys); + }); + client.sort.apply(client, sortCmd); + }else{ + // Do a normal key lookup with possbible indexes + var indexes = this.possibleIndexes(model, filter); + if (indexes.length) { + cmd = 'SINTER "' + indexes.join('" "') + '"'; + indexes.push(handleKeys); + client.sinter.apply(client, indexes, handleKeys); + } else { + cmd = 'KEYS ' + model + ':*'; + client.keys(model + ':*', handleKeys); + } } function handleKeys(err, keys) {