pwaleczek/redis.pubsub

View on GitHub
lib/query.js

Summary

Maintainability
A
55 mins
Test Coverage
/**
 *  @file:      query.js
 *  @author:    Pawel Waleczek <pawel@thisismyasterisk.org>
 *
 *  @license:   MIT
 **/

var common = require('common');
var compile = require('querify');

function Filter (query) {
  if(!query || !Object.keys(query).length) {
    return function (data) {
      return data;
    }
  }

  return function (data) {
    var result = {};

    for (var key in query) {
      if (data[key])
        result[key] = data[key];
    }

    return result;
  }
}

function Query () {
  this._list = {};
}

Query.prototype.add = function (query, fn) {
  var id = common.gensym();
  var compiled = compile(query);
  var list = this._list;

  list[id] = function (data, channel, pattern) {
    if (data instanceof Array) {
      var result = new Array();
      data.forEach(function (chunk) {
        if (compiled(chunk))
          result.push(chunk);
      });
      if (result.length > 0)
        fn(result, channel, pattern);
    } else {
      if (compiled(data))
        fn(data, channel, pattern);
    }
  }
  return function () {
    delete list[id];
  }
}

Query.prototype.check = function (data, channel, pattern) {
  for (var key in this._list) {
    this._list[key](data, channel, pattern);
  }
}

module.exports = {
    create: function () {
      return new Query();
    }
  , Filter: Filter
}