• 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 #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(
170             DistributedRdb::RdbPredicateOperator::LIMIT, 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     if (auto pval = std::get_if<ValueObject::Asset>(&value.value)) {
181         predicates_.AddOperation(DistributedRdb::RdbPredicateOperator::ASSETS_ONLY, field, (*pval).name);
182     }
183     if (auto pval = std::get_if<ValueObject::Assets>(&value.value)) {
184         std::vector<std::string> names;
185         for (const auto &asset : *pval) {
186             names.push_back(asset.name);
187         }
188         predicates_.AddOperation(DistributedRdb::RdbPredicateOperator::ASSETS_ONLY, field, names);
189     }
190     return (AbsRdbPredicates *)AbsPredicates::EqualTo(field, value);
191 }
192 
NotEqualTo(const std::string & field,const ValueObject & value)193 AbsRdbPredicates *AbsRdbPredicates::NotEqualTo(const std::string &field, const ValueObject &value)
194 {
195     if (auto pval = std::get_if<std::string>(&value.value)) {
196         predicates_.AddOperation(DistributedRdb::NOT_EQUAL_TO, field, *pval);
197     }
198     return (AbsRdbPredicates *)AbsPredicates::NotEqualTo(field, value);
199 }
200 
And()201 AbsRdbPredicates *AbsRdbPredicates::And()
202 {
203     predicates_.AddOperation(DistributedRdb::AND, "", "");
204     return (AbsRdbPredicates *)AbsPredicates::And();
205 }
206 
Or()207 AbsRdbPredicates *AbsRdbPredicates::Or()
208 {
209     predicates_.AddOperation(DistributedRdb::OR, "", "");
210     return (AbsRdbPredicates *)AbsPredicates::Or();
211 }
212 
OrderByAsc(const std::string & field)213 AbsRdbPredicates *AbsRdbPredicates::OrderByAsc(const std::string &field)
214 {
215     std::string isAsc = "true";
216     predicates_.AddOperation(DistributedRdb::ORDER_BY, field, isAsc);
217     return (AbsRdbPredicates *)AbsPredicates::OrderByAsc(field);
218 }
219 
OrderByDesc(const std::string & field)220 AbsRdbPredicates *AbsRdbPredicates::OrderByDesc(const std::string &field)
221 {
222     std::string isAsc = "false";
223     predicates_.AddOperation(DistributedRdb::ORDER_BY, field, isAsc);
224     return (AbsRdbPredicates *)AbsPredicates::OrderByDesc(field);
225 }
226 
BeginWrap()227 AbsPredicates *AbsRdbPredicates::BeginWrap()
228 {
229     predicates_.AddOperation(DistributedRdb::BEGIN_GROUP, {}, "");
230     return (AbsRdbPredicates *)AbsPredicates::BeginWrap();
231 }
232 
EndWrap()233 AbsPredicates *AbsRdbPredicates::EndWrap()
234 {
235     predicates_.AddOperation(DistributedRdb::END_GROUP, {}, "");
236     return (AbsRdbPredicates *)AbsPredicates::EndWrap();
237 }
238 
In(const std::string & field,const std::vector<ValueObject> & values)239 AbsPredicates *AbsRdbPredicates::In(const std::string &field, const std::vector<ValueObject> &values)
240 {
241     std::vector<std::string> vals;
242     vals.reserve(values.size());
243     for (const auto &value : values) {
244         auto val = std::get_if<std::string>(&value.value);
245         if (val == nullptr) {
246             return (AbsRdbPredicates *)AbsPredicates::In(field, values);
247         }
248         vals.emplace_back(std::move(*val));
249     }
250     predicates_.AddOperation(DistributedRdb::IN, field, vals);
251     return (AbsRdbPredicates *)AbsPredicates::In(field, values);
252 }
253 
In(const std::string & field,const std::vector<std::string> & values)254 AbsPredicates *AbsRdbPredicates::In(const std::string &field, const std::vector<std::string> &values)
255 {
256     predicates_.AddOperation(DistributedRdb::IN, field, values);
257     return (AbsRdbPredicates *)AbsPredicates::In(field, values);
258 }
259 
Contains(const std::string & field,const std::string & value)260 AbsRdbPredicates *AbsRdbPredicates::Contains(const std::string &field, const std::string &value)
261 {
262     predicates_.AddOperation(DistributedRdb::CONTAIN, field, value);
263     return (AbsRdbPredicates *)AbsPredicates::Contains(field, value);
264 }
265 
NotContains(const std::string & field,const std::string & value)266 AbsRdbPredicates *AbsRdbPredicates::NotContains(const std::string &field, const std::string &value)
267 {
268     predicates_.AddOperation(DistributedRdb::NOT_CONTAINS, field, value);
269     return (AbsRdbPredicates *)AbsPredicates::NotContains(field, value);
270 }
271 
BeginsWith(const std::string & field,const std::string & value)272 AbsRdbPredicates *AbsRdbPredicates::BeginsWith(const std::string &field, const std::string &value)
273 {
274     predicates_.AddOperation(DistributedRdb::BEGIN_WITH, field, value);
275     return (AbsRdbPredicates *)AbsPredicates::BeginsWith(field, value);
276 }
EndsWith(const std::string & field,const std::string & value)277 AbsRdbPredicates *AbsRdbPredicates::EndsWith(const std::string &field, const std::string &value)
278 {
279     predicates_.AddOperation(DistributedRdb::END_WITH, field, value);
280     return (AbsRdbPredicates *)AbsPredicates::EndsWith(field, value);
281 }
IsNull(const std::string & field)282 AbsRdbPredicates *AbsRdbPredicates::IsNull(const std::string &field)
283 {
284     predicates_.AddOperation(DistributedRdb::IS_NULL, field, "");
285     return (AbsRdbPredicates *)AbsPredicates::IsNull(field);
286 }
IsNotNull(const std::string & field)287 AbsRdbPredicates *AbsRdbPredicates::IsNotNull(const std::string &field)
288 {
289     predicates_.AddOperation(DistributedRdb::IS_NOT_NULL, field, "");
290     return (AbsRdbPredicates *)AbsPredicates::IsNotNull(field);
291 }
Like(const std::string & field,const std::string & value)292 AbsRdbPredicates *AbsRdbPredicates::Like(const std::string &field, const std::string &value)
293 {
294     predicates_.AddOperation(DistributedRdb::LIKE, field, value);
295     return (AbsRdbPredicates *)AbsPredicates::Like(field, value);
296 }
NotLike(const std::string & field,const std::string & value)297 AbsRdbPredicates *AbsRdbPredicates::NotLike(const std::string &field, const std::string &value)
298 {
299     predicates_.AddOperation(DistributedRdb::NOT_LIKE, field, value);
300     return (AbsRdbPredicates *)AbsPredicates::NotLike(field, value);
301 }
Glob(const std::string & field,const std::string & value)302 AbsRdbPredicates *AbsRdbPredicates::Glob(const std::string &field, const std::string &value)
303 {
304     predicates_.AddOperation(DistributedRdb::GLOB, field, value);
305     return (AbsRdbPredicates *)AbsPredicates::Glob(field, value);
306 }
Distinct()307 AbsRdbPredicates *AbsRdbPredicates::Distinct()
308 {
309     predicates_.AddOperation(DistributedRdb::DISTINCT, "", "");
310     return (AbsRdbPredicates *)AbsPredicates::Distinct();
311 }
IndexedBy(const std::string & indexName)312 AbsRdbPredicates *AbsRdbPredicates::IndexedBy(const std::string &indexName)
313 {
314     predicates_.AddOperation(DistributedRdb::INDEXED_BY, indexName, "");
315     return (AbsRdbPredicates *)AbsPredicates::IndexedBy(indexName);
316 }
NotIn(const std::string & field,const std::vector<std::string> & values)317 AbsRdbPredicates *AbsRdbPredicates::NotIn(const std::string &field, const std::vector<std::string> &values)
318 {
319     predicates_.AddOperation(DistributedRdb::NOT_IN, field, values);
320     return (AbsRdbPredicates *)AbsPredicates::NotIn(field, values);
321 }
NotIn(const std::string & field,const std::vector<ValueObject> & values)322 AbsRdbPredicates *AbsRdbPredicates::NotIn(const std::string &field, const std::vector<ValueObject> &values)
323 {
324     std::vector<std::string> vals;
325     vals.reserve(values.size());
326     for (const auto &value : values) {
327         auto val = std::get_if<std::string>(&value.value);
328         if (val == nullptr) {
329             return (AbsRdbPredicates *)AbsPredicates::NotIn(field, values);
330         }
331         vals.emplace_back(std::move(*val));
332     }
333     predicates_.AddOperation(DistributedRdb::NOT_IN, field, vals);
334     return (AbsRdbPredicates *)AbsPredicates::NotIn(field, values);
335 }
336 } // namespace OHOS::NativeRdb