/** * 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. */ #ifndef _OB_OPT_MOCK_STAT_MANAGER_H #define _OB_OPT_MOCK_STAT_MANAGER_H #include "share/stat/ob_opt_column_stat_cache.h" #include "share/stat/ob_opt_stat_manager.h" #include "share/stat/ob_opt_stat_service.h" #include "share/stat/ob_opt_table_stat.h" #include "sql/resolver/ob_schema_checker.h" #include "sql/optimizer/ob_opt_default_stat.h" #include "lib/timezone/ob_time_convert.h" namespace test { // class MockOptTableStatService : public oceanbase::common::ObOptTableStatService // { // public: // static const int64_t DEFAULT_ROW_COUNT = 100; // static const int64_t DEFAULT_SSTABLE_ROW_COUNT = 50; // static const int64_t DEFAULT_MEMTABLE_ROW_COUNT = 50; // static const int64_t DEFAULT_ROW_SIZE = 100; // static const int64_t DEFAULT_DATA_SIZE = DEFAULT_ROW_COUNT * DEFAULT_ROW_SIZE; // static const int64_t DEFAULT_MACROC_BLOCKS = DEFAULT_ROW_COUNT * DEFAULT_ROW_SIZE / DEFAULT_MACRO_BLOCK_SIZE; // static const int64_t DEFAULT_MICRO_BLOCKS = DEFAULT_DATA_SIZE / DEFAULT_MICRO_BLOCK_SIZE; // MockOptTableStatService() { // reset_table_stat(); // } // virtual ~MockOptTableStatService() {} // // void reset_table_stat() // { // stat_.set_data_size(DEFAULT_DATA_SIZE); // stat_.set_macro_block_num(DEFAULT_MACROC_BLOCKS); // stat_.set_memtable_avg_row_size(DEFAULT_ROW_SIZE); // stat_.set_memtable_row_count(DEFAULT_MEMTABLE_ROW_COUNT); // stat_.set_micro_block_num(DEFAULT_MICRO_BLOCKS); // stat_.set_sstable_avg_row_size(DEFAULT_ROW_SIZE); // stat_.set_sstable_row_count(DEFAULT_SSTABLE_ROW_COUNT); // } // // void set_table_stat(ObOptTableStat &table_stat) // { stat_ = table_stat; } // // void set_table_row_count(int64_t row_count) // { // stat_.set_memtable_row_count(row_count); // stat_.set_sstable_row_count(0); // } // private: // ObOptTableStat stat_; // }; // // class MockOptColumnStatService : public oceanbase::common::ObOptColumnStatService // { // public: // MockOptColumnStatService() {} // virtual ~MockOptColumnStatService() {} // int get_column_stat(const ObColumnStat::Key &key, const bool force_new, ObColumnStatValueHandle &handle) // { // UNUSED(key); // UNUSED(force_new); // UNUSED(handle); // return OB_SUCCESS; // } // // int get_column_stat(const ObColumnStat::Key &key, const bool force_new, ObColumnStat &cstat, ObIAllocator &alloc) // { // UNUSED(key); // UNUSED(force_new); // UNUSED(cstat); // UNUSED(alloc); // return OB_SUCCESS; // } // // int get_batch_stat(const oceanbase::share::schema::ObTableSchema &table_schema, // const uint64_t partition_id, // ObIArray &stats, // ObIAllocator &allocator) // { // UNUSED(table_schema); // UNUSED(partition_id); // UNUSED(stats); // UNUSED(allocator); // // return OB_SUCCESS; // } // // int update_column_stats(const ObIArray &column_stats) // { // UNUSED(column_stats); // return OB_SUCCESS; // } // int update_column_stat(const ObColumnStat &cstat) // { // UNUSED(cstat); // return OB_SUCCESS; // } // // int refresh_column_stat(const int64_t data_version) // { // UNUSED(data_version); // return OB_SUCCESS; // } // // }; // // class MockOptStatManager : public oceanbase::common::ObOptStatManager // { // static const uint64_t DEFAULT_TABLE1_ID = 1099511677777; // static const uint64_t DEFAULT_TABLE2_ID = 1099511677778; // static const int64_t TIME_MAX_VALUE = (3020399 * 1000000LL); // static const int64_t DATE_MAX_VALUE = 2932896; // static const int64_t DATE_MIN_VALUE = -354258;; // public: // struct ColumnStatInfo // { // ObObj min_; // ObObj max_; // int64_t distinct_num_; // int64_t null_num_; // void set_column_info(ObObj min, ObObj max, int64_t distinct_num, int64_t null_num) // { // min_ = min; // max_ = max; // distinct_num_ = distinct_num; // null_num_ = null_num; // } // }; // MockOptStatManager() : schema_checker_(NULL) // { // column_stat_.set_num_distinct(10); // ObObj min; // min.set_int(0); // ObObj max; // max.set_int(20); // int_info_.set_column_info(min, max, 10, 10); // ObObj str_min; // ObObj str_max; // str_min.set_varchar("aa"); // str_max.set_varchar("az"); // str_info_.set_column_info(str_min, str_max, 80, 10); // table1_row_count_ = 100; // table2_row_count_ = 100; // default_stat_ = false; // } // ~MockOptStatManager() {} // // void set_schema_checker(oceanbase::sql::ObSchemaChecker *schema_checker) // { schema_checker_ = schema_checker; } // // void set_default_stat(bool is_default) // { // default_stat_ = is_default; // } // // int get_table_stat(const ObPartitionKey &pkey, ObOptTableStat &tstat) // { // int ret = OB_SUCCESS; // if (default_stat_) { // tstat.set_memtable_row_count(0); // tstat.set_sstable_row_count(0); // } else if (DEFAULT_TABLE2_ID == pkey.get_table_id()) { // for opt_sel // tstat.set_memtable_row_count(table2_row_count_); // tstat.set_sstable_row_count(0); // tstat.set_data_size(DEFAULT_ROW_SIZE * tstat.get_row_count()); // } else { // tstat.set_memtable_row_count(table1_row_count_); // tstat.set_sstable_row_count(0); // tstat.set_data_size(DEFAULT_ROW_SIZE * tstat.get_row_count()); // } // return ret; // } // // virtual int get_column_stat(const uint64_t table_id, // const uint64_t partition_id, // const uint64_t column_id, // ObOptColumnStatHandle &handle) // { // int ret = oceanbase::common::OB_SUCCESS; // UNUSED(partition_id); // UNUSED(handle); // const oceanbase::share::schema::ObColumnSchemaV2 *col_schema = NULL; // ObObj min; // ObObj max; // column_stat_.set_num_distinct(int_info_.distinct_num_); // column_stat_.set_num_null(int_info_.null_num_); // if (NULL != schema_checker_) { // if (OB_FAIL(schema_checker_->get_column_schema( // table_id, column_id, col_schema, true))) { // COMMON_LOG(WARN, "Failed to get column schema", K(ret)); // } else if (NULL == col_schema) { // ret = OB_ERR_UNEXPECTED; // COMMON_LOG(WARN, "Col schema is NULL", K(ret)); // } else if (oceanbase::common::ObStringTC == col_schema->get_meta_type().get_type_class()) { // column_stat_.set_num_distinct(str_info_.distinct_num_); // column_stat_.set_num_null(str_info_.null_num_); // min = str_info_.min_; // todo(yeti): special use, need deep copy // max = str_info_.max_; // } else if (col_schema->get_meta_type().get_type() >= ObDateTimeType // && col_schema->get_meta_type().get_type() <= ObYearType) { // switch (col_schema->get_meta_type().get_type()) { // case ObDateTimeType: { // min.set_datetime(DATETIME_MIN_VAL); // max.set_datetime(DATETIME_MAX_VAL); // break; // } // case ObTimestampType: { // min.set_timestamp(DATETIME_MIN_VAL); // max.set_timestamp(DATETIME_MAX_VAL); // break; // } // case ObDateType: { // min.set_date(DATE_MIN_VALUE); // ObObj xx ; // xx.set_varchar("9999-12-31"); // max.set_date(DATE_MAX_VALUE); // break; // } // case ObTimeType: { // min.set_time(ObTimeConverter::ZERO_TIME); // max.set_time(TIME_MAX_VALUE); // break; // } // case ObYearType: { // uint8_t ymin = 0; // ObTimeConverter::int_to_year(1970, ymin); // min.set_year(ymin); // uint8_t ymax = 0; // ObTimeConverter::int_to_year(2155, ymax); // max.set_year(ymax); // break; // } // default: break; // } // } else {//分更多种类型,default // min = int_info_.min_; // max = int_info_.max_; // } // } // column_stat_.set_min_value(min); // column_stat_.set_max_value(max); // column_stat_.set_histogram(hist_); // handle.stat_ = &column_stat_; // return ret; // } // // virtual int get_column_stat(const ObOptColumnStat::Key &key, ObOptColumnStatHandle &handle) // { // UNUSED(key); // UNUSED(handle); // return OB_SUCCESS; // } // // int get_batch_stat(const oceanbase::share::schema::ObTableSchema &table_schema, // const uint64_t partition_id, // ObIArray &stats, // ObIAllocator &allocator) // { // UNUSED(table_schema); // UNUSED(partition_id); // UNUSED(stats); // UNUSED(allocator); // return OB_SUCCESS; // } // // void set_column_stat(int64_t distinct, ObObj min, ObObj max, int64_t null_num) // { // if (ObStringTC == min.get_type_class()) { // str_info_.set_column_info(min, max, distinct, null_num); // } else { // int_info_.set_column_info(min, max, distinct, null_num); // } // } // // void set_table_stat(int64_t table1_row_count, int64_t table2_row_count) // { // table1_row_count_ = table1_row_count; // table2_row_count_ = table2_row_count; // } // // void set_histogram(ObHistogram *hist) // { // hist_ = hist; // } // // private: // oceanbase::sql::ObSchemaChecker *schema_checker_; // ObOptColumnStat column_stat_; // ObHistogram *hist_; // int64_t table1_row_count_; // int64_t table2_row_count_; // ColumnStatInfo int_info_; // ColumnStatInfo str_info_; // bool default_stat_; // }; class MockOptStatService : public oceanbase::common::ObOptStatService { public: static MockOptStatService &get_instance() { static MockOptStatService instance_; return instance_; } MockOptStatService() { reset_table_stat(); } virtual ~MockOptStatService() {} virtual int init(oceanbase::common::ObMySQLProxy *proxy, ObServerConfig *config) { UNUSED(proxy); UNUSED(config); return OB_SUCCESS; } virtual int get_table_stat(const ObOptTableStat::Key &key, ObOptTableStat &tstat) { UNUSED(key); // UNUSED now; tstat = tstat_; return OB_SUCCESS; } virtual int get_column_stat(const ObOptColumnStat::Key &key, ObOptColumnStatHandle &handle) { UNUSED(key); handle.stat_ = &cstat_; return OB_SUCCESS; } virtual int load_table_stat_and_put_cache(const ObOptTableStat::Key &key, ObOptTableStatHandle &handle) { UNUSED(key); UNUSED(handle); return OB_SUCCESS; } ObOptColumnStat &get_column_stat() { return cstat_; } ObHistogram &get_histogram() { return hist_; } void use_histogram() { cstat_.get_histogram() = hist_; } void no_use_histogram() { cstat_.get_histogram().set_type(ObHistType::INVALID_TYPE); } void reset_table_stat() { tstat_.set_row_count(1.0); tstat_.set_data_size( oceanbase::common::ObOptStatManager::get_default_data_size()); tstat_.set_avg_row_size( oceanbase::common::ObOptStatManager::get_default_avg_row_size()); tstat_.set_last_analyzed(1); cstat_.set_last_analyzed(1); } private: ObOptTableStat tstat_; ObOptColumnStat cstat_; ObHistogram hist_; }; class MockOptStatManager : public oceanbase::common::ObOptStatManager { public: static MockOptStatManager &get_instance() { static MockOptStatManager instance_; return instance_; } virtual int init(ObOptStatService *stat_service, ObMySQLProxy *proxy, ObServerConfig *config) { inited_ = true; UNUSED(stat_service); UNUSED(proxy); UNUSED(config); mock_stat_service_ = stat_service; if (NULL != mock_stat_service_) { mock_stat_service_->init(NULL, NULL); } return OB_SUCCESS; } // virtual int get_column_stat(const ObOptColumnStat::Key &key, ObOptColumnStatHandle &handle) // { // return mock_stat_service_->get_column_stat(key, handle); // } // virtual int get_table_stat(const ObOptTableStat::Key &key, ObOptTableStat &tstat) // { // int ret = OB_SUCCESS; // return mock_stat_service_->get_table_stat(key, tstat); // return ret; // } // virtual int get_column_stat(const ObOptColumnStat::Key &key, ObOptColumnStatHandle &handle); virtual int update_column_stat(const oceanbase::common::ObIArray &column_stats) { UNUSED(column_stats); return OB_SUCCESS; } virtual int delete_column_stat(const oceanbase::common::ObIArray &column_stats) { UNUSED(column_stats); return OB_SUCCESS; } virtual int refresh_column_stat(const ObOptColumnStat::Key &key) { UNUSED(key); return OB_SUCCESS; } virtual int refresh_table_stat(const ObOptTableStat::Key &key) { UNUSED(key); return OB_SUCCESS; } // virtual int get_table_stat(const ObOptTableStat::Key &key, ObOptTableStat &tstat); virtual int add_refresh_stat_task(const oceanbase::obrpc::ObUpdateStatCacheArg &analyze_arg) { UNUSED(analyze_arg); return OB_SUCCESS; } ObOptStatService *mock_stat_service_; }; } // end namespace test #endif /* _OB_MOCK_OPT_STAT_MANAGER_H */