1 /*
2 * Copyright (c) 2023 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 #define LOG_TAG "RelationalPredicate"
16 #include "relational_predicates.h"
17
18 #include <variant>
19
20 #include "convertor_error_code.h"
21 #include "logger.h"
22 #include "oh_data_define.h"
23 #include "oh_predicates.h"
24 #include "relational_predicates_objects.h"
25 #include "relational_store_error_code.h"
26 #include "sqlite_global_config.h"
27
28 using namespace OHOS::NativeRdb;
29 namespace OHOS {
30 namespace RdbNdk {
EqualTo(OH_Predicates * predicates,const char * field,OH_VObject * valueObject)31 OH_Predicates *RelationalPredicate::EqualTo(OH_Predicates *predicates, const char *field, OH_VObject *valueObject)
32 {
33 auto self = GetSelf(predicates);
34 auto selfObjects = RelationalPredicatesObjects::GetSelf(valueObject);
35 if (self == nullptr || selfObjects == nullptr || field == nullptr) {
36 return self;
37 }
38 std::vector<ValueObject> values = selfObjects->Get();
39 if (!values.empty()) {
40 self->predicates_.EqualTo(field, values[0]);
41 }
42 return self;
43 }
44
NotEqualTo(OH_Predicates * predicates,const char * field,OH_VObject * valueObject)45 OH_Predicates *RelationalPredicate::NotEqualTo(OH_Predicates *predicates, const char *field, OH_VObject *valueObject)
46 {
47 auto self = GetSelf(predicates);
48 auto selfObjects = RelationalPredicatesObjects::GetSelf(valueObject);
49 if (self == nullptr || selfObjects == nullptr || field == nullptr) {
50 return self;
51 }
52 std::vector<ValueObject> values = selfObjects->Get();
53 if (!values.empty()) {
54 self->predicates_.NotEqualTo(field, values[0]);
55 }
56 return self;
57 }
58
BeginWrap(OH_Predicates * predicates)59 OH_Predicates *RelationalPredicate::BeginWrap(OH_Predicates *predicates)
60 {
61 auto self = GetSelf(predicates);
62 if (self == nullptr) {
63 return self;
64 }
65 self->predicates_.BeginWrap();
66 return self;
67 }
68
EndWrap(OH_Predicates * predicates)69 OH_Predicates *RelationalPredicate::EndWrap(OH_Predicates *predicates)
70 {
71 auto self = GetSelf(predicates);
72 if (self == nullptr) {
73 return self;
74 }
75 self->predicates_.EndWrap();
76 return self;
77 }
78
Or(OH_Predicates * predicates)79 OH_Predicates *RelationalPredicate::Or(OH_Predicates *predicates)
80 {
81 auto self = GetSelf(predicates);
82 if (self == nullptr) {
83 return self;
84 }
85 self->predicates_.Or();
86 return self;
87 }
88
And(OH_Predicates * predicates)89 OH_Predicates *RelationalPredicate::And(OH_Predicates *predicates)
90 {
91 auto self = GetSelf(predicates);
92 if (self == nullptr) {
93 return self;
94 }
95 self->predicates_.And();
96 return self;
97 }
98
IsNull(OH_Predicates * predicates,const char * field)99 OH_Predicates *RelationalPredicate::IsNull(OH_Predicates *predicates, const char *field)
100 {
101 auto self = GetSelf(predicates);
102 if (self == nullptr || field == nullptr) {
103 return self;
104 }
105 self->predicates_.IsNull(field);
106 return self;
107 }
108
IsNotNull(OH_Predicates * predicates,const char * field)109 OH_Predicates *RelationalPredicate::IsNotNull(OH_Predicates *predicates, const char *field)
110 {
111 auto self = GetSelf(predicates);
112 if (self == nullptr || field == nullptr) {
113 return self;
114 }
115 self->predicates_.IsNotNull(field);
116 return self;
117 }
118
Like(OH_Predicates * predicates,const char * field,OH_VObject * valueObject)119 OH_Predicates *RelationalPredicate::Like(OH_Predicates *predicates, const char *field, OH_VObject *valueObject)
120 {
121 auto self = GetSelf(predicates);
122 auto selfObjects = RelationalPredicatesObjects::GetSelf(valueObject);
123 if (self == nullptr || selfObjects == nullptr || field == nullptr) {
124 return self;
125 }
126 std::vector<ValueObject> values = selfObjects->Get();
127 if (!values.empty()) {
128 if (auto pval = std::get_if<std::string>(&values[0].value)) {
129 self->predicates_.Like(field, std::move(*pval));
130 }
131 }
132 return self;
133 }
134
Between(OH_Predicates * predicates,const char * field,OH_VObject * valueObject)135 OH_Predicates *RelationalPredicate::Between(OH_Predicates *predicates, const char *field, OH_VObject *valueObject)
136 {
137 auto self = GetSelf(predicates);
138 auto selfObjects = RelationalPredicatesObjects::GetSelf(valueObject);
139 if (self == nullptr || selfObjects == nullptr || field == nullptr) {
140 return self;
141 }
142 std::vector<ValueObject> values = selfObjects->Get();
143 // The number of arguments required for the between method is 2
144 if (values.size() != 2) {
145 LOG_ERROR("size is %{public}zu", values.size());
146 return self;
147 }
148
149 self->predicates_.Between(field, values[0], values[1]);
150 return self;
151 }
152
NotBetween(OH_Predicates * predicates,const char * field,OH_VObject * valueObject)153 OH_Predicates *RelationalPredicate::NotBetween(OH_Predicates *predicates, const char *field, OH_VObject *valueObject)
154 {
155 auto self = GetSelf(predicates);
156 auto selfObjects = RelationalPredicatesObjects::GetSelf(valueObject);
157 if (self == nullptr || selfObjects == nullptr || field == nullptr) {
158 return self;
159 }
160 std::vector<ValueObject> values = selfObjects->Get();
161 // The number of arguments required for the between method is 2
162 if (values.size() != 2) {
163 LOG_ERROR("size is %{public}zu", values.size());
164 return self;
165 }
166 self->predicates_.NotBetween(field, values[0], values[1]);
167 return self;
168 }
169
GreaterThan(OH_Predicates * predicates,const char * field,OH_VObject * valueObject)170 OH_Predicates *RelationalPredicate::GreaterThan(OH_Predicates *predicates, const char *field, OH_VObject *valueObject)
171 {
172 auto self = GetSelf(predicates);
173 auto selfObjects = RelationalPredicatesObjects::GetSelf(valueObject);
174 if (self == nullptr || selfObjects == nullptr || field == nullptr) {
175 return self;
176 }
177 std::vector<ValueObject> values = selfObjects->Get();
178 if (!values.empty()) {
179 self->predicates_.GreaterThan(field, values[0]);
180 }
181 return self;
182 }
183
LessThan(OH_Predicates * predicates,const char * field,OH_VObject * valueObject)184 OH_Predicates *RelationalPredicate::LessThan(OH_Predicates *predicates, const char *field, OH_VObject *valueObject)
185 {
186 auto self = GetSelf(predicates);
187 auto selfObjects = RelationalPredicatesObjects::GetSelf(valueObject);
188 if (self == nullptr || selfObjects == nullptr || field == nullptr) {
189 return self;
190 }
191 std::vector<ValueObject> values = selfObjects->Get();
192 if (!values.empty()) {
193 self->predicates_.LessThan(field, values[0]);
194 }
195 return self;
196 }
197
GreaterThanOrEqualTo(OH_Predicates * predicates,const char * field,OH_VObject * valueObject)198 OH_Predicates *RelationalPredicate::GreaterThanOrEqualTo(
199 OH_Predicates *predicates, const char *field, OH_VObject *valueObject)
200 {
201 auto self = GetSelf(predicates);
202 auto selfObjects = RelationalPredicatesObjects::GetSelf(valueObject);
203 if (self == nullptr || selfObjects == nullptr || field == nullptr) {
204 return self;
205 }
206 std::vector<ValueObject> values = selfObjects->Get();
207 if (!values.empty()) {
208 self->predicates_.GreaterThanOrEqualTo(field, values[0]);
209 }
210 return self;
211 }
LessThanOrEqualTo(OH_Predicates * predicates,const char * field,OH_VObject * valueObject)212 OH_Predicates *RelationalPredicate::LessThanOrEqualTo(
213 OH_Predicates *predicates, const char *field, OH_VObject *valueObject)
214 {
215 auto self = GetSelf(predicates);
216 auto selfObjects = RelationalPredicatesObjects::GetSelf(valueObject);
217 if (self == nullptr || selfObjects == nullptr || field == nullptr) {
218 return self;
219 }
220 std::vector<ValueObject> values = selfObjects->Get();
221 if (!values.empty()) {
222 self->predicates_.LessThanOrEqualTo(field, values[0]);
223 }
224 return self;
225 }
226
OrderBy(OH_Predicates * predicates,const char * field,OH_OrderType type)227 OH_Predicates *RelationalPredicate::OrderBy(OH_Predicates *predicates, const char *field, OH_OrderType type)
228 {
229 auto self = GetSelf(predicates);
230 if (self == nullptr || field == nullptr) {
231 return self;
232 }
233 if (type == OH_OrderType::DESC) {
234 self->predicates_.OrderByDesc(field);
235 return self;
236 }
237 self->predicates_.OrderByAsc(field);
238 return self;
239 }
240
Distinct(OH_Predicates * predicates)241 OH_Predicates *RelationalPredicate::Distinct(OH_Predicates *predicates)
242 {
243 auto self = GetSelf(predicates);
244 if (self == nullptr) {
245 return self;
246 }
247 self->predicates_.Distinct();
248 return self;
249 }
250
Limit(OH_Predicates * predicates,unsigned int value)251 OH_Predicates *RelationalPredicate::Limit(OH_Predicates *predicates, unsigned int value)
252 {
253 auto self = GetSelf(predicates);
254 if (self == nullptr) {
255 return self;
256 }
257 self->predicates_.Limit(value);
258 return self;
259 }
260
Offset(OH_Predicates * predicates,unsigned int rowOffset)261 OH_Predicates *RelationalPredicate::Offset(OH_Predicates *predicates, unsigned int rowOffset)
262 {
263 auto self = GetSelf(predicates);
264 if (self == nullptr) {
265 return self;
266 }
267 self->predicates_.Offset(rowOffset);
268 return self;
269 }
270
GroupBy(OH_Predicates * predicates,char const * const * fields,int length)271 OH_Predicates *RelationalPredicate::GroupBy(OH_Predicates *predicates, char const *const *fields, int length)
272 {
273 auto self = GetSelf(predicates);
274 if (self == nullptr || fields == nullptr || length <= 0) {
275 return self;
276 }
277 std::vector<std::string> vec;
278 vec.reserve(length);
279 for (int i = 0; i < length; i++) {
280 vec.push_back(std::string(fields[i]));
281 }
282 self->predicates_.GroupBy(vec);
283 return self;
284 }
285
In(OH_Predicates * predicates,const char * field,OH_VObject * valueObject)286 OH_Predicates *RelationalPredicate::In(OH_Predicates *predicates, const char *field, OH_VObject *valueObject)
287 {
288 auto self = GetSelf(predicates);
289 auto selfObjects = RelationalPredicatesObjects::GetSelf(valueObject);
290 if (self == nullptr || selfObjects == nullptr || field == nullptr) {
291 return self;
292 }
293 std::vector<ValueObject> values = selfObjects->Get();
294 if (values.size() > OHOS::NativeRdb::GlobalExpr::SQLITE_MAX_COLUMN) {
295 return self;
296 }
297
298 self->predicates_.In(field, values);
299 return self;
300 }
301
NotIn(OH_Predicates * predicates,const char * field,OH_VObject * valueObject)302 OH_Predicates *RelationalPredicate::NotIn(OH_Predicates *predicates, const char *field, OH_VObject *valueObject)
303 {
304 auto self = GetSelf(predicates);
305 auto selfObjects = RelationalPredicatesObjects::GetSelf(valueObject);
306 if (self == nullptr || selfObjects == nullptr || field == nullptr) {
307 return self;
308 }
309 std::vector<ValueObject> values = selfObjects->Get();
310 if (values.size() > OHOS::NativeRdb::GlobalExpr::SQLITE_MAX_COLUMN) {
311 return self;
312 }
313
314 self->predicates_.NotIn(field, values);
315 return self;
316 }
317
Clear(OH_Predicates * predicates)318 OH_Predicates *RelationalPredicate::Clear(OH_Predicates *predicates)
319 {
320 auto self = GetSelf(predicates);
321 if (self == nullptr) {
322 return self;
323 }
324 self->predicates_.Clear();
325 return self;
326 }
327
Destroy(OH_Predicates * predicates)328 int RelationalPredicate::Destroy(OH_Predicates *predicates)
329 {
330 auto self = GetSelf(predicates);
331 if (self == nullptr) {
332 return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
333 }
334 delete self;
335 return OH_Rdb_ErrCode::RDB_OK;
336 }
337
RelationalPredicate(const char * table)338 RelationalPredicate::RelationalPredicate(const char *table) : predicates_(table)
339 {
340 id = RDB_PREDICATES_CID;
341 equalTo = EqualTo;
342 notEqualTo = NotEqualTo;
343 beginWrap = BeginWrap;
344 endWrap = EndWrap;
345 orOperate = Or;
346 andOperate = And;
347 isNull = IsNull;
348 isNotNull = IsNotNull;
349 like = Like;
350 between = Between;
351 notBetween = NotBetween;
352 greaterThan = GreaterThan;
353 lessThan = LessThan;
354 greaterThanOrEqualTo = GreaterThanOrEqualTo;
355 lessThanOrEqualTo = LessThanOrEqualTo;
356 orderBy = OrderBy;
357 distinct = Distinct;
358 limit = Limit;
359 offset = Offset;
360 groupBy = GroupBy;
361 in = In;
362 notIn = NotIn;
363 clear = Clear;
364 destroy = Destroy;
365 }
366
Get()367 OHOS::NativeRdb::RdbPredicates &RelationalPredicate::Get()
368 {
369 return predicates_;
370 }
371
GetSelf(OH_Predicates * predicates)372 RelationalPredicate *RelationalPredicate::GetSelf(OH_Predicates *predicates)
373 {
374 if (predicates == nullptr || predicates->id != OHOS::RdbNdk::RDB_PREDICATES_CID) {
375 LOG_ERROR("cursor invalid. is null %{public}d", (predicates == nullptr));
376 return nullptr;
377 }
378 return static_cast<OHOS::RdbNdk::RelationalPredicate *>(predicates);
379 }
380 } // namespace RdbNdk
381 } // namespace OHOS
382
383 using namespace OHOS::RdbNdk;
384 using namespace OHOS::NativeRdb;
OH_Predicates_Having(OH_Predicates * predicates,const char * conditions,const OH_Data_Values * values)385 int OH_Predicates_Having(OH_Predicates *predicates, const char *conditions, const OH_Data_Values *values)
386 {
387 auto self = RelationalPredicate::GetSelf(predicates);
388 if (self == nullptr || conditions == nullptr || (values != nullptr && !values->IsValid())) {
389 return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
390 }
391 if (self->Get().GetGroup().empty() || strlen(conditions) == 0) {
392 return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
393 }
394 if (values == nullptr) {
395 self->Get().Having(conditions);
396 return OH_Rdb_ErrCode::RDB_OK;
397 }
398 std::vector<ValueObject> datas;
399 for (auto &value : values->values_) {
400 if (!value.IsValid()) {
401 return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
402 }
403 datas.push_back(value.value_);
404 }
405 self->Get().Having(conditions, datas);
406 return OH_Rdb_ErrCode::RDB_OK;
407 }
408
OH_Predicates_NotLike(OH_Predicates * predicates,const char * field,const char * pattern)409 int OH_Predicates_NotLike(OH_Predicates *predicates, const char *field, const char *pattern)
410 {
411 auto self = RelationalPredicate::GetSelf(predicates);
412 if (self == nullptr || field == nullptr || pattern == nullptr) {
413 return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
414 }
415 self->Get().NotLike(field, pattern);
416 return OH_Rdb_ErrCode::RDB_OK;
417 }
418
OH_Predicates_Glob(OH_Predicates * predicates,const char * field,const char * pattern)419 int OH_Predicates_Glob(OH_Predicates *predicates, const char *field, const char *pattern)
420 {
421 auto self = RelationalPredicate::GetSelf(predicates);
422 if (self == nullptr || field == nullptr || pattern == nullptr) {
423 return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
424 }
425 self->Get().Glob(field, pattern);
426 return OH_Rdb_ErrCode::RDB_OK;
427 }
428
OH_Predicates_NotGlob(OH_Predicates * predicates,const char * field,const char * pattern)429 int OH_Predicates_NotGlob(OH_Predicates *predicates, const char *field, const char *pattern)
430 {
431 auto self = RelationalPredicate::GetSelf(predicates);
432 if (self == nullptr || field == nullptr || pattern == nullptr) {
433 return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
434 }
435 self->Get().NotGlob(field, pattern);
436 return OH_Rdb_ErrCode::RDB_OK;
437 }
438