• 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 struct QueryObjInfo {
32     SchemaObject schema_;
33     std::list<QueryObjNode> queryObjNodes_;
34     std::vector<uint8_t> prefixKey_;
35     std::string suggestIndex_;
36     std::set<Key> keys_;
37     int orderByCounts_ = 0; // Record processing to which orderBy node
38     bool isValid_ = true;
39     bool hasOrderBy_ = false;
40     bool hasLimit_ = false;
41     bool hasPrefixKey_ = false;
42     std::string tableName_;
43     bool isRelationalQuery_ = false;
44 };
45 
46 enum SymbolType : uint32_t {
47     INVALID_SYMBOL = 0x0000,
48     COMPARE_SYMBOL = 0x0100, // relation symbol use to compare
49     RELATIONAL_SYMBOL = 0x0200,
50     RANGE_SYMBOL = 0x0300,
51     PREFIXKEY_SYMBOL = 0x0400,
52     LOGIC_SYMBOL = 0x0500,
53     LINK_SYMBOL = 0x0600, // use to link relatonal symbol
54     SPECIAL_SYMBOL = 0x0700, // need special precess and need at the last
55     SUGGEST_INDEX_SYMBOL = 0x0800,
56     IN_KEYS_SYMBOL = 0x0900,
57 };
58 
59 class SqliteQueryHelper final {
60 public:
61     explicit SqliteQueryHelper(const QueryObjInfo &info);
62 
63     // forbidden move constructor.
64     SqliteQueryHelper(SqliteQueryHelper &&) = delete;
65     SqliteQueryHelper &operator=(SqliteQueryHelper &&) = delete;
66     // forbidden copy constructor.
67     SqliteQueryHelper(const SqliteQueryHelper &) = delete;
68     SqliteQueryHelper &operator=(const SqliteQueryHelper &) = delete;
69 
70     ~SqliteQueryHelper() = default;
71 
72     int GetQuerySqlStatement(sqlite3 *dbHandle, bool onlyRowid, sqlite3_stmt *&statement);
73     int GetQuerySqlStatement(sqlite3 *dbHandle, const std::string &sql, sqlite3_stmt *&statement);
74     int GetCountSqlStatement(sqlite3 *dbHandle, sqlite3_stmt *&countStmt);
75 
76     // For query Sync
77     int GetQuerySyncStatement(sqlite3 *dbHandle, uint64_t beginTime, uint64_t endTime, sqlite3_stmt *&statement);
78     int GetSyncDataCheckSql(std::string &sql);
79     int BindSyncDataCheckStmt(sqlite3_stmt *statement, const Key &hashKey) const;
80 
81     int GetSubscribeSql(const std::string &subscribeId, TriggerMode::TriggerModeEnum mode,
82         std::string &subscribeCondition);
83 
84     static SymbolType GetSymbolType(const QueryObjType &queryObjType);
85 
86     // public for unit test
87     int GetQuerySql(std::string &sql, bool onlyRowid);
88     int GetCountQuerySql(std::string &sql);
89 
GetTableName()90     const std::string &GetTableName()
91     {
92         return tableName_;
93     }
94 
95     int GetRelationalMissQuerySql(const std::vector<std::string> &fieldNames, std::string &sql);
96     int GetRelationalMissQueryStatement(sqlite3 *dbHandle, uint64_t beginTime, uint64_t endTime,
97         const std::vector<std::string> &fieldNames, sqlite3_stmt *&statement);
98     int GetRelationalSyncDataQuerySql(std::string &sql, bool hasSubQuery, const std::vector<std::string> &fieldNames);
99     int GetRelationalQueryStatement(sqlite3 *dbHandle, uint64_t beginTime, uint64_t endTime,
100         const std::vector<std::string> &fieldNames, sqlite3_stmt *&statement);
101 
102 private:
103     int ToQuerySql();
104     int ToQuerySyncSql(bool hasSubQuery, bool useTimeStampAlias = false);
105     int ToGetCountSql();
106     int ParseQueryExpression(const QueryObjNode &queryNode, std::string &querySql,
107         const std::string &accessStr = "", bool placeholder = true);
108     std::string MapRelationalSymbolToSql(const QueryObjNode &queryNode, bool placeholder = false) const;
109     std::string MapKeywordSymbolToSql(const QueryObjNode &queryNode);
110     std::string MapLogicSymbolToSql(const QueryObjNode &queryNode) const;
111     std::string MapValueToSql(const QueryObjNode &queryNode, bool placeholder) const;
112     std::string MapCastFuncSql(const QueryObjNode &queryNode, const std::string &accessStr = "");
113     std::string MapCastTypeSql(const FieldType &type) const;
114     int BindFieldValue(sqlite3_stmt *statement, const QueryObjNode &queryNode, int &index) const;
115     bool FilterSymbolToAddBracketLink(std::string &querySql, bool isNeedLink = true) const;
116     std::string AssembleSqlForSuggestIndex(const std::string &baseSql, const std::string &filter) const;
117     std::string CheckAndFormatSuggestIndex() const;
118     int GetSyncDataQuerySql(std::string &sql, bool hasSubQuery);
119     int ParseQueryObjNodeToSQL(bool isQueryForSync);
120     int BindTimeRange(sqlite3_stmt *&statement, int &index, uint64_t beginTime, uint64_t endTime) const;
121     int BindObjNodes(sqlite3_stmt *&statement, int &index) const;
122     int GetSubscribeCondition(const std::string &accessStr, std::string &conditionStr);
123     std::string MapKeysInToSql(size_t keysNum) const;
124     int BindKeysToStmt(const std::set<Key> &keys, sqlite3_stmt *&countStmt, int &index) const;
125 
126     std::string MapKeysInSubCondition(const std::string &accessStr) const;  // For InKeys.
127     // Return the left string of symbol in compare clause.
128     std::string GetFieldShape(const QueryObjNode &queryNode, const std::string &accessStr = "");
129 
130     SchemaObject schema_;
131     std::list<QueryObjNode> queryObjNodes_;
132     std::vector<uint8_t> prefixKey_;
133     std::string suggestIndex_;
134     std::string tableName_;
135     std::set<Key> keys_;
136 
137     std::string querySql_;
138     std::string countSql_;
139 
140     int orderByCounts_; // Record processing to which orderBy node
141     bool isValid_;
142     bool transformed_;
143     bool hasOrderBy_;
144     bool hasLimit_;
145     bool isOrderByAppeared_;
146     bool hasPrefixKey_;
147     bool isNeedOrderbyKey_;  // The tag field is used for prefix query filtering key sorting
148     bool isRelationalQuery_;
149 };
150 }
151 #endif