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 GetStatement() const;
49     API_EXPORT std::string GetWhereClause() const;
50     API_EXPORT void SetWhereClause(const std::string &whereClause);
51     [[deprecated("Use GetBindArgs() instead.")]]
52     API_EXPORT std::vector<std::string> GetWhereArgs() const;
53     API_EXPORT std::vector<ValueObject> GetBindArgs() const;
54     [[deprecated("Use SetBindArgs() instead.")]]
55     API_EXPORT void SetWhereArgs(const std::vector<std::string> &whereArgs);
56     API_EXPORT void SetBindArgs(const std::vector<ValueObject> &bindArgs);
57     API_EXPORT std::string GetOrder() const;
58     API_EXPORT void SetOrder(const std::string &order);
59     API_EXPORT int GetLimit() const;
60     API_EXPORT int GetOffset() const;
61     API_EXPORT bool IsDistinct() const;
62     API_EXPORT std::string GetGroup() const;
63     API_EXPORT std::string GetIndex() const;
64     API_EXPORT bool IsNeedAnd() const;
65     API_EXPORT bool IsSorted() const;
66     API_EXPORT bool HasSpecificField() 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 *Between(
86         const std::string &field, const ValueObject &low, const ValueObject &high);
87     API_EXPORT virtual AbsPredicates *NotBetween(
88         const std::string &field, const ValueObject &low, const ValueObject &high);
89     API_EXPORT virtual AbsPredicates *GreaterThan(const std::string &field, const ValueObject &value);
90     API_EXPORT virtual AbsPredicates *LessThan(const std::string &field, const ValueObject &value);
91     API_EXPORT virtual AbsPredicates *GreaterThanOrEqualTo(const std::string &field, const ValueObject &value);
92     API_EXPORT virtual AbsPredicates *LessThanOrEqualTo(const std::string &field, const ValueObject &value);
93     API_EXPORT virtual AbsPredicates *OrderByAsc(const std::string &field);
94     API_EXPORT virtual AbsPredicates *OrderByDesc(const std::string &field);
95     API_EXPORT virtual AbsPredicates *Distinct();
96     API_EXPORT virtual AbsPredicates *Limit(const int limit);
97     API_EXPORT virtual AbsPredicates *Limit(const int offset, const int limit);
98     API_EXPORT virtual AbsPredicates *Offset(const int offset);
99     API_EXPORT virtual AbsPredicates *GroupBy(const std::vector<std::string> &fields);
100     API_EXPORT virtual AbsPredicates *IndexedBy(const std::string &indexName);
101     [[deprecated("Use In(const std::string &, const std::vector<ValueObject> &) instead.")]]
102     API_EXPORT virtual AbsPredicates *In(const std::string &field, const std::vector<std::string> &values);
103     API_EXPORT virtual AbsPredicates *In(const std::string &field, const std::vector<ValueObject> &values);
104     [[deprecated("Use NotIn(const std::string &, const std::vector<ValueObject> &) instead.")]]
105     API_EXPORT virtual AbsPredicates *NotIn(const std::string &field, const std::vector<std::string> &values);
106     API_EXPORT virtual AbsPredicates *NotIn(const std::string &field, const std::vector<ValueObject> &values);
107 private:
108     static constexpr const char *LOG_ORIGIN_FIELD = "#_flag";
109 
110     std::string whereClause;
111     std::vector<ValueObject> bindArgs;
112     std::string order;
113     std::string group;
114     std::string index;
115     int limit;
116     int offset;
117     bool distinct;
118     bool isNeedAnd;
119     bool isSorted;
120     bool hasSpecificField = false;
121 
122     void Initial();
123     bool CheckParameter(
124         const std::string &methodName, const std::string &field, const std::initializer_list<ValueObject> &args) const;
IsSpecificField(const std::string & field)125     inline bool IsSpecificField(const std::string &field)
126     {
127         return field.find("#_") != std::string::npos;
128     }
129     std::string RemoveQuotes(const std::string &source) const;
130     void CheckIsNeedAnd();
131     void AppendWhereClauseWithInOrNotIn(const std::string &methodName, const std::string &field,
132         const std::vector<std::string> &replaceValues);
133 };
134 } // namespace NativeRdb
135 } // namespace OHOS
136 
137 #endif