13
13
// limitations under the License.
14
14
15
15
#include " database/src/desktop/query_desktop.h"
16
+
16
17
#include < sstream>
18
+
17
19
#include " app/memory/unique_ptr.h"
18
20
#include " app/rest/transport_builder.h"
19
21
#include " app/rest/transport_curl.h"
@@ -40,6 +42,47 @@ using callback::NewCallback;
40
42
namespace database {
41
43
namespace internal {
42
44
45
+ // This method validates that key index has been called with the correct
46
+ // combination of parameters
47
+ static bool ValidateQueryEndpoints (const QueryParams& params) {
48
+ if (params.order_by == QueryParams::kOrderByKey ) {
49
+ const char message[] =
50
+ " You must use StartAt(String value), EndAt(String value) or "
51
+ " EqualTo(String value) in combination with orderByKey(). Other type of "
52
+ " values or using the version with 2 parameters is not supported" ;
53
+ if (HasStart (params)) {
54
+ const Variant& start_node = GetStartValue (params);
55
+ std::string start_name = GetStartName (params);
56
+ if ((start_name != QueryParamsComparator::kMinKey ) ||
57
+ !(start_node.is_string ())) {
58
+ LogWarning (message);
59
+ return false ;
60
+ }
61
+ }
62
+ if (HasEnd (params)) {
63
+ const Variant& end_node = GetEndValue (params);
64
+ std::string end_name = GetEndName (params);
65
+ if ((end_name != QueryParamsComparator::kMaxKey ) ||
66
+ !(end_node.is_string ())) {
67
+ LogWarning (message);
68
+ return false ;
69
+ }
70
+ }
71
+ } else {
72
+ if (params.order_by == QueryParams::kOrderByPriority ) {
73
+ if ((HasStart (params) && !IsValidPriority (GetStartValue (params))) ||
74
+ (HasEnd (params) && !IsValidPriority (GetEndValue (params)))) {
75
+ LogWarning (
76
+ " When using orderByPriority(), values provided to "
77
+ " StartAt(), EndAt(), or EqualTo() must be valid "
78
+ " priorities." );
79
+ return false ;
80
+ }
81
+ }
82
+ }
83
+ return true ;
84
+ }
85
+
43
86
QueryInternal::QueryInternal (DatabaseInternal* database,
44
87
const QuerySpec& query_spec)
45
88
: database_(database), query_spec_(query_spec) {
@@ -241,8 +284,15 @@ QueryInternal* QueryInternal::StartAt(const Variant& value) {
241
284
query_spec_.path .c_str ());
242
285
return nullptr ;
243
286
}
287
+ if (HasStart (query_spec_.params )) {
288
+ LogWarning (" Can't Call StartAt() or EqualTo() multiple times" );
289
+ return nullptr ;
290
+ }
244
291
QuerySpec spec = query_spec_;
245
292
spec.params .start_at_value = value;
293
+ if (!ValidateQueryEndpoints (spec.params )) {
294
+ return nullptr ;
295
+ }
246
296
return new QueryInternal (database_, spec);
247
297
}
248
298
@@ -259,6 +309,9 @@ QueryInternal* QueryInternal::StartAt(const Variant& value,
259
309
QuerySpec spec = query_spec_;
260
310
spec.params .start_at_value = value;
261
311
spec.params .start_at_child_key = child_key;
312
+ if (!ValidateQueryEndpoints (spec.params )) {
313
+ return nullptr ;
314
+ }
262
315
return new QueryInternal (database_, spec);
263
316
}
264
317
@@ -270,8 +323,15 @@ QueryInternal* QueryInternal::EndAt(const Variant& value) {
270
323
query_spec_.path .c_str ());
271
324
return nullptr ;
272
325
}
326
+ if (HasEnd (query_spec_.params )) {
327
+ LogWarning (" Can't Call EndAt() or EqualTo() multiple times" );
328
+ return nullptr ;
329
+ }
273
330
QuerySpec spec = query_spec_;
274
331
spec.params .end_at_value = value;
332
+ if (!ValidateQueryEndpoints (spec.params )) {
333
+ return nullptr ;
334
+ }
275
335
return new QueryInternal (database_, spec);
276
336
}
277
337
@@ -288,6 +348,9 @@ QueryInternal* QueryInternal::EndAt(const Variant& value,
288
348
QuerySpec spec = query_spec_;
289
349
spec.params .end_at_value = value;
290
350
spec.params .end_at_child_key = child_key;
351
+ if (!ValidateQueryEndpoints (spec.params )) {
352
+ return nullptr ;
353
+ }
291
354
return new QueryInternal (database_, spec);
292
355
}
293
356
@@ -301,6 +364,9 @@ QueryInternal* QueryInternal::EqualTo(const Variant& value) {
301
364
}
302
365
QuerySpec spec = query_spec_;
303
366
spec.params .equal_to_value = value;
367
+ if (!ValidateQueryEndpoints (spec.params )) {
368
+ return nullptr ;
369
+ }
304
370
return new QueryInternal (database_, spec);
305
371
}
306
372
@@ -316,6 +382,9 @@ QueryInternal* QueryInternal::EqualTo(const Variant& value,
316
382
QuerySpec spec = query_spec_;
317
383
spec.params .equal_to_value = value;
318
384
spec.params .equal_to_child_key = child_key;
385
+ if (!ValidateQueryEndpoints (spec.params )) {
386
+ return nullptr ;
387
+ }
319
388
return new QueryInternal (database_, spec);
320
389
}
321
390
0 commit comments