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