obdev b6773084c6 [FEAT MERGE] impl vectorization 2.0
Co-authored-by: Naynahs <cfzy002@126.com>
Co-authored-by: hwx65 <1780011298@qq.com>
Co-authored-by: oceanoverflow <oceanoverflow@gmail.com>
2023-12-22 03:43:22 +00:00

231 lines
5.7 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 <vector>
#include <random>
#include <time.h>
#include "share/vector/type_traits.h"
#include "lib/allocator/ob_allocator.h"
#include "lib/number/ob_number_v2.h"
#include "lib/wide_integer/ob_wide_integer.h"
#include "lib/timezone/ob_timezone_info.h"
#include "sql/engine/expr/ob_expr.h"
namespace oceanbase
{
namespace common
{
struct MockAllocator: public ObIAllocator
{
void* alloc(const int64_t size) override
{
return malloc(size);
}
void* alloc(const int64_t num, const lib::ObMemAttr &attr) override {
return malloc(num);
}
void free(void *ptr) override {
std::free(ptr);
}
};
struct Item
{
char *data;
int32_t data_len;
};
template<VecValueTypeClass>
Item rand_item()
{
return Item();
}
template<>
Item rand_item<VEC_TC_NUMBER>()
{
std::default_random_engine rd(time(NULL));
std::uniform_int_distribution<int32_t> digit_len(1, 30);
std::uniform_int_distribution<int32_t> digits(0, 9);
std::uniform_int_distribution<int32_t> neg(0, 10);
std::string num_str;
int32_t int_len = digit_len(rd), dec_len = digit_len(rd);
if (neg(rd) <= 5) {
num_str.push_back('-');
}
for (int i = 0; i < int_len; i++) {
num_str.push_back(digits(rd) + '0');
}
num_str.push_back('.');
for (int i = 0; i < dec_len; i++) {
num_str.push_back(digits(rd) + '0');
}
MockAllocator alloc;
number::ObNumber v;
int ret = v.from(num_str.c_str(), num_str.size(), alloc);
int32_t data_len = sizeof(ObNumberDesc) + v.get_length() * sizeof(uint32_t);
char *data = (char *)alloc.alloc(data_len);
*reinterpret_cast<ObNumberDesc *>(data) = v.get_desc();
std::memcpy(data + sizeof(ObNumberDesc), v.get_digits(), sizeof(uint32_t) * v.get_length());
return Item{data, data_len};
}
template<>
Item rand_item<VEC_TC_STRING>()
{
static const std::string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
std::default_random_engine rd(time(NULL));
std::uniform_int_distribution<int32_t> idx(0, chars.size() - 1);
std::string str;
std::uniform_int_distribution<int32_t> data_len(0, 1000);
int32_t len = data_len(rd);
for (int i = 0; i < len; i++) {
str.push_back(chars[idx(rd)]);
}
void *data = std::malloc(len);
std::memcpy(data, str.data(), len);
return Item{(char *)data, len};
}
template<typename T>
struct RandomData
{
static T rand()
{
return T();
}
};
template<>
struct RandomData<int64_t>
{
static int64_t rand()
{
std::default_random_engine random(time(NULL));
std::uniform_int_distribution<int64_t> dist(INT64_MIN, INT64_MAX);
return dist(random);
}
};
template <typename T>
struct WideIntegerRandomData
{
static T rand()
{
std::default_random_engine random(time(NULL));
std::uniform_int_distribution<int64_t> dist(0, UINT64_MAX);
T res = 0;
for (int i = 0; i < T::ITEM_COUNT; i++) {
res = (res << 64) + dist(random);
}
return res;
}
};
template<>
struct RandomData<int128_t>: WideIntegerRandomData<int128_t> {};
template<>
struct RandomData<int256_t>: WideIntegerRandomData<int256_t> {};
template<>
struct RandomData<int512_t>: WideIntegerRandomData<int512_t> {};
template<>
struct RandomData<uint64_t>
{
static uint64_t rand()
{
std::default_random_engine random(time(NULL));
std::uniform_int_distribution<uint64_t> dist(0, UINT64_MAX);
return dist(random);
}
};
template<>
struct RandomData<double>
{
static double rand()
{
std::default_random_engine random(time(NULL));
std::uniform_real_distribution<double> dist(-9999999999.0, 9999999999.0);
return dist(random);
}
};
template<>
struct RandomData<float>
{
static float rand()
{
std::default_random_engine random(time(NULL));
std::uniform_real_distribution<float> dist(-9999999999.0, 9999999999.0);
return dist(random);
}
};
template<>
struct RandomData<bool>
{
static bool rand()
{
std::default_random_engine random(time(NULL));
std::uniform_real_distribution<float> dist(-10.0, 10.0);
return dist(random) >= 0;
}
};
template<>
struct RandomData<ObOTimestampData>
{
static ObOTimestampData rand()
{
std::default_random_engine random(time(NULL));
std::uniform_int_distribution<int64_t> us(1, 100000000);
std::uniform_int_distribution<int16_t> tz(1, 2047);
std::uniform_int_distribution<int16_t> tran_type(0, 31);
std::uniform_int_distribution<int16_t> tail_nsec(0,999);
ObOTimestampData::UnionTZCtx rand_tz_ctx;
rand_tz_ctx.tail_nsec_ = tail_nsec(random);
rand_tz_ctx.version_ = 0;
rand_tz_ctx.store_tz_id_ = true;
rand_tz_ctx.is_null_ = false;
rand_tz_ctx.time_reserved_ = 0;
rand_tz_ctx.tz_id_ = tz(random);
rand_tz_ctx.tran_type_id_ = tran_type(random);
int64_t time_us = us(random);
return ObOTimestampData(time_us, rand_tz_ctx);
}
};
template<>
struct RandomData<ObIntervalDSValue>
{
static ObIntervalDSValue rand()
{
std::default_random_engine random(time(NULL));
std::uniform_int_distribution<int32_t> frac_sec(INT32_MIN, INT32_MAX);
std::uniform_int_distribution<int64_t> nsec(INT64_MIN, INT64_MAX);
return ObIntervalDSValue(nsec(random), frac_sec(random));
}
};
// sql::ObExpr *rand_data_expr(VecValueTypeClass data_tc, sql::ObEvalCtx)
} // end common
} // oceanbase