-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
/
Copy pathqueryFromFilters.js
112 lines (109 loc) · 3.48 KB
/
queryFromFilters.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
105
106
107
108
109
110
111
112
/*
* Copyright (c) 2016-present, Parse, LLC
* All rights reserved.
*
* This source code is licensed under the license found in the LICENSE file in
* the root directory of this source tree.
*/
import Parse from 'parse';
// Given a className and a set of filters, generate a Parse.Query
export default function queryFromFilters(className, filters) {
let query;
if (typeof className === 'string') {
query = new Parse.Query(className);
} else if (typeof className === 'object' && className instanceof Parse.Relation) {
query = className.query();
}
filters.forEach((filter) => {
addConstraint(query, filter);
});
return query;
}
function addQueryConstraintFromObject(query, filter, constraintType) {
let compareTo = JSON.parse(filter.get('compareTo'));
for (let key of Object.keys(compareTo)) {
query[constraintType](filter.get('field')+'.'+key, compareTo[key]);
}
}
function addConstraint(query, filter) {
switch (filter.get('constraint')) {
case 'exists':
query.exists(filter.get('field'));
break;
case 'dne':
query.doesNotExist(filter.get('field'));
break;
case 'eq':
query.equalTo(filter.get('field'), filter.get('compareTo'));
break;
case 'neq':
query.notEqualTo(filter.get('field'), filter.get('compareTo'));
break;
case 'lt':
query.lessThan(filter.get('field'), filter.get('compareTo'));
break;
case 'lte':
query.lessThanOrEqualTo(filter.get('field'), filter.get('compareTo'));
break;
case 'gt':
query.greaterThan(filter.get('field'), filter.get('compareTo'));
break;
case 'gte':
query.greaterThanOrEqualTo(filter.get('field'), filter.get('compareTo'));
break;
case 'starts':
query.startsWith(filter.get('field'), filter.get('compareTo'));
break;
case 'ends':
query.endsWith(filter.get('field'), filter.get('compareTo'));
break;
case 'before':
query.lessThan(filter.get('field'), filter.get('compareTo'));
break;
case 'after':
query.greaterThan(filter.get('field'), filter.get('compareTo'));
break;
case 'containsString':
case 'containsNumber':
query.equalTo(filter.get('field'), filter.get('compareTo'));
break;
case 'doesNotContainString':
case 'doesNotContainNumber':
query.notEqualTo(filter.get('field'), filter.get('compareTo'));
break;
case 'containedIn':
query.containedIn(filter.get('field'), filter.get('array'));
break;
case 'stringContainsString':
query.matches(filter.get('field'), filter.get('compareTo'), 'i');
break;
case 'keyExists':
query.exists(filter.get('field') + '.' + filter.get('compareTo'));
break;
case 'keyDne':
query.doesNotExist(filter.get('field') + '.' + filter.get('compareTo'));
break;
case 'keyEq':
addQueryConstraintFromObject(query, filter, 'equalTo');
break;
case 'keyNeq':
addQueryConstraintFromObject(query, filter, 'notEqualTo');
break;
case 'keyGt':
addQueryConstraintFromObject(query, filter, 'greaterThan');
break;
case 'keyGte':
addQueryConstraintFromObject(query, filter, 'greaterThanOrEqualTo');
break;
case 'keyLt':
addQueryConstraintFromObject(query, filter, 'lessThan');
break;
case 'keyLte':
addQueryConstraintFromObject(query, filter, 'lessThanOrEqualTo');
break;
case 'dneOrNull':
query.equalTo(filter.get('field'), null);
break;
}
return query;
}