281 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			281 lines
		
	
	
		
			9.6 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_UNITTEST_MEMTABLE_ROWKEY_BUILDER_H_
 | |
| #define OCEANBASE_UNITTEST_MEMTABLE_ROWKEY_BUILDER_H_
 | |
| 
 | |
| #include "lib/allocator/page_arena.h"
 | |
| #include "lib/container/ob_iarray.h"
 | |
| #include "lib/container/ob_se_array.h"
 | |
| #include "common/object/ob_object.h"
 | |
| #include "common/rowkey/ob_store_rowkey.h"
 | |
| #include "share/schema/ob_table_schema.h"
 | |
| 
 | |
| namespace oceanbase {
 | |
| namespace unittest {
 | |
| using namespace oceanbase::common;
 | |
| 
 | |
| class ObStoreRowkeyWrapper {
 | |
| public:
 | |
|   template <class... Args>
 | |
|   ObStoreRowkeyWrapper(const Args&... args) : obj_cnt_(0)
 | |
|   {
 | |
|     fill(args...);
 | |
|   }
 | |
|   ObStoreRowkeyWrapper(const uint8_t obj_cnt) : obj_cnt_(obj_cnt)
 | |
|   {}
 | |
|   ObStoreRowkeyWrapper(const int32_t obj_cnt) : obj_cnt_(obj_cnt)
 | |
|   {}
 | |
|   ~ObStoreRowkeyWrapper()
 | |
|   {}
 | |
| 
 | |
| public:
 | |
|   CharArena& get_allocator()
 | |
|   {
 | |
|     return allocator_;
 | |
|   }
 | |
|   ObObj& get_cur_obj()
 | |
|   {
 | |
|     return objs_[obj_cnt_];
 | |
|   }
 | |
|   ObObj& get_obj(int64_t idx)
 | |
|   {
 | |
|     return objs_[idx];
 | |
|   }
 | |
|   int64_t get_obj_cnt() const
 | |
|   {
 | |
|     return obj_cnt_;
 | |
|   }
 | |
|   void add_obj()
 | |
|   {
 | |
|     obj_cnt_++;
 | |
|   }
 | |
|   ObStoreRowkey& get_rowkey()
 | |
|   {
 | |
|     return rowkey_ = ObStoreRowkey(objs_, obj_cnt_);
 | |
|   }
 | |
|   const ObStoreRowkey& get_rowkey() const
 | |
|   {
 | |
|     return rowkey_ = ObStoreRowkey(objs_, obj_cnt_);
 | |
|   }
 | |
| 
 | |
| private:
 | |
|   template <class T, class... Args>
 | |
|   void fill(const T& head, const Args&... args)
 | |
|   {
 | |
|     head.build(*this);
 | |
|     fill(args...);
 | |
|   }
 | |
|   void fill()
 | |
|   { /*for recursion exit*/
 | |
|   }
 | |
| 
 | |
| private:
 | |
|   CharArena allocator_;
 | |
|   mutable ObObj objs_[OB_MAX_ROWKEY_COLUMN_NUMBER];
 | |
|   int64_t obj_cnt_;
 | |
|   mutable ObStoreRowkey rowkey_;
 | |
| };
 | |
| 
 | |
| class ObColumnDesc {
 | |
| public:
 | |
|   template <class... Args>
 | |
|   ObColumnDesc(const Args&... args)
 | |
|   {
 | |
|     fill(args...);
 | |
|   }
 | |
|   const ObIArray<share::schema::ObColDesc>& get_columns() const
 | |
|   {
 | |
|     return columns_;
 | |
|   }
 | |
| 
 | |
| private:
 | |
|   template <class... Args>
 | |
|   void fill(const uint64_t col_id, const ObObjType col_type, const ObCollationType col_collation, const Args&... args)
 | |
|   {
 | |
|     share::schema::ObColDesc col_desc;
 | |
|     col_desc.col_id_ = col_id;
 | |
|     col_desc.col_type_.set_type(col_type);
 | |
|     col_desc.col_type_.set_collation_type(col_collation);
 | |
|     columns_.push_back(col_desc);
 | |
|     fill(args...);
 | |
|   }
 | |
|   void fill()
 | |
|   { /*for recursion exit*/
 | |
|   }
 | |
| 
 | |
| private:
 | |
|   ObSEArray<share::schema::ObColDesc, 64> columns_;
 | |
| };
 | |
| 
 | |
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| #define DEFINE_TYPE_OBJ(classname, ctype, obtype)          \
 | |
|   class classname {                                        \
 | |
|   public:                                                  \
 | |
|     classname(const ctype v) : v_(v)                       \
 | |
|     {}                                                     \
 | |
|     ~classname()                                           \
 | |
|     {}                                                     \
 | |
|                                                            \
 | |
|   public:                                                  \
 | |
|     void build(ObStoreRowkeyWrapper& rowkey_wrapper) const \
 | |
|     {                                                      \
 | |
|       rowkey_wrapper.get_cur_obj().set_##obtype(v_);       \
 | |
|       rowkey_wrapper.add_obj();                            \
 | |
|     }                                                      \
 | |
|                                                            \
 | |
|   private:                                                 \
 | |
|     const ctype v_;                                        \
 | |
|   };
 | |
| 
 | |
| #define DEFINE_CHARTYPE_OBJ(classname, obtype, cltype)                                                \
 | |
|   class classname {                                                                                   \
 | |
|   public:                                                                                             \
 | |
|     classname(const char* str, const int64_t len, const ObCollationType cltype = CS_TYPE_UTF8MB4_BIN) \
 | |
|         : str_(str), len_(len), cltype_(cltype)                                                       \
 | |
|     {}                                                                                                \
 | |
|     ~classname()                                                                                      \
 | |
|     {}                                                                                                \
 | |
|                                                                                                       \
 | |
|   public:                                                                                             \
 | |
|     void build(ObStoreRowkeyWrapper& rowkey_wrapper) const                                            \
 | |
|     {                                                                                                 \
 | |
|       ObString obstr;                                                                                 \
 | |
|       obstr.assign_ptr(const_cast<char*>(str_), static_cast<int32_t>(len_));                          \
 | |
|       rowkey_wrapper.get_cur_obj().set_##obtype(obstr);                                               \
 | |
|       rowkey_wrapper.get_cur_obj().set_collation_type(cltype_);                                       \
 | |
|       rowkey_wrapper.add_obj();                                                                       \
 | |
|     }                                                                                                 \
 | |
|                                                                                                       \
 | |
|   private:                                                                                            \
 | |
|     const char* str_;                                                                                 \
 | |
|     const int64_t len_;                                                                               \
 | |
|     const ObCollationType cltype_;                                                                    \
 | |
|   };
 | |
| 
 | |
| #define DEFINE_NMBTYPE_OBJ(classname, obtype)              \
 | |
|   class classname {                                        \
 | |
|   public:                                                  \
 | |
|     classname(const char* str) : str_(str)                 \
 | |
|     {}                                                     \
 | |
|     ~classname()                                           \
 | |
|     {}                                                     \
 | |
|                                                            \
 | |
|   public:                                                  \
 | |
|     void build(ObStoreRowkeyWrapper& rowkey_wrapper) const \
 | |
|     {                                                      \
 | |
|       number::ObNumber obnmb;                              \
 | |
|       obnmb.from(str_, rowkey_wrapper.get_allocator());    \
 | |
|       rowkey_wrapper.get_cur_obj().set_##obtype(obnmb);    \
 | |
|       rowkey_wrapper.add_obj();                            \
 | |
|     }                                                      \
 | |
|                                                            \
 | |
|   private:                                                 \
 | |
|     const char* str_;                                      \
 | |
|   };
 | |
| 
 | |
| class U {
 | |
| public:
 | |
|   U()
 | |
|   {}
 | |
|   ~U()
 | |
|   {}
 | |
| 
 | |
| public:
 | |
|   void build(ObStoreRowkeyWrapper& rowkey_wrapper) const
 | |
|   {
 | |
|     rowkey_wrapper.get_cur_obj().set_null();
 | |
|     rowkey_wrapper.add_obj();
 | |
|   }
 | |
| };
 | |
| 
 | |
| class OBMIN {
 | |
| public:
 | |
|   OBMIN()
 | |
|   {}
 | |
|   ~OBMIN()
 | |
|   {}
 | |
| 
 | |
| public:
 | |
|   void build(ObStoreRowkeyWrapper& rowkey_wrapper) const
 | |
|   {
 | |
|     rowkey_wrapper.get_cur_obj().set_ext(ObObj::MIN_OBJECT_VALUE);
 | |
|     rowkey_wrapper.add_obj();
 | |
|   }
 | |
| };
 | |
| 
 | |
| class OBMAX {
 | |
| public:
 | |
|   OBMAX()
 | |
|   {}
 | |
|   ~OBMAX()
 | |
|   {}
 | |
| 
 | |
| public:
 | |
|   void build(ObStoreRowkeyWrapper& rowkey_wrapper) const
 | |
|   {
 | |
|     rowkey_wrapper.get_cur_obj().set_ext(ObObj::MAX_OBJECT_VALUE);
 | |
|     rowkey_wrapper.add_obj();
 | |
|   }
 | |
| };
 | |
| 
 | |
| DEFINE_TYPE_OBJ(IT, int8_t, tinyint)
 | |
| DEFINE_TYPE_OBJ(IS, int16_t, smallint)
 | |
| DEFINE_TYPE_OBJ(IM, int32_t, mediumint)
 | |
| DEFINE_TYPE_OBJ(I32, int32_t, int32)
 | |
| DEFINE_TYPE_OBJ(I, int64_t, int)
 | |
| 
 | |
| DEFINE_TYPE_OBJ(UIT, uint8_t, utinyint)
 | |
| DEFINE_TYPE_OBJ(UIS, uint16_t, usmallint)
 | |
| DEFINE_TYPE_OBJ(UIM, uint32_t, umediumint)
 | |
| DEFINE_TYPE_OBJ(UI32, uint32_t, uint32)
 | |
| DEFINE_TYPE_OBJ(UI, uint64_t, uint64)
 | |
| 
 | |
| DEFINE_TYPE_OBJ(F, float, float)
 | |
| DEFINE_TYPE_OBJ(D, double, double)
 | |
| 
 | |
| DEFINE_TYPE_OBJ(UF, float, ufloat)
 | |
| DEFINE_TYPE_OBJ(UD, double, udouble)
 | |
| 
 | |
| DEFINE_NMBTYPE_OBJ(N, number)
 | |
| DEFINE_NMBTYPE_OBJ(UN, unumber)
 | |
| 
 | |
| DEFINE_TYPE_OBJ(T, int64_t, datetime)
 | |
| DEFINE_TYPE_OBJ(TS, int64_t, timestamp)
 | |
| DEFINE_TYPE_OBJ(DD, int32_t, date)
 | |
| DEFINE_TYPE_OBJ(TT, int64_t, time)
 | |
| DEFINE_TYPE_OBJ(YY, uint8_t, year)
 | |
| 
 | |
| DEFINE_CHARTYPE_OBJ(V, varchar, ObCollationType)
 | |
| DEFINE_CHARTYPE_OBJ(C, char, ObCollationType)
 | |
| DEFINE_CHARTYPE_OBJ(VB, varbinary, ObCollationType)
 | |
| DEFINE_CHARTYPE_OBJ(BB, binary, ObCollationType)
 | |
| 
 | |
| typedef ObStoreRowkeyWrapper RK;
 | |
| typedef ObColumnDesc CD;
 | |
| 
 | |
| #define INIT_MTK(allocator, mtk, table_id, ...)                \
 | |
|   {                                                            \
 | |
|     RK _rkb_(__VA_ARGS__);                                     \
 | |
|     ObMemtableKey tmp_mtk;                                     \
 | |
|     int ret = tmp_mtk.encode(table_id, &(_rkb_.get_rowkey())); \
 | |
|     EXPECT_EQ(OB_SUCCESS, ret);                                \
 | |
|     ret = tmp_mtk.dup(mtk, allocator);                         \
 | |
|     EXPECT_EQ(OB_SUCCESS, ret);                                \
 | |
|   }
 | |
| 
 | |
| }  // namespace unittest
 | |
| }  // namespace oceanbase
 | |
| 
 | |
| #endif  // OCEANBASE_UNITTEST_MEMTABLE_ROWKEY_BUILDER_H_
 | 
