summaryrefslogtreecommitdiff
path: root/app/node_modules/okquery/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'app/node_modules/okquery/index.js')
-rw-r--r--app/node_modules/okquery/index.js73
1 files changed, 67 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) {