-
Notifications
You must be signed in to change notification settings - Fork 55
/
query.js
67 lines (57 loc) · 1.75 KB
/
query.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
var query = {}
, model = require('../model')
, operation = require('./operation')
, comparison = require('./comparison');
query.Query = function (model, conditions, options) {
this.model = null;
this.conditions = null;
this.initialize.apply(this, arguments);
};
query.Query.prototype = new (function () {
var _comparisonCtorNames = {
'eql': 'EqualTo'
, 'ne': 'NotEqual'
, 'in': 'In'
, 'like': 'Like'
, 'gt': 'GreaterThan'
, 'lt': 'LessThan'
, 'gte': 'GreaterThanOrEqual'
, 'lte': 'LessThanOrEqual'
}
, _createConditions = function (conditions) {
var op = new operation.create('and')
, comp;
for (var key in conditions) {
// TODO: Handle associations
comp = _createComparison.apply(this, [key, conditions[key]]);
op.add(comp);
}
return op;
}
, _createComparison = function (key, val) {
var type
, descr = model.descriptionRegistry[
this.model.modelName].properties[key];
// Non-null objects
if (val && typeof val == 'object') {
for (var p in val) {
type = p;
val = val[p];
}
}
else {
type = 'eql'
}
// TODO: Validate the value for both the particular field
// (e.g., must be a numeric) and the type of comparison
// (e.g., 'IN' must be a collection, etc)
return comparison.create(_comparisonCtorNames[type], key, val,
descr.datatype);
};
this.initialize = function (model, conditions, options) {
this.model = model;
this.conditions = _createConditions.call(this, conditions);
this.options = options || {};
};
})();
module.exports = query;