water-orm
Version:
A monolith version of Standalone waterline ORM
93 lines (74 loc) • 2.76 kB
JavaScript
/**
* Module dependencies
*/
var _ = require('lodash');
var util = require('util');
var _where = require('./filters/where');
var _limit = require('./filters/limit');
var _skip = require('./filters/skip');
var _select = require('./projections/select');
var _groupBy = require('./projections/groupBy');
var _sort = require('./sort');
/**
* Filter/aggregate/partition/map the tuples known as `classifier`
* in `data` using `criteria` (a Waterline criteria object)
*
* @param { Object[] } data
* @param { Object } criteria [the Waterline criteria object- complete w/ `where`, `limit`, `sort, `skip`, and `joins`]
*
* @return { Integer | Object | Object[] }
*/
module.exports = function query ( /* classifier|tuples, data|criteria [, criteria] */ ) {
// Embed an `INDEX_IN_ORIG_DATA` for each tuple to remember its original index
// within `data`. At the end, we'll lookup the `INDEX_IN_ORIG_DATA` for each tuple
// and expose it as part of our results.
var INDEX_IN_ORIG_DATA = '.(ørigindex)';
var tuples, classifier, data, criteria, schema;
// If no classifier is provided, and data was specified as an array
// instead of an object, infer tuples from the array
if (_.isArray(arguments[0]) && !arguments[2]) {
tuples = arguments[0];
criteria = arguments[1];
}
// If all three arguments were supplied:
// get tuples of type `classifier` (i.e. SELECT * FROM __________)
// and clone 'em.
else {
classifier = arguments[0];
data = arguments[1];
criteria = arguments[2];
tuples = data[classifier];
}
// If the schema was passed in, it will be the 4th argument (zero based)
if(arguments[3]) {
schema = arguments[3];
}
// Clone tuples to avoid dirtying things up
tuples = _.cloneDeep(tuples);
// Embed `INDEX_IN_ORIG_DATA` in each tuple
_.each(tuples, function(tuple, i) {
tuple[INDEX_IN_ORIG_DATA] = i;
});
// Ensure criteria object exists
criteria = criteria || {};
// Query and return result set using criteria
tuples = _where(tuples, criteria.where, schema);
tuples = _sort(tuples, criteria.sort);
tuples = _skip(tuples, criteria.skip);
tuples = _limit(tuples, criteria.limit);
tuples = _select(tuples, criteria.select);
// TODO:
// tuples = _groupBy(tuples, criteria.groupBy);
// Grab the INDEX_IN_ORIG_DATA from each matched tuple
// this is typically used to update the tuples in the external source data.
var originalIndices = _.map(tuples, INDEX_IN_ORIG_DATA);
// Remove INDEX_IN_ORIG_DATA from each tuple--
// it is no longer needed.
_.each(tuples, function(tuple) {
delete tuple[INDEX_IN_ORIG_DATA];
});
return {
results: tuples,
indices: originalIndices
};
};