-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathindex.js
104 lines (94 loc) · 2.49 KB
/
index.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
"use strict";
var functionOperatorMap = {
BETWEEN: 'whereBetween',
IN: 'whereIn',
NIN: 'whereNotIn',
NOTIN: 'whereNotIn',
ISNULL: 'whereNull',
NOTNULL: 'whereNotNull',
/* ---- */
OR: 'orWhere',
AND: 'where',
EQ: 'where',
'=': 'where',
/* ---- */
OR_BETWEEN: 'orWhereBetween',
OR_IN: 'orWhereIn',
OR_NOTIN: 'orWhereNotIn',
OR_ISNULL: 'orWhereNull',
IR_NOTNULL: 'orWhereNotNull',
/* ---- */
AND_BETWEEN: 'andWhereBetween',
AND_IN: 'andWhereIn',
AND_NOTIN: 'andWhereNotIn',
AND_ISNULL: 'andWhereNull',
AND_NOTNULL: 'andWhereNotNull',
/* ---- */
RAW: 'whereRaw',
OR_RAW: 'orWhereRaw',
AND_RAW: 'whereRaw',
};
var aliases = {
REGEX: 'REGEXP'
};
function addCondition (q, field, val) {
if( field === '$or' ){
return q.orWhere( getWhereCondition( val ))
}
if( field === '$and' ){
return q.where( getWhereCondition( val ))
}
if( val.constructor.name === 'Object' ){
delete val.$options;
val = Object.keys(val).map( function(key){
return [ key.slice(1).toUpperCase(), val[key] ];
});
if( val.length === 1){
val = val[0];
}
}
if (Array.isArray(val[0])) {
return q.where(function () {
return val.forEach(addCondition.bind(null, this, field));
});
}
if (!Array.isArray(val)) {
// Simple string or number value
val = ['AND', field, val ];
} else {
val[0] = aliases[ val[0] ] || val[0];
if (functionOperatorMap.hasOwnProperty( val[0] ) ) {
// SQL operator
val = [ val[0], field ].concat(val.slice(1));
} else {
// Cases when we have something like 'OR_ILIKE' or 'AND_@>'
var operators = /(\w+)_(\w+)/.exec(val[0])
var operatorsExist = operators && operators.constructor === Array && operators.length >= 3
if (operatorsExist) {
val = [operators[1], field].concat([operators[2]], val.slice(1));
} else {
// other cases like ( '>', '10' ) Greater than 10
val = [ 'AND', field ].concat(val);
}
}
}
var args = val[0].includes('RAW') ? [ q.client.raw('??', val[1]) + ' ' + val[2] ] : val.slice(1);
return q[functionOperatorMap[val[0]]].apply(q, args);
}
function getWhereCondition( cond ){
if( Array.isArray(cond) ){
return function(){
cond.forEach( function(v){
this.orWhere( getWhereCondition(v) );
}, this );
};
} else {
return function(){
var field;
for( field in cond ){
addCondition( this, field, cond[field] );
}
};
}
}
module.exports = getWhereCondition;