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