summaryrefslogtreecommitdiff
path: root/app/node_modules/okquery/index.js
diff options
context:
space:
mode:
authorSean Fridman <fridman@mail.sfsu.edu>2015-07-09 16:58:02 -0400
committerSean Fridman <fridman@mail.sfsu.edu>2015-07-09 17:55:50 -0400
commit42fe17f3e52be163a506bf9a3953aa8adb5fd64f (patch)
treee4320eaf5ae38d18299fb4b5b046b8b28ed6401b /app/node_modules/okquery/index.js
parent9be28b4322a629b8fe7c35e8cdc42eb413c6d84a (diff)
Implement groupBy queries + admin interface
Diffstat (limited to 'app/node_modules/okquery/index.js')
-rw-r--r--app/node_modules/okquery/index.js43
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) {