fix get from ddlkv
This commit is contained in:
parent
2383698d81
commit
d83b66ec6a
@ -20,6 +20,175 @@ namespace oceanbase
|
||||
{
|
||||
namespace storage
|
||||
{
|
||||
class ObSSTableMultiVersionRowGetter;
|
||||
class ObSSTableMultiVersionRowMultiGetter;
|
||||
|
||||
template <class T>
|
||||
class ObDDLKVEmptyRowIterator : public ObStoreRowIterator
|
||||
{
|
||||
public:
|
||||
virtual int init(
|
||||
const ObTableIterParam ¶m,
|
||||
ObTableAccessContext &context,
|
||||
ObITable *table,
|
||||
const void *query_range)
|
||||
{
|
||||
return OB_SUCCESS;
|
||||
}
|
||||
virtual int get_next_row(const blocksstable::ObDatumRow *&row) { return OB_ITER_END; }
|
||||
};
|
||||
|
||||
template <>
|
||||
class ObDDLKVEmptyRowIterator<ObSSTableMultiVersionRowGetter> : public ObStoreRowIterator
|
||||
{
|
||||
public:
|
||||
ObDDLKVEmptyRowIterator() : range_idx_(0) {}
|
||||
virtual ~ObDDLKVEmptyRowIterator() {}
|
||||
virtual void reuse()
|
||||
{
|
||||
range_idx_ = 0;
|
||||
not_exist_row_.reset();
|
||||
ObStoreRowIterator::reuse();
|
||||
}
|
||||
virtual void reset()
|
||||
{
|
||||
range_idx_ = 0;
|
||||
not_exist_row_.reset();
|
||||
ObStoreRowIterator::reset();
|
||||
}
|
||||
virtual int init(
|
||||
const ObTableIterParam ¶m,
|
||||
ObTableAccessContext &context,
|
||||
ObITable *table,
|
||||
const void *query_range)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (OB_UNLIKELY(not_exist_row_.is_valid())) {
|
||||
ret = OB_INIT_TWICE;
|
||||
STORAGE_LOG(WARN, "init twice", K(ret), KP(this), K(not_exist_row_));
|
||||
} else if (OB_ISNULL(query_range)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
STORAGE_LOG(WARN, "invalid args", K(ret), KP(query_range));
|
||||
} else {
|
||||
const ObDatumRowkey *rowkey = static_cast<const ObDatumRowkey *>(query_range);
|
||||
const int64_t column_count = param.get_out_col_cnt();
|
||||
if (OB_UNLIKELY(rowkey->get_datum_cnt() > column_count)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
STORAGE_LOG(WARN, "invalid rowkey cnt", K(ret), KPC(rowkey), K(column_count));
|
||||
} else if (OB_FAIL(not_exist_row_.init(*context.get_range_allocator(), column_count))) {
|
||||
STORAGE_LOG(WARN, "fail to init datum row", K(ret));
|
||||
} else {
|
||||
not_exist_row_.row_flag_.reset();
|
||||
not_exist_row_.row_flag_.set_flag(ObDmlFlag::DF_NOT_EXIST);
|
||||
for (int64_t i = 0; i < not_exist_row_.get_column_count(); ++i) {
|
||||
if (i < rowkey->get_datum_cnt()) {
|
||||
not_exist_row_.storage_datums_[i] = rowkey->datums_[i];
|
||||
} else {
|
||||
not_exist_row_.storage_datums_[i].set_nop();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
virtual int get_next_row(const blocksstable::ObDatumRow *&row)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (OB_UNLIKELY(!not_exist_row_.is_valid())) {
|
||||
ret = OB_NOT_INIT;
|
||||
STORAGE_LOG(WARN, "not init", K(ret), KP(this));
|
||||
} else if (range_idx_ == 0) {
|
||||
++range_idx_;
|
||||
row = ¬_exist_row_;
|
||||
} else {
|
||||
ret = OB_ITER_END;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
private:
|
||||
int64_t range_idx_;
|
||||
blocksstable::ObDatumRow not_exist_row_;
|
||||
};
|
||||
|
||||
template <>
|
||||
class ObDDLKVEmptyRowIterator<ObSSTableMultiVersionRowMultiGetter> : public ObStoreRowIterator
|
||||
{
|
||||
public:
|
||||
ObDDLKVEmptyRowIterator() : range_idx_(0), base_rowkeys_(nullptr) {}
|
||||
virtual ~ObDDLKVEmptyRowIterator() {}
|
||||
virtual void reuse()
|
||||
{
|
||||
range_idx_ = 0;
|
||||
not_exist_row_.reset();
|
||||
base_rowkeys_ = nullptr;
|
||||
ObStoreRowIterator::reuse();
|
||||
}
|
||||
virtual void reset()
|
||||
{
|
||||
range_idx_ = 0;
|
||||
not_exist_row_.reset();
|
||||
base_rowkeys_ = nullptr;
|
||||
ObStoreRowIterator::reset();
|
||||
}
|
||||
virtual int init(
|
||||
const ObTableIterParam ¶m,
|
||||
ObTableAccessContext &context,
|
||||
ObITable *table,
|
||||
const void *query_range)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (OB_UNLIKELY(not_exist_row_.is_valid())) {
|
||||
ret = OB_INIT_TWICE;
|
||||
STORAGE_LOG(WARN, "init twice", K(ret), KP(this), K(not_exist_row_));
|
||||
} else if (OB_ISNULL(query_range)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
STORAGE_LOG(WARN, "invalid args", K(ret), KP(query_range));
|
||||
} else {
|
||||
base_rowkeys_ = reinterpret_cast<const ObIArray<ObDatumRowkey> *>(query_range);
|
||||
const int64_t column_count = param.get_out_col_cnt();
|
||||
if (OB_FAIL(not_exist_row_.init(*context.get_range_allocator(), column_count))) {
|
||||
STORAGE_LOG(WARN, "fail to init datum row", K(ret));
|
||||
} else {
|
||||
not_exist_row_.row_flag_.reset();
|
||||
not_exist_row_.row_flag_.set_flag(ObDmlFlag::DF_NOT_EXIST);
|
||||
for (int64_t i = 0; i < not_exist_row_.get_column_count(); ++i) {
|
||||
not_exist_row_.storage_datums_[i].set_nop();
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
virtual int get_next_row(const blocksstable::ObDatumRow *&row)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (OB_UNLIKELY(!not_exist_row_.is_valid())) {
|
||||
ret = OB_NOT_INIT;
|
||||
STORAGE_LOG(WARN, "not init", K(ret), KP(this));
|
||||
} else if (range_idx_ < base_rowkeys_->count()) {
|
||||
const blocksstable::ObDatumRowkey &rowkey = base_rowkeys_->at(range_idx_);
|
||||
if (OB_UNLIKELY(rowkey.get_datum_cnt() > not_exist_row_.get_column_count())) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
STORAGE_LOG(WARN, "invalid rowkey cnt", K(ret), K(rowkey),
|
||||
K(not_exist_row_.get_column_count()));
|
||||
} else {
|
||||
for (int64_t i = 0; i < rowkey.get_datum_cnt(); ++i) {
|
||||
not_exist_row_.storage_datums_[i] = rowkey.datums_[i];
|
||||
}
|
||||
++range_idx_;
|
||||
row = ¬_exist_row_;
|
||||
}
|
||||
} else {
|
||||
ret = OB_ITER_END;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
private:
|
||||
int64_t range_idx_;
|
||||
blocksstable::ObDatumRow not_exist_row_;
|
||||
const common::ObIArray<blocksstable::ObDatumRowkey> *base_rowkeys_;
|
||||
};
|
||||
|
||||
template <class T>
|
||||
class ObDDLKVMultiVersionRowIterator : public ObStoreRowIterator
|
||||
@ -42,7 +211,7 @@ private:
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
STORAGE_LOG(WARN, "unexpected ddl memtable is null", K(ret));
|
||||
} else if (OB_FAIL(iterator_.init(param_, context_, ddl_memtable, query_range_))) {
|
||||
STORAGE_LOG(WARN, "fail to init", K(ret));
|
||||
STORAGE_LOG(WARN, "fail to init iterator", K(ret));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@ -59,12 +228,14 @@ public:
|
||||
virtual void reuse()
|
||||
{
|
||||
iterator_.reuse();
|
||||
empty_iterator_.reuse();
|
||||
is_empty_ = false;
|
||||
ObStoreRowIterator::reuse();
|
||||
}
|
||||
virtual void reset()
|
||||
{
|
||||
iterator_.reset();
|
||||
empty_iterator_.reset();
|
||||
is_empty_ = false;
|
||||
ObStoreRowIterator::reset();
|
||||
}
|
||||
@ -91,6 +262,9 @@ public:
|
||||
} else {
|
||||
ret = OB_SUCCESS;
|
||||
is_empty_ = true;
|
||||
if (OB_FAIL(empty_iterator_.init(param, context, nullptr, query_range))) {
|
||||
STORAGE_LOG(WARN, "fail to init empty ddl memtable", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -100,7 +274,7 @@ public:
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (is_empty_) {
|
||||
ret = OB_ITER_END;
|
||||
ret = empty_iterator_.get_next_row(row);
|
||||
} else {
|
||||
ret = iterator_.get_next_row(row);
|
||||
}
|
||||
@ -109,6 +283,7 @@ public:
|
||||
|
||||
private:
|
||||
T iterator_;
|
||||
ObDDLKVEmptyRowIterator<T> empty_iterator_;
|
||||
bool is_empty_;
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user