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