[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:
@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user