76 lines
2.9 KiB
C++
76 lines
2.9 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.
|
|
*/
|
|
|
|
#define USING_LOG_PREFIX SQL_OPT
|
|
#include "sql/optimizer/ob_replica_compare.h"
|
|
using namespace oceanbase::common;
|
|
namespace oceanbase
|
|
{
|
|
namespace sql
|
|
{
|
|
|
|
ObReplicaCompare::ObReplicaCompare(ObRoutePolicyType policy_type)
|
|
:ret_(OB_SUCCESS),
|
|
policy_type_(policy_type),
|
|
readonly_zone_first_{IS_OTHER_REGION, ZONE_TYPE, MERGE_STATUS, POS_TYPE},
|
|
only_readonly_zone_{ZONE_TYPE, IS_OTHER_REGION, MERGE_STATUS, POS_TYPE,},
|
|
unmerge_zone_first_{IS_OTHER_REGION, MERGE_STATUS, ZONE_TYPE, POS_TYPE}
|
|
{
|
|
static_assert(sizeof(readonly_zone_first_) == sizeof(only_readonly_zone_), "invalid array size");
|
|
static_assert(sizeof(readonly_zone_first_) == sizeof(unmerge_zone_first_), "invalid array size");
|
|
static_assert((sizeof(readonly_zone_first_)/sizeof(CompareType)) == (sizeof(cmp_func_array_)/sizeof(CmpFuncPtr)), "invalid array size");
|
|
|
|
cmp_func_array_[IS_OTHER_REGION] = &ObReplicaCompare::compare_other_region;
|
|
cmp_func_array_[ZONE_TYPE] = &ObReplicaCompare::compare_zone_type;
|
|
cmp_func_array_[MERGE_STATUS] = &ObReplicaCompare::compare_merge_status;
|
|
cmp_func_array_[POS_TYPE] = &ObReplicaCompare::compare_pos_type;
|
|
}
|
|
|
|
|
|
bool ObReplicaCompare::operator()(const ObRoutePolicy::CandidateReplica &replica1,
|
|
const ObRoutePolicy::CandidateReplica &replica2)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
bool bool_ret = false;
|
|
CompareType *cmp_type_array = NULL;
|
|
if (OB_FAIL(ret_)) {//do nothing if we already have an error
|
|
} else {
|
|
if (READONLY_ZONE_FIRST == policy_type_) {
|
|
cmp_type_array = readonly_zone_first_;
|
|
} else if (ONLY_READONLY_ZONE == policy_type_) {
|
|
cmp_type_array = only_readonly_zone_;
|
|
} else if (UNMERGE_ZONE_FIRST == policy_type_) {
|
|
cmp_type_array = unmerge_zone_first_;
|
|
} else {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("unexpected policy type", K(policy_type_), K(ret));
|
|
}
|
|
CompareRes cmp_res = EQUAL;
|
|
for(int64_t i = 0 ; OB_SUCC(ret) && cmp_res == EQUAL && i < CMP_CNT; ++i) {
|
|
CompareType cmp_type = cmp_type_array[i];
|
|
CmpFuncPtr cmp_fun = cmp_func_array_[cmp_type];
|
|
if (OB_ISNULL(cmp_fun)) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("cmp fun is NULL", K(cmp_type), K(ret));
|
|
} else {
|
|
cmp_res = (this->*cmp_fun)(replica1, replica2);
|
|
}
|
|
}
|
|
bool_ret = (cmp_res == LESS);
|
|
ret_ = ret;
|
|
}
|
|
return bool_ret;
|
|
}
|
|
|
|
}//sql
|
|
}//oceanbase
|