Files
oceanbase/src/storage/ob_multiple_scan_merge_impl.h
gm 4a92b6d7df reformat source code
according to code styles, 'AccessModifierOffset' should be -2.
2021-06-17 10:40:36 +08:00

131 lines
3.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.
*/
#ifndef OCEANBASE_STORAGE_OB_MULTIPLE_SCAN_MERGE_IMPL_H_
#define OCEANBASE_STORAGE_OB_MULTIPLE_SCAN_MERGE_IMPL_H_
#include "lib/container/ob_loser_tree.h"
#include "storage/ob_i_store.h"
#include "storage/ob_row_fuse.h"
#include "storage/ob_multiple_merge.h"
#include "storage/ob_range_purger.h"
#include "storage/ob_range_skip.h"
#include "storage/ob_scan_merge_loser_tree.h"
namespace oceanbase {
namespace storage {
class ObQueryIteratorConsumer {
public:
ObQueryIteratorConsumer()
{
reset();
}
~ObQueryIteratorConsumer()
{}
void add_consumer(const int64_t iter_idx)
{
consumer_iters_[consumer_num_++] = iter_idx;
}
void set_consumer(const int64_t consumer_idx, const int64_t iter_idx)
{
consumer_iters_[consumer_idx] = iter_idx;
}
void set_base_iter_idx(const int64_t iter_idx)
{
base_sstable_iter_idx_ = iter_idx;
}
void reset()
{
consumer_num_ = 0;
base_sstable_iter_idx_ = OB_INVALID_INDEX;
memset(consumer_iters_, 0, MAX_TABLE_CNT_IN_STORAGE * sizeof(int64_t));
}
inline int64_t get_consumer_num()
{
return consumer_num_;
}
inline int64_t* get_consumer_iters()
{
return consumer_iters_;
}
inline void set_consumer_num(const int64_t consumer_num)
{
consumer_num_ = consumer_num;
}
OB_INLINE bool is_base_iter_only() const
{
return 1 == consumer_num_ && base_sstable_iter_idx_ == consumer_iters_[0];
}
// remove larger or equal to idx
void remove_le(const int64_t idx)
{
int64_t valid_consume_num = 0;
for (int64_t i = 0; i < consumer_num_; i++) {
if (consumer_iters_[i] < idx) {
consumer_iters_[valid_consume_num++] = consumer_iters_[i];
}
}
consumer_num_ = valid_consume_num;
}
TO_STRING_KV(
"consumers", ObArrayWrap<int64_t>(consumer_iters_, consumer_num_), K_(consumer_num), K_(base_sstable_iter_idx));
private:
int64_t consumer_iters_[common::MAX_TABLE_CNT_IN_STORAGE];
int64_t consumer_num_;
int64_t base_sstable_iter_idx_;
};
class ObMultipleScanMergeImpl : public ObMultipleMerge {
public:
ObMultipleScanMergeImpl();
virtual ~ObMultipleScanMergeImpl();
virtual int init(
const ObTableAccessParam& param, ObTableAccessContext& context, const ObGetTableParam& get_table_param) override;
virtual int inner_get_next_row(ObStoreRow& row) override;
virtual void reset() override;
virtual void reuse() override;
inline bool is_scan_end() const
{
return loser_tree_.empty();
}
protected:
int reset_range(int idx, int64_t range_idx, const ObStoreRowkey* rowkey, const bool include_gap_key);
int supply_consume();
int prepare_range_skip();
int inner_get_next_row(ObStoreRow& row, bool& need_retry);
int prepare_loser_tree();
private:
int try_skip_range(const ObStoreRow* row, int idx, uint8_t flag, bool first_pop, bool& skipped);
protected:
ObScanMergeLoserTreeCmp tree_cmp_;
ObScanMergeLoserTree loser_tree_;
bool iter_del_row_;
ObQueryIteratorConsumer consumer_;
bool try_push_top_item_;
ObRangePurger range_purger_;
ObRangeSkip range_skip_;
private:
DISALLOW_COPY_AND_ASSIGN(ObMultipleScanMergeImpl);
};
} // end namespace storage
} // end namespace oceanbase
#endif // OCEANBASE_STORAGE_OB_MULTIPLE_SCAN_MERGE_IMPL_H_