1 | /** |
2 | * Copyright 2021 Alibaba, Inc. and its affiliates. All Rights Reserved. |
3 | * |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | * you may not use this file except in compliance with the License. |
6 | * You may obtain a copy of the License at |
7 | * |
8 | * http://www.apache.org/licenses/LICENSE-2.0 |
9 | * |
10 | * Unless required by applicable law or agreed to in writing, software |
11 | * distributed under the License is distributed on an "AS IS" BASIS, |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
13 | * See the License for the specific language governing permissions and |
14 | * limitations under the License. |
15 | |
16 | * \author DianZhang.Chen |
17 | * \date Oct 2020 |
18 | * \brief Mysql result builder interface definition for bilin engine |
19 | */ |
20 | |
21 | #pragma once |
22 | |
23 | #include <gmock/gmock.h> |
24 | #include "proto/proxima_be.pb.h" |
25 | #include "event_builder.h" |
26 | #include "mock_mysql_connector.h" |
27 | |
28 | using namespace proxima::be::repository; |
29 | using namespace ::testing; |
30 | |
31 | namespace proxima { |
32 | namespace be { |
33 | namespace repository { |
34 | |
35 | class MysqlResultBuilder; |
36 | using MysqlResultBuilderPtr = std::shared_ptr<MysqlResultBuilder>; |
37 | |
38 | /*! |
39 | */ |
40 | class MysqlResultBuilder { |
41 | public: |
42 | //! Constructor |
43 | MysqlResultBuilder() { |
44 | connection_uri_ = "mysql://root:[email protected]:3306/mytest" ; |
45 | user_ = "root" ; |
46 | password_ = "root" ; |
47 | ailego::Uri::Parse(connection_uri_.c_str(), &uri_); |
48 | table_name_ = "table" ; |
49 | db_ = "mytest" ; |
50 | table_id_ = 1000; |
51 | } |
52 | |
53 | //! Destructor |
54 | ~MysqlResultBuilder() = default; |
55 | |
56 | public: |
57 | void BuildCollectionConfig() { |
58 | auto *repo = config_.mutable_repository_config(); |
59 | repo->set_repository_type( |
60 | proto::CollectionConfig::RepositoryConfig::RT_DATABASE); |
61 | repo->set_repository_name(table_name_); |
62 | auto *database = repo->mutable_database(); |
63 | database->set_connection_uri(connection_uri_); |
64 | database->set_table_name(table_name_); |
65 | database->set_user(user_); |
66 | database->set_password(password_); |
67 | |
68 | config_.add_forward_column_names("name" ); |
69 | config_.add_forward_column_names("age" ); |
70 | auto *index1 = config_.add_index_column_params(); |
71 | index1->set_column_name("vector1" ); |
72 | auto *index2 = config_.add_index_column_params(); |
73 | index2->set_column_name("vector2" ); |
74 | } |
75 | |
76 | MockMysqlResultWrapperPtr BuildSelectVersionResult() { |
77 | MockMysqlResultWrapperPtr result = |
78 | std::make_shared<MockMysqlResultWrapper>(); |
79 | result->append_field_meta("VERSION()" ); |
80 | std::vector<std::string> values1 = {"5.7.10-log" }; |
81 | result->append_row_values(values1); |
82 | return result; |
83 | } |
84 | |
85 | MockMysqlResultWrapperPtr BuildShowBinlogResult() { |
86 | MockMysqlResultWrapperPtr result = |
87 | std::make_shared<MockMysqlResultWrapper>(); |
88 | result->append_field_meta("Variable_name" ); |
89 | result->append_field_meta("Value" ); |
90 | std::vector<std::string> values1 = {"binlog_format" , "ROW" }; |
91 | result->append_row_values(values1); |
92 | return result; |
93 | } |
94 | |
95 | MockMysqlResultWrapperPtr BuildShowBinaryLogsResult() { |
96 | MockMysqlResultWrapperPtr result = |
97 | std::make_shared<MockMysqlResultWrapper>(); |
98 | result->append_field_meta("Log_name" ); |
99 | result->append_field_meta("File_size" ); |
100 | std::vector<std::string> values1 = {"binlog.000000" , "12345" }; |
101 | result->append_row_values(values1); |
102 | std::vector<std::string> values2 = {"binlog.000004" , "12345" }; |
103 | result->append_row_values(values2); |
104 | return result; |
105 | } |
106 | |
107 | std::string BuildTableMapEventStr() { |
108 | std::vector<bool> column_nulls(column_types_.size(), false); |
109 | column_nulls[column_types_.size() - 1] = true; |
110 | std::string table_map = EventBuilder::BuildTableMapEvent( |
111 | table_id_, db_, table_name_, column_types_, column_metas_, |
112 | column_nulls); |
113 | return " " + table_map; |
114 | } |
115 | |
116 | TableMapEventPtr BuildTableMapEvent() { |
117 | std::string event_str = BuildTableMapEventStr(); |
118 | return std::make_shared<TableMapEvent>(event_str.substr(1).c_str(), |
119 | event_str.size() - 1); |
120 | } |
121 | |
122 | std::string BuildWriteRowsEventStr(std::vector<std::string> &column_values, |
123 | size_t rows_count = 1) { |
124 | TableMapEventPtr table_map = BuildTableMapEvent(); |
125 | std::vector<bool> column_nulls(column_types_.size(), false); |
126 | std::string rows_str = EventBuilder::BuildWriteRowsEvent( |
127 | table_id_, column_nulls, column_types_, column_values, table_map, |
128 | WRITE_ROWS_EVENT_V1, rows_count); |
129 | return " " + rows_str; |
130 | } |
131 | |
132 | MockMysqlResultWrapperPtr BuildQuerySchemaResult() { |
133 | MockMysqlResultWrapperPtr result = |
134 | std::make_shared<MockMysqlResultWrapper>(); |
135 | result->append_field_meta("id" , MYSQL_TYPE_LONG, 11, 0, |
136 | AUTO_INCREMENT_FLAG); |
137 | result->append_field_meta("name" , MYSQL_TYPE_VAR_STRING, 100); |
138 | result->append_field_meta("age" , MYSQL_TYPE_LONG, 11); |
139 | result->append_field_meta("score" , MYSQL_TYPE_FLOAT, 12); |
140 | result->append_field_meta("vector1" , MYSQL_TYPE_VAR_STRING, 1024); |
141 | result->append_field_meta("vector2" , MYSQL_TYPE_VAR_STRING, 1024); |
142 | result->append_field_meta("vector3" , MYSQL_TYPE_VAR_STRING, 1024); |
143 | |
144 | column_types_.push_back(MYSQL_TYPE_LONG); |
145 | column_types_.push_back(MYSQL_TYPE_VAR_STRING); |
146 | column_types_.push_back(MYSQL_TYPE_LONG); |
147 | column_types_.push_back(MYSQL_TYPE_FLOAT); |
148 | column_types_.push_back(MYSQL_TYPE_VAR_STRING); |
149 | column_types_.push_back(MYSQL_TYPE_VAR_STRING); |
150 | column_types_.push_back(MYSQL_TYPE_VAR_STRING); |
151 | column_metas_.push_back(0); |
152 | column_metas_.push_back(2); |
153 | column_metas_.push_back(0); |
154 | column_metas_.push_back(0); |
155 | column_metas_.push_back(2); |
156 | column_metas_.push_back(2); |
157 | column_metas_.push_back(2); |
158 | |
159 | return result; |
160 | } |
161 | |
162 | MockMysqlResultWrapperPtr BuildQueryCollationResult() { |
163 | MockMysqlResultWrapperPtr result = |
164 | std::make_shared<MockMysqlResultWrapper>(); |
165 | result->append_field_meta("Field" , MYSQL_TYPE_VAR_STRING, 11); |
166 | result->append_field_meta("Type" , MYSQL_TYPE_VAR_STRING, 100); |
167 | result->append_field_meta("Collation" , MYSQL_TYPE_VAR_STRING, 11); |
168 | |
169 | std::vector<std::string> values1 = {"id" , "" , "" }; |
170 | result->append_row_values(values1); |
171 | std::vector<std::string> values2 = {"name" , "" , "utf8_general_ci" }; |
172 | result->append_row_values(values2); |
173 | std::vector<std::string> values3 = {"age" , "" , "" }; |
174 | result->append_row_values(values3); |
175 | std::vector<std::string> values4 = {"score" , "" , "utf8_general_ci" }; |
176 | result->append_row_values(values4); |
177 | std::vector<std::string> values5 = {"vector1" , "" , "utf8_general_ci" }; |
178 | result->append_row_values(values5); |
179 | std::vector<std::string> values6 = {"vector2" , "" , "utf8_general_ci" }; |
180 | result->append_row_values(values6); |
181 | std::vector<std::string> values7 = {"vector3" , "" , "utf8_general_ci" }; |
182 | result->append_row_values(values7); |
183 | |
184 | return result; |
185 | } |
186 | |
187 | MockMysqlResultWrapperPtr BuildScanTableResult() { |
188 | MockMysqlResultWrapperPtr result = |
189 | std::make_shared<MockMysqlResultWrapper>(); |
190 | result->append_field_meta("id" , MYSQL_TYPE_LONG, 11, 0, |
191 | AUTO_INCREMENT_FLAG); |
192 | result->append_field_meta("name" , MYSQL_TYPE_VAR_STRING, 100); |
193 | result->append_field_meta("age" , MYSQL_TYPE_LONG, 11); |
194 | result->append_field_meta("vector1" , MYSQL_TYPE_VAR_STRING, 1024); |
195 | result->append_field_meta("vector2" , MYSQL_TYPE_VAR_STRING, 1024); |
196 | |
197 | std::vector<std::string> values1 = {"1" , "1,2,3,4" , "1,2,3,5" , "name1" , |
198 | "18" }; |
199 | result->append_row_values(values1); |
200 | std::vector<std::string> values2 = {"2" , "2,2,3,4" , "2,2,3,5" , "name2" , |
201 | "19" }; |
202 | result->append_row_values(values2); |
203 | |
204 | return result; |
205 | } |
206 | |
207 | MockMysqlResultWrapperPtr BuildSelectDbResult() { |
208 | MockMysqlResultWrapperPtr result = |
209 | std::make_shared<MockMysqlResultWrapper>(); |
210 | result->append_field_meta("id" , MYSQL_TYPE_LONG, 11, 0, |
211 | AUTO_INCREMENT_FLAG); |
212 | |
213 | std::vector<std::string> values1 = {"1" }; |
214 | result->append_row_values(values1); |
215 | |
216 | return result; |
217 | } |
218 | |
219 | public: |
220 | proto::CollectionConfig config_; |
221 | // agent::proto::CollectionConfig config_; |
222 | std::string connection_uri_{}; |
223 | std::string user_{}; |
224 | std::string password_{}; |
225 | ailego::Uri uri_{}; |
226 | std::string table_name_{}; |
227 | std::string db_{}; |
228 | |
229 | uint64_t table_id_{0}; |
230 | std::vector<enum_field_types> column_types_{}; |
231 | std::vector<int32_t> column_metas_{}; |
232 | }; |
233 | |
234 | } // namespace repository |
235 | } // namespace be |
236 | } // namespace proxima |
237 | |