• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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