[FEAT MERGE]4_1_sql_feature

Co-authored-by: leslieyuchen <leslieyuchen@gmail.com>
Co-authored-by: Charles0429 <xiezhenjiang@gmail.com>
Co-authored-by: raywill <hustos@gmail.com>
This commit is contained in:
obdev
2023-01-28 16:01:26 +08:00
committed by ob-robot
parent 3080f2b66f
commit 2d19a9d8f5
846 changed files with 161957 additions and 116661 deletions

View File

@ -1276,6 +1276,42 @@ bool ObRangeSliceIdCalc::Compare::operator()(
return less;
}
int ObWfHybridDistSliceIdCalc::get_slice_idx_vec(
const ObIArray<ObExpr*> &exprs, ObEvalCtx &eval_ctx,
ObBitVector &skip, const int64_t batch_size,
int64_t *&indexes)
{
UNUSEDx(exprs, eval_ctx, skip, batch_size, indexes);
return common::OB_NOT_SUPPORTED;
}
int ObWfHybridDistSliceIdCalc::get_slice_indexes(const ObIArray<ObExpr*> &exprs,
ObEvalCtx &eval_ctx,
SliceIdxArray &slice_idx_array)
{
int ret = OB_SUCCESS;
if (slice_id_calc_type_ <= SliceIdCalcType::INVALID
|| slice_id_calc_type_ >= SliceIdCalcType::MAX) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("slice_id_calc_type_ is invalid", K(ret), K(slice_id_calc_type_));
} else if (SliceIdCalcType::BROADCAST == slice_id_calc_type_
&& OB_FAIL(broadcast_slice_id_calc_.get_slice_indexes(
exprs, eval_ctx, slice_idx_array))) {
LOG_WARN("get_slice_indexes failed", K(ret), K(slice_id_calc_type_));
} else if (SliceIdCalcType::RANDOM == slice_id_calc_type_
&& OB_FAIL(random_slice_id_calc_.get_slice_indexes(
exprs, eval_ctx, slice_idx_array))) {
LOG_WARN("get_slice_indexes failed", K(ret), K(slice_id_calc_type_));
} else if (SliceIdCalcType::HASH == slice_id_calc_type_
&& OB_FAIL(hash_slice_id_calc_.get_slice_indexes(exprs, eval_ctx, slice_idx_array))) {
LOG_WARN("get_slice_indexes failed", K(ret), K(slice_id_calc_type_));
}
return ret;
}
int ObNullAwareHashSliceIdCalc::get_slice_indexes(const ObIArray<ObExpr*> &exprs,
ObEvalCtx &eval_ctx,
SliceIdxArray &slice_idx_array)
@ -1340,3 +1376,71 @@ int ObNullAwareAffinitizedRepartSliceIdxCalc::get_slice_indexes(
return ret;
}
int ObHybridHashSliceIdCalcBase::check_if_popular_value(ObEvalCtx &eval_ctx, bool &is_popular)
{
int ret = OB_SUCCESS;
uint64_t hash_val = 0;
is_popular = false;
if (OB_ISNULL(popular_values_hash_) || popular_values_hash_->count() <= 0) {
// assume not popular, do nothing
} else if (OB_UNLIKELY(hash_calc_.hash_funcs_->count() != 1)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("only support 1 condition for hybrid hash for now. this may change later",
K(ret), K(hash_calc_.hash_funcs_->count()));
} else if (OB_FAIL(hash_calc_.calc_hash_value(eval_ctx, hash_val))) {
LOG_WARN("fail get hash value", K(ret));
} else {
// build a small hash table to accelerate the lookup.
// if popular_values_hash_->count() <= 3, we use array lookup instead
if (use_hash_lookup_) {
if (OB_HASH_EXIST == (ret = popular_values_map_.exist_refactored(hash_val))) {
is_popular = true;
ret = OB_SUCCESS; // popular value
} else if (OB_HASH_NOT_EXIST == ret) {
ret = OB_SUCCESS; // not popular value
} else {
LOG_WARN("fail lookup hash map", K(ret));
}
} else {
for (int64_t i = 0; i < popular_values_hash_->count(); ++i) {
if (hash_val == popular_values_hash_->at(i)) {
is_popular = true;
break;
}
}
}
}
return ret;
}
int ObHybridHashRandomSliceIdCalc::get_slice_idx(
const ObIArray<ObExpr*> &exprs, ObEvalCtx &eval_ctx, int64_t &slice_idx)
{
int ret = OB_SUCCESS;
bool is_popular = false;
if (OB_FAIL(check_if_popular_value(eval_ctx, is_popular))) {
LOG_WARN("fail check if value popular", K(ret));
} else if (is_popular) {
ret = random_calc_.get_slice_idx(exprs, eval_ctx, slice_idx);
} else {
ret = hash_calc_.get_slice_idx(exprs, eval_ctx, slice_idx);
}
return ret;
}
int ObHybridHashBroadcastSliceIdCalc::get_slice_indexes(
const ObIArray<ObExpr*> &exprs, ObEvalCtx &eval_ctx, SliceIdxArray &slice_idx_array)
{
int ret = OB_SUCCESS;
bool is_popular = false;
if (OB_FAIL(check_if_popular_value(eval_ctx, is_popular))) {
LOG_WARN("fail check if value popular", K(ret));
} else if (is_popular) {
ret = broadcast_calc_.get_slice_indexes(exprs, eval_ctx, slice_idx_array);
} else {
ret = hash_calc_.get_slice_indexes(exprs, eval_ctx, slice_idx_array);
}
return ret;
}