• 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 #ifndef SQLITE_QUERY_HELPER_H
16 #define SQLITE_QUERY_HELPER_H
17 
18 #include <list>
19 #include <set>
20 #include <string>
21 #include <vector>
22 
23 #include "query_expression.h"
24 #include "schema_utils.h"
25 #include "sqlite_import.h"
26 
27 namespace DistributedDB {
28 namespace TriggerMode {
29 enum class TriggerModeEnum;
30 }
31 enum class CloudWaterType;
32 struct QueryObjInfo {
33     SchemaObject schema_;
34     std::list<QueryObjNode> queryObjNodes_;
35     std::vector<uint8_t> prefixKey_;
36     std::string suggestIndex_;
37     std::set<Key> keys_;
38     int orderByCounts_ = 0; // Record processing to which orderBy node
39     bool isValid_ = true;
40     bool hasOrderBy_ = false;
41     bool hasLimit_ = false;
42     bool hasPrefixKey_ = false;
43     std::string tableName_;
44     bool isRelationalQuery_ = false;
45     SortType sortType_ = SortType::NONE;
46 };
47 
48 enum class SymbolType : uint32_t {
49     INVALID_SYMBOL = 0x0000,
50     COMPARE_SYMBOL = 0x0100, // relation symbol use to compare
51     RELATIONAL_SYMBOL = 0x0200,
52     RANGE_SYMBOL = 0x0300,
53     PREFIXKEY_SYMBOL = 0x0400,
54     LOGIC_SYMBOL = 0x0500,
55     LINK_SYMBOL = 0x0600, // use to link relatonal symbol
56     SPECIAL_SYMBOL = 0x0700, // need special precess and need at the last
57     SUGGEST_INDEX_SYMBOL = 0x0800,
58     IN_KEYS_SYMBOL = 0x0900,
59 };
60 
61 class SqliteQueryHelper final {
62 public:
63     explicit SqliteQueryHelper(const QueryObjInfo &info);
64 
65     // forbidden move constructor.
66     SqliteQueryHelper(SqliteQueryHelper &&) = delete;
67     SqliteQueryHelper &operator=(SqliteQueryHelper &&) = delete;
68     // forbidden copy constructor.
69     SqliteQueryHelper(const SqliteQueryHelper &) = delete;
70     SqliteQueryHelper &operator=(const SqliteQueryHelper &) = delete;
71 
72     ~SqliteQueryHelper() = default;
73 
74     int GetQuerySqlStatement(sqlite3 *dbHandle, bool onlyRowid, sqlite3_stmt *&statement);
75     int GetQuerySqlStatement(sqlite3 *dbHandle, const std::string &sql, sqlite3_stmt *&statement);
76     int GetCountSqlStatement(sqlite3 *dbHandle, sqlite3_stmt *&countStmt);
77 
78     // For query Sync
79     int GetQuerySyncStatement(sqlite3 *dbHandle, uint64_t beginTime, uint64_t endTime, sqlite3_stmt *&statement,
80         bool isCount = false);
81     int GetSyncDataCheckSql(std::string &sql);
82     int BindSyncDataCheckStmt(sqlite3_stmt *statement, const Key &hashKey) const;
83 
84     int GetSubscribeSql(TriggerMode::TriggerModeEnum mode, std::string &subscribeCondition);
85 
86     static SymbolType GetSymbolType(const QueryObjType &queryObjType);
87 
88     // public for unit test
89     int GetQuerySql(std::string &sql, bool onlyRowid);
90     int GetCountQuerySql(std::string &sql);
91 
GetTableName()92     const std::string &GetTableName()
93     {
94         return tableName_;
95     }
96 
97     int GetRelationalMissQuerySql(const std::vector<std::string> &fieldNames, std::string &sql);
98     int GetRelationalMissQueryStatement(sqlite3 *dbHandle, uint64_t beginTime, uint64_t endTime,
99         const std::vector<std::string> &fieldNames, sqlite3_stmt *&statement);
100     int GetRelationalSyncDataQuerySql(std::string &sql, bool hasSubQuery, const std::vector<std::string> &fieldNames);
101     int GetRelationalSyncDataQuerySqlWithLimit(const std::vector<std::string> &fieldNames, std::string &sql);
102     int GetRelationalQueryStatement(sqlite3 *dbHandle, uint64_t beginTime, uint64_t endTime,
103         const std::vector<std::string> &fieldNames, sqlite3_stmt *&statement);
104     std::string GetRelationalCloudQuerySql(const std::vector<Field> &fields,
105         const bool &isCloudForcePush, bool isCompensatedTask, CloudWaterType mode);
106 
107     std::string GetCountRelationalCloudQuerySql(bool isCloudForcePush, bool isCompensatedTask, CloudWaterType mode);
108 
109     std::string GetGidRelationalCloudQuerySql(const std::vector<Field> &fields, bool isCloudForcePush,
110         bool isCompensatedTask);
111 
112     int GetCloudQueryStatement(bool useTimestampAlias, sqlite3 *dbHandle, std::string &sql, sqlite3_stmt *&statement);
113 
114     int GetAndBindGidKvCloudQueryStatement(const std::string &user, sqlite3 *dbHandle, sqlite3_stmt *&stmt);
115 
116     int GetCountKvCloudDataStatement(sqlite3 *db, bool forcePush, const CloudWaterType mode, sqlite3_stmt *&stmt);
117 
118     std::pair<int, int64_t> BindCountKvCloudDataStatement(sqlite3 *db, bool isMemory, const Timestamp &timestamp,
119         const std::string &user, sqlite3_stmt *&stmt);
120 
121     void AppendKvQueryObjectOnSql(std::string &sql);
122 
123     std::pair<int, sqlite3_stmt *> GetKvCloudQueryStmt(sqlite3 *db, bool forcePush, const CloudWaterType mode,
124         int64_t timeStamp, const std::string &user);
125 
126     static std::string GetKvCloudQuerySql(bool countOnly, bool forcePush);
127 
128     static void AppendCloudQueryToGetDiffData(std::string &sql, const CloudWaterType mode, bool isKv = false);
129 
130     static std::string GetKvCloudRecordSql();
131 
132     static std::string GetCloudVersionRecordSql(bool isDeviceEmpty);
133 private:
134     int ToQuerySql();
135     int ToQuerySyncSql(bool hasSubQuery, bool useTimestampAlias = false);
136     int ToGetCountSql();
137     int ParseQueryExpression(const QueryObjNode &queryNode, std::string &querySql,
138         const std::string &accessStr = "", bool placeholder = true);
139     std::string MapRelationalSymbolToSql(const QueryObjNode &queryNode, bool placeholder = false) const;
140     std::string MapKeywordSymbolToSql(const QueryObjNode &queryNode);
141     std::string MapLogicSymbolToSql(const QueryObjNode &queryNode) const;
142     std::string MapValueToSql(const QueryObjNode &queryNode, bool placeholder) const;
143     std::string MapCastFuncSql(const QueryObjNode &queryNode, const std::string &accessStr = "");
144     std::string MapCastTypeSql(const FieldType &type) const;
145     int BindFieldValue(sqlite3_stmt *statement, const QueryObjNode &queryNode, int &index) const;
146     bool FilterSymbolToAddBracketLink(std::string &querySql, bool isNeedLink = true) const;
147     std::string AssembleSqlForSuggestIndex(const std::string &baseSql, const std::string &filter) const;
148     std::string CheckAndFormatSuggestIndex() const;
149     int GetSyncDataQuerySql(std::string &sql, bool hasSubQuery, bool isCount);
150     int ParseQueryObjNodeToSQL(bool isQueryForSync);
151     int BindTimeRange(sqlite3_stmt *&statement, int &index, uint64_t beginTime, uint64_t endTime) const;
152     int BindObjNodes(sqlite3_stmt *&statement, int &index) const;
153     int GetSubscribeCondition(const std::string &accessStr, std::string &conditionStr);
154     std::string MapKeysInToSql(size_t keysNum) const;
155     int BindKeysToStmt(const std::set<Key> &keys, sqlite3_stmt *&countStmt, int &index) const;
156 
157     std::string MapKeysInSubCondition(const std::string &accessStr) const;  // For InKeys.
158     // Return the left string of symbol in compare clause.
159     std::string GetFieldShape(const QueryObjNode &queryNode, const std::string &accessStr = "");
160 
161     void AppendCloudQuery(bool isCloudForcePush, bool isCompensatedTask, std::string &sql, CloudWaterType mode);
162 
163     void AppendCloudGidQuery(bool isCloudForcePush, bool isCompensatedTask, std::string &sql);
164     SchemaObject schema_;
165     std::list<QueryObjNode> queryObjNodes_;
166     std::vector<uint8_t> prefixKey_;
167     std::string suggestIndex_;
168     std::string tableName_;
169     std::set<Key> keys_;
170 
171     std::string querySql_;
172     std::string countSql_;
173 
174     int orderByCounts_; // Record processing to which orderBy node
175     bool isValid_;
176     bool transformed_;
177     bool hasOrderBy_;
178     bool hasLimit_;
179     bool isOrderByAppeared_;
180     bool hasPrefixKey_;
181     bool isNeedOrderbyKey_;  // The tag field is used for prefix query filtering key sorting
182     bool isRelationalQuery_;
183     SortType sortType_ = SortType::NONE;
184 };
185 }
186 #endif