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