Commit d7ea298c by Jose Carlos López

Update split export into two functions(criteria, options) && Remove isOr query…

Update split export into two functions(criteria, options) && Remove isOr query param && Remove links
parent bd0db1b3
...@@ -144,7 +144,7 @@ function hasOrdinalKeys(obj) { ...@@ -144,7 +144,7 @@ function hasOrdinalKeys(obj) {
function queryCriteriaToMongo(query, options) { function queryCriteriaToMongo(query, options) {
var options = options || {} var options = options || {}
var p, v, deep var p, v, deep
var hash = query.isOr ? [] : {} var hash = {}
for (var key in query) { for (var key in query) {
if (Object.prototype.hasOwnProperty.call(query,key) && (!options.ignore || options.ignore.indexOf(key) == -1)) { if (Object.prototype.hasOwnProperty.call(query,key) && (!options.ignore || options.ignore.indexOf(key) == -1)) {
deep = (typeof query[key] === 'object' && !hasOrdinalKeys(query[key])) deep = (typeof query[key] === 'object' && !hasOrdinalKeys(query[key]))
...@@ -159,12 +159,10 @@ function queryCriteriaToMongo(query, options) { ...@@ -159,12 +159,10 @@ function queryCriteriaToMongo(query, options) {
} }
if (p) { if (p) {
if (query.isOr) { if (!hash[p.key]) {
var orQuery = {}; hash[p.key] = p.value;
orQuery[p.key] = p.value
hash.push(orQuery)
} else { } else {
hash[p.key] = p.value hash[p.key] = Object.assign(hash[p.key], p.value);
} }
} }
} }
...@@ -199,7 +197,7 @@ function queryOptionsToMongo(query, options) { ...@@ -199,7 +197,7 @@ function queryOptionsToMongo(query, options) {
return hash return hash
} }
module.exports = function(query, options) { function init(query, options) {
query = query || {}; query = query || {};
options = options || {} options = options || {}
...@@ -208,43 +206,22 @@ module.exports = function(query, options) { ...@@ -208,43 +206,22 @@ module.exports = function(query, options) {
} else { } else {
options.ignore = (typeof options.ignore === 'string') ? [options.ignore] : options.ignore options.ignore = (typeof options.ignore === 'string') ? [options.ignore] : options.ignore
} }
options.ignore = options.ignore.concat(['fields', 'omit', 'sort', 'offset', 'limit', 'isOr']) options.ignore = options.ignore.concat(['fields', 'omit', 'sort', 'offset', 'limit'])
if (!options.parser) options.parser = querystring if (!options.parser) options.parser = querystring
if (typeof query === 'string') query = options.parser.parse(query) if (typeof query === 'string') query = options.parser.parse(query)
var criteria = queryCriteriaToMongo(query, options);
if (query.isOr) {
criteria = { $or: criteria};
}
return { return {
criteria: criteria, query: query,
options: queryOptionsToMongo(query, options), options: options,
}
links: function(url, totalCount) { }
var offset = this.options.skip || 0
var limit = Math.min(this.options.limit || 0, totalCount)
var links = {}
var last = {}
if (!limit) return null
options = options || {}
if (offset > 0) { module.exports = {
query.offset = Math.max(offset - limit, 0) q2m: function(query, options) {
links['prev'] = url + '?' + options.parser.stringify(query) var initValues = init(query, options);
query.offset = 0 return queryCriteriaToMongo(initValues.query, initValues.options);
links['first'] = url + '?' + options.parser.stringify(query) },
} o2m: function(query, options) {
if (offset + limit < totalCount) { var initValues = init(query, options);
last.pages = Math.ceil(totalCount / limit) return queryOptionsToMongo(initValues.query, initValues.options);
last.offset = (last.pages - 1) * limit
query.offset = Math.min(offset + limit, last.offset)
links['next'] = url + '?' + options.parser.stringify(query)
query.offset = last.offset
links['last'] = url + '?' + options.parser.stringify(query)
}
return links
}
} }
} }
var assert = require("chai").assert var assert = require("chai").assert
var q2m = require("../index") var q2m = require("../index")
describe("query-to-mongo(query).links =>", function () { /*describe("query-to-mongo(query).links =>", function () {
describe("#links", function () { describe("#links", function () {
var links = q2m("offset=20&limit=10").links('http://localhost', 95) var links = q2m("offset=20&limit=10").links('http://localhost', 95)
it("should create first link", function () { it("should create first link", function () {
...@@ -58,3 +58,4 @@ describe("query-to-mongo(query).links =>", function () { ...@@ -58,3 +58,4 @@ describe("query-to-mongo(query).links =>", function () {
}) })
}) })
}) })
*/
var assert = require("chai").assert var assert = require("chai").assert
var q2m = require("../index") var q2m = require("../index").q2m
var o2m = require("../index").o2m
var qs = require("qs") var qs = require("qs")
describe("query-to-mongo(query,{paser: qs}) =>", function () { describe("query-to-mongo(query,{paser: qs}) =>", function () {
describe(".criteria", function () { describe("", function () {
it("should create criteria", function () { it("should create criteria", function () {
var results = q2m("foo[bar]=value", {parser: qs}) var results = q2m("foo[bar]=value", {parser: qs})
assert.ok(results.criteria) assert.ok(results)
assert.deepEqual(results.criteria, {foo: {bar: "value"}}) assert.deepEqual(results, {foo: {bar: "value"}})
}) })
it("should create numeric criteria", function () { it("should create numeric criteria", function () {
var results = q2m("foo[i]=10&foo[f]=1.2&foo[z]=0", {parser: qs}) var results = q2m("foo[i]=10&foo[f]=1.2&foo[z]=0", {parser: qs})
assert.ok(results.criteria) assert.ok(results)
assert.deepEqual(results.criteria, {foo:{"i": 10, "f": 1.2, "z": 0}}) assert.deepEqual(results, {foo:{"i": 10, "f": 1.2, "z": 0}})
}) })
it("should create boolean criteria", function () { it("should create boolean criteria", function () {
var results = q2m("foo[t]=true&foo[f]=false", {parser: qs}) var results = q2m("foo[t]=true&foo[f]=false", {parser: qs})
assert.ok(results.criteria) assert.ok(results)
assert.deepEqual(results.criteria, {foo:{t: true, f: false}}) assert.deepEqual(results, {foo:{t: true, f: false}})
}) })
it("should create regex criteria", function () { it("should create regex criteria", function () {
var results = q2m("foo[r]=/regex/&foo[ri]=/regexi/i", {parser: qs}) var results = q2m("foo[r]=/regex/&foo[ri]=/regexi/i", {parser: qs})
assert.ok(results.criteria) assert.ok(results)
assert.deepEqual(results.criteria, {foo:{r: /regex/, ri: /regexi/i}}) assert.deepEqual(results, {foo:{r: /regex/, ri: /regexi/i}})
}) })
// can't create comparisons for embedded documents // can't create comparisons for embedded documents
it("shouldn't ignore deep criteria", function () { it("shouldn't ignore deep criteria", function () {
var results = q2m("field=value&foo[envelope]=true", {ignore: ['envelope'], parser: qs}) var results = q2m("field=value&foo[envelope]=true", {ignore: ['envelope'], parser: qs})
assert.ok(results.criteria) assert.ok(results)
assert.deepEqual(results.criteria, {field: "value", foo: {envelope: true}}) assert.deepEqual(results, {field: "value", foo: {envelope: true}})
}) })
it("should create string criteria when forced with a quote", function () { it("should create string criteria when forced with a quote", function () {
var results = q2m("a='10'&b=\'11\'&c='a,b'&d=10,11&z=\"that's all folks\"", {parser: qs}) var results = q2m("a='10'&b=\'11\'&c='a,b'&d=10,11&z=\"that's all folks\"", {parser: qs})
assert.ok(results.criteria) assert.ok(results)
assert.deepEqual(results.criteria, {a: "10", b: "11", c: "a,b", d: {$in: [10, 11]}, z: "that's all folks"}) assert.deepEqual(results, {a: "10", b: "11", c: "a,b", d: {$in: [10, 11]}, z: "that's all folks"})
}) })
}) })
describe(".options", function () { describe(".options", function () {
it("should create paging options", function () { it("should create paging options", function () {
var results = q2m("offset=8&limit=16", {parser: qs}) var results = o2m("offset=8&limit=16", {parser: qs})
assert.ok(results.options) assert.ok(results)
assert.deepEqual(results.options, {skip: 8, limit: 16}) assert.deepEqual(results, {skip: 8, limit: 16})
}) })
it("should create field option", function () { it("should create field option", function () {
var results = q2m("fields=a,b,c", {parser: qs}) var results = o2m("fields=a,b,c", {parser: qs})
assert.ok(results.options) assert.ok(results)
assert.deepEqual(results.options, {fields: {a:true, b:true, c:true}}) assert.deepEqual(results, {fields: {a:true, b:true, c:true}})
}) })
it("should create sort option", function () { it("should create sort option", function () {
var results = q2m("sort=a,+b,-c", {parser: qs}) var results = o2m("sort=a,+b,-c", {parser: qs})
assert.ok(results.options) assert.ok(results)
assert.deepEqual(results.options, {sort: {a:1, b:1, c:-1}}) assert.deepEqual(results, {sort: {a:1, b:1, c:-1}})
}) })
it("should limit queries", function () { it("should limit queries", function () {
var results = q2m("limit=100", {maxLimit: 50, parser: qs}) var results = o2m("limit=100", {maxLimit: 50, parser: qs})
assert.ok(results.options) assert.ok(results)
assert.deepEqual(results.options, {limit: 50}) assert.deepEqual(results, {limit: 50})
}) })
}) })
describe("#links", function () { /* describe("#links", function () {
var links = q2m("foo[bar]=baz&offset=20&limit=10", {maxLimit: 50, parser: qs}).links('http://localhost', 100) var links = q2m("foo[bar]=baz&offset=20&limit=10", {maxLimit: 50, parser: qs}).links('http://localhost', 100)
it("should create first link", function () { it("should create first link", function () {
assert.equal(links.first, "http://localhost?foo%5Bbar%5D=baz&offset=0&limit=10") assert.equal(links.first, "http://localhost?foo%5Bbar%5D=baz&offset=0&limit=10")
...@@ -74,5 +75,5 @@ describe("query-to-mongo(query,{paser: qs}) =>", function () { ...@@ -74,5 +75,5 @@ describe("query-to-mongo(query,{paser: qs}) =>", function () {
it("should create last link", function () { it("should create last link", function () {
assert.equal(links.last, "http://localhost?foo%5Bbar%5D=baz&offset=90&limit=10") assert.equal(links.last, "http://localhost?foo%5Bbar%5D=baz&offset=90&limit=10")
}) })
}) })*/
}) })
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment