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