From db7712ac11f5492f35c8b37c5fe8ade60db736a2 Mon Sep 17 00:00:00 2001 From: Ryan Crosser Date: Sat, 23 May 2015 10:26:56 -0400 Subject: [PATCH 1/3] replaced underscore with lodash, expanded querying capability to search through nested objects and arrays --- package.json | 2 +- src/router.js | 4 ++-- src/utils.js | 61 ++++++++++++++++++++++++++++++++++----------------- 3 files changed, 44 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 1e0b3fb..87537e4 100644 --- a/package.json +++ b/package.json @@ -14,12 +14,12 @@ "errorhandler": "^1.2.0", "express": "^4.9.5", "got": "^1.2.2", + "lodash": "^3.9.1", "lowdb": "^0.7.1", "method-override": "^2.1.2", "morgan": "^1.3.1", "node-uuid": "^1.4.2", "pluralize": "^1.1.2", - "underscore": "^1.5.2", "underscore-db": "^0.8.0", "update-notifier": "^0.2.2", "yargs": "^1.3.1" diff --git a/src/router.js b/src/router.js index 7e7c924..2272f74 100644 --- a/src/router.js +++ b/src/router.js @@ -1,7 +1,7 @@ var express = require('express') var methodOverride = require('method-override') var bodyParser = require('body-parser') -var _ = require('underscore') +var _ = require('lodash') var low = require('lowdb') var pluralize = require('pluralize') var utils = require('./utils') @@ -78,7 +78,7 @@ module.exports = function (source) { array = db(req.params.resource).filter(function (obj) { for (var key in obj) { var value = obj[key] - if (_.isString(value) && value.toLowerCase().indexOf(q) !== -1) { + if(utils.deepQuery(value, q)){ return true } } diff --git a/src/utils.js b/src/utils.js index c196ee9..69060b7 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,4 +1,4 @@ -var _ = require('underscore') +var _ = require('lodash') var uuid = require('node-uuid') var pluralize = require('pluralize') @@ -6,15 +6,15 @@ var pluralize = require('pluralize') // Example: // 'true' -> true // '1' -> 1 -function toNative (value) { - if (typeof value === 'string') { - if (value === '' - || value.trim() !== value - || (value.length > 1 && value[0] === '0')) { +function toNative(value) { + if(typeof value === 'string') { + if(value === '' + || value.trim() !== value + || (value.length > 1 && value[0] === '0')) { return value - } else if (value === 'true' || value === 'false') { + } else if(value === 'true' || value === 'false') { return value === 'true' - } else if (!isNaN(+value)) { + } else if(!isNaN(+value)) { return +value } } @@ -22,15 +22,15 @@ function toNative (value) { } // Return incremented id or uuid -function createId (coll) { - if (_.isEmpty(coll)) { +function createId(coll) { + if(_.isEmpty(coll)) { return 1 } else { - var id = _.max(coll, function (doc) { + var id = _.max(coll, function(doc) { return doc.id }).id - if (_.isFinite(id)) { + if(_.isFinite(id)) { // Increment integer id return ++id } else { @@ -42,19 +42,19 @@ function createId (coll) { // Returns document ids that have unsatisfied relations // Example: a comment that references a post that doesn't exist -function getRemovable (db) { +function getRemovable(db) { var removable = [] - _(db).each(function (coll, collName) { - _(coll).each(function (doc) { - _(doc).each(function (value, key) { - if (/Id$/.test(key)) { + _(db).each(function(coll, collName) { + _(coll).each(function(doc) { + _(doc).each(function(value, key) { + if(/Id$/.test(key)) { var refName = pluralize.plural(key.slice(0, -2)) // Test if table exists - if (db[refName]) { + if(db[refName]) { // Test if references is defined in table var ref = _.findWhere(db[refName], {id: value}) - if (_.isUndefined(ref)) { + if(_.isUndefined(ref)) { removable.push({name: collName, id: doc.id}) } } @@ -66,8 +66,29 @@ function getRemovable (db) { return removable } +function deepQuery(value, q) { + if(value) { + if(_.isArray(value)) { + for(var i = 0; i < value.length; i++) { + if(deepQuery(value[i], q)) { + return true + } + } + } else if(_.isPlainObject(value)) { + for(var k in value) { + if(deepQuery(value[k], q)) { + return true + } + } + } else if(value.toString().toLowerCase().indexOf(q) !== -1) { + return true; + } + } +} + module.exports = { toNative: toNative, createId: createId, - getRemovable: getRemovable + getRemovable: getRemovable, + deepQuery: deepQuery } From 55f3ed2f26e7390e6892166675c700650c0a0526 Mon Sep 17 00:00:00 2001 From: Ryan Crosser Date: Sat, 23 May 2015 10:48:27 -0400 Subject: [PATCH 2/3] fixed spacing --- src/router.js | 2 +- src/utils.js | 52 +++++++++++++++++++++++++-------------------------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/router.js b/src/router.js index 2272f74..fb5d65f 100644 --- a/src/router.js +++ b/src/router.js @@ -78,7 +78,7 @@ module.exports = function (source) { array = db(req.params.resource).filter(function (obj) { for (var key in obj) { var value = obj[key] - if(utils.deepQuery(value, q)){ + if (utils.deepQuery(value, q)) { return true } } diff --git a/src/utils.js b/src/utils.js index 69060b7..65daaf6 100644 --- a/src/utils.js +++ b/src/utils.js @@ -6,15 +6,15 @@ var pluralize = require('pluralize') // Example: // 'true' -> true // '1' -> 1 -function toNative(value) { - if(typeof value === 'string') { - if(value === '' +function toNative (value) { + if (typeof value === 'string') { + if (value === '' || value.trim() !== value || (value.length > 1 && value[0] === '0')) { return value - } else if(value === 'true' || value === 'false') { + } else if (value === 'true' || value === 'false') { return value === 'true' - } else if(!isNaN(+value)) { + } else if (!isNaN(+value)) { return +value } } @@ -22,15 +22,15 @@ function toNative(value) { } // Return incremented id or uuid -function createId(coll) { - if(_.isEmpty(coll)) { +function createId (coll) { + if (_.isEmpty(coll)) { return 1 } else { - var id = _.max(coll, function(doc) { + var id = _.max(coll, function (doc) { return doc.id }).id - if(_.isFinite(id)) { + if (_.isFinite(id)) { // Increment integer id return ++id } else { @@ -42,19 +42,19 @@ function createId(coll) { // Returns document ids that have unsatisfied relations // Example: a comment that references a post that doesn't exist -function getRemovable(db) { +function getRemovable (db) { var removable = [] - _(db).each(function(coll, collName) { - _(coll).each(function(doc) { - _(doc).each(function(value, key) { - if(/Id$/.test(key)) { + _(db).each(function (coll, collName) { + _(coll).each(function (doc) { + _(doc).each(function (value, key) { + if (/Id$/.test(key)) { var refName = pluralize.plural(key.slice(0, -2)) // Test if table exists - if(db[refName]) { + if (db[refName]) { // Test if references is defined in table var ref = _.findWhere(db[refName], {id: value}) - if(_.isUndefined(ref)) { + if (_.isUndefined(ref)) { removable.push({name: collName, id: doc.id}) } } @@ -66,22 +66,22 @@ function getRemovable(db) { return removable } -function deepQuery(value, q) { - if(value) { - if(_.isArray(value)) { - for(var i = 0; i < value.length; i++) { - if(deepQuery(value[i], q)) { +function deepQuery (value, q) { + if (value) { + if (_.isArray(value)) { + for (var i = 0; i < value.length; i++) { + if (deepQuery(value[i], q)) { return true } } - } else if(_.isPlainObject(value)) { - for(var k in value) { - if(deepQuery(value[k], q)) { + } else if (_.isPlainObject(value)) { + for (var k in value) { + if (deepQuery(value[k], q)) { return true } } - } else if(value.toString().toLowerCase().indexOf(q) !== -1) { - return true; + } else if (value.toString().toLowerCase().indexOf(q) !== -1) { + return true } } } From c782e82277d2ce9e1a96707ffe9b12172647a8f4 Mon Sep 17 00:00:00 2001 From: Ryan Crosser Date: Sat, 23 May 2015 14:07:22 -0400 Subject: [PATCH 3/3] reverted back to underscore, for now. --- package.json | 1 + src/router.js | 5 +++-- src/utils.js | 8 ++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 87537e4..e93b931 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "morgan": "^1.3.1", "node-uuid": "^1.4.2", "pluralize": "^1.1.2", + "underscore": "^1.8.3", "underscore-db": "^0.8.0", "update-notifier": "^0.2.2", "yargs": "^1.3.1" diff --git a/src/router.js b/src/router.js index fb5d65f..70c409b 100644 --- a/src/router.js +++ b/src/router.js @@ -1,7 +1,7 @@ var express = require('express') var methodOverride = require('method-override') var bodyParser = require('body-parser') -var _ = require('lodash') +var _ = require('underscore') var low = require('lowdb') var pluralize = require('pluralize') var utils = require('./utils') @@ -101,7 +101,8 @@ module.exports = function (source) { filters[key] = utils.toNative(req.query[key]) } } - + console.log(filters) + console.log() // Filter if (_(filters).isEmpty()) { array = db(req.params.resource).value() diff --git a/src/utils.js b/src/utils.js index 65daaf6..5021962 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,4 +1,4 @@ -var _ = require('lodash') +var _ = require('underscore') var uuid = require('node-uuid') var pluralize = require('pluralize') @@ -44,7 +44,7 @@ function createId (coll) { // Example: a comment that references a post that doesn't exist function getRemovable (db) { var removable = [] - + console.log(db) _(db).each(function (coll, collName) { _(coll).each(function (doc) { _(doc).each(function (value, key) { @@ -67,14 +67,14 @@ function getRemovable (db) { } function deepQuery (value, q) { - if (value) { + if (value && q) { if (_.isArray(value)) { for (var i = 0; i < value.length; i++) { if (deepQuery(value[i], q)) { return true } } - } else if (_.isPlainObject(value)) { + } else if (_.isObject(value) && !_.isArray(value)) { for (var k in value) { if (deepQuery(value[k], q)) { return true