1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #define LOG_TAG "DataQuery"
17
18 #include "data_query.h"
19 #include "log_print.h"
20 #include "query.h"
21 namespace OHOS {
22 namespace DistributedKv {
23 const char * const DataQuery::EQUAL_TO = "^EQUAL";
24 const char * const DataQuery::NOT_EQUAL_TO = "^NOT_EQUAL";
25 const char * const DataQuery::GREATER_THAN = "^GREATER";
26 const char * const DataQuery::LESS_THAN = "^LESS";
27 const char * const DataQuery::GREATER_THAN_OR_EQUAL_TO = "^GREATER_EQUAL";
28 const char * const DataQuery::LESS_THAN_OR_EQUAL_TO = "^LESS_EQUAL";
29 const char * const DataQuery::IS_NULL = "^IS_NULL";
30 const char * const DataQuery::IN = "^IN";
31 const char * const DataQuery::NOT_IN = "^NOT_IN";
32 const char * const DataQuery::LIKE = "^LIKE";
33 const char * const DataQuery::NOT_LIKE = "^NOT_LIKE";
34 const char * const DataQuery::AND = "^AND";
35 const char * const DataQuery::OR = "^OR";
36 const char * const DataQuery::ORDER_BY_ASC = "^ASC";
37 const char * const DataQuery::ORDER_BY_DESC = "^DESC";
38 const char * const DataQuery::ORDER_BY_WRITE_TIME = "^OrderByWriteTime";
39 const char * const DataQuery::IS_ASC = "^IS_ASC";
40 const char * const DataQuery::IS_DESC = "^IS_DESC";
41 const char * const DataQuery::LIMIT = "^LIMIT";
42 const char * const DataQuery::SPACE = " ";
43 const char * const DataQuery::SPECIAL = "^";
44 const char * const DataQuery::SPECIAL_ESCAPE = "(^)";
45 const char * const DataQuery::SPACE_ESCAPE = "^^";
46 const char * const DataQuery::EMPTY_STRING = "^EMPTY_STRING";
47 const char * const DataQuery::START_IN = "^START";
48 const char * const DataQuery::END_IN = "^END";
49 const char * const DataQuery::BEGIN_GROUP = "^BEGIN_GROUP";
50 const char * const DataQuery::END_GROUP = "^END_GROUP";
51 const char * const DataQuery::KEY_PREFIX = "^KEY_PREFIX";
52 const char * const DataQuery::DEVICE_ID = "^DEVICE_ID";
53 const char * const DataQuery::IS_NOT_NULL = "^IS_NOT_NULL";
54 const char * const DataQuery::TYPE_STRING = "STRING";
55 const char * const DataQuery::TYPE_INTEGER = "INTEGER";
56 const char * const DataQuery::TYPE_LONG = "LONG";
57 const char * const DataQuery::TYPE_DOUBLE = "DOUBLE";
58 const char * const DataQuery::TYPE_BOOLEAN = "BOOL";
59 const char * const DataQuery::VALUE_TRUE = "true";
60 const char * const DataQuery::VALUE_FALSE = "false";
61 const char * const DataQuery::SUGGEST_INDEX = "^SUGGEST_INDEX";
62 const char * const DataQuery::IN_KEYS = "^IN_KEYS";
63 constexpr int MAX_QUERY_LENGTH = 5 * 1024; // Max query string length 5k
64
DataQuery()65 DataQuery::DataQuery()
66 {
67 query_ = std::make_shared<DistributedDB::Query>();
68 }
69
Reset()70 DataQuery& DataQuery::Reset()
71 {
72 str_ = "";
73 hasKeys_ = false;
74 hasPrefix_ = false;
75 deviceId_ = "";
76 prefix_ = "";
77 query_ = std::make_shared<DistributedDB::Query>();
78 return *this;
79 }
80
EqualTo(const std::string & field,const int value)81 DataQuery& DataQuery::EqualTo(const std::string &field, const int value)
82 {
83 std::string myField = field;
84 if (ValidateField(myField)) {
85 AppendCommon(EQUAL_TO, TYPE_INTEGER, myField, value);
86 query_->EqualTo(field, value);
87 }
88 return *this;
89 }
90
EqualTo(const std::string & field,const int64_t value)91 DataQuery& DataQuery::EqualTo(const std::string &field, const int64_t value)
92 {
93 std::string myField = field;
94 if (ValidateField(myField)) {
95 AppendCommon(EQUAL_TO, TYPE_LONG, myField, value);
96 query_->EqualTo(field, value);
97 }
98 return *this;
99 }
100
EqualTo(const std::string & field,const double value)101 DataQuery& DataQuery::EqualTo(const std::string &field, const double value)
102 {
103 std::string myField = field;
104 if (ValidateField(myField)) {
105 AppendCommon(EQUAL_TO, TYPE_DOUBLE, myField, value);
106 query_->EqualTo(field, value);
107 }
108 return *this;
109 }
110
EqualTo(const std::string & field,const std::string & value)111 DataQuery& DataQuery::EqualTo(const std::string &field, const std::string &value)
112 {
113 std::string myField = field;
114 std::string myValue = value;
115 if (ValidateField(myField)) {
116 AppendCommonString(EQUAL_TO, TYPE_STRING, myField, myValue);
117 query_->EqualTo(field, value);
118 }
119 return *this;
120 }
121
EqualTo(const std::string & field,const bool value)122 DataQuery& DataQuery::EqualTo(const std::string &field, const bool value)
123 {
124 std::string myField = field;
125 if (ValidateField(myField)) {
126 AppendCommonBoolean(EQUAL_TO, TYPE_BOOLEAN, myField, value);
127 query_->EqualTo(field, value);
128 }
129 return *this;
130 }
131
NotEqualTo(const std::string & field,const int value)132 DataQuery& DataQuery::NotEqualTo(const std::string &field, const int value)
133 {
134 std::string myField = field;
135 if (ValidateField(myField)) {
136 AppendCommon(NOT_EQUAL_TO, TYPE_INTEGER, myField, value);
137 query_->NotEqualTo(field, value);
138 }
139 return *this;
140 }
141
NotEqualTo(const std::string & field,const int64_t value)142 DataQuery& DataQuery::NotEqualTo(const std::string &field, const int64_t value)
143 {
144 std::string myField = field;
145 if (ValidateField(myField)) {
146 AppendCommon(NOT_EQUAL_TO, TYPE_LONG, myField, value);
147 query_->NotEqualTo(field, value);
148 }
149 return *this;
150 }
151
NotEqualTo(const std::string & field,const double value)152 DataQuery& DataQuery::NotEqualTo(const std::string &field, const double value)
153 {
154 std::string myField = field;
155 if (ValidateField(myField)) {
156 AppendCommon(NOT_EQUAL_TO, TYPE_DOUBLE, myField, value);
157 query_->NotEqualTo(field, value);
158 }
159 return *this;
160 }
161
NotEqualTo(const std::string & field,const std::string & value)162 DataQuery& DataQuery::NotEqualTo(const std::string &field, const std::string &value)
163 {
164 std::string myField = field;
165 std::string myValue = value;
166 if (ValidateField(myField)) {
167 AppendCommonString(NOT_EQUAL_TO, TYPE_STRING, myField, myValue);
168 query_->NotEqualTo(field, value);
169 }
170 return *this;
171 }
172
NotEqualTo(const std::string & field,const bool value)173 DataQuery& DataQuery::NotEqualTo(const std::string &field, const bool value)
174 {
175 std::string myField = field;
176 if (ValidateField(myField)) {
177 AppendCommonBoolean(NOT_EQUAL_TO, TYPE_BOOLEAN, myField, value);
178 query_->NotEqualTo(field, value);
179 }
180 return *this;
181 }
182
GreaterThan(const std::string & field,const int value)183 DataQuery& DataQuery::GreaterThan(const std::string &field, const int value)
184 {
185 std::string myField = field;
186 if (ValidateField(myField)) {
187 AppendCommon(GREATER_THAN, TYPE_INTEGER, myField, value);
188 query_->GreaterThan(field, value);
189 }
190 return *this;
191 }
192
GreaterThan(const std::string & field,const int64_t value)193 DataQuery& DataQuery::GreaterThan(const std::string &field, const int64_t value)
194 {
195 std::string myField = field;
196 if (ValidateField(myField)) {
197 AppendCommon(GREATER_THAN, TYPE_LONG, myField, value);
198 query_->GreaterThan(field, value);
199 }
200 return *this;
201 }
202
GreaterThan(const std::string & field,const double value)203 DataQuery& DataQuery::GreaterThan(const std::string &field, const double value)
204 {
205 std::string myField = field;
206 if (ValidateField(myField)) {
207 AppendCommon(GREATER_THAN, TYPE_DOUBLE, myField, value);
208 query_->GreaterThan(field, value);
209 }
210 return *this;
211 }
212
GreaterThan(const std::string & field,const std::string & value)213 DataQuery& DataQuery::GreaterThan(const std::string &field, const std::string &value)
214 {
215 std::string myField = field;
216 std::string myValue = value;
217 if (ValidateField(myField)) {
218 AppendCommonString(GREATER_THAN, TYPE_STRING, myField, myValue);
219 query_->GreaterThan(field, value);
220 }
221 return *this;
222 }
223
LessThan(const std::string & field,const int value)224 DataQuery& DataQuery::LessThan(const std::string &field, const int value)
225 {
226 std::string myField = field;
227 if (ValidateField(myField)) {
228 AppendCommon(LESS_THAN, TYPE_INTEGER, myField, value);
229 query_->LessThan(field, value);
230 }
231 return *this;
232 }
233
LessThan(const std::string & field,const int64_t value)234 DataQuery& DataQuery::LessThan(const std::string &field, const int64_t value)
235 {
236 std::string myField = field;
237 if (ValidateField(myField)) {
238 AppendCommon(LESS_THAN, TYPE_LONG, myField, value);
239 query_->LessThan(field, value);
240 }
241 return *this;
242 }
243
LessThan(const std::string & field,const double value)244 DataQuery& DataQuery::LessThan(const std::string &field, const double value)
245 {
246 std::string myField = field;
247 if (ValidateField(myField)) {
248 AppendCommon(LESS_THAN, TYPE_DOUBLE, myField, value);
249 query_->LessThan(field, value);
250 }
251 return *this;
252 }
253
LessThan(const std::string & field,const std::string & value)254 DataQuery& DataQuery::LessThan(const std::string &field, const std::string &value)
255 {
256 std::string myField = field;
257 std::string myValue = value;
258 if (ValidateField(myField)) {
259 AppendCommonString(LESS_THAN, TYPE_STRING, myField, myValue);
260 query_->LessThan(field, value);
261 }
262 return *this;
263 }
264
GreaterThanOrEqualTo(const std::string & field,const int value)265 DataQuery& DataQuery::GreaterThanOrEqualTo(const std::string &field, const int value)
266 {
267 std::string myField = field;
268 if (ValidateField(myField)) {
269 AppendCommon(GREATER_THAN_OR_EQUAL_TO, TYPE_INTEGER, myField, value);
270 query_->GreaterThanOrEqualTo(field, value);
271 }
272 return *this;
273 }
274
GreaterThanOrEqualTo(const std::string & field,const int64_t value)275 DataQuery& DataQuery::GreaterThanOrEqualTo(const std::string &field, const int64_t value)
276 {
277 std::string myField = field;
278 if (ValidateField(myField)) {
279 AppendCommon(GREATER_THAN_OR_EQUAL_TO, TYPE_LONG, myField, value);
280 query_->GreaterThanOrEqualTo(field, value);
281 }
282 return *this;
283 }
284
GreaterThanOrEqualTo(const std::string & field,const double value)285 DataQuery& DataQuery::GreaterThanOrEqualTo(const std::string &field, const double value)
286 {
287 std::string myField = field;
288 if (ValidateField(myField)) {
289 AppendCommon(GREATER_THAN_OR_EQUAL_TO, TYPE_DOUBLE, myField, value);
290 query_->GreaterThanOrEqualTo(field, value);
291 }
292 return *this;
293 }
294
GreaterThanOrEqualTo(const std::string & field,const std::string & value)295 DataQuery& DataQuery::GreaterThanOrEqualTo(const std::string &field, const std::string &value)
296 {
297 std::string myField = field;
298 std::string myValue = value;
299 if (ValidateField(myField)) {
300 AppendCommonString(GREATER_THAN_OR_EQUAL_TO, TYPE_STRING, myField, myValue);
301 query_->GreaterThanOrEqualTo(field, value);
302 }
303 return *this;
304 }
305
LessThanOrEqualTo(const std::string & field,const int value)306 DataQuery& DataQuery::LessThanOrEqualTo(const std::string &field, const int value)
307 {
308 std::string myField = field;
309 if (ValidateField(myField)) {
310 AppendCommon(LESS_THAN_OR_EQUAL_TO, TYPE_INTEGER, myField, value);
311 query_->LessThanOrEqualTo(field, value);
312 }
313 return *this;
314 }
315
LessThanOrEqualTo(const std::string & field,const int64_t value)316 DataQuery& DataQuery::LessThanOrEqualTo(const std::string &field, const int64_t value)
317 {
318 std::string myField = field;
319 if (ValidateField(myField)) {
320 AppendCommon(LESS_THAN_OR_EQUAL_TO, TYPE_LONG, myField, value);
321 query_->LessThanOrEqualTo(field, value);
322 }
323 return *this;
324 }
325
LessThanOrEqualTo(const std::string & field,const double value)326 DataQuery& DataQuery::LessThanOrEqualTo(const std::string &field, const double value)
327 {
328 std::string myField = field;
329 if (ValidateField(myField)) {
330 AppendCommon(LESS_THAN_OR_EQUAL_TO, TYPE_DOUBLE, myField, value);
331 query_->LessThanOrEqualTo(field, value);
332 }
333 return *this;
334 }
335
LessThanOrEqualTo(const std::string & field,const std::string & value)336 DataQuery& DataQuery::LessThanOrEqualTo(const std::string &field, const std::string &value)
337 {
338 std::string myField = field;
339 std::string myValue = value;
340 if (ValidateField(myField)) {
341 AppendCommonString(LESS_THAN_OR_EQUAL_TO, TYPE_STRING, myField, myValue);
342 query_->LessThanOrEqualTo(field, value);
343 }
344 return *this;
345 }
346
IsNull(const std::string & field)347 DataQuery& DataQuery::IsNull(const std::string &field)
348 {
349 std::string myField = field;
350 if (ValidateField(myField)) {
351 str_.append(SPACE);
352 str_.append(IS_NULL);
353 str_.append(SPACE);
354 EscapeSpace(myField);
355 str_.append(myField);
356 query_->IsNull(field);
357 }
358 return *this;
359 }
360
IsNotNull(const std::string & field)361 DataQuery& DataQuery::IsNotNull(const std::string &field)
362 {
363 std::string myField = field;
364 if (ValidateField(myField)) {
365 str_.append(SPACE);
366 str_.append(IS_NOT_NULL);
367 str_.append(SPACE);
368 EscapeSpace(myField);
369 str_.append(myField);
370 query_->IsNotNull(field);
371 }
372 return *this;
373 }
374
In(const std::string & field,const std::vector<int> & valueList)375 DataQuery& DataQuery::In(const std::string &field, const std::vector<int> &valueList)
376 {
377 ZLOGD("DataQuery::In int");
378 std::string myField = field;
379 if (ValidateField(myField)) {
380 AppendCommonList(IN, TYPE_INTEGER, myField, valueList);
381 query_->In(field, valueList);
382 }
383 return *this;
384 }
385
In(const std::string & field,const std::vector<int64_t> & valueList)386 DataQuery& DataQuery::In(const std::string &field, const std::vector<int64_t> &valueList)
387 {
388 ZLOGD("DataQuery::In int64_t");
389 std::string myField = field;
390 if (ValidateField(myField)) {
391 AppendCommonList(IN, TYPE_LONG, myField, valueList);
392 query_->In(field, valueList);
393 }
394 return *this;
395 }
396
In(const std::string & field,const std::vector<double> & valueList)397 DataQuery& DataQuery::In(const std::string &field, const std::vector<double> &valueList)
398 {
399 ZLOGD("DataQuery::In double");
400 std::string myField = field;
401 if (ValidateField(myField)) {
402 AppendCommonList(IN, TYPE_DOUBLE, myField, valueList);
403 query_->In(field, valueList);
404 }
405 return *this;
406 }
407
In(const std::string & field,const std::vector<std::string> & valueList)408 DataQuery& DataQuery::In(const std::string &field, const std::vector<std::string> &valueList)
409 {
410 ZLOGD("DataQuery::In string");
411 std::string myField = field;
412 std::vector<std::string> myValueList(valueList);
413 if (ValidateField(myField)) {
414 AppendCommonListString(IN, TYPE_STRING, myField, myValueList);
415 query_->In(field, valueList);
416 }
417 return *this;
418 }
419
NotIn(const std::string & field,const std::vector<int> & valueList)420 DataQuery& DataQuery::NotIn(const std::string &field, const std::vector<int> &valueList)
421 {
422 ZLOGD("DataQuery::NotIn int");
423 std::string myField = field;
424 if (ValidateField(myField)) {
425 AppendCommonList(NOT_IN, TYPE_INTEGER, myField, valueList);
426 query_->NotIn(field, valueList);
427 }
428 return *this;
429 }
430
NotIn(const std::string & field,const std::vector<int64_t> & valueList)431 DataQuery& DataQuery::NotIn(const std::string &field, const std::vector<int64_t> &valueList)
432 {
433 ZLOGD("DataQuery::NotIn int64_t");
434 std::string myField = field;
435 if (ValidateField(myField)) {
436 AppendCommonList(NOT_IN, TYPE_LONG, myField, valueList);
437 query_->NotIn(field, valueList);
438 }
439 return *this;
440 }
441
NotIn(const std::string & field,const std::vector<double> & valueList)442 DataQuery& DataQuery::NotIn(const std::string &field, const std::vector<double> &valueList)
443 {
444 ZLOGD("DataQuery::NotIn double");
445 std::string myField = field;
446 if (ValidateField(myField)) {
447 AppendCommonList(NOT_IN, TYPE_DOUBLE, myField, valueList);
448 query_->NotIn(field, valueList);
449 }
450 return *this;
451 }
452
NotIn(const std::string & field,const std::vector<std::string> & valueList)453 DataQuery& DataQuery::NotIn(const std::string &field, const std::vector<std::string> &valueList)
454 {
455 ZLOGD("DataQuery::NotIn string");
456 std::string myField = field;
457 std::vector<std::string> myValueList(valueList);
458 if (ValidateField(myField)) {
459 AppendCommonListString(NOT_IN, TYPE_STRING, myField, myValueList);
460 query_->NotIn(field, valueList);
461 }
462 return *this;
463 }
464
Like(const std::string & field,const std::string & value)465 DataQuery& DataQuery::Like(const std::string &field, const std::string &value)
466 {
467 std::string myField = field;
468 std::string myValue = value;
469 if (ValidateField(myField)) {
470 AppendCommonString(LIKE, myField, myValue);
471 query_->Like(field, value);
472 }
473 return *this;
474 }
475
Unlike(const std::string & field,const std::string & value)476 DataQuery& DataQuery::Unlike(const std::string &field, const std::string &value)
477 {
478 std::string myField = field;
479 std::string myValue = value;
480 if (ValidateField(myField)) {
481 AppendCommonString(NOT_LIKE, myField, myValue);
482 query_->NotLike(field, value);
483 }
484 return *this;
485 }
486
And()487 DataQuery& DataQuery::And()
488 {
489 str_.append(SPACE);
490 str_.append(AND);
491 query_->And();
492 return *this;
493 }
494
Or()495 DataQuery& DataQuery::Or()
496 {
497 str_.append(SPACE);
498 str_.append(OR);
499 query_->Or();
500 return *this;
501 }
502
OrderByAsc(const std::string & field)503 DataQuery& DataQuery::OrderByAsc(const std::string &field)
504 {
505 std::string myField = field;
506 if (ValidateField(myField)) {
507 str_.append(SPACE);
508 str_.append(ORDER_BY_ASC);
509 str_.append(SPACE);
510 EscapeSpace(myField);
511 str_.append(myField);
512 query_->OrderBy(field);
513 }
514 return *this;
515 }
516
OrderByDesc(const std::string & field)517 DataQuery& DataQuery::OrderByDesc(const std::string &field)
518 {
519 std::string myField = field;
520 if (ValidateField(myField)) {
521 str_.append(SPACE);
522 str_.append(ORDER_BY_DESC);
523 str_.append(SPACE);
524 EscapeSpace(myField);
525 str_.append(myField);
526 query_->OrderBy(field, false);
527 }
528 return *this;
529 }
530
OrderByWriteTime(const bool isAsc)531 DataQuery& DataQuery::OrderByWriteTime (const bool isAsc)
532 {
533 str_.append(SPACE);
534 str_.append(ORDER_BY_WRITE_TIME);
535 str_.append(SPACE);
536 str_.append(isAsc?IS_ASC:IS_DESC);
537 query_->OrderByWriteTime(isAsc);
538 return *this;
539 }
540
Limit(const int number,const int offset)541 DataQuery& DataQuery::Limit(const int number, const int offset)
542 {
543 if (number < 0 || offset < 0) {
544 ZLOGE("Invalid number param");
545 return *this;
546 }
547 str_.append(SPACE);
548 str_.append(LIMIT);
549 str_.append(SPACE);
550 str_.append(BasicToString(number));
551 str_.append(SPACE);
552 str_.append(BasicToString(offset));
553 query_->Limit(number, offset);
554 return *this;
555 }
556
BeginGroup()557 DataQuery& DataQuery::BeginGroup()
558 {
559 str_.append(SPACE);
560 str_.append(BEGIN_GROUP);
561 query_->BeginGroup();
562 return *this;
563 }
564
EndGroup()565 DataQuery& DataQuery::EndGroup()
566 {
567 str_.append(SPACE);
568 str_.append(END_GROUP);
569 query_->EndGroup();
570 return *this;
571 }
572
KeyPrefix(const std::string & prefix)573 DataQuery& DataQuery::KeyPrefix(const std::string &prefix)
574 {
575 std::string myPrefix = prefix;
576 if (ValidateField(myPrefix)) {
577 str_.append(SPACE);
578 str_.append(KEY_PREFIX);
579 str_.append(SPACE);
580 EscapeSpace(myPrefix);
581 str_.append(myPrefix);
582 prefix_ = prefix;
583 hasPrefix_ = true;
584 }
585 return *this;
586 }
587
DeviceId(const std::string & deviceId)588 DataQuery& DataQuery::DeviceId(const std::string &deviceId)
589 {
590 std::string device = deviceId;
591 if (ValidateField(device)) {
592 std::string start;
593 start.append(SPACE);
594 start.append(DEVICE_ID);
595 start.append(SPACE);
596 EscapeSpace(device);
597 start.append(device);
598 str_ = start + str_; // start with diveceId
599 deviceId_ = deviceId;
600 }
601 return *this;
602 }
603
SetSuggestIndex(const std::string & index)604 DataQuery& DataQuery::SetSuggestIndex(const std::string &index)
605 {
606 std::string suggestIndex = index;
607 if (ValidateField(suggestIndex)) {
608 str_.append(SPACE);
609 str_.append(SUGGEST_INDEX);
610 str_.append(SPACE);
611 EscapeSpace(suggestIndex);
612 str_.append(suggestIndex);
613 query_->SuggestIndex(index);
614 }
615 return *this;
616 }
617
InKeys(const std::vector<std::string> & keys)618 DataQuery& DataQuery::InKeys(const std::vector<std::string> &keys)
619 {
620 if (keys.empty()) {
621 ZLOGE("Invalid number param");
622 return *this;
623 }
624 if (hasKeys_) {
625 ZLOGE("cannot set inkeys more than once");
626 return *this;
627 }
628 hasKeys_ = true;
629 str_.append(SPACE);
630 str_.append(IN_KEYS);
631 str_.append(SPACE);
632 str_.append(START_IN);
633 str_.append(SPACE);
634 for (std::string key : keys) {
635 if (ValidateField(key)) {
636 EscapeSpace(key);
637 str_.append(key);
638 str_.append(SPACE);
639 }
640 }
641 str_.append(END_IN);
642 keys_ = keys;
643 return *this;
644 }
645
ToString() const646 std::string DataQuery::ToString() const
647 {
648 if (str_.length() > MAX_QUERY_LENGTH) {
649 ZLOGE("Query is too long");
650 return std::string();
651 }
652 std::string str(str_.begin(), str_.end());
653 return str;
654 }
655
656 template<typename T>
AppendCommon(const std::string & keyword,const std::string & fieldType,std::string & field,const T & value)657 void DataQuery::AppendCommon(const std::string &keyword, const std::string &fieldType,
658 std::string &field, const T &value)
659 {
660 str_.append(SPACE);
661 str_.append(keyword);
662 str_.append(SPACE);
663 str_.append(fieldType);
664 str_.append(SPACE);
665 EscapeSpace(field);
666 str_.append(field);
667 str_.append(SPACE);
668 str_.append(BasicToString(value));
669 }
670
AppendCommonString(const std::string & keyword,const std::string & fieldType,std::string & field,std::string & value)671 void DataQuery::AppendCommonString(const std::string &keyword, const std::string &fieldType,
672 std::string &field, std::string &value)
673 {
674 str_.append(SPACE);
675 str_.append(keyword);
676 str_.append(SPACE);
677 str_.append(fieldType);
678 str_.append(SPACE);
679 EscapeSpace(field);
680 str_.append(field);
681 str_.append(SPACE);
682 EscapeSpace(value);
683 str_.append(value);
684 }
685
AppendCommonBoolean(const std::string & keyword,const std::string & fieldType,std::string & field,const bool & value)686 void DataQuery::AppendCommonBoolean(const std::string &keyword, const std::string &fieldType,
687 std::string &field, const bool &value)
688 {
689 str_.append(SPACE);
690 str_.append(keyword);
691 str_.append(SPACE);
692 str_.append(fieldType);
693 str_.append(SPACE);
694 EscapeSpace(field);
695 str_.append(field);
696 str_.append(SPACE);
697 if (value) {
698 str_.append(VALUE_TRUE);
699 } else {
700 str_.append(VALUE_FALSE);
701 }
702 }
703
AppendCommonString(const std::string & keyword,std::string & field,std::string & value)704 void DataQuery::AppendCommonString(const std::string &keyword, std::string &field, std::string &value)
705 {
706 str_.append(SPACE);
707 str_.append(keyword);
708 str_.append(SPACE);
709 EscapeSpace(field);
710 str_.append(field);
711 str_.append(SPACE);
712 EscapeSpace(value);
713 str_.append(value);
714 }
715
716 template<typename T>
AppendCommonList(const std::string & keyword,const std::string & fieldType,std::string & field,const std::vector<T> & valueList)717 void DataQuery::AppendCommonList(const std::string &keyword, const std::string &fieldType,
718 std::string &field, const std::vector<T> &valueList)
719 {
720 str_.append(SPACE);
721 str_.append(keyword);
722 str_.append(SPACE);
723 str_.append(fieldType);
724 str_.append(SPACE);
725 EscapeSpace(field);
726 str_.append(field);
727 str_.append(SPACE);
728 str_.append(START_IN);
729 str_.append(SPACE);
730 for (T object : valueList) {
731 str_.append(BasicToString(object));
732 str_.append(SPACE);
733 }
734 str_.append(END_IN);
735 }
736
AppendCommonListString(const std::string & keyword,const std::string & fieldType,std::string & field,std::vector<std::string> & valueList)737 void DataQuery::AppendCommonListString(const std::string &keyword, const std::string &fieldType,
738 std::string &field, std::vector<std::string> &valueList)
739 {
740 str_.append(SPACE);
741 str_.append(keyword);
742 str_.append(SPACE);
743 str_.append(fieldType);
744 str_.append(SPACE);
745 EscapeSpace(field);
746 str_.append(field);
747 str_.append(SPACE);
748 str_.append(START_IN);
749 str_.append(SPACE);
750 for (std::string str : valueList) {
751 EscapeSpace(str);
752 str_.append(str);
753 str_.append(SPACE);
754 }
755 str_.append(END_IN);
756 }
757
EscapeSpace(std::string & input)758 void DataQuery::EscapeSpace(std::string &input)
759 {
760 if (input.length() == 0) {
761 input = EMPTY_STRING;
762 }
763 size_t index = 0; // search from the beginning of the string
764 while (true) {
765 index = input.find(DataQuery::SPECIAL, index);
766 if (index == std::string::npos) {
767 break;
768 }
769 input.replace(index, 1, DataQuery::SPECIAL_ESCAPE); // 1 char to be replaced
770 index += 3; // replaced with 3 chars, keep searching the remaining string
771 }
772 index = 0; // search from the beginning of the string
773 while (true) {
774 index = input.find(DataQuery::SPACE, index);
775 if (index == std::string::npos) {
776 break;
777 }
778 input.replace(index, 1, DataQuery::SPACE_ESCAPE); // 1 char to be replaced
779 index += 2; // replaced with 2 chars, keep searching the remaining string
780 }
781 }
782
ValidateField(const std::string & field)783 bool DataQuery::ValidateField(const std::string &field)
784 {
785 if (field.empty() || field.find(DataQuery::SPECIAL) != std::string::npos) {
786 ZLOGE("invalid string argument");
787 return false;
788 }
789 return true;
790 }
791
792 template<typename T>
BasicToString(const T & value)793 std::string DataQuery::BasicToString(const T &value)
794 {
795 std::ostringstream oss;
796 oss << value;
797 return oss.str();
798 }
799 } // namespace DistributedKv
800 } // namespace OHOS
801