• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 #ifndef NATIVE_RDB_ABSPREDICATES_H
17 #define NATIVE_RDB_ABSPREDICATES_H
18 
19 #include <climits>
20 #include <string>
21 #include <vector>
22 
23 #include "rdb_visibility.h"
24 #include "value_object.h"
25 
26 namespace OHOS {
27 namespace NativeRdb {
28 class API_EXPORT AbsPredicates {
29 public:
30     static constexpr int INIT_LIMIT_VALUE = INT_MIN;
31     static constexpr int INIT_OFFSET_VALUE = INT_MIN;
32     API_EXPORT AbsPredicates();
33     API_EXPORT virtual ~AbsPredicates();
34 
35     enum JoinType {
36         INNER,
37         LEFT,
38         CROSS
39     };
40 
41     enum Origin {
42         LOCAL = 0,
43         CLOUD,
44         REMOTE,
45         BUTT
46     };
47 
48     API_EXPORT std::string GetWhereClause() const;
49     API_EXPORT void SetWhereClause(const std::string &whereClause);
50     [[deprecated("Use GetBindArgs() instead.")]]
51     API_EXPORT std::vector<std::string> GetWhereArgs() const;
52     API_EXPORT std::vector<ValueObject> GetBindArgs() const;
53     [[deprecated("Use SetBindArgs() instead.")]]
54     API_EXPORT void SetWhereArgs(const std::vector<std::string> &whereArgs);
55     API_EXPORT void SetBindArgs(const std::vector<ValueObject> &bindArgs);
56     API_EXPORT std::string GetOrder() const;
57     API_EXPORT void SetOrder(const std::string &order);
58     API_EXPORT int GetLimit() const;
59     API_EXPORT int GetOffset() const;
60     API_EXPORT bool IsDistinct() const;
61     API_EXPORT std::string GetGroup() const;
62     API_EXPORT std::string GetIndex() const;
63     API_EXPORT bool IsNeedAnd() const;
64     API_EXPORT bool IsSorted() const;
65     API_EXPORT bool HasSpecificField() const;
66     API_EXPORT std::string GetHaving() const;
67 
68 public:
69     API_EXPORT virtual void Clear();
70     API_EXPORT virtual AbsPredicates *EqualTo(const std::string &field, const ValueObject &value);
71     API_EXPORT virtual AbsPredicates *NotEqualTo(const std::string &field, const ValueObject &value);
72     API_EXPORT virtual AbsPredicates *BeginWrap();
73     API_EXPORT virtual AbsPredicates *EndWrap();
74     API_EXPORT virtual AbsPredicates *Or();
75     API_EXPORT virtual AbsPredicates *And();
76     API_EXPORT virtual AbsPredicates *Contains(const std::string &field, const std::string &value);
77     API_EXPORT virtual AbsPredicates *NotContains(const std::string &field, const std::string &value);
78     API_EXPORT virtual AbsPredicates *BeginsWith(const std::string &field, const std::string &value);
79     API_EXPORT virtual AbsPredicates *EndsWith(const std::string &field, const std::string &value);
80     API_EXPORT virtual AbsPredicates *IsNull(const std::string &field);
81     API_EXPORT virtual AbsPredicates *IsNotNull(const std::string &field);
82     API_EXPORT virtual AbsPredicates *Like(const std::string &field, const std::string &value);
83     API_EXPORT virtual AbsPredicates *NotLike(const std::string &field, const std::string &value);
84     API_EXPORT virtual AbsPredicates *Glob(const std::string &field, const std::string &value);
85     API_EXPORT virtual AbsPredicates *NotGlob(const std::string &field, const std::string &value);
86     API_EXPORT virtual AbsPredicates *Between(
87         const std::string &field, const ValueObject &low, const ValueObject &high);
88     API_EXPORT virtual AbsPredicates *NotBetween(
89         const std::string &field, const ValueObject &low, const ValueObject &high);
90     API_EXPORT virtual AbsPredicates *GreaterThan(const std::string &field, const ValueObject &value);
91     API_EXPORT virtual AbsPredicates *LessThan(const std::string &field, const ValueObject &value);
92     API_EXPORT virtual AbsPredicates *GreaterThanOrEqualTo(const std::string &field, const ValueObject &value);
93     API_EXPORT virtual AbsPredicates *LessThanOrEqualTo(const std::string &field, const ValueObject &value);
94     API_EXPORT virtual AbsPredicates *OrderByAsc(const std::string &field);
95     API_EXPORT virtual AbsPredicates *OrderByDesc(const std::string &field);
96     API_EXPORT virtual AbsPredicates *Distinct();
97     API_EXPORT virtual AbsPredicates *Limit(const int limit);
98     API_EXPORT virtual AbsPredicates *Limit(const int offset, const int limit);
99     API_EXPORT virtual AbsPredicates *Offset(const int offset);
100     API_EXPORT virtual AbsPredicates *GroupBy(const std::vector<std::string> &fields);
101     API_EXPORT virtual AbsPredicates *IndexedBy(const std::string &indexName);
102     [[deprecated("Use In(const std::string &, const std::vector<ValueObject> &) instead.")]]
103     API_EXPORT virtual AbsPredicates *In(const std::string &field, const std::vector<std::string> &values);
104     API_EXPORT virtual AbsPredicates *In(const std::string &field, const std::vector<ValueObject> &values);
105     [[deprecated("Use NotIn(const std::string &, const std::vector<ValueObject> &) instead.")]]
106     API_EXPORT virtual AbsPredicates *NotIn(const std::string &field, const std::vector<std::string> &values);
107     API_EXPORT virtual AbsPredicates *NotIn(const std::string &field, const std::vector<ValueObject> &values);
108     API_EXPORT virtual AbsPredicates *Having(
109         const std::string &conditions, const std::vector<ValueObject> &values = {});
110     API_EXPORT virtual std::string GetStatement() const;
111 
112 private:
113     static constexpr const char *LOG_ORIGIN_FIELD = "#_flag";
114 
115     std::string whereClause;
116     std::vector<ValueObject> bindArgs;
117     std::string order;
118     std::string group;
119     std::string index;
120     std::string havingClause;
121     int limit;
122     int offset;
123     bool distinct;
124     bool isNeedAnd;
125     bool isSorted;
126     bool hasSpecificField = false;
127 
128     void Initial();
129     bool CheckParameter(
130         const std::string &methodName, const std::string &field, const std::initializer_list<ValueObject> &args) const;
IsSpecificField(const std::string & field)131     inline bool IsSpecificField(const std::string &field)
132     {
133         return field.find("#_") != std::string::npos;
134     }
135     std::string RemoveQuotes(const std::string &source) const;
136     void CheckIsNeedAnd();
137     void AppendWhereClauseWithInOrNotIn(
138         const std::string &methodName, const std::string &field, const std::vector<std::string> &replaceValues);
139 };
140 } // namespace NativeRdb
141 } // namespace OHOS
142 
143 #endif