diff options
Diffstat (limited to 'app/node_modules/okquery')
| -rw-r--r-- | app/node_modules/okquery/index.js | 73 | ||||
| -rw-r--r-- | app/node_modules/okquery/package.json | 1 |
2 files changed, 68 insertions, 6 deletions
diff --git a/app/node_modules/okquery/index.js b/app/node_modules/okquery/index.js index 33a49c4..d4cb905 100644 --- a/app/node_modules/okquery/index.js +++ b/app/node_modules/okquery/index.js @@ -1,3 +1,4 @@ +var cloneDeep = require('lodash.clonedeep'); var assign = require('object-assign'); var isobject = require('lodash.isobject'); var Q = require('q'); @@ -16,6 +17,14 @@ function OKQuery(options) { var resource = options.resource; var type = resource.type; var query = options.query || '*'; + // Ensure immutability + if (isobject(query)) + query = cloneDeep(query); + + // Queries are ordered by index by default + var sortField = options.sortBy || '__index'; + // TODO Make descending by default + var descending = options.descending || false; Object.defineProperty(this, 'resource', { value: resource, @@ -29,8 +38,23 @@ function OKQuery(options) { enumerable: true }); + Object.defineProperty(this, 'as', { + value: options.as, + writable: false, + enumerable: true + }); + + Object.defineProperty(this, 'groupBy', { + value: options.groupBy, + writable: false, + enumerable: true + }) + this.get = createQuery(resource, query, { - default: options.default + default: options.default, + sortField: sortField, + descending : descending, + groupBy: options.groupBy }); } @@ -43,18 +67,24 @@ function createQuery(resource, query, options) { } else if (isDynamic(query)) { query = queryDynamic(resource); } else if (isSet(query)) { - query = queryAll(resource); + query = queryAll(resource, options.sortField, options.descending); } else { query = querySingle(resource, query); } if (options.default) { query = withDefault(query, options.default); } + if (options.groupBy) { + query = withGrouping(query, options.groupBy) + } return query; } function queryComplex(resource, query) { var dynamicProp; + // Query is an object specifying key value pairs against which + // to match DB entries. Iterate through and check if any of the values + // is unbound e.g. :id var notDynamic = Object.keys(query).every(function(prop) { var matcher = query[prop]; if (isDynamic(matcher)) { @@ -67,15 +97,15 @@ function queryComplex(resource, query) { if (notDynamic) { return function() { - console.log('get it!', query) return resource.find(query); } } else { return function(id) { + // Bind the dynamic property to its value + // and add the pair to the query var dynamicQuery = {}; dynamicQuery[dynamicProp] = id; var query = assign({}, query, dynamicQuery); - console.log('get it!', query) return resource.find(query); } } @@ -87,9 +117,9 @@ function queryDynamic(resource) { }; } -function queryAll(resource) { +function queryAll(resource, sortField, descending) { return function() { - return resource.all(); + return resource.sortBy(sortField, descending); }; } @@ -105,6 +135,37 @@ function queryBound(resource) { }; } +/** + * Transform the query such that the results are grouped by the + * given field + */ +function withGrouping(queryFn, groupField) { + return function() { + return Q.Promise(function(resolve, reject) { + queryFn().then(function(data) { + data = data || [] + if (typeof data.length === 'undefined') { + data = [data] + } + var result = {} + result[groupField] = data.reduce(reduceToGroups, {}) + resolve(result) + }, reject) + }) + } + + function reduceToGroups(acc, data) { + var groupName = data[groupField] + if (groupName) { + if (!acc[groupName]) { + acc[groupName] = [] + } + acc[groupName].push(data) + } + return acc + } +} + function withDefault(queryFn, resultDefault) { return function() { return Q.Promise(function(resolve, reject) { diff --git a/app/node_modules/okquery/package.json b/app/node_modules/okquery/package.json index 606d45b..5ba9dd5 100644 --- a/app/node_modules/okquery/package.json +++ b/app/node_modules/okquery/package.json @@ -9,6 +9,7 @@ "author": "OKFocus", "license": "None", "dependencies": { + "lodash.clonedeep": "^3.0.0", "lodash.isobject": "^3.0.1", "object-assign": "^2.0.0", "q": "^1.2.0" |
