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