Files
oceanbase/src/sql/rewrite/ob_equal_set.ipp
wangzelin.wzl 93a1074b0c patch 4.0
2022-10-24 17:57:12 +08:00

187 lines
6.3 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.
*/
namespace oceanbase
{
namespace sql
{
template <typename COLUMN_INFO, typename CONST_INFO>
ObEqualSet<COLUMN_INFO, CONST_INFO>::ObEqualSet()
{
}
template <typename COLUMN_INFO, typename CONST_INFO>
ObEqualSet<COLUMN_INFO, CONST_INFO>::~ObEqualSet()
{
}
template<typename COLUMN_INFO, typename CONST_INFO>
int ObEqualSet<COLUMN_INFO, CONST_INFO>::add_expr(int64_t expr_idx, bool flag, const COLUMN_INFO &payload)
{
int ret = common::OB_SUCCESS;
if (OB_UNLIKELY(expr_idx < 0)) {
ret = common::OB_INVALID_ARGUMENT;
SQL_REWRITE_LOG(WARN, "expr_idx is invalid", K(expr_idx));
} else if (OB_FAIL(exprs_.set_refactored(expr_idx, payload))) {
SQL_REWRITE_LOG(WARN, "set exprs failed", K(ret));
} else if (OB_FAIL(expr_bitmap_.add_member(static_cast<int32_t>(expr_idx)))) {
SQL_REWRITE_LOG(WARN, "add member failed", K(ret));
} else {
if (flag) {
if (OB_FAIL(flags_.add_member(static_cast<int32_t>(expr_idx)))) {
SQL_REWRITE_LOG(WARN, "add member failed", K(ret));
}
}
}
return ret;
}
template <typename COLUMN_INFO, typename CONST_INFO>
bool ObEqualSet<COLUMN_INFO, CONST_INFO>::intersect_equal_set(const ObEqualSet &other) const
{
return expr_bitmap_.overlap(other.expr_bitmap_);
}
template <typename COLUMN_INFO, typename CONST_INFO>
int ObEqualSet<COLUMN_INFO, CONST_INFO>::set_flag(int64_t expr_idx, bool flag)
{
int ret = common::OB_SUCCESS;
if (OB_UNLIKELY(expr_idx < 0)) {
ret = common::OB_INVALID_ARGUMENT;
SQL_REWRITE_LOG(WARN, "expr_idx is invalid", K(expr_idx));
} else {
if (flag) {
if (OB_FAIL(flags_.add_member(static_cast<int32_t>(expr_idx)))) {
SQL_REWRITE_LOG(WARN, "add member failed", K(ret));
}
} else {
if (OB_FAIL(flags_.del_member(static_cast<int32_t>(expr_idx)))) {
SQL_REWRITE_LOG(WARN, "del member failed", K(ret));
}
}
}
return ret;
}
template <typename COLUMN_INFO, typename CONST_INFO>
bool ObEqualSet<COLUMN_INFO, CONST_INFO>::has_expr(int64_t expr_idx) const
{
return NULL != exprs_.get(expr_idx);
}
template <typename COLUMN_INFO, typename CONST_INFO>
const COLUMN_INFO *ObEqualSet<COLUMN_INFO, CONST_INFO>::get_expr(int64_t expr_idx) const
{
return exprs_.get(expr_idx);
}
template <typename COLUMN_INFO, typename CONST_INFO>
int ObEqualSet<COLUMN_INFO, CONST_INFO>::add_const(const CONST_INFO &obj)
{
return constants_.push_back(obj);
}
template <typename COLUMN_INFO, typename CONST_INFO>
bool ObEqualSet<COLUMN_INFO, CONST_INFO>::has_const() const
{
return constants_.count() > 0;
}
//template <typename COLUMN_INFO, typename CONST_INFO>
//void ObEqualSet<COLUMN_INFO, CONST_INFO>::reset()
//{
// exprs_.reuse();
// flags_.reset();
// constants_.reset();
// expr_bitmap_.reset();
//}
template <typename COLUMN_INFO, typename CONST_INFO>
int64_t ObEqualSet<COLUMN_INFO, CONST_INFO>::get_column_num() const
{
return exprs_.count();
}
template <typename COLUMN_INFO, typename CONST_INFO>
int64_t ObEqualSet<COLUMN_INFO, CONST_INFO>::get_const_num() const
{
return constants_.count();
}
template <typename COLUMN_INFO, typename CONST_INFO>
int ObEqualSet<COLUMN_INFO, CONST_INFO>::get_const(int64_t idx, CONST_INFO &val) const
{
return constants_.at(idx, val);
}
////////////////////////////////////////////////////////////////
template <typename COLUMN_INFO, typename CONST_INFO>
ObEqualSet<COLUMN_INFO, CONST_INFO>::ColumnIterator::ColumnIterator()
: equal_set_(NULL),
col_iter_()
{
}
template <typename COLUMN_INFO, typename CONST_INFO>
ObEqualSet<COLUMN_INFO, CONST_INFO>::ColumnIterator::ColumnIterator(const ObEqualSet *equal_set,
const ObEqualSet<COLUMN_INFO, CONST_INFO>::ColIter &col_iter)
: equal_set_(equal_set),
col_iter_(col_iter)
{
}
template <typename COLUMN_INFO, typename CONST_INFO>
ObEqualSet<COLUMN_INFO, CONST_INFO>::ColumnIterator::~ColumnIterator()
{
}
template <typename COLUMN_INFO, typename CONST_INFO>
ObEqualSet<COLUMN_INFO, CONST_INFO>::ColumnIterator::ColumnIterator(const ObEqualSet<COLUMN_INFO, CONST_INFO>::ColumnIterator &other)
: equal_set_(other.equal_set_),
col_iter_(other.col_iter_)
{
}
template <typename COLUMN_INFO, typename CONST_INFO>
typename ObEqualSet<COLUMN_INFO, CONST_INFO>::ColumnIterator
&ObEqualSet<COLUMN_INFO, CONST_INFO>::ColumnIterator::operator=(const ObEqualSet<COLUMN_INFO, CONST_INFO>::ColumnIterator &other)
{
if (this != &other) {
equal_set_ = other.equal_set_;
col_iter_ = other.col_iter_;
}
return *this;
}
template <typename COLUMN_INFO, typename CONST_INFO>
bool ObEqualSet<COLUMN_INFO, CONST_INFO>::ColumnIterator::operator==(const ObEqualSet<COLUMN_INFO, CONST_INFO>::ColumnIterator &other) const
{
return equal_set_ == other.equal_set_ && col_iter_ == other.col_iter_;
}
template <typename COLUMN_INFO, typename CONST_INFO>
bool ObEqualSet<COLUMN_INFO, CONST_INFO>::ColumnIterator::operator!=(const ObEqualSet<COLUMN_INFO, CONST_INFO>::ColumnIterator &other) const
{
return equal_set_ != other.equal_set_ || col_iter_ != other.col_iter_;
}
template <typename COLUMN_INFO, typename CONST_INFO>
typename ObEqualSet<COLUMN_INFO, CONST_INFO>::ColumnIterator &ObEqualSet<COLUMN_INFO, CONST_INFO>::ColumnIterator::operator++()
{
++col_iter_;
return *this;
}
template <typename COLUMN_INFO, typename CONST_INFO>
bool ObEqualSet<COLUMN_INFO, CONST_INFO>::ColumnIterator::get_flag() const
{
return equal_set_->flags_.has_member(static_cast<int32_t>((*col_iter_).first));
}
template <typename COLUMN_INFO, typename CONST_INFO>
int64_t ObEqualSet<COLUMN_INFO, CONST_INFO>::ColumnIterator::get_expr_idx() const
{
return (*col_iter_).first;
}
template <typename COLUMN_INFO, typename CONST_INFO>
const COLUMN_INFO &ObEqualSet<COLUMN_INFO, CONST_INFO>::ColumnIterator::get_expr_info() const
{
return (*col_iter_).second;
}
} // end namespace sql
} // end namespace oceanbase