• 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 #ifndef OMIT_JSON
16 #include <gtest/gtest.h>
17 #include <cmath>
18 #include <random>
19 #include <chrono>
20 #include <string>
21 
22 #include "kv_store_delegate.h"
23 #include "kv_store_nb_delegate.h"
24 #include "kv_store_delegate_manager.h"
25 #include "distributed_test_tools.h"
26 #include "distributeddb_nb_test_tools.h"
27 #include "distributeddb_data_generator.h"
28 #include "distributeddb_schema_test_tools.h"
29 
30 using namespace std;
31 using namespace chrono;
32 using namespace testing;
33 #if defined TESTCASES_USING_GTEST_EXT
34 using namespace testing::ext;
35 #endif
36 using namespace std::placeholders;
37 using namespace DistributedDB;
38 using namespace DistributedDBDataGenerator;
39 
40 namespace DistributeddbNbPredicateQuery {
41 KvStoreNbDelegate *g_nbQueryDelegate = nullptr;
42 KvStoreDelegateManager *g_manager = nullptr;
43 Option g_predicateOption;
44 const int IN_AND_NOTIN_MAX_LENGTH = 128;
45 const int LIKE_AND_NOTLIKE_MAX_LENGTH = 50000;
46 
47 DistributedDB::CipherPassword g_passwd1;
48 
49 const int SCHEMA_GOT_COUNT_1 = 1;
50 const int SCHEMA_GOT_COUNT_2 = 2;
51 const int SCHEMA_GOT_COUNT_3 = 3;
52 const int SCHEMA_GOT_COUNT_4 = 4;
53 const int SCHEMA_GOT_COUNT_5 = 5;
54 const int CURSOR_OFFSET_2 = 2;
55 const int NO_RECORD = 0;
56 
57 const int CURSOR_POSITION_NEGATIVE1 = -1;
58 const int INTERFACE_QTY_2 = 2;
59 const int INTERFACE_QTY_6 = 6;
60 class DistributeddbNbPredicateQueryTest : public testing::Test {
61 public:
62     static void SetUpTestCase(void);
63     static void TearDownTestCase(void);
64     void SetUp();
65     void TearDown();
66 private:
67 };
68 
SetUpTestCase(void)69 void DistributeddbNbPredicateQueryTest::SetUpTestCase(void)
70 {
71     (void)g_passwd1.SetValue(PASSWD_VECTOR_1.data(), PASSWD_VECTOR_1.size());
72 }
73 
TearDownTestCase(void)74 void DistributeddbNbPredicateQueryTest::TearDownTestCase(void)
75 {
76 }
77 
SetUp(void)78 void DistributeddbNbPredicateQueryTest::SetUp(void)
79 {
80     RemoveDir(DistributedDBConstant::NB_DIRECTOR);
81 
82     UnitTest *test = UnitTest::GetInstance();
83     ASSERT_NE(test, nullptr);
84     const TestInfo *testinfo = test->current_test_info();
85     ASSERT_NE(testinfo, nullptr);
86     string testCaseName = string(testinfo->name());
87     MST_LOG("[SetUp] test case %s is start to run", testCaseName.c_str());
88 }
89 
TearDown(void)90 void DistributeddbNbPredicateQueryTest::TearDown(void)
91 {
92     RemoveDir(DistributedDBConstant::NB_DIRECTOR);
93 }
94 
PrepareSchemaDBAndData(KvStoreNbDelegate * & delegate,KvStoreDelegateManager * & manager,const vector<string> & schemasValue,vector<Entry> & entries,const std::string schemaDefine)95 void PrepareSchemaDBAndData(KvStoreNbDelegate *&delegate, KvStoreDelegateManager *&manager,
96     const vector<string> &schemasValue, vector<Entry> &entries, const std::string schemaDefine)
97 {
98     string validSchema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, schemaDefine, VALID_INDEX_1);
99 
100     g_predicateOption = g_option;
101     g_predicateOption.isMemoryDb = false;
102     g_predicateOption.schema = validSchema;
103     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, g_predicateOption);
104     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
105 
106     vector<Key> keys;
107     if (schemasValue.size() == 5) { // 5 elements
108         keys = {KEY_1, KEY_2, KEY_3, KEY_4, KEY_5};
109     } else if (schemasValue.size() == 7) { // 7 elements
110         keys = {KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7};
111     } else if (schemasValue.size() == 10) { // 10 elements
112         keys = {KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_10};
113     }
114     for (unsigned long index = 0; index < schemasValue.size(); index++) {
115         Value value(schemasValue[index].begin(), schemasValue[index].end());
116         entries.push_back({keys[index], value});
117     }
118 
119     for (unsigned long index = 0; index < schemasValue.size(); index++) {
120         EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, entries[index].key, entries[index].value), OK);
121     }
122 }
123 
CheckSchemaQuery(KvStoreNbDelegate * & delegate,Query & queryNeedCheck,vector<Entry> & expectEntry,const int & expectCount,DBStatus status)124 bool CheckSchemaQuery(KvStoreNbDelegate *&delegate, Query &queryNeedCheck, vector<Entry> &expectEntry,
125     const int &expectCount, DBStatus status)
126 {
127     bool result = true;
128     vector<Entry> entries;
129     int count = 0;
130     DBStatus statusGot = delegate->GetEntries(queryNeedCheck, entries);
131     result = (statusGot == status) && result;
132     MST_LOG("GetEntries entries result: %d, statusGot: %d", result, statusGot);
133     for (unsigned long index = 0; index < entries.size(); index++) {
134         if (!expectEntry.empty()) {
135             result = (entries[index].key == expectEntry[index].key) && result;
136             MST_LOG("check entries[%ld] key result:%d", index, result);
137             result = (entries[index].value == expectEntry[index].value) && result;
138         } else {
139             MST_LOG("expect value is empty, but Got has: %zu entries", entries.size());
140             return false;
141         }
142     }
143     statusGot = delegate->GetCount(queryNeedCheck, count);
144     result = (statusGot == status) && result;
145     MST_LOG("GetCount result: %d, statusGot: %d", result, statusGot);
146     result = (count == expectCount) && result;
147     MST_LOG("Is GotCount equal to Expect result: %d", result);
148     KvStoreResultSet *resultSet = nullptr;
149     if (status != DBStatus::NOT_FOUND) {
150         statusGot = delegate->GetEntries(queryNeedCheck, resultSet);
151         result = (statusGot == status) && result;
152     } else {
153         statusGot = delegate->GetEntries(queryNeedCheck, resultSet);
154         result = (statusGot == DBStatus::OK) && result;
155     }
156     MST_LOG("GetEntries resultSet result: %d, statusGot: %d", result, statusGot);
157     if (resultSet != nullptr) {
158         int quatity = resultSet->GetCount();
159         result = (quatity == expectCount) && result;
160         MST_LOG("ResultSet GetCount result: %d, quatity: %d", result, quatity);
161         result = (delegate->CloseResultSet(resultSet) == DBStatus::OK) && result;
162     }
163     return result;
164 }
165 
CheckSchemaQueryForOrderBy(KvStoreNbDelegate * & delegate,Query & queryNeedCheck,vector<Entry> & expectEntry,const int & expectCount,DBStatus status)166 bool CheckSchemaQueryForOrderBy(KvStoreNbDelegate *&delegate, Query &queryNeedCheck, vector<Entry> &expectEntry,
167     const int &expectCount, DBStatus status)
168 {
169     bool result = true;
170     vector<Entry> entries;
171     DBStatus statusGot = delegate->GetEntries(queryNeedCheck, entries);
172     result = (statusGot == status) && result;
173     MST_LOG("GetEntries entries result: %d, statusGot: %d", result, statusGot);
174     for (unsigned long index = 0; index < entries.size(); index++) {
175         if (!expectEntry.empty()) {
176             result = (entries[index].key == expectEntry[index].key) && result;
177             MST_LOG("check entries[%ld] key result:%d", index, result);
178             result = (entries[index].value == expectEntry[index].value) && result;
179         } else {
180             MST_LOG("expect value is empty, but Got: %zu entries", entries.size());
181         }
182     }
183     KvStoreResultSet *resultSet = nullptr;
184     if (status != DBStatus::NOT_FOUND) {
185         statusGot = delegate->GetEntries(queryNeedCheck, resultSet);
186         result = (statusGot == status) && result;
187     } else {
188         statusGot = delegate->GetEntries(queryNeedCheck, resultSet);
189         result = (statusGot == DBStatus::OK) && result;
190     }
191     MST_LOG("GetEntries resultSet result: %d, statusGot: %d", result, statusGot);
192     if (resultSet != nullptr) {
193         int quatity = resultSet->GetCount();
194         result = (quatity == expectCount) && result;
195         MST_LOG("ResultSet GetCount result: %d, quatity: %d", result, quatity);
196         result = (delegate->CloseResultSet(resultSet) == DBStatus::OK) && result;
197     }
198     return result;
199 }
200 
CheckSchemaNotExist(KvStoreNbDelegate * & delegate)201 bool CheckSchemaNotExist(KvStoreNbDelegate *&delegate)
202 {
203     bool result = true;
204     vector<Entry> entries;
205     bool valueBool = true; // boolean true
206     int valueInt = 10; // int value 10
207     int64_t valueLong = 15; // long value 15
208     double valueDouble = 10.5; // double value 10.5
209 
210     string fieldStr = "$.field1";
211     vector<Query> queries1, queries2, queries3;
212     bool functionChoiceComp1[INTERFACE_QTY_6] = {true, false, false, false, false, false};
213     QueryGenerate<bool>::Instance().GenerateQueryComp(queries1, functionChoiceComp1, fieldStr, valueBool);
214     bool functionChoiceComp2[INTERFACE_QTY_6] = {false, true, false, false, false, false};
215     QueryGenerate<bool>::Instance().GenerateQueryComp(queries2, functionChoiceComp2, fieldStr, valueBool);
216     bool functionChoiceComp3[INTERFACE_QTY_6] = {false, false, true, true, true, true};
217     QueryGenerate<bool>::Instance().GenerateQueryComp(queries3, functionChoiceComp3, fieldStr, valueBool);
218 
219     bool functionChoiceComp4[INTERFACE_QTY_6] = {true, false, false, false, true, true};
220     QueryGenerate<int>::Instance().GenerateQueryComp(queries1, functionChoiceComp4, fieldStr, valueInt);
221     bool functionChoiceComp5[INTERFACE_QTY_6] = {false, true, true, true, false, false};
222     QueryGenerate<int>::Instance().GenerateQueryComp(queries2, functionChoiceComp5, fieldStr, valueInt);
223 
224     QueryGenerate<int64_t>::Instance().GenerateQueryComp(queries1, functionChoiceComp4, fieldStr, valueLong);
225     QueryGenerate<int64_t>::Instance().GenerateQueryComp(queries2, functionChoiceComp5, fieldStr, valueLong);
226 
227     QueryGenerate<double>::Instance().GenerateQueryComp(queries1, functionChoiceComp4, fieldStr, valueDouble);
228     QueryGenerate<double>::Instance().GenerateQueryComp(queries2, functionChoiceComp5, fieldStr, valueDouble);
229 
230     vector<bool> valuesBool = {true};
231     vector<int> valuesInt = {10, 11};
232     vector<int64_t> valuesLong = {15, 16};
233     vector<double> valuesDouble = {10.5, 11.5};
234 
235     bool functionChoiceIn1[INTERFACE_QTY_2] = {true, false};
236     QueryGenerate<bool>::Instance().GenerateQueryIn(queries1, functionChoiceIn1, fieldStr, valuesBool);
237     bool functionChoiceIn2[INTERFACE_QTY_2] = {false, true};
238     QueryGenerate<bool>::Instance().GenerateQueryIn(queries2, functionChoiceIn2, fieldStr, valuesBool);
239 
240     QueryGenerate<int>::Instance().GenerateQueryIn(queries1, functionChoiceIn1, fieldStr, valuesInt);
241     QueryGenerate<int>::Instance().GenerateQueryIn(queries2, functionChoiceIn2, fieldStr, valuesInt);
242 
243     QueryGenerate<int64_t>::Instance().GenerateQueryIn(queries1, functionChoiceIn1, fieldStr, valuesLong);
244     QueryGenerate<int64_t>::Instance().GenerateQueryIn(queries2, functionChoiceIn2, fieldStr, valuesLong);
245 
246     QueryGenerate<double>::Instance().GenerateQueryIn(queries1, functionChoiceIn1, fieldStr, valuesDouble);
247     QueryGenerate<double>::Instance().GenerateQueryIn(queries2, functionChoiceIn2, fieldStr, valuesDouble);
248 
249     for (auto const &it : queries1) {
250         result = (delegate->GetEntries(it, entries) == NOT_FOUND) && result;
251     }
252     for (auto const &it : queries2) {
253         result = (delegate->GetEntries(it, entries) == OK) && result;
254         result = (entries.size() == SCHEMA_GOT_COUNT_4) && result;
255     }
256     for (auto const &it : queries3) {
257         result = (delegate->GetEntries(it, entries) == INVALID_QUERY_FORMAT) && result;
258     }
259     return result;
260 }
261 
262 /**
263  * @tc.name: Query 001
264  * @tc.desc: check valid schema of String type and construct valid query object and traverse all function of Query.
265  * @tc.type: FUNC
266  * @tc.require: SR000DR9JP
267  * @tc.author: fengxiaoyun
268  */
269 HWTEST_F(DistributeddbNbPredicateQueryTest, Query001, TestSize.Level0)
270 {
271     KvStoreNbDelegate *delegate = nullptr;
272     KvStoreDelegateManager *manager = nullptr;
273     vector<Entry> entries;
274     /**
275      * @tc.steps: step1. create schema db and put 5 entries which has valid schema constructor
276      *    and has the value given to db.
277      * @tc.expected: step1. create and put successfully.
278      */
279     PrepareSchemaDBAndData(delegate, manager, STRING_SCHEMA_VALUE, entries, VALID_DEFINE_STRING);
280 
281     /**
282      * @tc.steps: step2. test the Query interface of EqualTo/NotEqualTo/In/NotIn/GreaterThan/LessThan/
283      *    GreaterThanOrEqualTo/LessThanOrEqualTo/OrderBy and check the result with GetEntries.
284      * @tc.expected: step2. each interface called ok and GetEntries return right result.
285      */
286     Query query1 = Query::Select().EqualTo("$.field1", "bxz");
287     vector<Entry> expectEntry = {entries[INDEX_ZEROTH], entries[INDEX_THIRD]};
288     EXPECT_TRUE(CheckSchemaQuery(delegate, query1, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
289     Query query5 = Query::Select().GreaterThan("$.field1", "abc");
290     EXPECT_TRUE(CheckSchemaQuery(delegate, query5, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
291 
292     Query query2 = Query::Select().NotEqualTo("$.field1", "bxz");
293     expectEntry = {entries[INDEX_FIRST], entries[INDEX_FORTH]};
294     EXPECT_TRUE(CheckSchemaQuery(delegate, query2, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
295     Query query8 = Query::Select().LessThanOrEqualTo("$.field1", "abc");
296     EXPECT_TRUE(CheckSchemaQuery(delegate, query8, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
297 
298     vector<string> scope = {"bxz", "abc"};
299     Query query3 = Query::Select().In("$.field1", scope);
300     expectEntry = {entries[INDEX_ZEROTH], entries[INDEX_FIRST], entries[INDEX_THIRD]};
301     EXPECT_TRUE(CheckSchemaQuery(delegate, query3, expectEntry, SCHEMA_GOT_COUNT_3, DBStatus::OK));
302     Query query7 = Query::Select().GreaterThanOrEqualTo("$.field1", "abc");
303     EXPECT_TRUE(CheckSchemaQuery(delegate, query7, expectEntry, SCHEMA_GOT_COUNT_3, DBStatus::OK));
304 
305     Query query4 = Query::Select().NotIn("$.field1", scope);
306     expectEntry = {entries[INDEX_FORTH]};
307     EXPECT_TRUE(CheckSchemaQuery(delegate, query4, expectEntry, SCHEMA_GOT_COUNT_1, DBStatus::OK));
308 
309     Query query6 = Query::Select().LessThan("$.field1", "abc");
310     EXPECT_TRUE(CheckSchemaQuery(delegate, query6, expectEntry, SCHEMA_GOT_COUNT_1, DBStatus::OK));
311 
312     EXPECT_TRUE(CheckSchemaNotExist(delegate));
313 
314     /**
315      * @tc.steps: step3. test Fuzzy match interface of Like and NotLike where field3 = "fx?" and check.
316      * @tc.expected: step3. check the result rightly.
317      */
318     Query query10 = Query::Select().Like("$.field2.field3", "fx_");
319     expectEntry = {entries[INDEX_ZEROTH], entries[INDEX_FIRST], entries[INDEX_SECOND]};
320     EXPECT_TRUE(CheckSchemaQuery(delegate, query10, expectEntry, SCHEMA_GOT_COUNT_3, DBStatus::OK));
321     Query query11 = Query::Select().NotLike("$.field2.field3", "fx_");
322     expectEntry = {};
323     EXPECT_TRUE(CheckSchemaQuery(delegate, query11, expectEntry, 0, DBStatus::NOT_FOUND));
324 
325     /**
326      * @tc.steps: step4. test IsNull interface where field = field3.
327      * @tc.expected: step4. check the result rightly.
328      */
329     Query query12 = Query::Select().IsNull("$.field2.field3");
330     expectEntry = {entries[INDEX_THIRD], entries[INDEX_FORTH]};
331     EXPECT_TRUE(CheckSchemaQuery(delegate, query12, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
332     /**
333      * @tc.steps: step5. test OrderBy interface where field = field1.
334      * @tc.expected: step5. check the result rightly.
335      */
336     Query query13 = Query::Select().OrderBy("$.field2.field3");
337     expectEntry = {entries[INDEX_THIRD], entries[INDEX_FORTH], entries[INDEX_SECOND], entries[INDEX_ZEROTH],
338         entries[INDEX_FIRST]};
339     EXPECT_TRUE(CheckSchemaQueryForOrderBy(delegate, query13, expectEntry, SCHEMA_GOT_COUNT_5, DBStatus::OK));
340 
341     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
342 }
343 
InvalidFieldCheck(KvStoreNbDelegate * & delegate,string field,DBStatus status)344 bool InvalidFieldCheck(KvStoreNbDelegate *&delegate, string field, DBStatus status)
345 {
346     bool result = true;
347     Query query1 = Query::Select().EqualTo(field, "bxz");
348     vector<Entry> expectEntry = {};
349     result = (CheckSchemaQuery(delegate, query1, expectEntry, 0, status)) && result;
350     MST_LOG("EqualTo result: %d", result);
351     Query query2 = Query::Select().NotEqualTo(field, "bxz");
352     result = (CheckSchemaQuery(delegate, query2, expectEntry, 0, status)) && result;
353     MST_LOG("NotEqualTo result: %d", result);
354 
355     vector<string> scope = {"bxz", "abc"};
356     Query query3 = Query::Select().In(field, scope);
357     result = (CheckSchemaQuery(delegate, query3, expectEntry, 0, status)) && result;
358     MST_LOG("In result: %d", result);
359 
360     Query query4 = Query::Select().NotIn(field, scope);
361     result = (CheckSchemaQuery(delegate, query4, expectEntry, 0, status)) && result;
362     MST_LOG("NoIn result: %d", result);
363 
364     Query query5 = Query::Select().GreaterThan(field, "abc");
365     result = (CheckSchemaQuery(delegate, query5, expectEntry, 0, status)) && result;
366     MST_LOG("GreaterThan result: %d", result);
367 
368     Query query6 = Query::Select().LessThan(field, "abc");
369     result = (CheckSchemaQuery(delegate, query6, expectEntry, 0, status)) && result;
370     MST_LOG("LessThan result: %d", result);
371 
372     Query query7 = Query::Select().GreaterThanOrEqualTo(field, "abc");
373     result = (CheckSchemaQuery(delegate, query7, expectEntry, 0, status)) && result;
374     MST_LOG("GreaterThanOrEqualTo result: %d", result);
375 
376     Query query8 = Query::Select().LessThanOrEqualTo(field, "abc");
377     result = (CheckSchemaQuery(delegate, query8, expectEntry, 0, status)) && result;
378     MST_LOG("LessThanOrEqualTo result: %d", result);
379     return result;
380 }
381 
382 /**
383  * @tc.name: Query 002
384  * @tc.desc: check valid schema of String type and construct invalid fields and traverse all function of Query.
385  * @tc.type: FUNC
386  * @tc.require: SR000DR9JP
387  * @tc.author: fengxiaoyun
388  */
389 HWTEST_F(DistributeddbNbPredicateQueryTest, Query002, TestSize.Level0)
390 {
391     KvStoreNbDelegate *delegate = nullptr;
392     KvStoreDelegateManager *manager = nullptr;
393     vector<Entry> entries;
394     /**
395      * @tc.steps: step1. create schema db and put 5 entries which has valid schema constructor
396      *    and has the value given to db.
397      * @tc.expected: step1. create and put successfully.
398      */
399     PrepareSchemaDBAndData(delegate, manager, STRING_SCHEMA_VALUE, entries, VALID_DEFINE_STRING);
400 
401     /**
402      * @tc.steps: step2. use notexist field5 to test EqualTo/NotEqualTo/In/NotIn/GreaterThan/LessThan/
403      *    GreaterThanOrEqualTo/LessThanOrEqualTo and GetEntries with Query.
404      * @tc.expected: step2. GetEntries return INVALID_QUERY_FIELD.
405      */
406     EXPECT_TRUE(InvalidFieldCheck(delegate, "$.field5", DBStatus::INVALID_QUERY_FIELD));
407 
408     /**
409      * @tc.steps: step3. use not Leaf node field to test EqualTo/NotEqualTo/In/NotIn/
410      *    GreaterThan/LessThan/GreaterThanOrEqualTo/LessThanOrEqualTo and call GetEntries and check.
411      * @tc.expected: step3. GetEntries return INVALID_QUERY_FIELD.
412      */
413     EXPECT_TRUE(InvalidFieldCheck(delegate, "$.field2.field4", DBStatus::INVALID_QUERY_FIELD));
414     EXPECT_TRUE(InvalidFieldCheck(delegate, "$.field3.field2", DBStatus::INVALID_QUERY_FIELD));
415 
416     /**
417      * @tc.steps: step4. use invalid format field to test EqualTo/NotEqualTo/In/NotIn/
418      *    GreaterThan/LessThan/GreaterThanOrEqualTo/LessThanOrEqualTo and call GetEntries and check.
419      * @tc.expected: step4. GetEntries return INVALID_QUERY_FORMAT.
420      */
421     EXPECT_TRUE(InvalidFieldCheck(delegate, ".field2.field3", DBStatus::INVALID_QUERY_FORMAT));
422     EXPECT_TRUE(InvalidFieldCheck(delegate, "$$field1", DBStatus::INVALID_QUERY_FORMAT));
423 
424     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
425 }
426 
CheckSchemaBoolNotExist(KvStoreNbDelegate * & delegate,vector<Entry> & entries)427 bool CheckSchemaBoolNotExist(KvStoreNbDelegate *&delegate, vector<Entry> &entries)
428 {
429     bool result = true;
430     string valueStringTrue = "true";
431     string valueString = "abc";
432     int64_t valueLong = 15; // long value 15
433     double valueDouble = 10.5; // double value 10.5
434     float valueFloat = 5.0; // float value 5.0
435 
436     vector<Query> queries1, queries2;
437     queries1.push_back(Query::Select().EqualTo("$.field1", valueStringTrue));
438     queries1.push_back(Query::Select().EqualTo("$.field1", valueString));
439     queries1.push_back(Query::Select().EqualTo("$.field1", valueLong));
440     queries1.push_back(Query::Select().EqualTo("$.field1", valueDouble));
441     queries1.push_back(Query::Select().EqualTo("$.field1", valueFloat));
442 
443     queries2.push_back(Query::Select().NotEqualTo("$.field1", valueStringTrue));
444     queries2.push_back(Query::Select().NotEqualTo("$.field1", valueString));
445     queries2.push_back(Query::Select().NotEqualTo("$.field1", valueLong));
446     queries2.push_back(Query::Select().NotEqualTo("$.field1", valueDouble));
447     queries2.push_back(Query::Select().NotEqualTo("$.field1", valueFloat));
448 
449     vector<string> valuesStringTrue = {"true"};
450     vector<string> valuesString = {"abc"};
451     vector<int64_t> valuesLong = {15};
452     vector<double> valuesDouble = {10.5};
453     vector<float> valuesFloat = {5.0};
454 
455     queries1.push_back(Query::Select().In("$.field1", valuesStringTrue));
456     queries1.push_back(Query::Select().In("$.field1", valuesString));
457     queries1.push_back(Query::Select().In("$.field1", valuesLong));
458     queries1.push_back(Query::Select().In("$.field1", valuesDouble));
459     queries1.push_back(Query::Select().In("$.field1", valuesFloat));
460 
461     queries2.push_back(Query::Select().NotIn("$.field1", valuesStringTrue));
462     queries2.push_back(Query::Select().NotIn("$.field1", valuesString));
463     queries2.push_back(Query::Select().NotIn("$.field1", valuesLong));
464     queries2.push_back(Query::Select().NotIn("$.field1", valuesDouble));
465     queries2.push_back(Query::Select().NotIn("$.field1", valuesFloat));
466 
467     vector<Entry> entries1;
468     for (auto const &it : queries1) {
469         result = (delegate->GetEntries(it, entries1) == NOT_FOUND) && result;
470     }
471     vector<Entry> expectEntry
472         = {entries[INDEX_ZEROTH], entries[INDEX_FIRST], entries[INDEX_THIRD], entries[INDEX_FORTH]};
473     for (auto &it : queries2) {
474         result = CheckSchemaQuery(delegate, it, expectEntry, SCHEMA_GOT_COUNT_4, DBStatus::OK) && result;
475     }
476     return result;
477 }
478 
CheckSchemaBoolExist(KvStoreNbDelegate * & delegate,vector<Entry> & entries)479 bool CheckSchemaBoolExist(KvStoreNbDelegate *&delegate, vector<Entry> &entries)
480 {
481     bool result = true;
482     string valueStringZero = "0";
483     int valueInt = 1; // int value 1
484     Query query = Query::Select().EqualTo("$.field1", valueStringZero);
485     vector<Entry> expectEntry = {entries[INDEX_FIRST]};
486     result = (CheckSchemaQuery(delegate, query, expectEntry, SCHEMA_GOT_COUNT_1, DBStatus::OK)) && result;
487     query = Query::Select().EqualTo("$.field1", valueInt);
488     expectEntry = {entries[INDEX_ZEROTH], entries[INDEX_THIRD], entries[INDEX_FORTH]};
489     result = (CheckSchemaQuery(delegate, query, expectEntry, SCHEMA_GOT_COUNT_3, DBStatus::OK)) && result;
490     query = Query::Select().NotEqualTo("$.field1", valueStringZero);
491     result = (CheckSchemaQuery(delegate, query, expectEntry, SCHEMA_GOT_COUNT_3, DBStatus::OK)) && result;
492     query = Query::Select().NotEqualTo("$.field1", valueInt);
493     expectEntry = {entries[INDEX_FIRST]};
494     result = (CheckSchemaQuery(delegate, query, expectEntry, SCHEMA_GOT_COUNT_1, DBStatus::OK)) && result;
495 
496     vector<string> valuesStringZero = {"0"};
497     vector<int> valuesInt = {1};
498     query = Query::Select().In("$.field1", valuesStringZero);
499     expectEntry = {entries[INDEX_FIRST]};
500     result = (CheckSchemaQuery(delegate, query, expectEntry, SCHEMA_GOT_COUNT_1, DBStatus::OK)) && result;
501     query = Query::Select().In("$.field1", valuesInt);
502     expectEntry = {entries[INDEX_ZEROTH], entries[INDEX_THIRD], entries[INDEX_FORTH]};
503     result = (CheckSchemaQuery(delegate, query, expectEntry, SCHEMA_GOT_COUNT_3, DBStatus::OK)) && result;
504 
505     query = Query::Select().NotIn("$.field1", valuesStringZero);
506     result = (CheckSchemaQuery(delegate, query, expectEntry, SCHEMA_GOT_COUNT_3, DBStatus::OK)) && result;
507     query = Query::Select().NotIn("$.field1", valuesInt);
508     expectEntry = {entries[INDEX_FIRST]};
509     result = (CheckSchemaQuery(delegate, query, expectEntry, SCHEMA_GOT_COUNT_1, DBStatus::OK)) && result;
510 
511     return result;
512 }
513 
514 /**
515  * @tc.name: Query 003
516  * @tc.desc: check valid schema of Bool type and construct valid query object and traverse all function of Query.
517  * @tc.type: FUNC
518  * @tc.require: SR000DR9JP
519  * @tc.author: fengxiaoyun
520  */
521 HWTEST_F(DistributeddbNbPredicateQueryTest, Query003, TestSize.Level0)
522 {
523     KvStoreNbDelegate *delegate = nullptr;
524     KvStoreDelegateManager *manager = nullptr;
525     vector<Entry> entries;
526     /**
527      * @tc.steps: step1. create schema db and put 5 entries which has valid schema constructor
528      *    and has the value given to db.
529      * @tc.expected: step1. create and put successfully.
530      */
531     PrepareSchemaDBAndData(delegate, manager, BOOL_SCHEMA_VALUE, entries, VALID_DEFINE_BOOL);
532 
533     /**
534      * @tc.steps: step2. test the Query interface of EqualTo/NotEqualTo/In/NotIn/GreaterThan/LessThan/
535      *    GreaterThanOrEqualTo/LessThanOrEqualTo and call .
536      * @tc.expected: step2. each interface called ok and GetEntries return right result.
537      */
538     Query query = Query::Select().EqualTo("$.field1", true);
539     vector<Entry> expectEntry = {entries[INDEX_ZEROTH], entries[INDEX_THIRD], entries[INDEX_FORTH]};
540     EXPECT_TRUE(CheckSchemaQuery(delegate, query, expectEntry, SCHEMA_GOT_COUNT_3, DBStatus::OK));
541 
542     query = Query::Select().NotEqualTo("$.field1", true);
543     expectEntry = {entries[INDEX_FIRST]};
544     EXPECT_TRUE(CheckSchemaQuery(delegate, query, expectEntry, SCHEMA_GOT_COUNT_1, DBStatus::OK));
545 
546     vector<bool> scope = {true};
547     query = Query::Select().In("$.field1", scope);
548     expectEntry = {entries[INDEX_ZEROTH], entries[INDEX_THIRD], entries[INDEX_FORTH]};
549     EXPECT_TRUE(CheckSchemaQuery(delegate, query, expectEntry, SCHEMA_GOT_COUNT_3, DBStatus::OK));
550 
551     query = Query::Select().NotIn("$.field1", scope);
552     expectEntry = {entries[INDEX_FIRST]};
553     EXPECT_TRUE(CheckSchemaQuery(delegate, query, expectEntry, SCHEMA_GOT_COUNT_1, DBStatus::OK));
554     /**
555      * @tc.steps: step3. query the illegal value of field and check with the GetEntries.
556      * @tc.expected: step3. if the value is "0" or 1, can get valid query, or it will return invalid query
557      *    and GetEntries will return NOT_FOUND.
558      */
559     EXPECT_TRUE(CheckSchemaBoolNotExist(delegate, entries));
560     EXPECT_TRUE(CheckSchemaBoolExist(delegate, entries));
561 
562     /**
563      * @tc.steps: step4. test IsNull interface where field = field3.
564      * @tc.expected: step4. there are entries[0], entries[3], entries[4] in the query.
565      */
566     query = Query::Select().IsNull("$.field2.field3");
567     expectEntry = {entries[INDEX_ZEROTH], entries[INDEX_THIRD], entries[INDEX_FORTH]};
568     EXPECT_TRUE(CheckSchemaQuery(delegate, query, expectEntry, SCHEMA_GOT_COUNT_3, DBStatus::OK));
569 
570     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
571 }
572 
InvalidBoolFieldCheck(KvStoreNbDelegate * & delegate,string field,DBStatus status)573 bool InvalidBoolFieldCheck(KvStoreNbDelegate *&delegate, string field, DBStatus status)
574 {
575     bool result = true;
576     Query query1 = Query::Select().EqualTo(field, true);
577     vector<Entry> expectEntry = {};
578     result = (CheckSchemaQuery(delegate, query1, expectEntry, 0, status)) && result;
579     MST_LOG("Equal To result: %d", result);
580 
581     Query query2 = Query::Select().NotEqualTo(field, true);
582     result = (CheckSchemaQuery(delegate, query2, expectEntry, 0, status)) && result;
583     MST_LOG("NotEqual To result: %d", result);
584 
585     vector<bool> scope = {true};
586     Query query3 = Query::Select().In(field, scope);
587     result = (CheckSchemaQuery(delegate, query3, expectEntry, 0, status)) && result;
588     MST_LOG("In result: %d", result);
589 
590     Query query4 = Query::Select().NotIn(field, scope);
591     result = (CheckSchemaQuery(delegate, query4, expectEntry, 0, status)) && result;
592     MST_LOG("Not in result: %d", result);
593 
594     return result;
595 }
596 
597 /**
598  * @tc.name: Query 004
599  * @tc.desc: check valid schema of Bool type and construct invalid field and traverse all function of Query.
600  * @tc.type: FUNC
601  * @tc.require: SR000DR9JP
602  * @tc.author: fengxiaoyun
603  */
604 HWTEST_F(DistributeddbNbPredicateQueryTest, Query004, TestSize.Level0)
605 {
606     KvStoreNbDelegate *delegate = nullptr;
607     KvStoreDelegateManager *manager = nullptr;
608     vector<Entry> entries;
609     /**
610      * @tc.steps: step1. create schema db and put 5 entries which has valid schema constructor
611      *    and has the value given to db.
612      * @tc.expected: step1. create and put successfully.
613      */
614     PrepareSchemaDBAndData(delegate, manager, BOOL_SCHEMA_VALUE, entries, VALID_DEFINE_BOOL);
615 
616     /**
617      * @tc.steps: step2. use notexist field5 to test EqualTo/NotEqualTo/In/NotIn and call GetEntries with Query.
618      * @tc.expected: step2. GetEntries return INVALID_QUERY_FIELD.
619      */
620     EXPECT_TRUE(InvalidBoolFieldCheck(delegate, "$.field5", DBStatus::INVALID_QUERY_FIELD));
621 
622     /**
623      * @tc.steps: step3. use not Leaf node field to test EqualTo/NotEqualTo/In/NotIn and call GetEntries to check.
624      * @tc.expected: step3. GetEntries return INVALID_QUERY_FIELD.
625      */
626     EXPECT_TRUE(InvalidBoolFieldCheck(delegate, "$.field2.field4", DBStatus::INVALID_QUERY_FIELD));
627     EXPECT_TRUE(InvalidBoolFieldCheck(delegate, "$.field3.field2", DBStatus::INVALID_QUERY_FIELD));
628     /**
629      * @tc.steps: step4. use invalid format field to test EqualTo/NotEqualTo/In/NotIn and call GetEntries with Query.
630      * @tc.expected: step4. GetEntries return INVALID_QUERY_FORMAT.
631      */
632     EXPECT_TRUE(InvalidBoolFieldCheck(delegate, ".field2.field3", DBStatus::INVALID_QUERY_FORMAT));
633     EXPECT_TRUE(InvalidBoolFieldCheck(delegate, "$$field1", DBStatus::INVALID_QUERY_FORMAT));
634 
635     /**
636      * @tc.steps: step5. use invalid format field to test
637      *    GreaterThan/LessThan/GreaterThanOrEqualTo/LessThanOrEqualTo/OrderBy and call GetEntries with Query.
638      * @tc.expected: step5. GetEntries return INVALID_QUERY_FORMAT.
639      */
640     Query query = Query::Select().GreaterThan("$.field1", "1");
641     vector<Entry> expectEntry = {};
642     EXPECT_TRUE(CheckSchemaQuery(delegate, query, expectEntry, 0, DBStatus::INVALID_QUERY_FORMAT));
643     query = Query::Select().GreaterThanOrEqualTo("$.field1", "1");
644     EXPECT_TRUE(CheckSchemaQuery(delegate, query, expectEntry, 0, DBStatus::INVALID_QUERY_FORMAT));
645     query = Query::Select().LessThan("$.field1", "1");
646     EXPECT_TRUE(CheckSchemaQuery(delegate, query, expectEntry, 0, DBStatus::INVALID_QUERY_FORMAT));
647     query = Query::Select().LessThanOrEqualTo("$.field1", "1");
648     EXPECT_TRUE(CheckSchemaQuery(delegate, query, expectEntry, 0, DBStatus::INVALID_QUERY_FORMAT));
649     query = Query::Select().OrderBy("$.field1", true);
650     EXPECT_TRUE(CheckSchemaQuery(delegate, query, expectEntry, 0, DBStatus::INVALID_QUERY_FORMAT));
651 
652     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
653 }
654 
CheckSchemaExceptionValue(KvStoreNbDelegate * & delegate,vector<Entry> & entries)655 bool CheckSchemaExceptionValue(KvStoreNbDelegate *&delegate, vector<Entry> &entries)
656 {
657     bool result = true;
658     string valueStringTen = "10"; // string 10
659     string valueString = "abc";
660     float valueFloat = 10.0; // float 10.0
661     bool valueBool = false; // boolean false
662     vector<Query> queries1, queries2, queries3;
663     queries1.push_back(Query::Select().EqualTo("$.field1", valueString));
664     queries1.push_back(Query::Select().EqualTo("$.field1", valueBool));
665 
666     queries2.push_back(Query::Select().NotEqualTo("$.field1", valueString));
667     queries2.push_back(Query::Select().NotEqualTo("$.field1", valueBool));
668 
669     vector<string> valuesString = {"abc"};
670     vector<bool> valuesBool = {false};
671     vector<double> valuesDouble = {10.5};
672     queries1.push_back(Query::Select().In("$.field1", valuesString));
673     queries1.push_back(Query::Select().In("$.field1", valuesBool));
674     queries1.push_back(Query::Select().In("$.field1", valuesDouble));
675 
676     queries2.push_back(Query::Select().NotIn("$.field1", valuesString));
677     queries2.push_back(Query::Select().NotIn("$.field1", valuesBool));
678     queries2.push_back(Query::Select().NotIn("$.field1", valuesDouble));
679 
680     queries1.push_back(Query::Select().GreaterThan("$.field1", valueString));
681     queries3.push_back(Query::Select().GreaterThan("$.field1", valueBool));
682 
683     queries2.push_back(Query::Select().GreaterThanOrEqualTo("$.field1", valueStringTen));
684     queries2.push_back(Query::Select().GreaterThanOrEqualTo("$.field1", valueFloat));
685     queries1.push_back(Query::Select().GreaterThanOrEqualTo("$.field1", valueString));
686     queries3.push_back(Query::Select().GreaterThanOrEqualTo("$.field1", valueBool));
687 
688     vector<Entry> expectEntry3 = {};
689     Query query = Query::Select().LessThan("$.field1", valueStringTen);
690     result = CheckSchemaQuery(delegate, query, expectEntry3, 0, DBStatus::NOT_FOUND) && result;
691     query = Query::Select().LessThan("$.field1", valueFloat);
692     result = CheckSchemaQuery(delegate, query, expectEntry3, 0, DBStatus::NOT_FOUND) && result;
693 
694     queries2.push_back(Query::Select().LessThan("$.field1", valueString));
695     queries3.push_back(Query::Select().LessThan("$.field1", valueBool));
696 
697     queries2.push_back(Query::Select().LessThanOrEqualTo("$.field1", valueString));
698     queries3.push_back(Query::Select().LessThanOrEqualTo("$.field1", valueBool));
699 
700     vector<Entry> entries1;
701     for (auto const &it : queries1) {
702         result = (delegate->GetEntries(it, entries1) == NOT_FOUND) && result;
703     }
704     vector<Entry> expectEntry2 =
705         {entries[INDEX_ZEROTH], entries[INDEX_SECOND], entries[INDEX_THIRD], entries[INDEX_FORTH]};
706     for (auto &it : queries2) {
707         result = CheckSchemaQuery(delegate, it, expectEntry2, SCHEMA_GOT_COUNT_4, DBStatus::OK) && result;
708     }
709     for (auto &it : queries3) {
710         result = CheckSchemaQuery(delegate, it, expectEntry3, 0, DBStatus::INVALID_QUERY_FORMAT) && result;
711     }
712     return result;
713 }
714 
CheckSchemaIntValue(KvStoreNbDelegate * & delegate,vector<Entry> & entries)715 bool CheckSchemaIntValue(KvStoreNbDelegate *&delegate, vector<Entry> &entries)
716 {
717     bool result = true;
718     string valueStringTen = "10"; // string 10
719     float valueFloat = 10.0; // float 10.0
720     double valueDouble = 10.5; // double value 10.5
721     Query query = Query::Select().EqualTo("$.field1", valueStringTen);
722     vector<Entry> expectEntry1 = {entries[INDEX_ZEROTH], entries[INDEX_THIRD]};
723     result = CheckSchemaQuery(delegate, query, expectEntry1, SCHEMA_GOT_COUNT_2, DBStatus::OK) && result;
724     query = Query::Select().EqualTo("$.field1", valueFloat);
725     result = CheckSchemaQuery(delegate, query, expectEntry1, SCHEMA_GOT_COUNT_2, DBStatus::OK) && result;
726     query = Query::Select().EqualTo("$.field1", valueDouble);
727     vector<Entry> entries1;
728     result = (delegate->GetEntries(query, entries1) == NOT_FOUND) && result;
729 
730     query = Query::Select().NotEqualTo("$.field1", valueStringTen);
731     vector<Entry> expectEntry2 = {entries[INDEX_SECOND], entries[INDEX_FORTH]};
732     result = CheckSchemaQuery(delegate, query, expectEntry2, SCHEMA_GOT_COUNT_2, DBStatus::OK) && result;
733     query = Query::Select().NotEqualTo("$.field1", valueFloat);
734     result = CheckSchemaQuery(delegate, query, expectEntry2, SCHEMA_GOT_COUNT_2, DBStatus::OK) && result;
735 
736     query = Query::Select().GreaterThan("$.field1", valueStringTen);
737     result = CheckSchemaQuery(delegate, query, expectEntry2, SCHEMA_GOT_COUNT_2, DBStatus::OK) && result;
738     query = Query::Select().GreaterThan("$.field1", valueFloat);
739     result = CheckSchemaQuery(delegate, query, expectEntry2, SCHEMA_GOT_COUNT_2, DBStatus::OK) && result;
740 
741     query = Query::Select().LessThanOrEqualTo("$.field1", valueStringTen);
742     result = CheckSchemaQuery(delegate, query, expectEntry1, SCHEMA_GOT_COUNT_2, DBStatus::OK) && result;
743     query = Query::Select().LessThanOrEqualTo("$.field1", valueFloat);
744     result = CheckSchemaQuery(delegate, query, expectEntry1, SCHEMA_GOT_COUNT_2, DBStatus::OK) && result;
745 
746     vector<string> valuesStringTen = {"10"};
747     vector<float> valuesFloat = {10.0};
748     query = Query::Select().In("$.field1", valuesStringTen);
749     result = CheckSchemaQuery(delegate, query, expectEntry1, SCHEMA_GOT_COUNT_2, DBStatus::OK) && result;
750     query = Query::Select().In("$.field1", valuesFloat);
751     result = CheckSchemaQuery(delegate, query, expectEntry1, SCHEMA_GOT_COUNT_2, DBStatus::OK) && result;
752 
753     query = Query::Select().NotIn("$.field1", valuesStringTen);
754     result = CheckSchemaQuery(delegate, query, expectEntry2, SCHEMA_GOT_COUNT_2, DBStatus::OK) && result;
755     query = Query::Select().NotIn("$.field1", valuesFloat);
756     result = CheckSchemaQuery(delegate, query, expectEntry2, SCHEMA_GOT_COUNT_2, DBStatus::OK) && result;
757 
758     query = Query::Select().GreaterThan("$.field1", valueDouble);
759     result = CheckSchemaQuery(delegate, query, expectEntry2, SCHEMA_GOT_COUNT_2, DBStatus::OK) && result;
760     query = Query::Select().GreaterThanOrEqualTo("$.field1", valueDouble);
761     result = CheckSchemaQuery(delegate, query, expectEntry2, SCHEMA_GOT_COUNT_2, DBStatus::OK) && result;
762 
763     query = Query::Select().LessThan("$.field1", valueDouble);
764     result = CheckSchemaQuery(delegate, query, expectEntry1, SCHEMA_GOT_COUNT_2, DBStatus::OK) && result;
765     query = Query::Select().LessThanOrEqualTo("$.field1", valueDouble);
766     result = CheckSchemaQuery(delegate, query, expectEntry1, SCHEMA_GOT_COUNT_2, DBStatus::OK) && result;
767 
768     query = Query::Select().NotEqualTo("$.field1", valueDouble);
769     expectEntry2 = {entries[INDEX_ZEROTH], entries[INDEX_SECOND], entries[INDEX_THIRD], entries[INDEX_FORTH]};
770     result = CheckSchemaQuery(delegate, query, expectEntry2, SCHEMA_GOT_COUNT_4, DBStatus::OK) && result;
771 
772     return result;
773 }
774 
775 /**
776  * @tc.name: Query 005
777  * @tc.desc: check valid schema of Int type and construct valid query object and traverse all function of Query.
778  * @tc.type: FUNC
779  * @tc.require: SR000DR9JP
780  * @tc.author: fengxiaoyun
781  */
782 HWTEST_F(DistributeddbNbPredicateQueryTest, Query005, TestSize.Level0)
783 {
784     KvStoreNbDelegate *delegate = nullptr;
785     KvStoreDelegateManager *manager = nullptr;
786     vector<Entry> entries;
787     /**
788      * @tc.steps: step1. create schema db and put 5 entries which has valid schema constructor
789      *    and has the value given to db.
790      * @tc.expected: step1. create and put successfully.
791      */
792     PrepareSchemaDBAndData(delegate, manager, INTEGER_SCHEMA_VALUE, entries, VALID_DEFINE_INT);
793 
794     /**
795      * @tc.steps: step2. test the Query interface of EqualTo/NotEqualTo/In/NotIn/GreaterThan/LessThan/
796      *    GreaterThanOrEqualTo/LessThanOrEqualTo and check the return query with GetEntries.
797      * @tc.expected: step2. each interface called ok and GetEntries return right result.
798      */
799     Query query1 = Query::Select().EqualTo("$.field1", 10);
800     vector<Entry> expectEntry = {entries[INDEX_ZEROTH], entries[INDEX_THIRD]};
801     EXPECT_TRUE(CheckSchemaQuery(delegate, query1, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
802 
803     Query query2 = Query::Select().NotEqualTo("$.field1", 10);
804     expectEntry = {entries[INDEX_SECOND], entries[INDEX_FORTH]};
805     EXPECT_TRUE(CheckSchemaQuery(delegate, query2, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
806 
807     vector<int> scope = {10};
808     Query query3 = Query::Select().In("$.field1", scope);
809     expectEntry = {entries[INDEX_ZEROTH], entries[INDEX_THIRD]};
810     EXPECT_TRUE(CheckSchemaQuery(delegate, query3, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
811 
812     Query query4 = Query::Select().NotIn("$.field1", scope);
813     expectEntry = {entries[INDEX_SECOND], entries[INDEX_FORTH]};
814     EXPECT_TRUE(CheckSchemaQuery(delegate, query4, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
815 
816     Query query5 = Query::Select().GreaterThan("$.field1", 10);
817     EXPECT_TRUE(CheckSchemaQuery(delegate, query5, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
818 
819     Query query6 = Query::Select().LessThan("$.field1", 10);
820     expectEntry = {};
821     EXPECT_TRUE(CheckSchemaQuery(delegate, query6, expectEntry, 0, DBStatus::NOT_FOUND));
822 
823     Query query7 = Query::Select().GreaterThanOrEqualTo("$.field1", 10);
824     expectEntry = {entries[INDEX_ZEROTH], entries[INDEX_SECOND], entries[INDEX_THIRD], entries[INDEX_FORTH]};
825     EXPECT_TRUE(CheckSchemaQuery(delegate, query7, expectEntry, SCHEMA_GOT_COUNT_4, DBStatus::OK));
826 
827     Query query8 = Query::Select().LessThanOrEqualTo("$.field1", 10);
828     expectEntry = {entries[INDEX_ZEROTH], entries[INDEX_THIRD]};
829     EXPECT_TRUE(CheckSchemaQuery(delegate, query8, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
830     /**
831      * @tc.steps: step3. query the illegal value of field and check with the GetEntries.
832      * @tc.expected: step3. if the value is "0" or 1, can get valid query, or it will return invalid query
833      *    and GetEntries will return NOT_FOUND.
834      */
835     EXPECT_TRUE(CheckSchemaExceptionValue(delegate, entries));
836     EXPECT_TRUE(CheckSchemaIntValue(delegate, entries));
837 
838     /**
839      * @tc.steps: step4. test IsNull interface where field = field3.
840      * @tc.expected: step4. create and put successfully.
841      */
842     Query query9 = Query::Select().IsNull("$.field2.field3");
843     expectEntry = {entries[INDEX_ZEROTH], entries[INDEX_SECOND], entries[INDEX_FORTH]};
844     EXPECT_TRUE(CheckSchemaQuery(delegate, query9, expectEntry, SCHEMA_GOT_COUNT_3, DBStatus::OK));
845 
846     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
847 }
848 
849 template<typename T>
InvalidFieldCheck(KvStoreNbDelegate * & delegate,string field,T value,DBStatus status)850 bool InvalidFieldCheck(KvStoreNbDelegate *&delegate, string field, T value, DBStatus status)
851 {
852     bool result = true;
853     Query query1 = Query::Select().EqualTo(field, value);
854     vector<Entry> expectEntry = {};
855     result = (CheckSchemaQuery(delegate, query1, expectEntry, 0, status)) && result;
856     MST_LOG("Equal to result: %d", result);
857 
858     Query query2 = Query::Select().NotEqualTo(field, value);
859     result = (CheckSchemaQuery(delegate, query2, expectEntry, 0, status)) && result;
860     MST_LOG("NotEqual to result: %d", result);
861 
862     vector<T> scope = {value};
863     Query query3 = Query::Select().In(field, scope);
864     result = (CheckSchemaQuery(delegate, query3, expectEntry, 0, status)) && result;
865     MST_LOG("In result: %d", result);
866 
867     Query query4 = Query::Select().NotIn(field, scope);
868     result = (CheckSchemaQuery(delegate, query4, expectEntry, 0, status)) && result;
869     MST_LOG("NotIn result: %d", result);
870 
871     Query query5 = Query::Select().GreaterThan(field, value);
872     result = (CheckSchemaQuery(delegate, query5, expectEntry, 0, status)) && result;
873     MST_LOG("GreaterThan result: %d", result);
874 
875     Query query6 = Query::Select().LessThan(field, value);
876     result = (CheckSchemaQuery(delegate, query6, expectEntry, 0, status)) && result;
877     MST_LOG("LessThan result: %d", result);
878 
879     Query query7 = Query::Select().GreaterThanOrEqualTo(field, value);
880     result = (CheckSchemaQuery(delegate, query7, expectEntry, 0, status)) && result;
881     MST_LOG("GreaterThanOrEqualTo result: %d", result);
882 
883     Query query8 = Query::Select().LessThanOrEqualTo(field, value);
884     result = (CheckSchemaQuery(delegate, query8, expectEntry, 0, status)) && result;
885     MST_LOG("LessThanOrEqualTo result: %d", result);
886 
887     Query query9 = Query::Select().OrderBy(field);
888     result = (CheckSchemaQueryForOrderBy(delegate, query9, expectEntry, 0, status)) && result;
889     MST_LOG("OrderBy result: %d", result);
890     return result;
891 }
892 
893 /**
894  * @tc.name: Query 006
895  * @tc.desc: check valid schema of Int type and construct invalid field and traverse all function of Query.
896  * @tc.type: FUNC
897  * @tc.require: SR000DR9JP
898  * @tc.author: fengxiaoyun
899  */
900 HWTEST_F(DistributeddbNbPredicateQueryTest, Query006, TestSize.Level0)
901 {
902     KvStoreNbDelegate *delegate = nullptr;
903     KvStoreDelegateManager *manager = nullptr;
904     vector<Entry> entries;
905     /**
906      * @tc.steps: step1. create schema db and put 5 entries which has valid schema constructor
907      *    and has the value given to db.
908      * @tc.expected: step1. create and put successfully.
909      */
910     PrepareSchemaDBAndData(delegate, manager, INTEGER_SCHEMA_VALUE, entries, VALID_DEFINE_INT);
911 
912     /**
913      * @tc.steps: step2. use notexist field5 to test EqualTo/NotEqualTo/In/NotIn/GreaterThan/LessThan/
914      *    GreaterThanOrEqualTo/LessThanOrEqualTo/OrderBy and call GetEntries with Query.
915      * @tc.expected: step2. GetEntries return INVALID_QUERY_FIELD.
916      */
917     int valueIntTen = 10;
918     EXPECT_TRUE(InvalidFieldCheck(delegate, "$.field5", valueIntTen, DBStatus::INVALID_QUERY_FIELD));
919 
920     /**
921      * @tc.steps: step3. use not Leaf node field to test EqualTo/NotEqualTo/In/NotIn/GreaterThan/LessThan/
922      *    GreaterThanOrEqualTo/LessThanOrEqualTo/OrderBy and call GetEntries to check.
923      * @tc.expected: step3. GetEntries return INVALID_QUERY_FIELD.
924      */
925     EXPECT_TRUE(InvalidFieldCheck(delegate, "$.field2.field4", valueIntTen, DBStatus::INVALID_QUERY_FIELD));
926     EXPECT_TRUE(InvalidFieldCheck(delegate, "$.field3.field2", valueIntTen, DBStatus::INVALID_QUERY_FIELD));
927 
928     /**
929      * @tc.steps: step4. use invalid format field to test EqualTo/NotEqualTo/In/NotIn/GreaterThan/LessThan/
930      *    GreaterThanOrEqualTo/LessThanOrEqualTo/OrderBy and call GetEntries with Query.
931      * @tc.expected: step4. GetEntries return INVALID_QUERY_FORMAT.
932      */
933     EXPECT_TRUE(InvalidFieldCheck(delegate, ".field2.field3", valueIntTen, DBStatus::INVALID_QUERY_FORMAT));
934     EXPECT_TRUE(InvalidFieldCheck(delegate, "$$field1", valueIntTen, DBStatus::INVALID_QUERY_FORMAT));
935 
936     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
937 }
938 
939 /**
940  * @tc.name: Query 007
941  * @tc.desc: check valid schema of Long type and construct valid query object and traverse all function of Query.
942  * @tc.type: FUNC
943  * @tc.require: SR000DR9JP
944  * @tc.author: fengxiaoyun
945  */
946 HWTEST_F(DistributeddbNbPredicateQueryTest, Query007, TestSize.Level0)
947 {
948     KvStoreNbDelegate *delegate = nullptr;
949     KvStoreDelegateManager *manager = nullptr;
950     vector<Entry> entries;
951     /**
952      * @tc.steps: step1. create schema db and put 5 entries which has valid schema constructor
953      *    and has the value given to db.
954      * @tc.expected: step1. create and put successfully.
955      */
956     PrepareSchemaDBAndData(delegate, manager, LONG_SCHEMA_VALUE, entries, VALID_DEFINE_LONG);
957 
958     /**
959      * @tc.steps: step2. test the Query interface of EqualTo/NotEqualTo/In/NotIn/GreaterThan/LessThan/
960      *    GreaterThanOrEqualTo/LessThanOrEqualTo and check the return query with GetEntries.
961      * @tc.expected: step2. each interface called ok and GetEntries return right result.
962      */
963     Query query1 = Query::Select().EqualTo("$.field1", 10);
964     vector<Entry> expectEntry = {entries[INDEX_ZEROTH], entries[INDEX_THIRD]};
965     EXPECT_TRUE(CheckSchemaQuery(delegate, query1, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
966 
967     Query query2 = Query::Select().NotEqualTo("$.field1", 10);
968     expectEntry = {entries[INDEX_SECOND], entries[INDEX_FORTH]};
969     EXPECT_TRUE(CheckSchemaQuery(delegate, query2, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
970 
971     vector<int> scope = {10, -10};
972     Query query3 = Query::Select().In("$.field1", scope);
973     expectEntry = {entries[INDEX_ZEROTH], entries[INDEX_THIRD]};
974     EXPECT_TRUE(CheckSchemaQuery(delegate, query3, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
975 
976     Query query4 = Query::Select().NotIn("$.field1", scope);
977     expectEntry = {entries[INDEX_SECOND], entries[INDEX_FORTH]};
978     EXPECT_TRUE(CheckSchemaQuery(delegate, query4, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
979 
980     Query query5 = Query::Select().GreaterThan("$.field1", 10);
981     EXPECT_TRUE(CheckSchemaQuery(delegate, query5, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
982 
983     Query query6 = Query::Select().LessThan("$.field1", 10);
984     expectEntry = {};
985     EXPECT_TRUE(CheckSchemaQuery(delegate, query6, expectEntry, 0, DBStatus::NOT_FOUND));
986 
987     Query query7 = Query::Select().GreaterThanOrEqualTo("$.field1", 10);
988     expectEntry = {entries[INDEX_ZEROTH], entries[INDEX_SECOND], entries[INDEX_THIRD], entries[INDEX_FORTH]};
989     EXPECT_TRUE(CheckSchemaQuery(delegate, query7, expectEntry, SCHEMA_GOT_COUNT_4, DBStatus::OK));
990 
991     Query query8 = Query::Select().LessThanOrEqualTo("$.field1", 10);
992     expectEntry = {entries[INDEX_ZEROTH], entries[INDEX_THIRD]};
993     EXPECT_TRUE(CheckSchemaQuery(delegate, query8, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
994     /**
995      * @tc.steps: step3. query the exception value of field and check with the GetEntries.
996      * @tc.expected: step3. if the value is "10" or 10.0, can get valid query, or it will return invalid query
997      *    and GetEntries will return NOT_FOUND.
998      */
999     EXPECT_TRUE(CheckSchemaExceptionValue(delegate, entries));
1000     EXPECT_TRUE(CheckSchemaIntValue(delegate, entries));
1001 
1002     /**
1003      * @tc.steps: step4. test IsNull interface where field = field3.
1004      * @tc.expected: step4. create and put successfully.
1005      */
1006     Query query9 = Query::Select().IsNull("$.field2.field3");
1007     expectEntry = {entries[INDEX_ZEROTH], entries[INDEX_SECOND], entries[INDEX_FORTH]};
1008     EXPECT_TRUE(CheckSchemaQuery(delegate, query9, expectEntry, SCHEMA_GOT_COUNT_3, DBStatus::OK));
1009 
1010     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
1011 }
1012 
1013 /**
1014  * @tc.name: Query 008
1015  * @tc.desc: check valid schema of Long type and construct invalid field and traverse all function of Query.
1016  * @tc.type: FUNC
1017  * @tc.require: SR000DR9JP
1018  * @tc.author: fengxiaoyun
1019  */
1020 HWTEST_F(DistributeddbNbPredicateQueryTest, Query008, TestSize.Level0)
1021 {
1022     KvStoreNbDelegate *delegate = nullptr;
1023     KvStoreDelegateManager *manager = nullptr;
1024     vector<Entry> entries;
1025     /**
1026      * @tc.steps: step1. create schema db and put 5 entries which has valid schema constructor
1027      *    and has the value given to db.
1028      * @tc.expected: step1. create and put successfully.
1029      */
1030     PrepareSchemaDBAndData(delegate, manager, LONG_SCHEMA_VALUE, entries, VALID_DEFINE_LONG);
1031 
1032     /**
1033      * @tc.steps: step2. use notexist field5 to test EqualTo/NotEqualTo/In/NotIn/GreaterThan/LessThan/
1034      *    GreaterThanOrEqualTo/LessThanOrEqualTo/OrderBy and call GetEntries with Query.
1035      * @tc.expected: step2. GetEntries return INVALID_QUERY_FIELD.
1036      */
1037     int64_t valueLongTen = 10;
1038     EXPECT_TRUE(InvalidFieldCheck(delegate, "$.field5", valueLongTen, DBStatus::INVALID_QUERY_FIELD));
1039 
1040     /**
1041      * @tc.steps: step3. use not Leaf node field to test EqualTo/NotEqualTo/In/NotIn/GreaterThan/LessThan/
1042      *    GreaterThanOrEqualTo/LessThanOrEqualTo/OrderBy and call GetEntries to check.
1043      * @tc.expected: step3. GetEntries return INVALID_QUERY_FIELD.
1044      */
1045     EXPECT_TRUE(InvalidFieldCheck(delegate, "$.field2.field4", valueLongTen, DBStatus::INVALID_QUERY_FIELD));
1046     EXPECT_TRUE(InvalidFieldCheck(delegate, "$.field3.field2", valueLongTen, DBStatus::INVALID_QUERY_FIELD));
1047     /**
1048      * @tc.steps: step4. use invalid format field to test EqualTo/NotEqualTo/In/NotIn/GreaterThan/LessThan/
1049      *    GreaterThanOrEqualTo/LessThanOrEqualTo/OrderBy and call GetEntries with Query.
1050      * @tc.expected: step4. GetEntries return INVALID_QUERY_FORMAT.
1051      */
1052     EXPECT_TRUE(InvalidFieldCheck(delegate, ".field2.field3", valueLongTen, DBStatus::INVALID_QUERY_FORMAT));
1053     EXPECT_TRUE(InvalidFieldCheck(delegate, "$$field1", valueLongTen, DBStatus::INVALID_QUERY_FORMAT));
1054 
1055     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
1056 }
1057 
CheckSchemaDoubleExceptionValue(KvStoreNbDelegate * & delegate,vector<Entry> & entries)1058 bool CheckSchemaDoubleExceptionValue(KvStoreNbDelegate *&delegate, vector<Entry> &entries)
1059 {
1060     bool result = true;
1061     string valueString = "abc";
1062     int64_t valueLong = 15; // long value 15
1063     vector<Query> queries1, queries2;
1064     queries1.push_back(Query::Select().EqualTo("$.field1", valueString));
1065     queries1.push_back(Query::Select().EqualTo("$.field1", valueLong));
1066 
1067     queries2.push_back(Query::Select().NotEqualTo("$.field1", valueString));
1068     queries2.push_back(Query::Select().NotEqualTo("$.field1", valueLong));
1069 
1070     vector<string> valuesStringZeroPoint = {"0.0"};
1071     vector<bool> valuesBool = {false};
1072     vector<string> valuesString = {"abc"};
1073     vector<int64_t> valuesLong = {15};
1074     Query query = Query::Select().In("$.field1", valuesStringZeroPoint);
1075     vector<Entry> expectEntry1 = {entries[INDEX_FORTH]};
1076     result = CheckSchemaQuery(delegate, query, expectEntry1, SCHEMA_GOT_COUNT_1, DBStatus::OK) && result;
1077     query = Query::Select().In("$.field1", valuesBool);
1078     result = CheckSchemaQuery(delegate, query, expectEntry1, SCHEMA_GOT_COUNT_1, DBStatus::OK) && result;
1079     queries1.push_back(Query::Select().In("$.field1", valuesString));
1080     queries1.push_back(Query::Select().In("$.field1", valuesLong));
1081 
1082     query = Query::Select().NotIn("$.field1", valuesStringZeroPoint);
1083     vector<Entry> expectEntry2 = {entries[INDEX_FIRST], entries[INDEX_SECOND], entries[INDEX_THIRD]};
1084     result = CheckSchemaQuery(delegate, query, expectEntry2, SCHEMA_GOT_COUNT_3, DBStatus::OK) && result;
1085     query = Query::Select().NotIn("$.field1", valuesBool);
1086     result = CheckSchemaQuery(delegate, query, expectEntry2, SCHEMA_GOT_COUNT_3, DBStatus::OK) && result;
1087     queries2.push_back(Query::Select().NotIn("$.field1", valuesString));
1088     queries2.push_back(Query::Select().NotIn("$.field1", valuesLong));
1089 
1090     queries1.push_back(Query::Select().GreaterThan("$.field1", valueString));
1091     queries1.push_back(Query::Select().GreaterThan("$.field1", valueLong));
1092 
1093     queries1.push_back(Query::Select().GreaterThanOrEqualTo("$.field1", valueString));
1094     queries1.push_back(Query::Select().GreaterThanOrEqualTo("$.field1", valueLong));
1095 
1096     queries2.push_back(Query::Select().LessThan("$.field1", valueString));
1097     queries2.push_back(Query::Select().LessThan("$.field1", valueLong));
1098 
1099     queries2.push_back(Query::Select().LessThanOrEqualTo("$.field1", valueString));
1100     queries2.push_back(Query::Select().LessThanOrEqualTo("$.field1", valueLong));
1101 
1102     vector<Entry> entries1;
1103     for (auto const &it : queries1) {
1104         result = (delegate->GetEntries(it, entries1) == NOT_FOUND) && result;
1105     }
1106     expectEntry2 = {entries[INDEX_FIRST], entries[INDEX_SECOND], entries[INDEX_THIRD], entries[INDEX_FORTH]};
1107     for (auto &it : queries2) {
1108         result = CheckSchemaQuery(delegate, it, expectEntry2, SCHEMA_GOT_COUNT_4, DBStatus::OK) && result;
1109     }
1110     return result;
1111 }
1112 
CheckSchemaDoubleValue(KvStoreNbDelegate * & delegate,vector<Entry> & entries)1113 bool CheckSchemaDoubleValue(KvStoreNbDelegate *&delegate, vector<Entry> &entries)
1114 {
1115     bool result = true;
1116     string valueStringZeroPoint = "0.0"; // string 0.0
1117     bool valueBool = false; // boolean false
1118     Query query = Query::Select().EqualTo("$.field1", valueStringZeroPoint);
1119     vector<Entry> expectEntry1 = {entries[INDEX_FORTH]};
1120     result = CheckSchemaQuery(delegate, query, expectEntry1, SCHEMA_GOT_COUNT_1, DBStatus::OK) && result;
1121     query = Query::Select().EqualTo("$.field1", valueBool);
1122     result = CheckSchemaQuery(delegate, query, expectEntry1, SCHEMA_GOT_COUNT_1, DBStatus::OK) && result;
1123 
1124     query = Query::Select().NotEqualTo("$.field1", valueStringZeroPoint);
1125     vector<Entry> expectEntry2 = {entries[INDEX_FIRST], entries[INDEX_SECOND], entries[INDEX_THIRD]};
1126     result = CheckSchemaQuery(delegate, query, expectEntry2, SCHEMA_GOT_COUNT_3, DBStatus::OK) && result;
1127     query = Query::Select().NotEqualTo("$.field1", valueBool);
1128     result = CheckSchemaQuery(delegate, query, expectEntry2, SCHEMA_GOT_COUNT_3, DBStatus::OK) && result;
1129 
1130     query = Query::Select().GreaterThan("$.field1", valueStringZeroPoint);
1131     vector<Entry> expectEntry3 = {entries[INDEX_FIRST], entries[INDEX_THIRD]};
1132     result = CheckSchemaQuery(delegate, query, expectEntry3, SCHEMA_GOT_COUNT_2, DBStatus::OK) && result;
1133     query = Query::Select().GreaterThan("$.field1", valueBool);
1134     expectEntry3 = {};
1135     result = CheckSchemaQuery(delegate, query, expectEntry3, 0, DBStatus::INVALID_QUERY_FORMAT) && result;
1136 
1137     query = Query::Select().GreaterThanOrEqualTo("$.field1", valueStringZeroPoint);
1138     expectEntry2 = {entries[INDEX_FIRST], entries[INDEX_THIRD], entries[INDEX_FORTH]};
1139     result = CheckSchemaQuery(delegate, query, expectEntry2, SCHEMA_GOT_COUNT_3, DBStatus::OK) && result;
1140     query = Query::Select().GreaterThanOrEqualTo("$.field1", valueBool);
1141     result = CheckSchemaQuery(delegate, query, expectEntry3, 0, DBStatus::INVALID_QUERY_FORMAT) && result;
1142 
1143     query = Query::Select().LessThan("$.field1", valueStringZeroPoint);
1144     expectEntry2 = {entries[INDEX_SECOND]};
1145     result = CheckSchemaQuery(delegate, query, expectEntry2, SCHEMA_GOT_COUNT_1, DBStatus::OK) && result;
1146     query = Query::Select().LessThan("$.field1", valueBool);
1147     result = CheckSchemaQuery(delegate, query, expectEntry3, 0, DBStatus::INVALID_QUERY_FORMAT) && result;
1148 
1149     query = Query::Select().LessThanOrEqualTo("$.field1", valueStringZeroPoint);
1150     expectEntry1 = {entries[INDEX_SECOND], entries[INDEX_FORTH]};
1151     result = CheckSchemaQuery(delegate, query, expectEntry1, SCHEMA_GOT_COUNT_2, DBStatus::OK) && result;
1152     query = Query::Select().LessThanOrEqualTo("$.field1", valueBool);
1153     result = CheckSchemaQuery(delegate, query, expectEntry3, 0, DBStatus::INVALID_QUERY_FORMAT) && result;
1154 
1155     return result;
1156 }
1157 /**
1158  * @tc.name: Query 009
1159  * @tc.desc: check valid schema of Double type and construct valid query object and traverse all function of Query.
1160  * @tc.type: FUNC
1161  * @tc.require: SR000DR9JP
1162  * @tc.author: fengxiaoyun
1163  */
1164 HWTEST_F(DistributeddbNbPredicateQueryTest, Query009, TestSize.Level0)
1165 {
1166     KvStoreNbDelegate *delegate = nullptr;
1167     KvStoreDelegateManager *manager = nullptr;
1168     vector<Entry> entries;
1169     /**
1170      * @tc.steps: step1. create schema db and put 5 entries which has valid schema constructor
1171      *    and has the value given to db.
1172      * @tc.expected: step1. create and put successfully.
1173      */
1174     PrepareSchemaDBAndData(delegate, manager, DOUBLE_SCHEMA_VALUE, entries, VALID_DEFINE_DOUBLE);
1175 
1176     /**
1177      * @tc.steps: step2. test the Query interface of EqualTo/NotEqualTo/In/NotIn/GreaterThan/LessThan/
1178      *    GreaterThanOrEqualTo/LessThanOrEqualTo and check the return query with GetEntries.
1179      * @tc.expected: step2. each interface called ok and GetEntries return right result.
1180      */
1181     Query query1 = Query::Select().EqualTo("$.field1", 10);
1182     vector<Entry> expectEntry = {entries[INDEX_FIRST]};
1183     EXPECT_TRUE(CheckSchemaQuery(delegate, query1, expectEntry, SCHEMA_GOT_COUNT_1, DBStatus::OK));
1184 
1185     Query query2 = Query::Select().NotEqualTo("$.field1", 10);
1186     expectEntry = {entries[INDEX_SECOND], entries[INDEX_THIRD], entries[INDEX_FORTH]};
1187     EXPECT_TRUE(CheckSchemaQuery(delegate, query2, expectEntry, SCHEMA_GOT_COUNT_3, DBStatus::OK));
1188 
1189     vector<int> scope = {10, -10};
1190     Query query3 = Query::Select().In("$.field1", scope);
1191     expectEntry = {entries[INDEX_FIRST], entries[INDEX_SECOND]};
1192     EXPECT_TRUE(CheckSchemaQuery(delegate, query3, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
1193 
1194     Query query4 = Query::Select().NotIn("$.field1", scope);
1195     expectEntry = {entries[INDEX_THIRD], entries[INDEX_FORTH]};
1196     EXPECT_TRUE(CheckSchemaQuery(delegate, query4, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
1197 
1198     Query query5 = Query::Select().GreaterThan("$.field1", 10);
1199     expectEntry = {entries[INDEX_THIRD]};
1200     EXPECT_TRUE(CheckSchemaQuery(delegate, query5, expectEntry, SCHEMA_GOT_COUNT_1, DBStatus::OK));
1201 
1202     Query query6 = Query::Select().LessThan("$.field1", 10);
1203     expectEntry = {entries[INDEX_SECOND], entries[INDEX_FORTH]};
1204     EXPECT_TRUE(CheckSchemaQuery(delegate, query6, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
1205 
1206     Query query7 = Query::Select().GreaterThanOrEqualTo("$.field1", 10);
1207     expectEntry = {entries[INDEX_FIRST], entries[INDEX_THIRD]};
1208     EXPECT_TRUE(CheckSchemaQuery(delegate, query7, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
1209 
1210     Query query8 = Query::Select().LessThanOrEqualTo("$.field1", 10);
1211     expectEntry = {entries[INDEX_FIRST], entries[INDEX_SECOND], entries[INDEX_FORTH]};
1212     EXPECT_TRUE(CheckSchemaQuery(delegate, query8, expectEntry, SCHEMA_GOT_COUNT_3, DBStatus::OK));
1213     /**
1214      * @tc.steps: step3. query the exception value of field and check with the GetEntries.
1215      * @tc.expected: step3. if the value is "0.0" or false, can get valid query, or it will return invalid query
1216      *    and GetEntries will return NOT_FOUND.
1217      */
1218     EXPECT_TRUE(CheckSchemaDoubleExceptionValue(delegate, entries));
1219     EXPECT_TRUE(CheckSchemaDoubleValue(delegate, entries));
1220 
1221     /**
1222      * @tc.steps: step4. test IsNull interface where field = field3.
1223      * @tc.expected: step4. create and put successfully.
1224      */
1225     Query query9 = Query::Select().IsNull("$.field2.field3");
1226     expectEntry = {entries[INDEX_FIRST], entries[INDEX_THIRD]};
1227     EXPECT_TRUE(CheckSchemaQuery(delegate, query9, expectEntry, SCHEMA_GOT_COUNT_2, DBStatus::OK));
1228 
1229     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
1230 }
1231 
1232 /**
1233  * @tc.name: Query 010
1234  * @tc.desc: check valid schema of Double type and construct invalid field and traverse all function of Query.
1235  * @tc.type: FUNC
1236  * @tc.require: SR000DR9JP
1237  * @tc.author: fengxiaoyun
1238  */
1239 HWTEST_F(DistributeddbNbPredicateQueryTest, Query010, TestSize.Level0)
1240 {
1241     KvStoreNbDelegate *delegate = nullptr;
1242     KvStoreDelegateManager *manager = nullptr;
1243     vector<Entry> entries;
1244     /**
1245      * @tc.steps: step1. create schema db and put 5 entries which has valid schema constructor
1246      *    and has the value given to db.
1247      * @tc.expected: step1. create and put successfully.
1248      */
1249     PrepareSchemaDBAndData(delegate, manager, DOUBLE_SCHEMA_VALUE, entries, VALID_DEFINE_DOUBLE);
1250 
1251     /**
1252      * @tc.steps: step2. use notexist field5 to test EqualTo/NotEqualTo/In/NotIn/GreaterThan/LessThan/
1253      *    GreaterThanOrEqualTo/LessThanOrEqualTo/OrderBy and call GetEntries with Query.
1254      * @tc.expected: step2. GetEntries return INVALID_QUERY_FIELD.
1255      */
1256     double valueDoubleTen = 10.0;
1257     EXPECT_TRUE(InvalidFieldCheck(delegate, "$.field5", valueDoubleTen, DBStatus::INVALID_QUERY_FIELD));
1258 
1259     /**
1260      * @tc.steps: step3. use not Leaf node field to test EqualTo/NotEqualTo/In/NotIn/GreaterThan/LessThan/
1261      *    GreaterThanOrEqualTo/LessThanOrEqualTo/OrderBy and call GetEntries to check.
1262      * @tc.expected: step3. GetEntries return INVALID_QUERY_FIELD.
1263      */
1264     EXPECT_TRUE(InvalidFieldCheck(delegate, "$.field2.field4", valueDoubleTen, DBStatus::INVALID_QUERY_FIELD));
1265     EXPECT_TRUE(InvalidFieldCheck(delegate, "$.field3.field2", valueDoubleTen, DBStatus::INVALID_QUERY_FIELD));
1266     /**
1267      * @tc.steps: step4. use invalid format field to test EqualTo/NotEqualTo/In/NotIn/GreaterThan/LessThan/
1268      *    GreaterThanOrEqualTo/LessThanOrEqualTo/OrderBy and call GetEntries with Query.
1269      * @tc.expected: step4. GetEntries return INVALID_QUERY_FORMAT.
1270      */
1271     EXPECT_TRUE(InvalidFieldCheck(delegate, ".field2.field3", valueDoubleTen, DBStatus::INVALID_QUERY_FORMAT));
1272     EXPECT_TRUE(InvalidFieldCheck(delegate, "$$field1", valueDoubleTen, DBStatus::INVALID_QUERY_FORMAT));
1273 
1274     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
1275 }
1276 
1277 /**
1278  * @tc.name: Query 011
1279  * @tc.desc: verify that GetCount interface can return right value of the valid query object.
1280  * @tc.type: FUNC
1281  * @tc.require: SR000DR9JP
1282  * @tc.author: fengxiaoyun
1283  */
1284 HWTEST_F(DistributeddbNbPredicateQueryTest, Query011, TestSize.Level0)
1285 {
1286     KvStoreNbDelegate *delegate = nullptr;
1287     KvStoreDelegateManager *manager = nullptr;
1288     /**
1289      * @tc.steps: step1. create common db and close it, and then open it with schema mode and put some schema data to
1290      *    the new mode db;
1291      * @tc.expected: step1. operate successfully.
1292      */
1293     Option option = g_option;
1294     option.isMemoryDb = false;
1295     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
1296     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
1297     EXPECT_TRUE(manager->CloseKvStore(delegate) == OK);
1298     delegate = nullptr;
1299 
1300     vector<Entry> entries;
1301     PrepareSchemaDBAndData(delegate, manager, COMBINE_SCHEMA_VALUE, entries, VALID_COMBINATION_DEFINE);
1302 
1303     /**
1304      * @tc.steps: step2. construct query object that test combination interface of LessThan on field5 = 100,
1305      *    and NotEqualTo on field7 = -100 and NotLike on field1 = "%c".
1306      * @tc.expected: step2. construct successfully.
1307      */
1308     Query query1 = Query::Select().LessThan("$.field2.field4.field5", 100).And().
1309         NotEqualTo("$.field2.field4.field6.field7", -100).And().NotLike("$.field1", "%c");
1310 
1311     /**
1312      * @tc.steps: step3. use GetCount interface to check the count of records in the query object.
1313      * @tc.expected: step3. the count is 4.
1314      */
1315     int count = 0;
1316     EXPECT_TRUE(delegate->GetCount(query1, count) == DBStatus::OK);
1317     EXPECT_EQ(count, SCHEMA_GOT_COUNT_4);
1318 
1319     /**
1320      * @tc.steps: step4. construct query object that test combination interface of LessThan on field5 = 100,
1321      *    and NotEqualTo on field7 = -100 or NotLike on field1 = "%c".
1322      * @tc.expected: step4. construct successfully.
1323      */
1324     Query query2 = Query::Select().LessThan("$.field2.field4.field5", 100).And().
1325         NotEqualTo("$.field2.field4.field6.field7", -100).Or().NotLike("$.field1", "%c");
1326 
1327     /**
1328      * @tc.steps: step5. use GetCount interface to check the count of records in the query object.
1329      * @tc.expected: step5. the count is 7.
1330      */
1331     EXPECT_TRUE(delegate->GetCount(query2, count) == DBStatus::OK);
1332     EXPECT_EQ(count, (SCHEMA_GOT_COUNT_4 + SCHEMA_GOT_COUNT_3));
1333 
1334     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
1335 }
1336 
1337 /**
1338  * @tc.name: Query 012
1339  * @tc.desc: verify that OrderBy and Limit interface and the offset of limit is smaller than the count of the records
1340  *    got can return right value of the valid query object.
1341  * @tc.type: FUNC
1342  * @tc.require: SR000DR9JP
1343  * @tc.author: fengxiaoyun
1344  */
1345 HWTEST_F(DistributeddbNbPredicateQueryTest, Query012, TestSize.Level0)
1346 {
1347     KvStoreNbDelegate *delegate = nullptr;
1348     KvStoreDelegateManager *manager = nullptr;
1349     /**
1350      * @tc.steps: step1. create db of schema mode and put some schema data the db;
1351      * @tc.expected: step1. create and put successfully.
1352      */
1353     vector<Entry> entries;
1354     PrepareSchemaDBAndData(delegate, manager, COMBINE_SCHEMA_VALUE, entries, VALID_COMBINATION_DEFINE);
1355 
1356     /**
1357      * @tc.steps: step2. construct query object that test combination interface of GreaterThanOrEqualTo on
1358      *    field7 = 0, and EqualTo on field3 = true and then OrderBy on field5 by asec when get 3 records begin from 1.
1359      * @tc.expected: step2. construct successfully.
1360      */
1361     Query query = Query::Select().GreaterThanOrEqualTo("$.field2.field4.field6.field7", 0).And().
1362         EqualTo("$.field2.field3", true).OrderBy("$.field2.field4.field5", false).Limit(3, 1);
1363 
1364     /**
1365      * @tc.steps: step3. use GetEntries interface to get the resultSet in the query object.
1366      * @tc.expected: step3. the count is 4.
1367      */
1368     KvStoreResultSet *resultSet = nullptr;
1369     Entry entry;
1370     EXPECT_EQ(delegate->GetEntries(query, resultSet), DBStatus::OK);
1371     EXPECT_EQ(resultSet->GetCount(), SCHEMA_GOT_COUNT_3);
1372     EXPECT_EQ(resultSet->GetPosition(), CURSOR_POSITION_NEGATIVE1);
1373     EXPECT_EQ(resultSet->MoveToPrevious(), false);
1374     EXPECT_EQ(resultSet->MoveToNext(), true);
1375     EXPECT_EQ(resultSet->GetEntry(entry), OK);
1376     EXPECT_EQ(entry.key, entries[INDEX_SIXTH].key);
1377     EXPECT_EQ(entry.value, entries[INDEX_SIXTH].value);
1378     EXPECT_EQ(resultSet->MoveToNext(), true);
1379     EXPECT_EQ(resultSet->GetEntry(entry), OK);
1380     EXPECT_EQ(entry.key, entries[INDEX_FIFTH].key);
1381     EXPECT_EQ(entry.value, entries[INDEX_FIFTH].value);
1382     EXPECT_EQ(resultSet->MoveToNext(), true);
1383     EXPECT_EQ(resultSet->GetEntry(entry), OK);
1384     EXPECT_EQ(entry.key, entries[INDEX_SECOND].key);
1385     EXPECT_EQ(entry.value, entries[INDEX_SECOND].value);
1386     EXPECT_EQ(resultSet->IsLast(), true);
1387     EXPECT_EQ(delegate->CloseResultSet(resultSet), OK);
1388 
1389     /**
1390      * @tc.steps: step4. use GetEntries interface to check the records in the query object.
1391      * @tc.expected: step4. the result and the order in the vector is: entries[6], entries[5], entries[2].
1392      */
1393     vector<Entry> entriesGot, entriesExpect;
1394     EXPECT_TRUE(delegate->GetEntries(query, entriesGot) == DBStatus::OK);
1395     entriesExpect = {entries[INDEX_SIXTH], entries[INDEX_FIFTH], entries[INDEX_SECOND]};
1396     EXPECT_TRUE(CompareEntriesVector(entriesGot, entriesExpect));
1397 
1398     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
1399 }
1400 
1401 /**
1402  * @tc.name: Query 013
1403  * @tc.desc: verify that OrderBy and Limit interface but the offset of limit is greater than the count of the records
1404  *     got can return right value of the valid query object.
1405  * @tc.type: FUNC
1406  * @tc.require: SR000DR9JP
1407  * @tc.author: fengxiaoyun
1408  */
1409 HWTEST_F(DistributeddbNbPredicateQueryTest, Query013, TestSize.Level0)
1410 {
1411     KvStoreNbDelegate *delegate = nullptr;
1412     KvStoreDelegateManager *manager = nullptr;
1413     /**
1414      * @tc.steps: step1. create db of schema mode and put some schema data the db;
1415      * @tc.expected: step1. create and put successfully.
1416      */
1417     vector<Entry> entries;
1418     PrepareSchemaDBAndData(delegate, manager, COMBINE_SCHEMA_VALUE, entries, VALID_COMBINATION_DEFINE);
1419 
1420     /**
1421      * @tc.steps: step2. construct query object that test combination interface of GreaterThanOrEqualTo on
1422      *    field7 = 0, and EqualTo on field3 = true and then OrderBy on field5 by asec when get 5 records begin from 1.
1423      * @tc.expected: step2. construct successfully.
1424      */
1425     Query query = Query::Select().GreaterThanOrEqualTo("$.field2.field4.field6.field7", 0).And().
1426         EqualTo("$.field2.field3", true).OrderBy("$.field2.field4.field5", false).Limit(5, 1);
1427 
1428     /**
1429      * @tc.steps: step3. use GetEntries interface to get the resultSet in the query object.
1430      * @tc.expected: step3. the count is 4.
1431      */
1432     KvStoreResultSet *resultSet = nullptr;
1433     Entry entry;
1434     EXPECT_EQ(delegate->GetEntries(query, resultSet), DBStatus::OK);
1435     EXPECT_EQ(resultSet->GetCount(), FOUR_RECORDS);
1436     EXPECT_EQ(resultSet->MoveToNext(), true);
1437     EXPECT_EQ(resultSet->GetEntry(entry), OK);
1438     EXPECT_EQ(entry.key, entries[INDEX_SIXTH].key);
1439     EXPECT_EQ(entry.value, entries[INDEX_SIXTH].value);
1440     EXPECT_EQ(resultSet->MoveToNext(), true);
1441     EXPECT_EQ(resultSet->GetEntry(entry), OK);
1442     EXPECT_EQ(entry.key, entries[INDEX_FIFTH].key);
1443     EXPECT_EQ(entry.value, entries[INDEX_FIFTH].value);
1444     EXPECT_EQ(resultSet->MoveToNext(), true);
1445     EXPECT_EQ(resultSet->GetEntry(entry), OK);
1446     EXPECT_EQ(entry.key, entries[INDEX_SECOND].key);
1447     EXPECT_EQ(entry.value, entries[INDEX_SECOND].value);
1448     EXPECT_EQ(resultSet->MoveToNext(), true);
1449     EXPECT_EQ(resultSet->GetEntry(entry), OK);
1450     EXPECT_EQ(entry.key, entries[INDEX_ZEROTH].key);
1451     EXPECT_EQ(entry.value, entries[INDEX_ZEROTH].value);
1452     EXPECT_EQ(resultSet->IsLast(), true);
1453     EXPECT_EQ(delegate->CloseResultSet(resultSet), OK);
1454 
1455     /**
1456      * @tc.steps: step4. use GetEntries interface to check the records in the query object.
1457      * @tc.expected: step4. the result and the order in the vector is: entries[6], entries[5], entries[2], entries[0].
1458      */
1459     vector<Entry> entriesGot, entriesExpect;
1460     EXPECT_TRUE(delegate->GetEntries(query, entriesGot) == DBStatus::OK);
1461     entriesExpect = {entries[INDEX_SIXTH], entries[INDEX_FIFTH], entries[INDEX_SECOND], entries[INDEX_ZEROTH]};
1462     EXPECT_TRUE(CompareEntriesVector(entriesGot, entriesExpect));
1463 
1464     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
1465 }
1466 
1467 /**
1468  * @tc.name: Query 014
1469  * @tc.desc: verify that OrderBy and Limit interface but the offset of limit is nagative
1470  *    can return right value of the valid query object.
1471  * @tc.type: FUNC
1472  * @tc.require: SR000DR9JP
1473  * @tc.author: fengxiaoyun
1474  */
1475 HWTEST_F(DistributeddbNbPredicateQueryTest, Query014, TestSize.Level0)
1476 {
1477     KvStoreNbDelegate *delegate = nullptr;
1478     KvStoreDelegateManager *manager = nullptr;
1479     /**
1480      * @tc.steps: step1. create db of schema mode and put some schema data the db;
1481      * @tc.expected: step1. create and put successfully.
1482      */
1483     vector<Entry> entries;
1484     PrepareSchemaDBAndData(delegate, manager, COMBINE_SCHEMA_VALUE, entries, VALID_COMBINATION_DEFINE);
1485 
1486     /**
1487      * @tc.steps: step2. construct query object that test combination interface of LessThanOrEqualTo on field7 = 1000,
1488      *    and EqualTo on field3 = true and Like field1 = ab*, and then OrderBy on field8 by asec
1489      *    when get 10 records begin from -1.
1490      * @tc.expected: step2. construct successfully.
1491      */
1492     Query query = Query::Select().LessThanOrEqualTo("$.field2.field4.field6.field7", 1000).Or().
1493         EqualTo("$.field2.field3", true).And().Like("$.field1", "ab%").
1494         OrderBy("$.field2.field4.field6.field8", true).Limit(10, -1);
1495 
1496     /**
1497      * @tc.steps: step3. use GetEntries interface to get the resultSet in the query object.
1498      * @tc.expected: step3. the count is 6.
1499      */
1500     KvStoreResultSet *resultSet = nullptr;
1501     Entry entry;
1502     EXPECT_EQ(delegate->GetEntries(query, resultSet), DBStatus::OK);
1503     EXPECT_EQ(resultSet->GetCount(), 7); // 7 records
1504     EXPECT_EQ(resultSet->MoveToNext(), true);
1505     EXPECT_EQ(resultSet->GetEntry(entry), OK);
1506     EXPECT_EQ(entry.key, entries[INDEX_FIRST].key);
1507     EXPECT_EQ(entry.value, entries[INDEX_FIRST].value);
1508     EXPECT_EQ(resultSet->MoveToNext(), true);
1509     EXPECT_EQ(resultSet->GetEntry(entry), OK);
1510     EXPECT_EQ(entry.key, entries[INDEX_FIFTH].key);
1511     EXPECT_EQ(entry.value, entries[INDEX_FIFTH].value);
1512     EXPECT_EQ(resultSet->MoveToNext(), true);
1513     EXPECT_EQ(resultSet->GetEntry(entry), OK);
1514     EXPECT_EQ(entry.key, entries[INDEX_ZEROTH].key);
1515     EXPECT_EQ(entry.value, entries[INDEX_ZEROTH].value);
1516     EXPECT_TRUE(resultSet->Move(CURSOR_OFFSET_2));
1517     EXPECT_EQ(resultSet->GetEntry(entry), OK);
1518     EXPECT_EQ(entry.key, entries[INDEX_SECOND].key);
1519     EXPECT_EQ(entry.value, entries[INDEX_SECOND].value);
1520     EXPECT_EQ(resultSet->MoveToNext(), true);
1521     EXPECT_EQ(resultSet->GetEntry(entry), OK);
1522     EXPECT_EQ(entry.key, entries[INDEX_FORTH].key);
1523     EXPECT_EQ(entry.value, entries[INDEX_FORTH].value);
1524     EXPECT_EQ(resultSet->MoveToNext(), true);
1525     EXPECT_EQ(resultSet->GetEntry(entry), OK);
1526     EXPECT_EQ(entry.key, entries[INDEX_SIXTH].key);
1527     EXPECT_EQ(entry.value, entries[INDEX_SIXTH].value);
1528     EXPECT_EQ(resultSet->IsLast(), true);
1529     EXPECT_EQ(delegate->CloseResultSet(resultSet), OK);
1530 
1531     /**
1532      * @tc.steps: step4. use GetEntries interface to check the records in the query object.
1533      * @tc.expected: step4. the result and the order in the vector is: entries[1], entries[5],
1534      *    entries[0], entries[2], entries[4], entries[6].
1535      */
1536     vector<Entry> entriesGot, entriesExpect;
1537     EXPECT_TRUE(delegate->GetEntries(query, entriesGot) == OK);
1538     entriesExpect = {entries[INDEX_FIRST], entries[INDEX_FIFTH], entries[INDEX_ZEROTH], entries[INDEX_THIRD],
1539         entries[INDEX_SECOND], entries[INDEX_FORTH], entries[INDEX_SIXTH]};
1540     EXPECT_TRUE(CompareEntriesVector(entriesGot, entriesExpect));
1541 
1542     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
1543 }
1544 
1545 /**
1546  * @tc.name: Query 015
1547  * @tc.desc: verify that OrderBy and Limit interface but the offset of limit is out of the range of the query result
1548  *    can return right value of the valid query object.
1549  * @tc.type: FUNC
1550  * @tc.require: SR000DR9JP
1551  * @tc.author: fengxiaoyun
1552  */
1553 HWTEST_F(DistributeddbNbPredicateQueryTest, Query015, TestSize.Level0)
1554 {
1555     KvStoreNbDelegate *delegate = nullptr;
1556     KvStoreDelegateManager *manager = nullptr;
1557     /**
1558      * @tc.steps: step1. create db of schema mode and put some schema data the db;
1559      * @tc.expected: step1. create and put successfully.
1560      */
1561     vector<Entry> entries;
1562     PrepareSchemaDBAndData(delegate, manager, COMBINE_SCHEMA_VALUE, entries, VALID_COMBINATION_DEFINE);
1563 
1564     /**
1565      * @tc.steps: step2. construct query object that test combination interface of GreaterThanOrEqualTo on
1566      *    field5 = 10, and NotEqualTo on field3 = true and then OrderBy on field5 by asec
1567      *    when get 10 records begin from 6.
1568      * @tc.expected: step2. construct successfully.
1569      */
1570     vector<double> doubleRange = {150.999};
1571     Query query = Query::Select().GreaterThanOrEqualTo("$.field2.field4.field5", 10).And().EqualTo("$.field2.field3",
1572         true).And().NotIn("$.field2.field4.field6.field8", doubleRange).Limit(10, 6);
1573 
1574     /**
1575      * @tc.steps: step3. use GetEntries interface to get the resultSet in the query object.
1576      * @tc.expected: step3. the count is 0.
1577      */
1578     KvStoreResultSet *resultSet = nullptr;
1579     Entry entry;
1580     EXPECT_EQ(delegate->GetEntries(query, resultSet), DBStatus::OK);
1581     EXPECT_EQ(resultSet->GetCount(), NO_RECORD);
1582     EXPECT_EQ(resultSet->GetPosition(), CURSOR_POSITION_NEGATIVE1);
1583     EXPECT_EQ(resultSet->IsLast(), false);
1584     EXPECT_EQ(resultSet->IsAfterLast(), true);
1585     EXPECT_EQ(delegate->CloseResultSet(resultSet), OK);
1586 
1587     /**
1588      * @tc.steps: step4. use GetEntries interface to check the records in the query object.
1589      * @tc.expected: step4. no records in the query.
1590      */
1591     vector<Entry> entriesGot;
1592     EXPECT_TRUE(delegate->GetEntries(query, entriesGot) == NOT_FOUND);
1593     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
1594 }
1595 
1596 /**
1597  * @tc.name: Query 016
1598  * @tc.desc: verify that OrderBy and Limit interface but the limit is not only greater than the result of the
1599  *    query result, but also the offset of the limit is out of the range of the query result
1600  *    can return right value of the valid query object.
1601  * @tc.type: FUNC
1602  * @tc.require: SR000DR9JP
1603  * @tc.author: fengxiaoyun
1604  */
1605 HWTEST_F(DistributeddbNbPredicateQueryTest, Query016, TestSize.Level0)
1606 {
1607     KvStoreNbDelegate *delegate = nullptr;
1608     KvStoreDelegateManager *manager = nullptr;
1609     /**
1610      * @tc.steps: step1. create db of schema mode and put some schema data the db;
1611      * @tc.expected: step1. create and put successfully.
1612      */
1613     vector<Entry> entries;
1614     PrepareSchemaDBAndData(delegate, manager, COMBINE_SCHEMA_VALUE, entries, VALID_COMBINATION_DEFINE);
1615 
1616     /**
1617      * @tc.steps: step2. construct query object that test combination interface of Like on field1 = ab*,
1618      *    GeaterThan on field5 = 10, and EqualTo on field3 = true and when field in {0, 30, 50, 120, 1000},
1619      *    then OrderBy on field8 by asec when get 10 records begin from -2.
1620      * @tc.expected: step2. construct successfully.
1621      */
1622     vector<int64_t> longRange = {0, 30, 50, 120, 1000};
1623     Query query = Query::Select().Like("$.field1", "abc").Or().GreaterThan("$.field2.field4.field5", 10).And().
1624         EqualTo("$.field2.field3", true).And().In("$.field2.field4.field6.field7", longRange).
1625         OrderBy("$.field2.field4.field6.field8", true).Limit(10, -2);
1626 
1627     /**
1628      * @tc.steps: step3. use GetEntries interface to get the resultSet in the query object.
1629      * @tc.expected: step3. the count is 3.
1630      */
1631     KvStoreResultSet *resultSet = nullptr;
1632     Entry entry;
1633     EXPECT_EQ(delegate->GetEntries(query, resultSet), DBStatus::OK);
1634     EXPECT_EQ(resultSet->GetCount(), SCHEMA_GOT_COUNT_3);
1635     EXPECT_EQ(resultSet->GetPosition(), CURSOR_POSITION_NEGATIVE1);
1636     EXPECT_EQ(resultSet->GetEntry(entry), NOT_FOUND);
1637     EXPECT_EQ(resultSet->MoveToNext(), true);
1638     EXPECT_EQ(resultSet->GetEntry(entry), OK);
1639     EXPECT_EQ(entry.key, entries[INDEX_FIFTH].key);
1640     EXPECT_EQ(entry.value, entries[INDEX_FIFTH].value);
1641     EXPECT_EQ(resultSet->MoveToNext(), true);
1642     EXPECT_EQ(resultSet->GetEntry(entry), OK);
1643     EXPECT_EQ(entry.key, entries[INDEX_ZEROTH].key);
1644     EXPECT_EQ(entry.value, entries[INDEX_ZEROTH].value);
1645     EXPECT_EQ(resultSet->MoveToNext(), true);
1646     EXPECT_EQ(resultSet->GetEntry(entry), OK);
1647     EXPECT_EQ(entry.key, entries[INDEX_FORTH].key);
1648     EXPECT_EQ(entry.value, entries[INDEX_FORTH].value);
1649     EXPECT_EQ(resultSet->IsLast(), true);
1650     EXPECT_EQ(resultSet->MoveToNext(), false);
1651     EXPECT_EQ(resultSet->IsAfterLast(), true);
1652     EXPECT_EQ(delegate->CloseResultSet(resultSet), OK);
1653 
1654     /**
1655      * @tc.steps: step4. use GetEntries interface to check the records in the query object.
1656      * @tc.expected: step4. the result and the order in the vector is: entries[1], entries[5],
1657      *    entries[0], entries[2], entries[4], entries[6].
1658      */
1659     vector<Entry> entriesGot, entriesExpect;
1660     EXPECT_TRUE(delegate->GetEntries(query, entriesGot) == OK);
1661     entriesExpect = {entries[INDEX_FIFTH], entries[INDEX_ZEROTH], entries[INDEX_FORTH]};
1662     EXPECT_TRUE(CompareEntriesVector(entriesGot, entriesExpect));
1663 
1664     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
1665 }
1666 
1667 /**
1668  * @tc.name: Query 017
1669  * @tc.desc: verify that common db can not support schema query.
1670  * @tc.type: FUNC
1671  * @tc.require: SR000DR9JP
1672  * @tc.author: fengxiaoyun
1673  */
1674 HWTEST_F(DistributeddbNbPredicateQueryTest, Query017, TestSize.Level0)
1675 {
1676     KvStoreNbDelegate *delegate = nullptr;
1677     KvStoreDelegateManager *manager = nullptr;
1678     /**
1679      * @tc.steps: step1. create db of schema mode and put some schema data the db;
1680      * @tc.expected: step1. create and put successfully.
1681      */
1682     vector<Entry> entries;
1683     Option option = g_option;
1684     option.isMemoryDb = false;
1685     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
1686     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
1687 
1688     vector<Key> keys = {KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7};
1689     for (unsigned long index = 0; index < COMBINE_SCHEMA_VALUE.size(); index++) {
1690         Value value(COMBINE_SCHEMA_VALUE[index].begin(), COMBINE_SCHEMA_VALUE[index].end());
1691         entries.push_back({keys[index], value});
1692     }
1693 
1694     for (unsigned long index = 0; index < COMBINE_SCHEMA_VALUE.size(); index++) {
1695         EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, entries[index].key, entries[index].value), OK);
1696     }
1697 
1698     /**
1699      * @tc.steps: step2. construct query1 object that test combination interface of Like on field1 = ab*,
1700      *    GeaterThan on field5 = 10, and EqualTo on field3 = true and when field in {0, 30, 50, 120, 1000},
1701      *    then OrderBy on field8 by asec when get 10 records begin from -2,
1702      *    construct query2 object the same as query1 but has not OrderBy and Limit.
1703      * @tc.expected: step2. construct successfully.
1704      */
1705     vector<int64_t> longRange = {0, 30, 50, 120, 1000};
1706     Query query1 = Query::Select().Like("$.field1", "ab*").Or().GreaterThan("$.field2.field4.field5", 10).And().
1707         EqualTo("$.field2.field3", true).And().In("$.field2.field4.field6.field7", longRange).
1708         OrderBy("$.field2.field4.field6.field8", true).Limit(10, -2);
1709     Query query2 = Query::Select().Like("$.field1", "ab*").Or().GreaterThan("$.field2.field4.field5", 10).And().
1710         EqualTo("$.field2.field3", true).And().In("$.field2.field4.field6.field7", longRange);
1711 
1712     /**
1713      * @tc.steps: step3. use GetEntries interface to get the resultSet in the query1 and query2 objects.
1714      * @tc.expected: step3. both of them returns NOT_SUPPORT.
1715      */
1716     KvStoreResultSet *resultSet = nullptr;
1717     EXPECT_EQ(delegate->GetEntries(query1, resultSet), DBStatus::NOT_SUPPORT);
1718     EXPECT_EQ(delegate->GetEntries(query2, resultSet), DBStatus::NOT_SUPPORT);
1719 
1720     /**
1721      * @tc.steps: step4. use GetEntries interface to get the records in the query1 and query2 objects.
1722      * @tc.expected: step4. both of them returns NOT_SUPPORT.
1723      */
1724     vector<Entry> entriesGot;
1725     EXPECT_TRUE(delegate->GetEntries(query1, entriesGot) == DBStatus::NOT_SUPPORT);
1726     EXPECT_TRUE(delegate->GetEntries(query2, entriesGot) == DBStatus::NOT_SUPPORT);
1727 
1728     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
1729 }
1730 
1731 /**
1732  * @tc.name: Query 018
1733  * @tc.desc: verify that constructor illegal query object and returns INVALID_QUERY_FORMAT
1734  * @tc.type: FUNC
1735  * @tc.require: SR000DR9JP
1736  * @tc.author: fengxiaoyun
1737  */
1738 HWTEST_F(DistributeddbNbPredicateQueryTest, Query018, TestSize.Level0)
1739 {
1740     KvStoreNbDelegate *delegate = nullptr;
1741     KvStoreDelegateManager *manager = nullptr;
1742     /**
1743      * @tc.steps: step1. create db of schema mode and put some schema data the db;
1744      * @tc.expected: step1. create and put successfully.
1745      */
1746     vector<Entry> entries;
1747     PrepareSchemaDBAndData(delegate, manager, COMBINE_SCHEMA_VALUE, entries, VALID_COMBINATION_DEFINE);
1748 
1749     /**
1750      * @tc.steps: step2. construct illegal query object such as:
1751      *    query1: which didn't combine with And() or Or().
1752      *    query2: OrderBy is before other condition.
1753      *    query3: Limit is before other condition.
1754      *    query4: OrderBy is after Limit.
1755      * @tc.expected: step2. construct successfully.
1756      */
1757     // LessThan on where field8 = 100
1758     Query query1 = Query::Select().LessThan("$.field2.field4.field6.field8", 100).NotLike("$.field1", "%c");
1759     Query query2 = Query::Select().GreaterThanOrEqualTo("$.field2.field4.field6.field7", 0).
1760         OrderBy("$.field2.field4.field5", true).And().EqualTo("$.field2.field3", true);
1761     vector<double> doubleRange = {150.999};
1762     // field5 = 10, get 10 records begin from 6th.
1763     Query query3 = Query::Select().GreaterThanOrEqualTo("$.field2.field4.field5", 10).And().EqualTo("$.field2.field3",
1764         true).Limit(10, 6).And().NotIn("$.field2.field4.field6.field8", doubleRange);
1765     // field7 = 0, get 3 records begin from 1
1766     Query query4 = Query::Select().GreaterThanOrEqualTo("$.field2.field4.field6.field7", 0).And().
1767         EqualTo("$.field2.field3", true).Limit(3, 1).OrderBy("$.field2.field4.field5", true);
1768 
1769     /**
1770      * @tc.steps: step3. use GetEntries interface to to get the resultSet in the 4 query objects.
1771      * @tc.expected: step3. all of them return INVALID_QUERY_FORMAT.
1772      */
1773     KvStoreResultSet *resultSet = nullptr;
1774     EXPECT_EQ(delegate->GetEntries(query1, resultSet), DBStatus::INVALID_QUERY_FORMAT);
1775     EXPECT_EQ(delegate->GetEntries(query2, resultSet), DBStatus::INVALID_QUERY_FORMAT);
1776     EXPECT_EQ(delegate->GetEntries(query3, resultSet), DBStatus::INVALID_QUERY_FORMAT);
1777     EXPECT_EQ(delegate->GetEntries(query4, resultSet), DBStatus::INVALID_QUERY_FORMAT);
1778 
1779     /**
1780      * @tc.steps: step4. use GetEntries interface get the records in the query objects.
1781      * @tc.expected: step4. all of them return INVALID_QUERY_FORMAT.
1782      */
1783     vector<Entry> entriesGot;
1784     EXPECT_EQ(delegate->GetEntries(query1, entriesGot), INVALID_QUERY_FORMAT);
1785     EXPECT_EQ(delegate->GetEntries(query2, entriesGot), INVALID_QUERY_FORMAT);
1786     EXPECT_EQ(delegate->GetEntries(query3, entriesGot), INVALID_QUERY_FORMAT);
1787     EXPECT_EQ(delegate->GetEntries(query4, entriesGot), INVALID_QUERY_FORMAT);
1788     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
1789 }
1790 
1791 /**
1792  * @tc.name: Query 019
1793  * @tc.desc: verify that GetCount interface of KvStoreNbDelegate class can't support OrderBy and
1794  *    Limit interface in query
1795  * @tc.type: FUNC
1796  * @tc.require: SR000DR9JP
1797  * @tc.author: fengxiaoyun
1798  */
1799 HWTEST_F(DistributeddbNbPredicateQueryTest, Query019, TestSize.Level0)
1800 {
1801     KvStoreNbDelegate *delegate = nullptr;
1802     KvStoreDelegateManager *manager = nullptr;
1803     /**
1804      * @tc.steps: step1. create db of schema mode and put some schema data the db;
1805      * @tc.expected: step1. create and put successfully.
1806      */
1807     vector<Entry> entries;
1808     PrepareSchemaDBAndData(delegate, manager, COMBINE_SCHEMA_VALUE, entries, VALID_COMBINATION_DEFINE);
1809 
1810     /**
1811      * @tc.steps: step2. construct valid query object such as:
1812      *    query1: EqualTo on field3 = true and Order field5 by asec.
1813      *    query2: EqualTo on field3 = true and Limit(5, 1).
1814      * @tc.expected: step2. construct successfully.
1815      */
1816     Query query1 = Query::Select().EqualTo("$.field2.field3", true).OrderBy("$.field2.field4.field5", true);
1817     Query query2 = Query::Select().EqualTo("$.field2.field3", true).Limit(5, 1); // get 5 records begin from 1
1818 
1819     /**
1820      * @tc.steps: step3. use GetCount interface of KvStoreNbDelegate class to check the count of query objects.
1821      * @tc.expected: step3. all of them return INVALID_QUERY_FORMAT.
1822      */
1823     int count = 0;
1824     EXPECT_EQ(delegate->GetCount(query1, count), DBStatus::INVALID_QUERY_FORMAT);
1825     EXPECT_EQ(delegate->GetCount(query2, count), DBStatus::INVALID_QUERY_FORMAT);
1826     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
1827 }
1828 
1829 /**
1830  * @tc.name: Query 020
1831  * @tc.desc: verify query executed normal after delete records.
1832  * @tc.type: FUNC
1833  * @tc.require: SR000DR9JP
1834  * @tc.author: fengxiaoyun
1835  */
1836 HWTEST_F(DistributeddbNbPredicateQueryTest, Query020, TestSize.Level1)
1837 {
1838     KvStoreNbDelegate *delegate = nullptr;
1839     KvStoreDelegateManager *manager = nullptr;
1840     vector<Entry> entries;
1841     /**
1842      * @tc.steps: step1. create schema db and put 5 entries which has valid schema constructor
1843      *    and has the value given to db.
1844      * @tc.expected: step1. create and put successfully.
1845      */
1846     PrepareSchemaDBAndData(delegate, manager, STRING_SCHEMA_VALUE, entries, VALID_DEFINE_STRING);
1847 
1848     /**
1849      * @tc.steps: step2. call GetEntries with query=Select().NotIn(field1,{}) or query=Select().In(field1,{}) or
1850      *     query=Select().Like(field1,{}), and check the result with GetEntries.
1851      * @tc.expected: step2. return 4 entries if use NotIn, return NOT_FOUND if use In and Like.
1852      */
1853     vector<string> scope;
1854     vector<Entry> entriesResult;
1855     Query query1 = Query::Select().NotIn("$.field1", scope);
1856     Query query2 = Query::Select().In("$.field1", scope);
1857     Query query3 = Query::Select().Like("$.field2.field3", std::string());
1858     Query query4 = Query::Select().NotLike("$.field2.field3", std::string());
1859     EXPECT_EQ(delegate->GetEntries(query1, entriesResult), OK);
1860     EXPECT_EQ(delegate->GetEntries(query2, entriesResult), NOT_FOUND);
1861     EXPECT_EQ(delegate->GetEntries(query3, entriesResult), NOT_FOUND);
1862     EXPECT_EQ(delegate->GetEntries(query4, entriesResult), OK);
1863 
1864     /**
1865      * @tc.steps: step3. call GetEntries with query=Select().Like(field1,scope) that scope.size()=50000B, 50001B,
1866      *     4M and check the result with GetEntries.
1867      * @tc.expected: step3. return error code correspondingly.
1868      */
1869     string queryValidStr(LIKE_AND_NOTLIKE_MAX_LENGTH, 'a');
1870     Query queryLike = Query::Select().Like("$.field2.field3", queryValidStr);
1871     EXPECT_EQ(delegate->GetEntries(queryLike, entriesResult), NOT_FOUND);
1872     Query queryNotLike = Query::Select().NotLike("$.field2.field3", queryValidStr);
1873     EXPECT_EQ(delegate->GetEntries(queryNotLike, entriesResult), OK);
1874     vector<string> queryOvermaxStr;
1875     string queryInvalidStr1(LIKE_AND_NOTLIKE_MAX_LENGTH + 1, 'b');
1876     queryOvermaxStr.push_back(queryInvalidStr1);
1877     string queryInvalidStr2(FOUR_M_LONG_STRING, 'c');
1878     queryOvermaxStr.push_back(queryInvalidStr2);
1879     for (auto const &it : queryOvermaxStr) {
1880         Query queryLikeOverMax = Query::Select().Like("$.field2.field3", it);
1881         EXPECT_EQ(delegate->GetEntries(queryLikeOverMax, entriesResult), OVER_MAX_LIMITS);
1882         Query queryNotLikeOverMax = Query::Select().NotLike("$.field2.field3", it);
1883         EXPECT_EQ(delegate->GetEntries(queryNotLikeOverMax, entriesResult), OVER_MAX_LIMITS);
1884     }
1885 
1886     /**
1887      * @tc.steps: step4. call GetEntries with query=Select().NotIn(field1,scope) or query=Select().In(field1,scope)
1888      *     that scope.size()= 128B, 129B and check the result with GetEntries.
1889      * @tc.expected: step4. return error code correspondingly.
1890      */
1891     vector<string> scopeValid;
1892     scopeValid.assign(IN_AND_NOTIN_MAX_LENGTH, "d");
1893     Query query5 = Query::Select().NotIn("$.field1", scopeValid);
1894     Query query6 = Query::Select().In("$.field1", scopeValid);
1895     EXPECT_EQ(delegate->GetEntries(query5, entriesResult), OK);
1896     EXPECT_EQ(delegate->GetEntries(query6, entriesResult), NOT_FOUND);
1897 
1898     vector<string> scopeInValid;
1899     scopeInValid.assign(IN_AND_NOTIN_MAX_LENGTH + 1, "e");
1900     Query query7 = Query::Select().NotIn("$.field1", scopeInValid);
1901     Query query8 = Query::Select().In("$.field1", scopeInValid);
1902     EXPECT_EQ(delegate->GetEntries(query7, entriesResult), OVER_MAX_LIMITS);
1903     EXPECT_EQ(delegate->GetEntries(query8, entriesResult), OVER_MAX_LIMITS);
1904 
1905     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
1906 }
1907 
MakeTenSchemaValues(vector<string> & schemasValue)1908 void MakeTenSchemaValues(vector<string> &schemasValue)
1909 {
1910     for (int recordIndex = 0; recordIndex < TEN_RECORDS; ++recordIndex) {
1911         string val = "{\"field1\":" + string("\"") + string(1, 'a' + recordIndex) + "\"" +
1912             ",\"field2\":{\"field3\":\"fxy\",\"field4\":[]}}";
1913         schemasValue.push_back(val);
1914     }
1915 }
1916 /**
1917  * @tc.name: Query 021
1918  * @tc.desc: verify the record num of In query after delete several records.
1919  * @tc.type: FUNC
1920  * @tc.require: SR000DR9JP
1921  * @tc.author: fengxiaoyun
1922  */
1923 HWTEST_F(DistributeddbNbPredicateQueryTest, Query021, TestSize.Level0)
1924 {
1925     KvStoreNbDelegate *delegate = nullptr;
1926     KvStoreDelegateManager *manager = nullptr;
1927     vector<Entry> entries;
1928     vector<string> schemasValue;
1929     MakeTenSchemaValues(schemasValue);
1930     /**
1931      * @tc.steps: step1. create schema db and put 10 records with valid schema.
1932      * @tc.expected: step1. create and put successfully.
1933      */
1934     PrepareSchemaDBAndData(delegate, manager, schemasValue, entries, VALID_DEFINE_STRING);
1935 
1936     /**
1937      * @tc.steps: step2. call GetEntries with query=Select().GreaterThanOrEqualTo("$.field1",{}) or
1938      *  query=Select().EqualTo("$.field3", "fxy").
1939      * @tc.expected: step2. return 5 records.
1940      */
1941     for (int delRecordNum = ONE_RECORD; delRecordNum <= FIVE_RECORDS; delRecordNum++) {
1942         Entry entry = entries.back();
1943         EXPECT_EQ(DistributedDBNbTestTools::Delete(*delegate, entry.key), OK);
1944         entries.pop_back();
1945     }
1946     vector<Entry> entriesResult;
1947     KvStoreResultSet *resultSet = nullptr;
1948     Query query = Query::Select().GreaterThanOrEqualTo("$.field1", "f").Or().EqualTo("$.field2.field3", "fxy");
1949     EXPECT_EQ(delegate->GetEntries(query, entriesResult), OK);
1950     EXPECT_EQ(delegate->GetEntries(query, resultSet), OK);
1951     EXPECT_TRUE(entriesResult.size() == FIVE_RECORDS);
1952     EXPECT_EQ(delegate->CloseResultSet(resultSet), OK);
1953     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, g_predicateOption.isMemoryDb));
1954 }
1955 }
1956 #endif