summaryrefslogtreecommitdiff
path: root/app/node_modules/okquery/index.js
diff options
context:
space:
mode:
authortwo hustlers proj <jules+okfprojz@okfoc.us>2015-09-22 19:25:19 -0400
committertwo hustlers proj <jules+okfprojz@okfoc.us>2015-09-22 19:25:19 -0400
commit6b19245d0128311603d66d13c4ac606700e8912d (patch)
treecb3ea9337c76eebd2713ca18f8e844e47315a0d1 /app/node_modules/okquery/index.js
parente9fb94cd1f6e73201f0f95afde7c40cc3948ee60 (diff)
parent96eccfa594fb2526e50d4f9adfa690ea345a29ff (diff)
Merge branch 'twohustlers' of github.com:okfocus/okcms into twohustlers
Diffstat (limited to 'app/node_modules/okquery/index.js')
-rw-r--r--app/node_modules/okquery/index.js44
1 files changed, 43 insertions, 1 deletions
diff --git a/app/node_modules/okquery/index.js b/app/node_modules/okquery/index.js
index 4051f95..d4cb905 100644
--- a/app/node_modules/okquery/index.js
+++ b/app/node_modules/okquery/index.js
@@ -23,6 +23,7 @@ function OKQuery(options) {
// 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', {
@@ -43,10 +44,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 +74,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 +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) {