• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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