Skip to content

Commit 325afa6

Browse files
ssamulinatanrolnik
authored andcommitted
Add ability to search Object columns (#727)
* Add ability to search Object columns * Added more comparisons for Object columns exists, does not exist, equal to, not equal to, greater than, greater than or equal, less than, less than or equal. * Added exists and does not exist constraints for objects. * Make key exist and key does not exist work with strings instead of json
1 parent 095be94 commit 325afa6

File tree

4 files changed

+87
-1
lines changed

4 files changed

+87
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
### NEXT RELEASE
44

55
* _Contributing to this repo? Add info about your change here to be included in next release_
6+
* Improvement: Add ability to search Object columns, thanks to [Samuli Siivinen](https://github.com/ssamuli)
67
* Improvement: Added/fixed a filtering option "contains string" for String fields. Case insensitive for now.
78

89
### 1.0.27

src/components/BrowserFilter/FilterRow.react.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ function compareValue(info, value, onChangeCompareTo, active) {
3131
switch (info.type) {
3232
case null:
3333
return null;
34+
case 'Object':
3435
case 'String':
3536
return <input type='text' value={value} onChange={(e) => onChangeCompareTo(e.target.value)} ref={setFocus}/>;
3637
case 'Pointer':

src/lib/Filters.js

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,47 @@ export const Constraints = {
9090
doesNotContainAny: {
9191
name: 'does not contain',
9292
field: 'Array',
93-
}
93+
},
94+
keyExists: {
95+
name: 'key exists',
96+
field: 'Object',
97+
composable: true
98+
},
99+
keyDne: {
100+
name: 'key does not exist',
101+
field: 'Object',
102+
composable: true
103+
},
104+
keyEq: {
105+
name: 'key equals',
106+
field: 'Object',
107+
composable: true
108+
},
109+
keyNeq: {
110+
name: 'key does not equal',
111+
field: 'Object',
112+
composable: true
113+
},
114+
keyGt: {
115+
name: 'key greater than',
116+
field: 'Object',
117+
composable: true
118+
},
119+
keyGte: {
120+
name: 'key greater than/equal',
121+
field: 'Object',
122+
composable: true
123+
},
124+
keyLt: {
125+
name: 'key less than',
126+
field: 'Object',
127+
composable: true
128+
},
129+
keyLte: {
130+
name: 'key less than/equal',
131+
field: 'Object',
132+
composable: true
133+
},
94134
};
95135

96136
export const FieldConstraints = {
@@ -99,6 +139,18 @@ export const FieldConstraints = {
99139
'Number': [ 'exists', 'dne', 'eq', 'neq', 'lt', 'lte', 'gt', 'gte' ],
100140
'String': [ 'exists', 'dne', 'eq', 'neq', 'starts', 'ends', 'stringContainsString' ],
101141
'Date': [ 'exists', 'dne', 'before', 'after' ],
142+
'Object': [
143+
'exists',
144+
'dne',
145+
'keyExists',
146+
'keyDne',
147+
'keyEq',
148+
'keyNeq',
149+
'keyGt',
150+
'keyGte',
151+
'keyLt',
152+
'keyLte'
153+
],
102154
'Array': [
103155
'exists',
104156
'dne',
@@ -116,6 +168,7 @@ export const DefaultComparisons = {
116168
'Boolean': false,
117169
'Number': '',
118170
'String': '',
171+
'Object': '',
119172
'Date': Parse._encode(new Date()),
120173
};
121174

src/lib/queryFromFilters.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ export default function queryFromFilters(className, filters) {
2121
return query;
2222
}
2323

24+
function addQueryConstraintFromObject(query, filter, constraintType) {
25+
let compareTo = JSON.parse(filter.get('compareTo'));
26+
for (let key of Object.keys(compareTo)) {
27+
query[constraintType](filter.get('field')+'.'+key, compareTo[key]);
28+
}
29+
}
30+
2431
function addConstraint(query, filter) {
2532
switch (filter.get('constraint')) {
2633
case 'exists':
@@ -73,6 +80,30 @@ function addConstraint(query, filter) {
7380
case 'stringContainsString':
7481
query.matches(filter.get('field'), filter.get('compareTo'), 'i');
7582
break;
83+
case 'keyExists':
84+
query.exists(filter.get('field') + '.' + filter.get('compareTo'));
85+
break;
86+
case 'keyDne':
87+
query.doesNotExist(filter.get('field') + '.' + filter.get('compareTo'));
88+
break;
89+
case 'keyEq':
90+
addQueryConstraintFromObject(query, filter, 'equalTo');
91+
break;
92+
case 'keyNeq':
93+
addQueryConstraintFromObject(query, filter, 'notEqualTo');
94+
break;
95+
case 'keyGt':
96+
addQueryConstraintFromObject(query, filter, 'greaterThan');
97+
break;
98+
case 'keyGte':
99+
addQueryConstraintFromObject(query, filter, 'greaterThanOrEqualTo');
100+
break;
101+
case 'keyLt':
102+
addQueryConstraintFromObject(query, filter, 'lessThan');
103+
break;
104+
case 'keyLte':
105+
addQueryConstraintFromObject(query, filter, 'lessThanOrEqualTo');
106+
break;
76107
}
77108
return query;
78109
}

0 commit comments

Comments
 (0)