Files
oceanbase/src/storage/ob_range_iterator.h
oceanbase-admin cea7de1475 init push
2021-05-31 22:56:52 +08:00

120 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_RANGE_ITERATOR_
#define OCEANBASE_STORAGE_OB_RANGE_ITERATOR_
#include "storage/ob_storage_struct.h"
namespace oceanbase {
namespace common {
struct ObSimpleBatch;
}
namespace storage {
struct ObBatch final {
enum ObBatchType {
T_NONE,
T_GET,
T_MULTI_GET,
T_SCAN,
T_MULTI_SCAN,
};
ObBatchType type_;
union {
const common::ObExtStoreRowkey* rowkey_;
const common::ObExtStoreRange* range_;
const GetRowkeyArray* rowkeys_;
const ScanRangeArray* ranges_;
};
OB_INLINE bool is_valid() const
{
return (T_NONE != type_ && (NULL != rowkey_ || NULL != range_ || NULL != rowkeys_ || NULL != ranges_));
}
OB_INLINE int64_t to_string(char* buffer, const int64_t length) const
{
int64_t pos = 0;
if (T_NONE == type_) {
common::databuff_printf(buffer, length, pos, "NONE:");
} else if (T_GET == type_) {
common::databuff_printf(buffer, length, pos, "GET:");
pos += rowkey_->to_string(buffer + pos, length - pos);
} else if (T_MULTI_GET == type_) {
common::databuff_printf(buffer, length, pos, "MULTI GET:");
pos += rowkeys_->to_string(buffer + pos, length - pos);
} else if (T_SCAN == type_) {
common::databuff_printf(buffer, length, pos, "SCAN:");
pos += range_->to_string(buffer + pos, length - pos);
} else if (T_MULTI_SCAN == type_) {
common::databuff_printf(buffer, length, pos, "MULTI SCAN:");
pos += ranges_->to_string(buffer + pos, length - pos);
} else {
common::databuff_printf(buffer, length, pos, "invalid type:%d", type_);
}
return pos;
}
static int get_storage_batch(
const common::ObSimpleBatch& sql_batch, common::ObIAllocator& allocator, storage::ObBatch& batch);
};
class ObRangeIterator final {
public:
ObRangeIterator()
: scan_param_(NULL),
cur_idx_(0),
order_ranges_(),
rowkey_(),
range_(),
rowkeys_(),
rowkey_column_orders_(nullptr),
rowkey_column_cnt_(0),
is_inited_(false)
{}
~ObRangeIterator()
{}
int get_next(ObBatch& batch);
void reset();
void reuse();
int set_scan_param(ObTableScanParam& scan_param);
int get_org_range_array_idx(const int64_t range_idx, int64_t& org_range_array_idx);
private:
int convert_key_ranges(const int64_t range_begin_pos, const int64_t range_end_pos, const int64_t range_array_idx,
ObIAllocator& allocator, common::ObIArray<common::ObExtStoreRange>& store_ranges);
template <typename T>
void set_range_array_idx(const int64_t range_array_idx, T& range);
private:
ObTableScanParam* scan_param_;
int64_t cur_idx_;
ScanRangeArray order_ranges_;
common::ObExtStoreRowkey rowkey_;
common::ObExtStoreRange range_;
GetRowkeyArray rowkeys_;
const common::ObIArray<common::ObOrderType>* rowkey_column_orders_;
int64_t rowkey_column_cnt_;
bool is_inited_;
DISALLOW_COPY_AND_ASSIGN(ObRangeIterator);
};
template <typename T>
void ObRangeIterator::set_range_array_idx(const int64_t range_array_idx, T& range)
{
range.set_range_array_idx(range_array_idx);
}
} // namespace storage
} // namespace oceanbase
#endif // OCEANBASE_STORAGE_OB_RANGE_ITERATOR_