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 "AbsRdbPredicates"
16 #include "abs_rdb_predicates.h"
17
18 #include <variant>
19
20 #include "logger.h"
21 #include "rdb_trace.h"
22
23 namespace OHOS::NativeRdb {
24 using namespace OHOS::Rdb;
25
AbsRdbPredicates(const std::string & tableName)26 AbsRdbPredicates::AbsRdbPredicates(const std::string &tableName)
27 {
28 if (tableName.empty()) {
29 tableName_ = "";
30 LOG_DEBUG("No tableName specified.");
31 return;
32 }
33 tableName_ = std::move(tableName);
34 predicates_.tables_.push_back(tableName_);
35 }
36
AbsRdbPredicates(const std::vector<std::string> & tables)37 AbsRdbPredicates::AbsRdbPredicates(const std::vector<std::string> &tables)
38 {
39 if (tables.empty()) {
40 tableName_ = "";
41 LOG_DEBUG("No tableName specified.");
42 return;
43 }
44 tableName_ = *(tables.begin());
45 predicates_.tables_ = std::move(tables);
46 }
47
Clear()48 void AbsRdbPredicates::Clear()
49 {
50 AbsPredicates::Clear();
51 InitialParam();
52 }
53
InitialParam()54 void AbsRdbPredicates::InitialParam()
55 {
56 joinTypes.clear();
57 joinTableNames.clear();
58 joinConditions.clear();
59 joinCount = 0;
60 }
61
GetJoinTypes()62 std::vector<std::string> AbsRdbPredicates::GetJoinTypes()
63 {
64 return joinTypes;
65 }
66
67 /**
68 * Sets the join types in the predicates. The value can be {@code INNER JOIN}, {@code LEFT OUTER JOIN},
69 * and {@code CROSS JOIN}.
70 */
SetJoinTypes(const std::vector<std::string> & joinTypes)71 void AbsRdbPredicates::SetJoinTypes(const std::vector<std::string> &joinTypes)
72 {
73 this->joinTypes = joinTypes;
74 }
75
76 /**
77 * Obtains the database table names of the joins in the predicates.
78 */
GetJoinTableNames()79 std::vector<std::string> AbsRdbPredicates::GetJoinTableNames()
80 {
81 return joinTableNames;
82 }
83
84 /**
85 * Sets the database table names of the joins in the predicates.
86 */
SetJoinTableNames(const std::vector<std::string> & joinTableNames)87 void AbsRdbPredicates::SetJoinTableNames(const std::vector<std::string> &joinTableNames)
88 {
89 this->joinTableNames = joinTableNames;
90 }
91
92 /**
93 * Obtains the join conditions in the predicates.
94 */
GetJoinConditions()95 std::vector<std::string> AbsRdbPredicates::GetJoinConditions()
96 {
97 return joinConditions;
98 }
99
100 /**
101 * Sets the join conditions required in the predicates.
102 */
SetJoinConditions(const std::vector<std::string> & joinConditions)103 void AbsRdbPredicates::SetJoinConditions(const std::vector<std::string> &joinConditions)
104 {
105 this->joinConditions = joinConditions;
106 }
107
108 /**
109 * Obtains the join clause in the predicates.
110 */
GetJoinClause() const111 std::string AbsRdbPredicates::GetJoinClause() const
112 {
113 return "";
114 }
115
116 /**
117 * Obtains the number of joins in the predicates.
118 */
GetJoinCount() const119 int AbsRdbPredicates::GetJoinCount() const
120 {
121 return joinCount;
122 }
123
124 /**
125 * Sets the number of joins in the predicates.
126 */
SetJoinCount(int joinCount)127 void AbsRdbPredicates::SetJoinCount(int joinCount)
128 {
129 this->joinCount = joinCount;
130 }
131
132 /**
133 * Obtains the table name.
134 */
GetTableName() const135 std::string AbsRdbPredicates::GetTableName() const
136 {
137 return tableName_;
138 }
139
ToString() const140 std::string AbsRdbPredicates::ToString() const
141 {
142 std::string args;
143 for (const auto& item : GetWhereArgs()) {
144 args += item + ", ";
145 }
146 return "TableName = " + GetTableName() + ", {WhereClause:" + GetWhereClause() + ", bindArgs:{" + args + "}"
147 + ", order:" + GetOrder() + ", group:" + GetGroup() + ", index:" + GetIndex()
148 + ", limit:" + std::to_string(GetLimit()) + ", offset:" + std::to_string(GetOffset())
149 + ", distinct:" + std::to_string(IsDistinct()) + ", isNeedAnd:" + std::to_string(IsNeedAnd())
150 + ", isSorted:" + std::to_string(IsSorted()) + "}";
151 }
152
InDevices(std::vector<std::string> & devices)153 AbsRdbPredicates* AbsRdbPredicates::InDevices(std::vector<std::string> &devices)
154 {
155 predicates_.devices_ = devices;
156 return this;
157 }
158
InAllDevices()159 AbsRdbPredicates* AbsRdbPredicates::InAllDevices()
160 {
161 predicates_.devices_.clear();
162 return this;
163 }
164
GetDistributedPredicates() const165 const DistributedRdb::PredicatesMemo& AbsRdbPredicates::GetDistributedPredicates() const
166 {
167 int limit = GetLimit();
168 if (limit >= 0) {
169 predicates_.AddOperation(DistributedRdb::RdbPredicateOperator::LIMIT,
170 std::to_string(limit), std::to_string(GetOffset()));
171 }
172 return predicates_;
173 }
174
EqualTo(const std::string & field,const ValueObject & value)175 AbsRdbPredicates* AbsRdbPredicates::EqualTo(const std::string &field, const ValueObject &value)
176 {
177 if (auto pval = std::get_if<std::string>(&value.value)) {
178 predicates_.AddOperation(DistributedRdb::EQUAL_TO, field, *pval);
179 }
180 return (AbsRdbPredicates *)AbsPredicates::EqualTo(field, value);
181 }
182
NotEqualTo(const std::string & field,const ValueObject & value)183 AbsRdbPredicates* AbsRdbPredicates::NotEqualTo(const std::string &field, const ValueObject &value)
184 {
185 if (auto pval = std::get_if<std::string>(&value.value)) {
186 predicates_.AddOperation(DistributedRdb::NOT_EQUAL_TO, field, *pval);
187 }
188 return (AbsRdbPredicates *)AbsPredicates::NotEqualTo(field, value);
189 }
190
And()191 AbsRdbPredicates* AbsRdbPredicates::And()
192 {
193 predicates_.AddOperation(DistributedRdb::AND, "", "");
194 return (AbsRdbPredicates *)AbsPredicates::And();
195 }
196
Or()197 AbsRdbPredicates* AbsRdbPredicates::Or()
198 {
199 predicates_.AddOperation(DistributedRdb::OR, "", "");
200 return (AbsRdbPredicates *)AbsPredicates::Or();
201 }
202
OrderByAsc(const std::string & field)203 AbsRdbPredicates* AbsRdbPredicates::OrderByAsc(const std::string &field)
204 {
205 std::string isAsc = "true";
206 predicates_.AddOperation(DistributedRdb::ORDER_BY, field, isAsc);
207 return (AbsRdbPredicates *)AbsPredicates::OrderByAsc(field);
208 }
209
OrderByDesc(const std::string & field)210 AbsRdbPredicates* AbsRdbPredicates::OrderByDesc(const std::string &field)
211 {
212 std::string isAsc = "false";
213 predicates_.AddOperation(DistributedRdb::ORDER_BY, field, isAsc);
214 return (AbsRdbPredicates *)AbsPredicates::OrderByDesc(field);
215 }
216
BeginWrap()217 AbsPredicates *AbsRdbPredicates::BeginWrap()
218 {
219 predicates_.AddOperation(DistributedRdb::BEGIN_GROUP, {}, "");
220 return (AbsRdbPredicates *)AbsPredicates::BeginWrap();
221 }
222
EndWrap()223 AbsPredicates *AbsRdbPredicates::EndWrap()
224 {
225 predicates_.AddOperation(DistributedRdb::END_GROUP, {}, "");
226 return (AbsRdbPredicates *)AbsPredicates::EndWrap();
227 }
228
In(const std::string & field,const std::vector<ValueObject> & values)229 AbsPredicates *AbsRdbPredicates::In(const std::string &field, const std::vector<ValueObject> &values)
230 {
231 std::vector<std::string> vals;
232 vals.reserve(values.size());
233 for (const auto &value : values) {
234 auto val = std::get_if<std::string>(&value.value);
235 if (val == nullptr) {
236 return (AbsRdbPredicates *)AbsPredicates::In(field, values);
237 }
238 vals.emplace_back(std::move(*val));
239 }
240 predicates_.AddOperation(DistributedRdb::IN, field, vals);
241 return (AbsRdbPredicates *)AbsPredicates::In(field, values);
242 }
243
In(const std::string & field,const std::vector<std::string> & values)244 AbsPredicates *AbsRdbPredicates::In(const std::string &field, const std::vector<std::string> &values)
245 {
246 predicates_.AddOperation(DistributedRdb::IN, field, values);
247 return (AbsRdbPredicates *)AbsPredicates::In(field, values);
248 }
249
Contains(const std::string & field,const std::string & value)250 AbsRdbPredicates *AbsRdbPredicates::Contains(const std::string &field, const std::string &value)
251 {
252 predicates_.AddOperation(DistributedRdb::CONTAIN, field, value);
253 return (AbsRdbPredicates *)AbsPredicates::Contains(field, value);
254 }
255
NotContains(const std::string & field,const std::string & value)256 AbsRdbPredicates *AbsRdbPredicates::NotContains(const std::string &field, const std::string &value)
257 {
258 predicates_.AddOperation(DistributedRdb::NOT_CONTAINS, field, value);
259 return (AbsRdbPredicates *)AbsPredicates::NotContains(field, value);
260 }
261
BeginsWith(const std::string & field,const std::string & value)262 AbsRdbPredicates *AbsRdbPredicates::BeginsWith(const std::string &field, const std::string &value)
263 {
264 predicates_.AddOperation(DistributedRdb::BEGIN_WITH, field, value);
265 return (AbsRdbPredicates *)AbsPredicates::BeginsWith(field, value);
266 }
EndsWith(const std::string & field,const std::string & value)267 AbsRdbPredicates *AbsRdbPredicates::EndsWith(const std::string &field, const std::string &value)
268 {
269 predicates_.AddOperation(DistributedRdb::END_WITH, field, value);
270 return (AbsRdbPredicates *)AbsPredicates::EndsWith(field, value);
271 }
IsNull(const std::string & field)272 AbsRdbPredicates *AbsRdbPredicates::IsNull(const std::string &field)
273 {
274 predicates_.AddOperation(DistributedRdb::IS_NULL, field, "");
275 return (AbsRdbPredicates *)AbsPredicates::IsNull(field);
276 }
IsNotNull(const std::string & field)277 AbsRdbPredicates *AbsRdbPredicates::IsNotNull(const std::string &field)
278 {
279 predicates_.AddOperation(DistributedRdb::IS_NOT_NULL, field, "");
280 return (AbsRdbPredicates *)AbsPredicates::IsNotNull(field);
281 }
Like(const std::string & field,const std::string & value)282 AbsRdbPredicates *AbsRdbPredicates::Like(const std::string &field, const std::string &value)
283 {
284 predicates_.AddOperation(DistributedRdb::LIKE, field, value);
285 return (AbsRdbPredicates *)AbsPredicates::Like(field, value);
286 }
NotLike(const std::string & field,const std::string & value)287 AbsRdbPredicates *AbsRdbPredicates::NotLike(const std::string &field, const std::string &value)
288 {
289 predicates_.AddOperation(DistributedRdb::NOT_LIKE, field, value);
290 return (AbsRdbPredicates *)AbsPredicates::NotLike(field, value);
291 }
Glob(const std::string & field,const std::string & value)292 AbsRdbPredicates *AbsRdbPredicates::Glob(const std::string &field, const std::string &value)
293 {
294 predicates_.AddOperation(DistributedRdb::GLOB, field, value);
295 return (AbsRdbPredicates *)AbsPredicates::Glob(field, value);
296 }
Distinct()297 AbsRdbPredicates *AbsRdbPredicates::Distinct()
298 {
299 predicates_.AddOperation(DistributedRdb::DISTINCT, "", "");
300 return (AbsRdbPredicates *)AbsPredicates::Distinct();
301 }
IndexedBy(const std::string & indexName)302 AbsRdbPredicates *AbsRdbPredicates::IndexedBy(const std::string &indexName)
303 {
304 predicates_.AddOperation(DistributedRdb::INDEXED_BY, indexName, "");
305 return (AbsRdbPredicates *)AbsPredicates::IndexedBy(indexName);
306 }
NotIn(const std::string & field,const std::vector<std::string> & values)307 AbsRdbPredicates *AbsRdbPredicates::NotIn(const std::string &field, const std::vector<std::string> &values)
308 {
309 predicates_.AddOperation(DistributedRdb::NOT_IN, field, values);
310 return (AbsRdbPredicates *)AbsPredicates::NotIn(field, values);
311 }
NotIn(const std::string & field,const std::vector<ValueObject> & values)312 AbsRdbPredicates *AbsRdbPredicates::NotIn(const std::string &field, const std::vector<ValueObject> &values)
313 {
314 std::vector<std::string> vals;
315 vals.reserve(values.size());
316 for (const auto &value : values) {
317 auto val = std::get_if<std::string>(&value.value);
318 if (val == nullptr) {
319 return (AbsRdbPredicates *)AbsPredicates::NotIn(field, values);
320 }
321 vals.emplace_back(std::move(*val));
322 }
323 predicates_.AddOperation(DistributedRdb::NOT_IN, field, vals);
324 return (AbsRdbPredicates *)AbsPredicates::NotIn(field, values);
325 }
326 } // namespace OHOS::NativeRdb