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