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) {
function queryCriteriaToMongo(query, options) {
var options = options || {}
var p, v, deep
var hash = query.isOr ? [] : {}
var hash = {}
for (var key in query) {
if (Object.prototype.hasOwnProperty.call(query,key) && (!options.ignore || options.ignore.indexOf(key) == -1)) {
deep = (typeof query[key] === 'object' && !hasOrdinalKeys(query[key]))
......@@ -159,12 +159,10 @@ function queryCriteriaToMongo(query, options) {
}
if (p) {
if (query.isOr) {
var orQuery = {};
orQuery[p.key] = p.value
hash.push(orQuery)
if (!hash[p.key]) {
hash[p.key] = p.value;
} else {
hash[p.key] = p.value
hash[p.key] = Object.assign(hash[p.key], p.value);
}
}
}
......@@ -199,7 +197,7 @@ function queryOptionsToMongo(query, options) {
return hash
}
module.exports = function(query, options) {
function init(query, options) {
query = query || {};
options = options || {}
......@@ -208,43 +206,22 @@ module.exports = function(query, options) {
} else {
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 (typeof query === 'string') query = options.parser.parse(query)
var criteria = queryCriteriaToMongo(query, options);
if (query.isOr) {
criteria = { $or: criteria};
}
return {
criteria: criteria,
options: queryOptionsToMongo(query, 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 || {}
query: query,
options: options,
}
}
if (offset > 0) {
query.offset = Math.max(offset - limit, 0)
links['prev'] = url + '?' + options.parser.stringify(query)
query.offset = 0
links['first'] = url + '?' + options.parser.stringify(query)
}
if (offset + limit < totalCount) {
last.pages = Math.ceil(totalCount / limit)
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
}
module.exports = {
q2m: function(query, options) {
var initValues = init(query, options);
return queryCriteriaToMongo(initValues.query, initValues.options);
},
o2m: function(query, options) {
var initValues = init(query, options);
return queryOptionsToMongo(initValues.query, initValues.options);
}
}
var assert = require("chai").assert
var q2m = require("../index")
describe("query-to-mongo(query).links =>", function () {
/*describe("query-to-mongo(query).links =>", function () {
describe("#links", function () {
var links = q2m("offset=20&limit=10").links('http://localhost', 95)
it("should create first link", function () {
......@@ -58,3 +58,4 @@ describe("query-to-mongo(query).links =>", function () {
})
})
})
*/
var assert = require("chai").assert
var q2m = require("../index")
var q2m = require("../index").q2m
var o2m = require("../index").o2m
var qs = require("qs")
describe("query-to-mongo(query,{paser: qs}) =>", function () {
describe(".criteria", function () {
describe("", function () {
it("should create criteria", function () {
var results = q2m("foo[bar]=value", {parser: qs})
assert.ok(results.criteria)
assert.deepEqual(results.criteria, {foo: {bar: "value"}})
assert.ok(results)
assert.deepEqual(results, {foo: {bar: "value"}})
})
it("should create numeric criteria", function () {
var results = q2m("foo[i]=10&foo[f]=1.2&foo[z]=0", {parser: qs})
assert.ok(results.criteria)
assert.deepEqual(results.criteria, {foo:{"i": 10, "f": 1.2, "z": 0}})
assert.ok(results)
assert.deepEqual(results, {foo:{"i": 10, "f": 1.2, "z": 0}})
})
it("should create boolean criteria", function () {
var results = q2m("foo[t]=true&foo[f]=false", {parser: qs})
assert.ok(results.criteria)
assert.deepEqual(results.criteria, {foo:{t: true, f: false}})
assert.ok(results)
assert.deepEqual(results, {foo:{t: true, f: false}})
})
it("should create regex criteria", function () {
var results = q2m("foo[r]=/regex/&foo[ri]=/regexi/i", {parser: qs})
assert.ok(results.criteria)
assert.deepEqual(results.criteria, {foo:{r: /regex/, ri: /regexi/i}})
assert.ok(results)
assert.deepEqual(results, {foo:{r: /regex/, ri: /regexi/i}})
})
// can't create comparisons for embedded documents
it("shouldn't ignore deep criteria", function () {
var results = q2m("field=value&foo[envelope]=true", {ignore: ['envelope'], parser: qs})
assert.ok(results.criteria)
assert.deepEqual(results.criteria, {field: "value", foo: {envelope: true}})
assert.ok(results)
assert.deepEqual(results, {field: "value", foo: {envelope: true}})
})
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})
assert.ok(results.criteria)
assert.deepEqual(results.criteria, {a: "10", b: "11", c: "a,b", d: {$in: [10, 11]}, z: "that's all folks"})
assert.ok(results)
assert.deepEqual(results, {a: "10", b: "11", c: "a,b", d: {$in: [10, 11]}, z: "that's all folks"})
})
})
describe(".options", function () {
it("should create paging options", function () {
var results = q2m("offset=8&limit=16", {parser: qs})
assert.ok(results.options)
assert.deepEqual(results.options, {skip: 8, limit: 16})
var results = o2m("offset=8&limit=16", {parser: qs})
assert.ok(results)
assert.deepEqual(results, {skip: 8, limit: 16})
})
it("should create field option", function () {
var results = q2m("fields=a,b,c", {parser: qs})
assert.ok(results.options)
assert.deepEqual(results.options, {fields: {a:true, b:true, c:true}})
var results = o2m("fields=a,b,c", {parser: qs})
assert.ok(results)
assert.deepEqual(results, {fields: {a:true, b:true, c:true}})
})
it("should create sort option", function () {
var results = q2m("sort=a,+b,-c", {parser: qs})
assert.ok(results.options)
assert.deepEqual(results.options, {sort: {a:1, b:1, c:-1}})
var results = o2m("sort=a,+b,-c", {parser: qs})
assert.ok(results)
assert.deepEqual(results, {sort: {a:1, b:1, c:-1}})
})
it("should limit queries", function () {
var results = q2m("limit=100", {maxLimit: 50, parser: qs})
assert.ok(results.options)
assert.deepEqual(results.options, {limit: 50})
var results = o2m("limit=100", {maxLimit: 50, parser: qs})
assert.ok(results)
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)
it("should create first link", function () {
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 () {
it("should create last link", function () {
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