You're Invited:Meet the Socket Team at BlackHat and DEF CON in Las Vegas, Aug 4-6.RSVP
Socket
Book a DemoInstallSign in
Socket

backbone-query

Package Overview
Dependencies
Maintainers
1
Versions
2
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

backbone-query - npm Package Compare versions

Comparing version

to
0.1.2

203

js/backbone-query.js

@@ -1,22 +0,15 @@

/*
Backbone Query - A lightweight query API for Backbone Collections
(c)2012 - Dave Tonge
May be freely distributed according to MIT license.
*/
(function() {
var array_intersection, get_cache, get_models, get_sorted_models, iterator, page_models, parse_query, process_query, sort_models, test_attr, test_query_value,
__indexOf = Array.prototype.indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
/*
Backbone Query - A lightweight query API for Backbone Collections
(c)2012 - Dave Tonge
May be freely distributed according to MIT license.
*/
array_intersection = function(arrays) {
var rest;
rest = _.rest(arrays);
return _.filter(_.uniq(arrays[0]), function(item) {
return _.every(rest, function(other) {
return _.indexOf(other, item) >= 0;
});
});
var get_cache, get_models, get_sorted_models, iterator, page_models, parse_query, perform_query, process_query, sort_models, test_model_attribute, test_query_value;
var __indexOf = Array.prototype.indexOf || function(item) {
for (var i = 0, l = this.length; i < l; i++) {
if (this[i] === item) return i;
}
return -1;
};
parse_query = function(raw_query) {

@@ -49,3 +42,2 @@ var key, o, query_param, type, value, _results;

};
test_query_value = function(type, value) {

@@ -63,2 +55,3 @@ switch (type) {

case "$like":
case "$likeI":
return _(value).isString();

@@ -73,6 +66,6 @@ case "$between":

};
test_attr = function(type, value) {
test_model_attribute = function(type, value) {
switch (type) {
case "$like":
case "$likeI":
case "$regex":

@@ -93,7 +86,53 @@ return _(value).isString();

};
iterator = function(collection, query, andOr, filterReject) {
perform_query = function(type, value, attr, model) {
switch (type) {
case "$equal":
return attr === value;
case "$contains":
return __indexOf.call(attr, value) >= 0;
case "$ne":
return attr !== value;
case "$lt":
return attr < value;
case "$gt":
return attr > value;
case "$lte":
return attr <= value;
case "$gte":
return attr >= value;
case "$between":
return (value[0] < attr && attr < value[1]);
case "$in":
return __indexOf.call(value, attr) >= 0;
case "$nin":
return __indexOf.call(value, attr) < 0;
case "$all":
return _(attr).all(function(item) {
return __indexOf.call(value, item) >= 0;
});
case "$any":
return _(attr).any(function(item) {
return __indexOf.call(value, item) >= 0;
});
case "$size":
return attr.length === value;
case "$exists":
case "$has":
return (attr != null) === value;
case "$like":
return attr.indexOf(value) !== -1;
case "$likeI":
return attr.toLowerCase().indexOf(value.toLowerCase()) !== -1;
case "$regex":
return value.test(attr);
case "$cb":
return value.call(model, attr);
default:
return false;
}
};
iterator = function(models, query, andOr, filterReject) {
var parsed_query;
parsed_query = parse_query(query);
return collection[filterReject](function(model) {
return _[filterReject](models, function(model) {
var attr, q, test, _i, _len;

@@ -103,49 +142,4 @@ for (_i = 0, _len = parsed_query.length; _i < _len; _i++) {

attr = model.get(q.key);
test = test_attr(q.type, attr);
if (test) {
test = ((function() {
var _ref;
switch (q.type) {
case "$equal":
return attr === q.value;
case "$contains":
return _ref = q.value, __indexOf.call(attr, _ref) >= 0;
case "$ne":
return attr !== q.value;
case "$lt":
return attr < q.value;
case "$gt":
return attr > q.value;
case "$lte":
return attr <= q.value;
case "$gte":
return attr >= q.value;
case "$between":
return (q.value[0] < attr && attr < q.value[1]);
case "$in":
return __indexOf.call(q.value, attr) >= 0;
case "$nin":
return __indexOf.call(q.value, attr) < 0;
case "$all":
return _(model.get(q.key)).all(function(item) {
return __indexOf.call(q.value, item) >= 0;
});
case "$any":
return _(model.get(q.key)).any(function(item) {
return __indexOf.call(q.value, item) >= 0;
});
case "$size":
return attr.length === q.value;
case "$exists":
case "$has":
return model.has(q.key) === q.value;
case "$like":
return attr.indexOf(q.value) !== -1;
case "$regex":
return q.value.test(attr);
case "$cb":
return q.value.call(model, attr);
}
})());
}
test = test_model_attribute(q.type, attr);
if (test) test = perform_query(q.type, q.value, attr, model);
if (andOr === test) return andOr;

@@ -156,18 +150,16 @@ }

};
process_query = {
$and: function(collection, query) {
return iterator(collection, query, false, "filter");
$and: function(models, query) {
return iterator(models, query, false, "filter");
},
$or: function(collection, query) {
return iterator(collection, query, true, "filter");
$or: function(models, query) {
return iterator(models, query, true, "filter");
},
$nor: function(collection, query) {
return iterator(collection, query, true, "reject");
$nor: function(models, query) {
return iterator(models, query, true, "reject");
},
$not: function(collection, query) {
return iterator(collection, query, false, "reject");
$not: function(models, query) {
return iterator(models, query, false, "reject");
}
};
get_cache = function(collection, query, options) {

@@ -184,26 +176,15 @@ var cache, models, query_string, _ref;

};
get_models = function(collection, query) {
var compound_query, results, type;
compound_query = _(query).chain().keys().intersection(["$or", "$and", "$nor", "$not"]).value();
switch (compound_query.length) {
case 0:
return process_query.$and(collection, query);
case 1:
type = compound_query[0];
return process_query[type](collection, query[type]);
default:
results = (function() {
var _i, _len, _results;
_results = [];
for (_i = 0, _len = compound_query.length; _i < _len; _i++) {
type = compound_query[_i];
_results.push(process_query[type](collection, query[type]));
}
return _results;
})();
return array_intersection(results);
var compound_query, models, reduce_iterator;
compound_query = _.intersection(["$and", "$not", "$or", "$nor"], _(query).keys());
models = collection.models;
if (compound_query.length === 0) {
return process_query.$and(models, query);
} else {
reduce_iterator = function(memo, query_type) {
return process_query[query_type](memo, query[query_type]);
};
return _.reduce(compound_query, reduce_iterator, models);
}
};
get_sorted_models = function(collection, query, options) {

@@ -215,3 +196,2 @@ var models;

};
sort_models = function(models, options) {

@@ -228,3 +208,2 @@ if (_(options.sortBy).isString()) {

};
page_models = function(models, options) {

@@ -247,10 +226,6 @@ var end, sliced_models, start, total_pages;

};
if (typeof require !== 'undefined') {
if (typeof _ === "undefined" || _ === null) _ = require('underscore');
if (typeof Backbone === "undefined" || Backbone === null) {
Backbone = require('backbone');
}
if (typeof Backbone === "undefined" || Backbone === null) Backbone = require('backbone');
}
Backbone.QueryCollection = Backbone.Collection.extend({

@@ -268,2 +243,6 @@ query: function(query, options) {

},
where: function(params, options) {
if (options == null) options = {};
return new this.constructor(this.query(params, options));
},
reset_query_cache: function() {

@@ -273,7 +252,3 @@ return this._query_cache = {};

});
if (typeof exports !== "undefined") {
exports.QueryCollection = Backbone.QueryCollection;
}
if (typeof exports !== "undefined") exports.QueryCollection = Backbone.QueryCollection;
}).call(this);

@@ -1,1 +0,1 @@

((function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n=Array.prototype.indexOf||function(a){for(var b=0,c=this.length;b<c;b++)if(b in this&&this[b]===a)return b;return-1};b=function(a){var b;return b=_.rest(a),_.filter(_.uniq(a[0]),function(a){return _.every(b,function(b){return _.indexOf(b,a)>=0})})},i=function(a){var b,c,d,e,f,g;g=[];for(b in a){d=a[b],c={key:b};if(_.isRegExp(d))c.type="$regex",c.value=d;else if(_(d).isObject())for(e in d)f=d[e],m(e,f)&&(c.type=e,c.value=f);else c.type="$equal",c.value=d;g.push(c)}return g},m=function(a,b){switch(a){case"$in":case"$nin":case"$all":case"$any":return _(b).isArray();case"$size":return _(b).isNumber();case"$regex":return _(b).isRegExp();case"$like":return _(b).isString();case"$between":return _(b).isArray()&&b.length===2;case"$cb":return _(b).isFunction();default:return!0}},l=function(a,b){switch(a){case"$like":case"$regex":return _(b).isString();case"$contains":case"$all":case"$any":return _(b).isArray();case"$size":return _(b).isArray()||_(b).isString();case"$in":case"$nin":return b!=null;default:return!0}},f=function(a,b,c){var d;return d=i(b),a.filter(function(a){var b,e,f,g,h;for(g=0,h=d.length;g<h;g++){e=d[g],b=a.get(e.key),f=l(e.type,b),f&&(f=function(){var c;switch(e.type){case"$equal":return b===e.value;case"$contains":return c=e.value,n.call(b,c)>=0;case"$ne":return b!==e.value;case"$lt":return b<e.value;case"$gt":return b>e.value;case"$lte":return b<=e.value;case"$gte":return b>=e.value;case"$between":return e.value[0]<b&&b<e.value[1];case"$in":return n.call(e.value,b)>=0;case"$nin":return n.call(e.value,b)<0;case"$all":return _(a.get(e.key)).all(function(a){return n.call(e.value,a)>=0});case"$any":return _(a.get(e.key)).any(function(a){return n.call(e.value,a)>=0});case"$size":return b.length===e.value;case"$exists":case"$has":return a.has(e.key)===e.value;case"$like":return b.indexOf(e.value)!==-1;case"$regex":return e.value.test(b);case"$cb":return e.value.call(a,b)}}());if(c===f)return c}return!c})},a=function(a,b){return f(a,b,!1)},g=function(a,b){return f(a,b,!0)},j={$and:function(b,c){return a(b,c)},$or:function(a,b){return g(a,b)},$nor:function(a,b){return _.difference(a.models,g(a,b))},$not:function(b,c){return _.difference(b.models,a(b,c))}},c=function(a,b,c){var d,f,g,h;return g=JSON.stringify(b),d=(h=a._query_cache)!=null?h:a._query_cache={},f=d[g],f||(f=e(a,b,c),d[g]=f),f},d=function(a,c){var d,e,f;d=_(c).chain().keys().intersection(["$or","$and","$nor","$not"]).value();switch(d.length){case 0:return j.$and(a,c);case 1:return f=d[0],j[f](a,c[f]);default:return e=function(){var b,e,g;g=[];for(b=0,e=d.length;b<e;b++)f=d[b],g.push(j[f](a,c[f]));return g}(),b(e)}},e=function(a,b,c){var e;return e=d(a,b),c.sortBy&&(e=k(e,c)),e},k=function(a,b){return _(b.sortBy).isString()?a=_(a).sortBy(function(a){return a.get(b.sortBy)}):_(b.sortBy).isFunction()&&(a=_(a).sortBy(b.sortBy)),b.order==="desc"&&(a=a.reverse()),a},h=function(a,b){var c,d,e,f;return b.offset?e=b.offset:b.page?e=(b.page-1)*b.limit:e=0,c=e+b.limit,d=a.slice(e,c),b.pager&&_.isFunction(b.pager)&&(f=Math.ceil(a.length/b.limit),b.pager(f,d)),d},Backbone.QueryCollection=Backbone.Collection.extend({query:function(a,b){var d;return b==null&&(b={}),b.cache?d=c(this,a,b):d=e(this,a,b),b.limit&&(d=h(d,b)),d},reset_query_cache:function(){return this._query_cache={}}})})).call(this)
((function(){var a,b,c,d,e,f,g,h,i,j,k,l=Array.prototype.indexOf||function(a){for(var b=0,c=this.length;b<c;b++)if(this[b]===a)return b;return-1};f=function(a){var b,c,d,e,f,g;g=[];for(b in a){d=a[b],c={key:b};if(_.isRegExp(d))c.type="$regex",c.value=d;else if(_(d).isObject())for(e in d)f=d[e],k(e,f)&&(c.type=e,c.value=f);else c.type="$equal",c.value=d;g.push(c)}return g},k=function(a,b){switch(a){case"$in":case"$nin":case"$all":case"$any":return _(b).isArray();case"$size":return _(b).isNumber();case"$regex":return _(b).isRegExp();case"$like":case"$likeI":return _(b).isString();case"$between":return _(b).isArray()&&b.length===2;case"$cb":return _(b).isFunction();default:return!0}},j=function(a,b){switch(a){case"$like":case"$likeI":case"$regex":return _(b).isString();case"$contains":case"$all":case"$any":return _(b).isArray();case"$size":return _(b).isArray()||_(b).isString();case"$in":case"$nin":return b!=null;default:return!0}},g=function(a,b,c,d){switch(a){case"$equal":return c===b;case"$contains":return l.call(c,b)>=0;case"$ne":return c!==b;case"$lt":return c<b;case"$gt":return c>b;case"$lte":return c<=b;case"$gte":return c>=b;case"$between":return b[0]<c&&c<b[1];case"$in":return l.call(b,c)>=0;case"$nin":return l.call(b,c)<0;case"$all":return _(c).all(function(a){return l.call(b,a)>=0});case"$any":return _(c).any(function(a){return l.call(b,a)>=0});case"$size":return c.length===b;case"$exists":case"$has":return c!=null===b;case"$like":return c.indexOf(b)!==-1;case"$likeI":return c.toLowerCase().indexOf(b.toLowerCase())!==-1;case"$regex":return b.test(c);case"$cb":return b.call(d,c);default:return!1}},d=function(a,b,c,d){var e;return e=f(b),_[d](a,function(a){var b,d,f,h,i;for(h=0,i=e.length;h<i;h++){d=e[h],b=a.get(d.key),f=j(d.type,b),f&&(f=g(d.type,d.value,b,a));if(c===f)return c}return!c})},h={$and:function(a,b){return d(a,b,!1,"filter")},$or:function(a,b){return d(a,b,!0,"filter")},$nor:function(a,b){return d(a,b,!0,"reject")},$not:function(a,b){return d(a,b,!1,"reject")}},a=function(a,b,d){var e,f,g,h;return g=JSON.stringify(b),e=(h=a._query_cache)!=null?h:a._query_cache={},f=e[g],f||(f=c(a,b,d),e[g]=f),f},b=function(a,b){var c,d,e;return c=_.intersection(["$and","$not","$or","$nor"],_(b).keys()),d=a.models,c.length===0?h.$and(d,b):(e=function(a,c){return h[c](a,b[c])},_.reduce(c,e,d))},c=function(a,c,d){var e;return e=b(a,c),d.sortBy&&(e=i(e,d)),e},i=function(a,b){return _(b.sortBy).isString()?a=_(a).sortBy(function(a){return a.get(b.sortBy)}):_(b.sortBy).isFunction()&&(a=_(a).sortBy(b.sortBy)),b.order==="desc"&&(a=a.reverse()),a},e=function(a,b){var c,d,e,f;return b.offset?e=b.offset:b.page?e=(b.page-1)*b.limit:e=0,c=e+b.limit,d=a.slice(e,c),b.pager&&_.isFunction(b.pager)&&(f=Math.ceil(a.length/b.limit),b.pager(f,d)),d};if(typeof require!="undefined"){if(typeof _=="undefined"||_===null)_=require("underscore");if(typeof Backbone=="undefined"||Backbone===null)Backbone=require("backbone")}Backbone.QueryCollection=Backbone.Collection.extend({query:function(b,d){var f;return d==null&&(d={}),d.cache?f=a(this,b,d):f=c(this,b,d),d.limit&&(f=e(f,d)),f},where:function(a,b){return b==null&&(b={}),new this.constructor(this.query(a,b))},reset_query_cache:function(){return this._query_cache={}}}),typeof exports!="undefined"&&(exports.QueryCollection=Backbone.QueryCollection)})).call(this)
{
"name": "backbone-query"
, "description": "Lightweight Query API for Backbone Collections"
, "version": "0.1.1"
, "version": "0.1.2"
, "author": "Dave Tonge <dave@simplecreativity.co.uk> (https://github.com/davidgtonge)"

@@ -6,0 +6,0 @@ , "tags": ["backbone", "underscore", "mongo", "query"]

backbone-query
===================
.. |travis_status| image:: https://secure.travis-ci.org/davidgtonge/backbone_query.png
:target: http://travis-ci.org/davidgtonge/backbone_query
[![Build Status](https://secure.travis-ci.org/davidgtonge/backbone_query.png)](http://travis-ci.org/davidgtonge/backbone_query)

@@ -16,13 +15,21 @@ A lightweight (3KB minified) utility for Backbone projects, that works in the Browser and on the Server.

.. Client Side Installation:
#### Client Side Installation:
To install, include the `js/backbone-query.min.js` file in your HTML page, after Backbone and it's dependencies.
Then extend your collections from Backbone.QueryCollection rather than from Backbone.Collection.
.. Server side (node.js) installation
#### Server side (node.js) installation
You can install with NPM: `npm install backbone-query`
Then simply require in your project: `QueryCollection = require("backbone-query").QueryCollection`
Your collections will now have a `query` method that can be used like this:
Your collections will now have two new methods: `query` and `where`. Both methods accept 2 arguments -
a query object and an options object. The `query` method returns an array of models, but the `where` method
returns a new collection and is therefore useful where you would like to chain multiple collection
methods / where queries. The following are some basic examples:
```js
MyCollection.query({ {featured:true}, {likes: $gt:10} )};
MyCollection.query({
featured:true,
likes: {$gt:10}
});
// Returns all models where the featured attribute is true and there are

@@ -43,3 +50,4 @@ // more than 10 likes

title: {$like: "news"}, // Title attribute contains the string "news"
likes: {$gt: 10}}, // Likes attribute is greater than 10
likes: {$gt: 10}
}, // Likes attribute is greater than 10

@@ -49,4 +57,5 @@ // Models must match one of these queries

featured: true, // Featured attribute is true
category:{$in:["code","programming","javascript"]}}
//Category attribute is either "code", "programming", or "javascript"
category:{$in:["code","programming","javascript"]}
}
//Category attribute is either "code", "programming", or "javascript"
});

@@ -68,2 +77,13 @@ ```

Another CoffeeScript example, this time using `where` rather than `query`
```coffeescript
query =
$likes: $lt: 10
$downloads: $gt: 20
MyCollection.where(query).my_custom_collection_method()
```
Query API

@@ -181,6 +201,15 @@ ===

MyCollection.query({ title: {$like: "Test" } });
//Returns all models which have a "title" attribute what
//Returns all models which have a "title" attribute that
//contains the string "Test", e.g. "Testing", "Tests", "Test", etc.
```
### $likeI
The same as above but performs a case insensitive search using indexOf and toLowerCase (still faster than Regex)
```js
MyCollection.query({ title: {$likeI: "Test" } });
//Returns all models which have a "title" attribute that
//contains the string "Test", "test", "tEst","tesT", etc.
```
### $regex

@@ -187,0 +216,0 @@ Checks if the model attribute matches the supplied regular expression. The regex query can be supplied without the `$regex` keyword

(function() {
var QueryCollection, create, equals;
if (typeof require !== "undefined") {

@@ -9,5 +8,3 @@ QueryCollection = require("../js/backbone-query.js").QueryCollection;

}
equals = [];
if (typeof test === "undefined" || test === null) {

@@ -27,3 +24,2 @@ test = function(name, test_cb) {

}
if (typeof equal === "undefined" || equal === null) {

@@ -34,3 +30,2 @@ equal = function(real, expected) {

}
create = function() {

@@ -58,3 +53,2 @@ return new QueryCollection([

};
test("Simple equals query", function() {

@@ -69,3 +63,2 @@ var a, result;

});
test("Simple equals query (no results)", function() {

@@ -79,3 +72,2 @@ var a, result;

});
test("Simple equals query with explicit $equal", function() {

@@ -92,3 +84,2 @@ var a, result;

});
test("$contains operator", function() {

@@ -104,3 +95,2 @@ var a, result;

});
test("$ne operator", function() {

@@ -116,3 +106,2 @@ var a, result;

});
test("$lt operator", function() {

@@ -129,3 +118,2 @@ var a, result;

});
test("$lte operator", function() {

@@ -141,3 +129,2 @@ var a, result;

});
test("$gt operator", function() {

@@ -154,3 +141,2 @@ var a, result;

});
test("$gte operator", function() {

@@ -166,3 +152,2 @@ var a, result;

});
test("$between operator", function() {

@@ -179,3 +164,2 @@ var a, result;

});
test("$in operator", function() {

@@ -191,3 +175,2 @@ var a, result;

});
test("$in operator with wrong query value", function() {

@@ -201,5 +184,4 @@ var a, result;

});
return equal(result.length, 3);
return equal(result.length, 0);
});
test("$nin operator", function() {

@@ -216,3 +198,2 @@ var a, result;

});
test("$all operator", function() {

@@ -228,3 +209,2 @@ var a, result;

});
test("$all operator (wrong values)", function() {

@@ -244,5 +224,4 @@ var a, result;

});
return equal(result.length, 3);
return equal(result.length, 0);
});
test("$any operator", function() {

@@ -264,3 +243,2 @@ var a, result;

});
test("$size operator", function() {

@@ -277,3 +255,2 @@ var a, result;

});
test("$exists operator", function() {

@@ -289,3 +266,2 @@ var a, result;

});
test("$has operator", function() {

@@ -302,3 +278,2 @@ var a, result;

});
test("$like operator", function() {

@@ -315,3 +290,2 @@ var a, result;

});
test("$like operator 2", function() {

@@ -327,3 +301,18 @@ var a, result;

});
test("$likeI operator", function() {
var a, result;
a = create();
result = a.query({
content: {
$likeI: "dummy"
}
});
equal(result.length, 3);
result = a.query({
content: {
$like: "dummy"
}
});
return equal(result.length, 1);
});
test("$regex", function() {

@@ -340,3 +329,2 @@ var a, result;

});
test("$regex2", function() {

@@ -352,3 +340,2 @@ var a, result;

});
test("$regex3", function() {

@@ -364,3 +351,2 @@ var a, result;

});
test("$regex4", function() {

@@ -374,3 +360,2 @@ var a, result;

});
test("$cb - callback", function() {

@@ -389,3 +374,2 @@ var a, result;

});
test("$cb - callback - checking 'this' is the model", function() {

@@ -404,3 +388,2 @@ var a, result;

});
test("$and operator", function() {

@@ -420,3 +403,2 @@ var a, result;

});
test("$and operator (explicit)", function() {

@@ -438,3 +420,2 @@ var a, result;

});
test("$or operator", function() {

@@ -455,3 +436,2 @@ var a, result;

});
test("$nor operator", function() {

@@ -473,3 +453,2 @@ var a, result;

});
test("Compound Queries", function() {

@@ -517,3 +496,2 @@ var a, result;

});
test("Limit", function() {

@@ -531,3 +509,2 @@ var a, result;

});
test("Offset", function() {

@@ -546,3 +523,2 @@ var a, result;

});
test("Page", function() {

@@ -561,3 +537,2 @@ var a, result;

});
test("Sorder by model key", function() {

@@ -578,3 +553,2 @@ var a, result;

});
test("Sorder by model key with descending order", function() {

@@ -596,3 +570,2 @@ var a, result;

});
test("Sorder by function", function() {

@@ -615,3 +588,2 @@ var a, result;

});
test("cache", function() {

@@ -665,3 +637,2 @@ var a, result;

});
test("cache with multiple collections", function() {

@@ -748,3 +719,2 @@ var a, a_result, b, b_result;

});
test("null attribute with various operators", function() {

@@ -802,3 +772,13 @@ var a, result;

});
test("Where method", function() {
var a, result;
a = create();
result = a.where({
likes: {
$gt: 5
}
});
equal(result.length, 2);
return equal(result.models.length, result.length);
});
}).call(this);

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet