Files
oceanbase/src/storage/ob_row_fuse.h
chaser-ch 566e920620 Merge branch 'column_store'
Co-authored-by: wangt1xiuyi <13547954130@163.com>
Co-authored-by: yangqise7en <877793735@qq.com>
Co-authored-by: Zach41 <zach_41@163.com>
2023-10-31 15:39:22 +00:00

105 lines
2.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_ROW_FUSE_
#define OCEANBASE_STORAGE_OB_ROW_FUSE_
#include "storage/ob_i_store.h"
#include "storage/blocksstable/ob_datum_row.h"
namespace oceanbase
{
namespace storage
{
class ObNopPos
{
public:
ObNopPos() : allocator_(NULL),
capacity_(0),
count_(0),
nops_(NULL)
{}
~ObNopPos()
{
destroy();
}
void free();
int init(common::ObIAllocator &allocator, const int64_t capacity);
void destroy();
void reset()
{
count_ = 0;
}
bool is_valid() const
{
return (capacity_ > 0 && count_ >= 0 && count_ <= capacity_);
}
int get_nop_pos(const int64_t idx, int64_t &pos) const;
int64_t count() const { return count_; }
int64_t capacity() const { return capacity_; }
int set_count(const int64_t count);
int set_nop_pos(const int64_t idx, const int64_t pos);
TO_STRING_KV("nops", common::ObArrayWrap<int16_t>(nops_, count_));
public:
common::ObIAllocator *allocator_;
int64_t capacity_;
int64_t count_;
int16_t *nops_;
};
class ObObjShallowCopy
{
public:
OB_INLINE int operator () (const common::ObObj &src_obj, common::ObObj &dst_obj)
{
dst_obj = src_obj;
return common::OB_SUCCESS;
}
};
class ObObjDeepCopy
{
public:
ObObjDeepCopy(common::ObArenaAllocator &allocator) : allocator_(allocator) {}
OB_INLINE int operator() (const common::ObObj &src_obj, common::ObObj &dst_obj)
{
return common::deep_copy_obj(allocator_, src_obj, dst_obj);
}
private:
common::ObArenaAllocator &allocator_;
};
class ObRowFuse
{
public:
static int fuse_row(const ObStoreRow &former,
ObStoreRow &result,
ObNopPos &nop_pos,
bool &final_result,
ObObjDeepCopy *obj_copy = nullptr);
static int fuse_row(const blocksstable::ObDatumRow &former,
blocksstable::ObDatumRow &result,
ObNopPos &nop_pos,
bool &final_result,
common::ObIAllocator *allocator = nullptr);
static ObObjShallowCopy shallow_copy_;
};
} // namespace storage
} // namespace oceanbase
#endif // OCEANBASE_STORAGE_OB_ROW_FUSE_