• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
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 
ToString(const DataSharePredicatesObject & predicatesObject)57 std::string RdbUtils::ToString(const DataSharePredicatesObject &predicatesObject)
58 {
59     if (auto *val = std::get_if<int>(&predicatesObject.value)) {
60         return std::to_string(*val);
61     }
62     if (auto *val = std::get_if<double>(&predicatesObject.value)) {
63         return std::to_string(*val);
64     }
65     if (auto *val = std::get_if<std::string>(&predicatesObject.value)) {
66         return *val;
67     }
68     if (auto *val = std::get_if<bool>(&predicatesObject.value)) {
69         return std::to_string(*val);
70     }
71     if (auto *val = std::get_if<int64_t>(&predicatesObject.value)) {
72         return std::to_string(*val);
73     }
74     if (auto *val = std::get_if<std::monostate>(&predicatesObject.value)) {
75         LOG_INFO("RdbUtils::ToString No matching type");
76     }
77     return " ";
78 }
79 
ToResultSetBridge(std::shared_ptr<ResultSet> resultSet)80 std::shared_ptr<ResultSetBridge> RdbUtils::ToResultSetBridge(std::shared_ptr<ResultSet> resultSet)
81 {
82     if (resultSet == nullptr) {
83         LOG_ERROR("resultSet is null");
84         return nullptr;
85     }
86     return std::make_shared<RdbResultSetBridge>(resultSet);
87 }
88 
NoSupport(const OperationItem & item,RdbPredicates & query)89 void RdbUtils::NoSupport(const OperationItem &item, RdbPredicates &query)
90 {
91     LOG_ERROR("invalid operation:%{public}d", item.operation);
92 }
93 
EqualTo(const OperationItem & item,RdbPredicates & predicates)94 void RdbUtils::EqualTo(const OperationItem &item, RdbPredicates &predicates)
95 {
96     predicates.EqualTo(item.GetSingle(0), ToString(item.singleParams[1]));
97 }
98 
NotEqualTo(const OperationItem & item,RdbPredicates & predicates)99 void RdbUtils::NotEqualTo(const OperationItem &item, RdbPredicates &predicates)
100 {
101     predicates.NotEqualTo(item.GetSingle(0), ToString(item.singleParams[1]));
102 }
103 
GreaterThan(const OperationItem & item,RdbPredicates & predicates)104 void RdbUtils::GreaterThan(const OperationItem &item, RdbPredicates &predicates)
105 {
106     predicates.GreaterThan(item.GetSingle(0), ToString(item.singleParams[1]));
107 }
108 
LessThan(const OperationItem & item,RdbPredicates & predicates)109 void RdbUtils::LessThan(const OperationItem &item, RdbPredicates &predicates)
110 {
111     predicates.LessThan(item.GetSingle(0), ToString(item.singleParams[1]));
112 }
113 
GreaterThanOrEqualTo(const OperationItem & item,RdbPredicates & predicates)114 void RdbUtils::GreaterThanOrEqualTo(const OperationItem &item, RdbPredicates &predicates)
115 {
116     predicates.GreaterThanOrEqualTo(item.GetSingle(0), ToString(item.singleParams[1]));
117 }
118 
LessThanOrEqualTo(const OperationItem & item,RdbPredicates & predicates)119 void RdbUtils::LessThanOrEqualTo(const OperationItem &item, RdbPredicates &predicates)
120 {
121     predicates.LessThanOrEqualTo(item.GetSingle(0), ToString(item.singleParams[1]));
122 }
123 
And(const DataShare::OperationItem & item,RdbPredicates & predicates)124 void RdbUtils::And(const DataShare::OperationItem &item, RdbPredicates &predicates)
125 {
126     predicates.And();
127 }
128 
Or(const DataShare::OperationItem & item,RdbPredicates & predicates)129 void RdbUtils::Or(const DataShare::OperationItem &item, RdbPredicates &predicates)
130 {
131     predicates.Or();
132 }
133 
IsNull(const OperationItem & item,RdbPredicates & predicates)134 void RdbUtils::IsNull(const OperationItem &item, RdbPredicates &predicates)
135 {
136     predicates.IsNull(item.GetSingle(0));
137 }
138 
IsNotNull(const DataShare::OperationItem & item,RdbPredicates & predicates)139 void RdbUtils::IsNotNull(const DataShare::OperationItem &item, RdbPredicates &predicates)
140 {
141     predicates.IsNotNull(item.GetSingle(0));
142 }
143 
In(const DataShare::OperationItem & item,RdbPredicates & predicates)144 void RdbUtils::In(const DataShare::OperationItem &item, RdbPredicates &predicates)
145 {
146     predicates.In(item.GetSingle(0), MutliValue(item.multiParams[0]));
147 }
148 
NotIn(const DataShare::OperationItem & item,RdbPredicates & predicates)149 void RdbUtils::NotIn(const DataShare::OperationItem &item, RdbPredicates &predicates)
150 {
151     predicates.NotIn(item.GetSingle(0), MutliValue(item.multiParams[0]));
152 }
153 
Like(const DataShare::OperationItem & item,RdbPredicates & predicates)154 void RdbUtils::Like(const DataShare::OperationItem &item, RdbPredicates &predicates)
155 {
156     predicates.Like(item.GetSingle(0), ToString(item.singleParams[1]));
157 }
158 
OrderByAsc(const DataShare::OperationItem & item,RdbPredicates & predicates)159 void RdbUtils::OrderByAsc(const DataShare::OperationItem &item, RdbPredicates &predicates)
160 {
161     predicates.OrderByAsc(item.GetSingle(0));
162 }
163 
OrderByDesc(const DataShare::OperationItem & item,RdbPredicates & predicates)164 void RdbUtils::OrderByDesc(const DataShare::OperationItem &item, RdbPredicates &predicates)
165 {
166     predicates.OrderByDesc(item.GetSingle(0));
167 }
168 
Limit(const DataShare::OperationItem & item,RdbPredicates & predicates)169 void RdbUtils::Limit(const DataShare::OperationItem &item, RdbPredicates &predicates)
170 {
171     predicates.Limit(item.GetSingle(0));
172     predicates.Offset(item.GetSingle(1));
173 }
174 
Offset(const DataShare::OperationItem & item,RdbPredicates & predicates)175 void RdbUtils::Offset(const DataShare::OperationItem &item, RdbPredicates &predicates)
176 {
177     predicates.Offset(item.GetSingle(0));
178 }
179 
BeginWrap(const DataShare::OperationItem & item,RdbPredicates & predicates)180 void RdbUtils::BeginWrap(const DataShare::OperationItem &item, RdbPredicates &predicates)
181 {
182     predicates.BeginWrap();
183 }
184 
EndWrap(const DataShare::OperationItem & item,RdbPredicates & predicates)185 void RdbUtils::EndWrap(const DataShare::OperationItem &item, RdbPredicates &predicates)
186 {
187     predicates.EndWrap();
188 }
189 
BeginsWith(const DataShare::OperationItem & item,RdbPredicates & predicates)190 void RdbUtils::BeginsWith(const DataShare::OperationItem &item, RdbPredicates &predicates)
191 {
192     predicates.BeginsWith(item.GetSingle(0), ToString(item.singleParams[1]));
193 }
194 
EndsWith(const DataShare::OperationItem & item,RdbPredicates & predicates)195 void RdbUtils::EndsWith(const DataShare::OperationItem &item, RdbPredicates &predicates)
196 {
197     predicates.EndsWith(item.GetSingle(0), ToString(item.singleParams[1]));
198 }
199 
Distinct(const DataShare::OperationItem & item,RdbPredicates & predicates)200 void RdbUtils::Distinct(const DataShare::OperationItem &item, RdbPredicates &predicates)
201 {
202     predicates.Distinct();
203 }
204 
GroupBy(const DataShare::OperationItem & item,RdbPredicates & predicates)205 void RdbUtils::GroupBy(const DataShare::OperationItem &item, RdbPredicates &predicates)
206 {
207     predicates.GroupBy(MutliValue(item.multiParams[0]));
208 }
209 
IndexedBy(const DataShare::OperationItem & item,RdbPredicates & predicates)210 void RdbUtils::IndexedBy(const DataShare::OperationItem &item, RdbPredicates &predicates)
211 {
212     predicates.IndexedBy(item.GetSingle(0));
213 }
214 
Contains(const DataShare::OperationItem & item,RdbPredicates & predicates)215 void RdbUtils::Contains(const DataShare::OperationItem &item, RdbPredicates &predicates)
216 {
217     predicates.Contains(item.GetSingle(0), ToString(item.singleParams[1]));
218 }
219 
Glob(const DataShare::OperationItem & item,RdbPredicates & predicates)220 void RdbUtils::Glob(const DataShare::OperationItem &item, RdbPredicates &predicates)
221 {
222     predicates.Glob(item.GetSingle(0), ToString(item.singleParams[1]));
223 }
224 
Between(const DataShare::OperationItem & item,RdbPredicates & predicates)225 void RdbUtils::Between(const DataShare::OperationItem &item, RdbPredicates &predicates)
226 {
227     // singleParams[2] is another param
228     predicates.Between(item.GetSingle(0), ToString(item.singleParams[1]), ToString(item.singleParams[2]));
229 }
230 
NotBetween(const DataShare::OperationItem & item,RdbPredicates & predicates)231 void RdbUtils::NotBetween(const DataShare::OperationItem &item, RdbPredicates &predicates)
232 {
233     // singleParams[2] is another param
234     predicates.NotBetween(item.GetSingle(0), ToString(item.singleParams[1]), ToString(item.singleParams[2]));
235 }
236 
CrossJoin(const DataShare::OperationItem & item,RdbPredicates & predicates)237 void RdbUtils::CrossJoin(const DataShare::OperationItem &item, RdbPredicates &predicates)
238 {
239     predicates.CrossJoin(item.GetSingle(0));
240 }
241 
InnerJoin(const DataShare::OperationItem & item,RdbPredicates & predicates)242 void RdbUtils::InnerJoin(const DataShare::OperationItem &item, RdbPredicates &predicates)
243 {
244     predicates.InnerJoin(item.GetSingle(0));
245 }
246 
LeftOuterJoin(const DataShare::OperationItem & item,RdbPredicates & predicates)247 void RdbUtils::LeftOuterJoin(const DataShare::OperationItem &item, RdbPredicates &predicates)
248 {
249     predicates.LeftOuterJoin(item.GetSingle(0));
250 }
251 
Using(const DataShare::OperationItem & item,RdbPredicates & predicates)252 void RdbUtils::Using(const DataShare::OperationItem &item, RdbPredicates &predicates)
253 {
254     predicates.Using(MutliValue(item.multiParams[0]));
255 }
256 
On(const DataShare::OperationItem & item,RdbPredicates & predicates)257 void RdbUtils::On(const DataShare::OperationItem &item, RdbPredicates &predicates)
258 {
259     predicates.On(MutliValue(item.multiParams[0]));
260 }
261 
RdbUtils()262 RdbUtils::RdbUtils()
263 {
264 }
265 
~RdbUtils()266 RdbUtils::~RdbUtils()
267 {
268 }
269