1 /*
2 * Copyright (c) 2022 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 "RdbUtils"
16 #include "rdb_utils.h"
17
18 #include "logger.h"
19 #include "raw_data_parser.h"
20
21 using namespace OHOS::Rdb;
22 using namespace OHOS::RdbDataShareAdapter;
23 using namespace OHOS::DataShare;
24 using namespace OHOS::NativeRdb;
25
26 constexpr RdbUtils::OperateHandler RdbUtils::HANDLERS[LAST_TYPE];
27
ToValuesBucket(DataShareValuesBucket valuesBucket)28 ValuesBucket RdbUtils::ToValuesBucket(DataShareValuesBucket valuesBucket)
29 {
30 std::map<std::string, ValueObject> valuesMap;
31 for (auto &[key, dsValue] : valuesBucket.valuesMap) {
32 ValueObject::Type value;
33 RawDataParser::Convert(std::move(dsValue), value);
34 valuesMap.insert(std::pair<std::string, ValueObject>(key, std::move(value)));
35 }
36 return ValuesBucket(valuesMap);
37 }
38
ToPredicates(const DataShareAbsPredicates & predicates,const std::string & table)39 RdbPredicates RdbUtils::ToPredicates(const DataShareAbsPredicates &predicates, const std::string &table)
40 {
41 RdbPredicates rdbPredicates(table);
42 if (predicates.GetSettingMode() == QUERY_LANGUAGE) {
43 rdbPredicates.SetWhereClause(predicates.GetWhereClause());
44 rdbPredicates.SetWhereArgs(predicates.GetWhereArgs());
45 rdbPredicates.SetOrder(predicates.GetOrder());
46 }
47
48 const auto &operations = predicates.GetOperationList();
49 for (const auto &oper : operations) {
50 if (oper.operation >= 0 && oper.operation < LAST_TYPE) {
51 (*HANDLERS[oper.operation])(oper, rdbPredicates);
52 }
53 }
54 return rdbPredicates;
55 }
56
ToValueObject(const DataSharePredicatesObject & predicatesObject)57 OHOS::NativeRdb::ValueObject RdbUtils::ToValueObject(const DataSharePredicatesObject &predicatesObject)
58 {
59 if (auto *val = std::get_if<int>(&predicatesObject.value)) {
60 return ValueObject(*val);
61 }
62 ValueObject::Type value;
63 RawDataParser::Convert(std::move(predicatesObject.value), value);
64 return value;
65 }
66
ToResultSetBridge(std::shared_ptr<ResultSet> resultSet)67 std::shared_ptr<ResultSetBridge> RdbUtils::ToResultSetBridge(std::shared_ptr<ResultSet> resultSet)
68 {
69 if (resultSet == nullptr) {
70 LOG_ERROR("resultSet is null.");
71 return nullptr;
72 }
73 return std::make_shared<RdbResultSetBridge>(resultSet);
74 }
75
NoSupport(const OperationItem & item,RdbPredicates & query)76 void RdbUtils::NoSupport(const OperationItem &item, RdbPredicates &query)
77 {
78 LOG_ERROR("invalid operation:%{public}d", item.operation);
79 }
80
EqualTo(const OperationItem & item,RdbPredicates & predicates)81 void RdbUtils::EqualTo(const OperationItem &item, RdbPredicates &predicates)
82 {
83 // 2 is the number of argument item.singleParams
84 if (item.singleParams.size() < 2) {
85 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
86 return;
87 }
88 predicates.EqualTo(item.GetSingle(0), ToValueObject(item.GetSingle(1)));
89 }
90
NotEqualTo(const OperationItem & item,RdbPredicates & predicates)91 void RdbUtils::NotEqualTo(const OperationItem &item, RdbPredicates &predicates)
92 {
93 // 2 is the number of argument item.singleParams
94 if (item.singleParams.size() < 2) {
95 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
96 return;
97 }
98 predicates.NotEqualTo(item.GetSingle(0), ToValueObject(item.GetSingle(1)));
99 }
100
GreaterThan(const OperationItem & item,RdbPredicates & predicates)101 void RdbUtils::GreaterThan(const OperationItem &item, RdbPredicates &predicates)
102 {
103 // 2 is the number of argument item.singleParams
104 if (item.singleParams.size() < 2) {
105 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
106 return;
107 }
108 predicates.GreaterThan(item.GetSingle(0), ToValueObject(item.GetSingle(1)));
109 }
110
LessThan(const OperationItem & item,RdbPredicates & predicates)111 void RdbUtils::LessThan(const OperationItem &item, RdbPredicates &predicates)
112 {
113 // 2 is the number of argument item.singleParams
114 if (item.singleParams.size() < 2) {
115 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
116 return;
117 }
118 predicates.LessThan(item.GetSingle(0), ToValueObject(item.GetSingle(1)));
119 }
120
GreaterThanOrEqualTo(const OperationItem & item,RdbPredicates & predicates)121 void RdbUtils::GreaterThanOrEqualTo(const OperationItem &item, RdbPredicates &predicates)
122 {
123 // 2 is the number of argument item.singleParams
124 if (item.singleParams.size() < 2) {
125 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
126 return;
127 }
128 predicates.GreaterThanOrEqualTo(item.GetSingle(0), ToValueObject(item.GetSingle(1)));
129 }
130
LessThanOrEqualTo(const OperationItem & item,RdbPredicates & predicates)131 void RdbUtils::LessThanOrEqualTo(const OperationItem &item, RdbPredicates &predicates)
132 {
133 // 2 is the number of argument item.singleParams
134 if (item.singleParams.size() < 2) {
135 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
136 return;
137 }
138 predicates.LessThanOrEqualTo(item.GetSingle(0), ToValueObject(item.GetSingle(1)));
139 }
140
And(const DataShare::OperationItem & item,RdbPredicates & predicates)141 void RdbUtils::And(const DataShare::OperationItem &item, RdbPredicates &predicates)
142 {
143 predicates.And();
144 }
145
Or(const DataShare::OperationItem & item,RdbPredicates & predicates)146 void RdbUtils::Or(const DataShare::OperationItem &item, RdbPredicates &predicates)
147 {
148 predicates.Or();
149 }
150
IsNull(const OperationItem & item,RdbPredicates & predicates)151 void RdbUtils::IsNull(const OperationItem &item, RdbPredicates &predicates)
152 {
153 if (item.singleParams.size() < 1) {
154 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
155 return;
156 }
157 predicates.IsNull(item.GetSingle(0));
158 }
159
IsNotNull(const DataShare::OperationItem & item,RdbPredicates & predicates)160 void RdbUtils::IsNotNull(const DataShare::OperationItem &item, RdbPredicates &predicates)
161 {
162 if (item.singleParams.size() < 1) {
163 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
164 return;
165 }
166 predicates.IsNotNull(item.GetSingle(0));
167 }
168
In(const DataShare::OperationItem & item,RdbPredicates & predicates)169 void RdbUtils::In(const DataShare::OperationItem &item, RdbPredicates &predicates)
170 {
171 if (item.singleParams.size() < 1 || item.multiParams.size() < 1) {
172 LOG_ERROR(
173 "SingleParams size is %{public}zu, MultiParams size is %{public}zu",
174 item.singleParams.size(), item.multiParams.size());
175 return;
176 }
177 predicates.In(item.GetSingle(0), MutliValue(item.multiParams[0]));
178 }
179
NotIn(const DataShare::OperationItem & item,RdbPredicates & predicates)180 void RdbUtils::NotIn(const DataShare::OperationItem &item, RdbPredicates &predicates)
181 {
182 if (item.singleParams.size() < 1 || item.multiParams.size() < 1) {
183 LOG_ERROR(
184 "SingleParams size is %{public}zu, MultiParams size is %{public}zu",
185 item.singleParams.size(), item.multiParams.size());
186 return;
187 }
188 predicates.NotIn(item.GetSingle(0), MutliValue(item.multiParams[0]));
189 }
190
Like(const DataShare::OperationItem & item,RdbPredicates & predicates)191 void RdbUtils::Like(const DataShare::OperationItem &item, RdbPredicates &predicates)
192 {
193 // 2 is the number of argument item.singleParams
194 if (item.singleParams.size() < 2) {
195 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
196 return;
197 }
198 predicates.Like(item.GetSingle(0), ToValueObject(item.GetSingle(1)));
199 }
200
NotLike(const DataShare::OperationItem & item,RdbPredicates & predicates)201 void RdbUtils::NotLike(const DataShare::OperationItem &item, RdbPredicates &predicates)
202 {
203 // 2 is the number of argument item.singleParams
204 if (item.singleParams.size() < 2) {
205 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
206 return;
207 }
208 predicates.NotLike(item.GetSingle(0), ToValueObject(item.GetSingle(1)));
209 }
210
OrderByAsc(const DataShare::OperationItem & item,RdbPredicates & predicates)211 void RdbUtils::OrderByAsc(const DataShare::OperationItem &item, RdbPredicates &predicates)
212 {
213 if (item.singleParams.size() < 1) {
214 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
215 return;
216 }
217 predicates.OrderByAsc(item.GetSingle(0));
218 }
219
OrderByDesc(const DataShare::OperationItem & item,RdbPredicates & predicates)220 void RdbUtils::OrderByDesc(const DataShare::OperationItem &item, RdbPredicates &predicates)
221 {
222 if (item.singleParams.size() < 1) {
223 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
224 return;
225 }
226 predicates.OrderByDesc(item.GetSingle(0));
227 }
228
Limit(const DataShare::OperationItem & item,RdbPredicates & predicates)229 void RdbUtils::Limit(const DataShare::OperationItem &item, RdbPredicates &predicates)
230 {
231 // 2 is the number of argument item.singleParams
232 if (item.singleParams.size() < 2) {
233 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
234 return;
235 }
236 predicates.Limit(item.GetSingle(0));
237 predicates.Offset(item.GetSingle(1));
238 }
239
Offset(const DataShare::OperationItem & item,RdbPredicates & predicates)240 void RdbUtils::Offset(const DataShare::OperationItem &item, RdbPredicates &predicates)
241 {
242 if (item.singleParams.size() < 1) {
243 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
244 return;
245 }
246 predicates.Offset(item.GetSingle(0));
247 }
248
BeginWrap(const DataShare::OperationItem & item,RdbPredicates & predicates)249 void RdbUtils::BeginWrap(const DataShare::OperationItem &item, RdbPredicates &predicates)
250 {
251 predicates.BeginWrap();
252 }
253
EndWrap(const DataShare::OperationItem & item,RdbPredicates & predicates)254 void RdbUtils::EndWrap(const DataShare::OperationItem &item, RdbPredicates &predicates)
255 {
256 predicates.EndWrap();
257 }
258
BeginsWith(const DataShare::OperationItem & item,RdbPredicates & predicates)259 void RdbUtils::BeginsWith(const DataShare::OperationItem &item, RdbPredicates &predicates)
260 {
261 // 2 is the number of argument item.singleParams
262 if (item.singleParams.size() < 2) {
263 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
264 return;
265 }
266 predicates.BeginsWith(item.GetSingle(0), ToValueObject(item.GetSingle(1)));
267 }
268
EndsWith(const DataShare::OperationItem & item,RdbPredicates & predicates)269 void RdbUtils::EndsWith(const DataShare::OperationItem &item, RdbPredicates &predicates)
270 {
271 // 2 is the number of argument item.singleParams
272 if (item.singleParams.size() < 2) {
273 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
274 return;
275 }
276 predicates.EndsWith(item.GetSingle(0), ToValueObject(item.GetSingle(1)));
277 }
278
Distinct(const DataShare::OperationItem & item,RdbPredicates & predicates)279 void RdbUtils::Distinct(const DataShare::OperationItem &item, RdbPredicates &predicates)
280 {
281 predicates.Distinct();
282 }
283
GroupBy(const DataShare::OperationItem & item,RdbPredicates & predicates)284 void RdbUtils::GroupBy(const DataShare::OperationItem &item, RdbPredicates &predicates)
285 {
286 if (item.multiParams.size() < 1) {
287 LOG_ERROR("MultiParams is missing elements, size is %{public}zu", item.multiParams.size());
288 return;
289 }
290 predicates.GroupBy(MutliValue(item.multiParams[0]));
291 }
292
IndexedBy(const DataShare::OperationItem & item,RdbPredicates & predicates)293 void RdbUtils::IndexedBy(const DataShare::OperationItem &item, RdbPredicates &predicates)
294 {
295 if (item.singleParams.size() < 1) {
296 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
297 return;
298 }
299 predicates.IndexedBy(item.GetSingle(0));
300 }
301
Contains(const DataShare::OperationItem & item,RdbPredicates & predicates)302 void RdbUtils::Contains(const DataShare::OperationItem &item, RdbPredicates &predicates)
303 {
304 // 2 is the number of argument item.singleParams
305 if (item.singleParams.size() < 2) {
306 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
307 return;
308 }
309 predicates.Contains(item.GetSingle(0), ToValueObject(item.GetSingle(1)));
310 }
311
NotContains(const DataShare::OperationItem & item,RdbPredicates & predicates)312 void RdbUtils::NotContains(const DataShare::OperationItem &item, RdbPredicates &predicates)
313 {
314 // 2 is the number of argument item.singleParams
315 if (item.singleParams.size() < 2) {
316 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
317 return;
318 }
319 predicates.NotContains(item.GetSingle(0), ToValueObject(item.GetSingle(1)));
320 }
321
Glob(const DataShare::OperationItem & item,RdbPredicates & predicates)322 void RdbUtils::Glob(const DataShare::OperationItem &item, RdbPredicates &predicates)
323 {
324 // 2 is the number of argument item.singleParams
325 if (item.singleParams.size() < 2) {
326 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
327 return;
328 }
329 predicates.Glob(item.GetSingle(0), ToValueObject(item.GetSingle(1)));
330 }
331
Between(const DataShare::OperationItem & item,RdbPredicates & predicates)332 void RdbUtils::Between(const DataShare::OperationItem &item, RdbPredicates &predicates)
333 {
334 // 3 is the number of argument item.singleParams
335 if (item.singleParams.size() < 3) {
336 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
337 return;
338 }
339 // singleParams[2] is another param
340 predicates.Between(item.GetSingle(0), ToValueObject(item.GetSingle(1)), ToValueObject(item.GetSingle(2)));
341 }
342
NotBetween(const DataShare::OperationItem & item,RdbPredicates & predicates)343 void RdbUtils::NotBetween(const DataShare::OperationItem &item, RdbPredicates &predicates)
344 {
345 // 3 is the number of argument item.singleParams
346 if (item.singleParams.size() < 3) {
347 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
348 return;
349 }
350 // singleParams[2] is another param
351 predicates.NotBetween(item.GetSingle(0), ToValueObject(item.GetSingle(1)), ToValueObject(item.GetSingle(2)));
352 }
353
CrossJoin(const DataShare::OperationItem & item,RdbPredicates & predicates)354 void RdbUtils::CrossJoin(const DataShare::OperationItem &item, RdbPredicates &predicates)
355 {
356 if (item.singleParams.size() < 1) {
357 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
358 return;
359 }
360 predicates.CrossJoin(item.GetSingle(0));
361 }
362
InnerJoin(const DataShare::OperationItem & item,RdbPredicates & predicates)363 void RdbUtils::InnerJoin(const DataShare::OperationItem &item, RdbPredicates &predicates)
364 {
365 if (item.singleParams.size() < 1) {
366 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
367 return;
368 }
369 predicates.InnerJoin(item.GetSingle(0));
370 }
371
LeftOuterJoin(const DataShare::OperationItem & item,RdbPredicates & predicates)372 void RdbUtils::LeftOuterJoin(const DataShare::OperationItem &item, RdbPredicates &predicates)
373 {
374 if (item.singleParams.size() < 1) {
375 LOG_ERROR("SingleParams is missing elements, size is %{public}zu", item.singleParams.size());
376 return;
377 }
378 predicates.LeftOuterJoin(item.GetSingle(0));
379 }
380
Using(const DataShare::OperationItem & item,RdbPredicates & predicates)381 void RdbUtils::Using(const DataShare::OperationItem &item, RdbPredicates &predicates)
382 {
383 if (item.multiParams.size() < 1) {
384 LOG_ERROR("MultiParams is missing elements, size is %{public}zu", item.multiParams.size());
385 return;
386 }
387 predicates.Using(MutliValue(item.multiParams[0]));
388 }
389
On(const DataShare::OperationItem & item,RdbPredicates & predicates)390 void RdbUtils::On(const DataShare::OperationItem &item, RdbPredicates &predicates)
391 {
392 if (item.multiParams.size() < 1) {
393 LOG_ERROR("MultiParams is missing elements, size is %{public}zu", item.multiParams.size());
394 return;
395 }
396 predicates.On(MutliValue(item.multiParams[0]));
397 }
398
RdbUtils()399 RdbUtils::RdbUtils()
400 {
401 }
402
~RdbUtils()403 RdbUtils::~RdbUtils()
404 {
405 }
406