Co-authored-by: oceanoverflow <oceanoverflow@gmail.com> Co-authored-by: hezuojiao <hezuojiao@gmail.com> Co-authored-by: Monk-Liu <1152761042@qq.com>
		
			
				
	
	
		
			155 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/**
 | 
						|
 * Copyright (c) 2021 OceanBase
 | 
						|
 * OceanBase CE is licensed under Mulan PubL v2.
 | 
						|
 * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | 
						|
 * You may obtain a copy of Mulan PubL v2 at:
 | 
						|
 *          http://license.coscl.org.cn/MulanPubL-2.0
 | 
						|
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | 
						|
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | 
						|
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | 
						|
 * See the Mulan PubL v2 for more details.
 | 
						|
 */
 | 
						|
 | 
						|
#include <string>
 | 
						|
#include <random>
 | 
						|
#include <chrono>
 | 
						|
#include <vector>
 | 
						|
#include <unordered_map>
 | 
						|
#include <type_traits>
 | 
						|
#include <fstream>
 | 
						|
#include "lib/ob_define.h"
 | 
						|
 | 
						|
// class ObOperator;
 | 
						|
 | 
						|
namespace oceanbase
 | 
						|
{
 | 
						|
namespace sql
 | 
						|
{
 | 
						|
class ObTestOpConfig
 | 
						|
{
 | 
						|
public:
 | 
						|
  static ObTestOpConfig &get_instance()
 | 
						|
  {
 | 
						|
    static ObTestOpConfig test_op_config;
 | 
						|
    return test_op_config;
 | 
						|
  }
 | 
						|
 | 
						|
private:
 | 
						|
  ObTestOpConfig()
 | 
						|
  {}
 | 
						|
  ~ObTestOpConfig()
 | 
						|
  {}
 | 
						|
 | 
						|
  void init()
 | 
						|
  {
 | 
						|
    std::string nulls_probability;
 | 
						|
 | 
						|
    std::string test_config_file = test_filename_prefix_ + ".cfg";
 | 
						|
    test_filename_origin_output_file_ = test_filename_prefix_ + "_origin_result.data";
 | 
						|
    test_filename_vec_output_file_ = test_filename_prefix_ + "_vec_result.data";
 | 
						|
    std::ifstream if_tests_config(test_config_file);
 | 
						|
    OB_ASSERT(if_tests_config.is_open() == true);
 | 
						|
    std::string line;
 | 
						|
 | 
						|
    while (std::getline(if_tests_config, line)) {
 | 
						|
      if (line.size() <= 0) continue;
 | 
						|
      if (line.at(0) == '#') continue;
 | 
						|
 | 
						|
      std::vector<std::string> out;
 | 
						|
      const char delim = '=';
 | 
						|
      tokenize(line, delim, out);
 | 
						|
      OB_ASSERT(out.size() == 2);
 | 
						|
      configs_map_[out[0]] = out[1];
 | 
						|
    }
 | 
						|
 | 
						|
    set_configs();
 | 
						|
    LOG_INFO("Testing config is: ", K(*this));
 | 
						|
  }
 | 
						|
 | 
						|
  void tokenize(std::string const &str, const char delim, std::vector<std::string> &out)
 | 
						|
  {
 | 
						|
    size_t start;
 | 
						|
    size_t end = 0;
 | 
						|
 | 
						|
    while ((start = str.find_first_not_of(delim, end)) != std::string::npos) {
 | 
						|
      end = str.find(delim, start);
 | 
						|
      out.push_back(str.substr(start, end - start));
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  int get_config(std::string key, std::string &value)
 | 
						|
  {
 | 
						|
    int ret = OB_SUCCESS;
 | 
						|
    if (configs_map_.count(key) == 0) {
 | 
						|
      ret = OB_INVALID_ARGUMENT;
 | 
						|
    } else {
 | 
						|
      value = configs_map_[key];
 | 
						|
    }
 | 
						|
    return ret;
 | 
						|
  }
 | 
						|
 | 
						|
  void set_configs()
 | 
						|
  {
 | 
						|
    std::string digit_data_format;
 | 
						|
    std::string string_data_format;
 | 
						|
    std::string data_range_level;
 | 
						|
    std::string nulls_probability;
 | 
						|
    std::string skips_probability;
 | 
						|
    std::string round;
 | 
						|
    std::string batch_size;
 | 
						|
    std::string output_result_to_file;
 | 
						|
    get_config("digit_data_format", digit_data_format);
 | 
						|
    get_config("string_data_format", string_data_format);
 | 
						|
    get_config("data_range_level", data_range_level);
 | 
						|
    get_config("nulls_probability", nulls_probability);
 | 
						|
    get_config("skips_probability", skips_probability);
 | 
						|
    get_config("round", round);
 | 
						|
    get_config("batch_size", batch_size);
 | 
						|
    get_config("output_result_to_file", output_result_to_file);
 | 
						|
 | 
						|
    if (!digit_data_format.empty()) { digit_data_format_ = static_cast<VectorFormat>(std::stoi(digit_data_format)); }
 | 
						|
    if (!string_data_format.empty()) { string_data_format_ = static_cast<VectorFormat>(std::stoi(string_data_format)); }
 | 
						|
    if (!data_range_level.empty()) { data_range_level_ = std::stoi(data_range_level); }
 | 
						|
    if (!nulls_probability.empty()) { nulls_probability_ = std::stoi(nulls_probability); }
 | 
						|
    if (!skips_probability.empty()) { skips_probability_ = std::stoi(skips_probability); }
 | 
						|
    if (!round.empty()) { round_ = std::stoi(round); }
 | 
						|
    if (!batch_size.empty()) { batch_size_ = std::stoi(batch_size); }
 | 
						|
    if (!output_result_to_file.empty()) { output_result_to_file_ = std::stoi(output_result_to_file); }
 | 
						|
  }
 | 
						|
 | 
						|
  int64_t to_string(char *buf, const int64_t buf_len) const
 | 
						|
  {
 | 
						|
    int64_t pos = 0;
 | 
						|
    J_KV(K(digit_data_format_), K(string_data_format_), K(data_range_level_), K(nulls_probability_),
 | 
						|
         K(skips_probability_), K(round_), K(batch_size_), K(output_result_to_file_));
 | 
						|
    return pos;
 | 
						|
  }
 | 
						|
 | 
						|
private:
 | 
						|
  std::unordered_map<std::string, std::string> configs_map_;
 | 
						|
 | 
						|
  bool run_in_background_{false};
 | 
						|
  std::string test_filename_prefix_;
 | 
						|
  std::string test_filename_origin_output_file_;
 | 
						|
  std::string test_filename_vec_output_file_;
 | 
						|
 | 
						|
  bool output_result_to_file_{false};
 | 
						|
  // data foramt
 | 
						|
  VectorFormat digit_data_format_{VEC_UNIFORM};
 | 
						|
  VectorFormat string_data_format_{VEC_UNIFORM};
 | 
						|
 | 
						|
  // distribution and data range
 | 
						|
  int data_range_level_{0};
 | 
						|
 | 
						|
  // nulls and skips
 | 
						|
  int nulls_probability_{0};
 | 
						|
  int skips_probability_{0};
 | 
						|
 | 
						|
  // round and batch_size
 | 
						|
  int round_{10};
 | 
						|
  int batch_size_{256};
 | 
						|
};
 | 
						|
 | 
						|
} // end namespace sql
 | 
						|
} // end namespace oceanbase
 |