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
28using namespace proxima::be::repository;
29using namespace ::testing;
30
31namespace proxima {
32namespace be {
33namespace repository {
34
35class MysqlResultBuilder;
36using MysqlResultBuilderPtr = std::shared_ptr<MysqlResultBuilder>;
37
38/*!
39 */
40class 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