diff options
| author | Sean Fridman <fridman@mail.sfsu.edu> | 2015-07-09 16:58:02 -0400 |
|---|---|---|
| committer | Sean Fridman <fridman@mail.sfsu.edu> | 2015-07-09 17:55:50 -0400 |
| commit | 42fe17f3e52be163a506bf9a3953aa8adb5fd64f (patch) | |
| tree | e4320eaf5ae38d18299fb4b5b046b8b28ed6401b /app/node_modules/okquery/index.js | |
| parent | 9be28b4322a629b8fe7c35e8cdc42eb413c6d84a (diff) | |
Implement groupBy queries + admin interface
Diffstat (limited to 'app/node_modules/okquery/index.js')
| -rw-r--r-- | app/node_modules/okquery/index.js | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/app/node_modules/okquery/index.js b/app/node_modules/okquery/index.js index 4051f95..09d867d 100644 --- a/app/node_modules/okquery/index.js +++ b/app/node_modules/okquery/index.js @@ -43,10 +43,17 @@ function OKQuery(options) { enumerable: true }); + Object.defineProperty(this, 'groupBy', { + value: options.groupBy, + writable: false, + enumerable: true + }) + this.get = createQuery(resource, query, { default: options.default, sortField: sortField, - descending : descending + descending : descending, + groupBy: options.groupBy }); } @@ -66,6 +73,9 @@ function createQuery(resource, query, options) { if (options.default) { query = withDefault(query, options.default); } + if (options.groupBy) { + query = withGrouping(query, options.groupBy) + } return query; } @@ -124,6 +134,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) { |
