@@ -5,17 +5,19 @@ import 'package:flutter/foundation.dart';
5
5
class FieldPredicate <T > {
6
6
final String _operand;
7
7
String ? _value;
8
- List <String >? _values;
8
+ List <String ?>? _values;
9
+ bool _useValue;
9
10
10
- FieldPredicate .equals (T value) : _operand = '==' , _value = value.toString ();
11
- FieldPredicate .notEquals (T value) : _operand = '!=' , _value = value.toString ();
12
- FieldPredicate .oneOf (List <T > values) : _operand = 'oneOf' , _values = values.map ((value) => value.toString ()).toList ();
13
- FieldPredicate .notOneOf (List <T > values) : _operand = '!oneOf' , _values = values.map ((value) => value.toString ()).toList ();
11
+ FieldPredicate .equals (T value) : _operand = '==' , _value = value? .toString (), _useValue = true ;
12
+ FieldPredicate .notEquals (T value) : _operand = '!=' , _value = value? .toString (), _useValue = true ;
13
+ FieldPredicate .oneOf (List <T > values) : _operand = 'oneOf' , _values = values.map ((value) => value? .toString ()).toList (), _useValue = false ;
14
+ FieldPredicate .notOneOf (List <T > values) : _operand = '!oneOf' , _values = values.map ((value) => value? .toString ()).toList (), _useValue = false ;
14
15
15
16
FieldPredicate .of (FieldPredicate <T > other)
16
17
: _operand = other._operand,
17
18
_value = other._value,
18
- _values = (other._values != null ? List <String >.of (other._values! ) : null );
19
+ _values = (other._values != null ? List <String ?>.of (other._values! ) : null ),
20
+ _useValue = other._useValue;
19
21
20
22
@override
21
23
String toString () {
@@ -27,7 +29,7 @@ class FieldPredicate<T> {
27
29
28
30
result.add (_operand);
29
31
30
- if (_value != null ) {
32
+ if (_useValue ) {
31
33
result.add (_value);
32
34
}
33
35
@@ -59,13 +61,18 @@ class FieldPredicate<T> {
59
61
return false ;
60
62
}
61
63
64
+ if (_useValue != other._useValue) {
65
+ return false ;
66
+ }
67
+
62
68
return true ;
63
69
}
64
70
65
71
int get hashCode => Object .hash (
66
72
_operand,
67
73
_value,
68
74
(_values != null ? Object .hashAll (_values! ) : _values),
75
+ _useValue,
69
76
);
70
77
}
71
78
@@ -113,6 +120,10 @@ class CustomFieldPredicate extends FieldPredicate<String> {
113
120
return false ;
114
121
}
115
122
123
+ if (_useValue != other._useValue) {
124
+ return false ;
125
+ }
126
+
116
127
if (_exists != other._exists) {
117
128
return false ;
118
129
}
@@ -124,10 +135,80 @@ class CustomFieldPredicate extends FieldPredicate<String> {
124
135
_operand,
125
136
_value,
126
137
(_values != null ? Object .hashAll (_values! ) : _values),
138
+ _useValue,
127
139
_exists,
128
140
);
129
141
}
130
142
143
+ class NumberPredicate {
144
+ final String _operand;
145
+ double ? _value;
146
+ List <double >? _values;
147
+
148
+ NumberPredicate .greaterThan (double value) : _operand = '>' , _value = value;
149
+ NumberPredicate .lessThan (double value) : _operand = '<' , _value = value;
150
+ NumberPredicate .greaterOrEquals (double value) : _operand = '>=' , _value = value;
151
+ NumberPredicate .lessOrEquals (double value) : _operand = '<=' , _value = value;
152
+ NumberPredicate .between (List <double > values) : _operand = 'between' , _values = List <double >.of (values);
153
+ NumberPredicate .notBetween (List <double > values) : _operand = '!between' , _values = List <double >.of (values);
154
+
155
+ NumberPredicate .of (NumberPredicate other)
156
+ : _operand = other._operand,
157
+ _value = other._value,
158
+ _values = (other._values != null ? List <double >.of (other._values! ) : null );
159
+
160
+ @override
161
+ String toString () {
162
+ return json.encode (this );
163
+ }
164
+
165
+ dynamic toJson () {
166
+ final result = < dynamic > [];
167
+
168
+ result.add (_operand);
169
+
170
+ if (_value != null ) {
171
+ result.add (_value);
172
+ }
173
+
174
+ if (_values != null ) {
175
+ result.add (_values);
176
+ }
177
+
178
+ return result;
179
+ }
180
+
181
+ bool operator == (Object other) {
182
+ if (identical (this , other)) {
183
+ return true ;
184
+ }
185
+
186
+ if (! (other is NumberPredicate )) {
187
+ return false ;
188
+ }
189
+
190
+ if (_operand != other._operand) {
191
+ return false ;
192
+ }
193
+
194
+ if (_value != other._value) {
195
+ return false ;
196
+ }
197
+
198
+ if (! listEquals (_values, other._values)) {
199
+ return false ;
200
+ }
201
+
202
+ return true ;
203
+ }
204
+
205
+ int get hashCode => Object .hash (
206
+ _operand,
207
+ _value,
208
+ (_values != null ? Object .hashAll (_values! ) : _values),
209
+ );
210
+ }
211
+
131
212
class ConversationAccessLevel {
132
213
final String _value;
133
214
@@ -151,12 +232,20 @@ class ConversationPredicate {
151
232
/// Set this field to only select conversations that have, or don't have any, unread messages.
152
233
final bool ? hasUnreadMessages;
153
234
154
- const ConversationPredicate ({this .access, this .custom, this .hasUnreadMessages});
235
+ /// Only select conversations that have the last message sent in a particular time interval.
236
+ final NumberPredicate ? lastMessageTs;
237
+
238
+ /// Only select conversations that have the subject set to particular values.
239
+ final FieldPredicate <String ?>? subject;
240
+
241
+ const ConversationPredicate ({this .access, this .custom, this .hasUnreadMessages, this .lastMessageTs, this .subject});
155
242
156
243
ConversationPredicate .of (ConversationPredicate other)
157
244
: access = (other.access != null ? FieldPredicate <ConversationAccessLevel >.of (other.access! ) : null ),
158
245
custom = (other.custom != null ? Map <String , CustomFieldPredicate >.of (other.custom! ) : null ),
159
- hasUnreadMessages = other.hasUnreadMessages;
246
+ hasUnreadMessages = other.hasUnreadMessages,
247
+ lastMessageTs = (other.lastMessageTs != null ? NumberPredicate .of (other.lastMessageTs! ) : null ),
248
+ subject = (other.subject != null ? FieldPredicate <String ?>.of (other.subject! ) : null );
160
249
161
250
@override
162
251
String toString () {
@@ -178,6 +267,14 @@ class ConversationPredicate {
178
267
result['hasUnreadMessages' ] = hasUnreadMessages;
179
268
}
180
269
270
+ if (lastMessageTs != null ) {
271
+ result['lastMessageTs' ] = lastMessageTs;
272
+ }
273
+
274
+ if (subject != null ) {
275
+ result['subject' ] = subject;
276
+ }
277
+
181
278
return result;
182
279
}
183
280
@@ -202,6 +299,14 @@ class ConversationPredicate {
202
299
return false ;
203
300
}
204
301
302
+ if (lastMessageTs != other.lastMessageTs) {
303
+ return false ;
304
+ }
305
+
306
+ if (subject != other.subject) {
307
+ return false ;
308
+ }
309
+
205
310
return true ;
206
311
}
207
312
@@ -210,6 +315,8 @@ class ConversationPredicate {
210
315
(custom != null ? Object .hashAll (custom! .keys) : custom),
211
316
(custom != null ? Object .hashAll (custom! .values) : custom),
212
317
hasUnreadMessages,
318
+ lastMessageTs,
319
+ subject,
213
320
);
214
321
}
215
322
0 commit comments