137 lines
3.8 KiB
C++
137 lines
3.8 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 OB_JOIN_FAKE_TABLE_H_
|
|
#define OB_JOIN_FAKE_TABLE_H_
|
|
#include "sql/engine/join/ob_join.h"
|
|
#include "sql/engine/ob_physical_plan_ctx.h"
|
|
#include "sql/engine/ob_phy_operator.h"
|
|
#include "sql/engine/ob_exec_context.h"
|
|
#include "sql/ob_sql_define.h"
|
|
|
|
namespace oceanbase
|
|
{
|
|
using namespace common;
|
|
namespace sql
|
|
{
|
|
namespace test
|
|
{
|
|
enum TableType {
|
|
TT_UNKNOWN,
|
|
TT_LEFT_TABLE,
|
|
TT_RIGHT_TABLE,
|
|
TT_OUT_TABLE
|
|
};
|
|
|
|
enum JoinOpTestType
|
|
{
|
|
MERGE_JOIN_TEST,
|
|
NL_JOIN_TEST,
|
|
BNL_JOIN_TEST,
|
|
HASH_JOIN_TEST,
|
|
JOIN_TEST_TYPE_NUM,
|
|
};
|
|
|
|
static const int DATA_COUNT = 16;
|
|
typedef struct {
|
|
int64_t left_[DATA_COUNT][2];
|
|
int64_t right_[DATA_COUNT][2];
|
|
int64_t out_inner_[DATA_COUNT * DATA_COUNT][4];
|
|
int64_t out_left_[DATA_COUNT * DATA_COUNT][4];
|
|
int64_t out_right_[DATA_COUNT * DATA_COUNT][4];
|
|
int64_t out_full_[DATA_COUNT * DATA_COUNT][4];
|
|
} JoinData;
|
|
|
|
class ObQueryRangeDummy{
|
|
public:
|
|
ObQueryRangeDummy() : scan_key_value_(0) {}
|
|
~ObQueryRangeDummy() {}
|
|
void set_scan_key_value(int64_t join_key_value) { scan_key_value_ = join_key_value; }
|
|
int64_t get_scan_key_value() { return scan_key_value_; }
|
|
private:
|
|
int64_t scan_key_value_;
|
|
};
|
|
|
|
class ObJoinFakeTableScanInput : public ObIPhyOperatorInput
|
|
{
|
|
public:
|
|
virtual int init(ObExecContext &ctx, ObTaskInfo &task_info, ObPhyOperator &op)
|
|
{
|
|
UNUSED(ctx);
|
|
UNUSED(task_info);
|
|
UNUSED(op);
|
|
return OB_SUCCESS;
|
|
}
|
|
|
|
virtual ObPhyOperatorType get_phy_op_type() const
|
|
{
|
|
return PHY_TABLE_SCAN;
|
|
}
|
|
|
|
ObQueryRangeDummy &get_query_range()
|
|
{
|
|
return query_range_;
|
|
}
|
|
|
|
private:
|
|
ObQueryRangeDummy query_range_;
|
|
};
|
|
static ObArenaAllocator alloc_;
|
|
class ObJoinFakeTable: public ObPhyOperator
|
|
{
|
|
protected:
|
|
class ObJoinFakeTableCtx: public ObPhyOperatorCtx
|
|
{
|
|
friend class ObJoinFakeTable;
|
|
public:
|
|
ObJoinFakeTableCtx(ObExecContext &exex_ctx) : ObPhyOperatorCtx(exex_ctx), iter_(0) {}
|
|
virtual void destroy() { return ObPhyOperatorCtx::destroy_base(); }
|
|
private:
|
|
int64_t iter_;
|
|
common::ObAddr server_;
|
|
};
|
|
public:
|
|
ObJoinFakeTable();
|
|
virtual ~ObJoinFakeTable();
|
|
int init(JoinOpTestType join_op_type);
|
|
virtual ObPhyOperatorType get_type() const { return op_type_; }
|
|
virtual int set_child(int32_t child_idx, ObPhyOperator &child_operator);
|
|
virtual ObPhyOperator *get_child(int32_t child_idx) const;
|
|
virtual int32_t get_child_num() const { return 0; }
|
|
virtual int inner_open(ObExecContext &exec_ctx) const;
|
|
virtual int rescan(ObExecContext &exec_ctx) const;
|
|
virtual int init_op_ctx(ObExecContext &exec_ctx) const;
|
|
virtual int create_operator_input(ObExecContext &exec_ctx) const;
|
|
virtual int inner_get_next_row(ObExecContext &exec_ctx, const common::ObNewRow *&row) const;
|
|
public:
|
|
int prepare_data(int64_t case_id,
|
|
TableType table_type,
|
|
ObJoinType join_type);
|
|
void set_type(ObPhyOperatorType op_type) { op_type_ = op_type; }
|
|
private:
|
|
int cons_row(int64_t col1, int64_t col2, common::ObNewRow &row) const;
|
|
int cons_row(int64_t col1, int64_t col2, int64_t col3, int64_t col4, common::ObNewRow &row) const;
|
|
private:
|
|
int64_t (*left_data_)[2];
|
|
int64_t (*right_data_)[2];
|
|
int64_t (*out_data_)[4];
|
|
JoinOpTestType join_op_type_;
|
|
ObPhyOperatorType op_type_;
|
|
bool is_inited_;
|
|
};
|
|
|
|
} // namespace test
|
|
} // namespace sql
|
|
} // namespace oceanbase
|
|
|
|
#endif /* OB_JOIN_FAKE_TABLE_H_ */
|