1586 lines
58 KiB
C++
Executable File
1586 lines
58 KiB
C++
Executable File
// Copyright (c) 2017, Baidu.com, Inc. All Rights Reserved
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing,
|
|
// software distributed under the License is distributed on an
|
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
// KIND, either express or implied. See the License for the
|
|
// specific language governing permissions and limitations
|
|
// under the License.
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
#include "exec/olap_scan_node.h"
|
|
#include "gen_cpp/PlanNodes_types.h"
|
|
#include "olap/command_executor.h"
|
|
#include "olap/field.h"
|
|
#include "olap/olap_reader.h"
|
|
#include "olap/olap_main.cpp"
|
|
#include "runtime/descriptors.h"
|
|
#include "runtime/primitive_type.h"
|
|
#include "runtime/exec_env.h"
|
|
#include "runtime/runtime_state.h"
|
|
#include "runtime/row_batch.h"
|
|
#include "runtime/string_value.h"
|
|
#include "runtime/tuple_row.h"
|
|
#include "util/runtime_profile.h"
|
|
#include "util/debug_util.h"
|
|
#include "util/logging.h"
|
|
|
|
using namespace testing;
|
|
using namespace palo;
|
|
using namespace std;
|
|
|
|
namespace palo {
|
|
|
|
void set_up() {
|
|
config::storage_root_path = "./test_run/data_test";
|
|
system("rm -rf ./test_run && mkdir -p ./test_run");
|
|
create_dir(config::storage_root_path);
|
|
touch_all_singleton();
|
|
}
|
|
|
|
void tear_down() {
|
|
system("rm -rf ./test_run");
|
|
remove_all_dir(string(getenv("DORIS_HOME")) + UNUSED_PREFIX);
|
|
}
|
|
|
|
void set_default_create_tablet_request(TCreateTabletReq* request) {
|
|
request->tablet_id = 10003;
|
|
request->__set_version(1);
|
|
request->__set_version_hash(0);
|
|
request->tablet_schema.schema_hash = 1508825676;
|
|
request->tablet_schema.short_key_column_count = 2;
|
|
request->tablet_schema.storage_type = TStorageType::COLUMN;
|
|
|
|
TColumn k1;
|
|
k1.column_name = "k1";
|
|
k1.column_type.type = TPrimitiveType::TINYINT;
|
|
request->tablet_schema.columns.push_back(k1);
|
|
|
|
TColumn k2;
|
|
k2.column_name = "k2";
|
|
k2.column_type.type = TPrimitiveType::INT;
|
|
request->tablet_schema.columns.push_back(k2);
|
|
|
|
TColumn k3;
|
|
k3.column_name = "k3";
|
|
k3.column_type.type = TPrimitiveType::VARCHAR;
|
|
k3.column_type.__set_len(64);
|
|
request->tablet_schema.columns.push_back(k3);
|
|
|
|
TColumn k4;
|
|
k4.column_name = "k4";
|
|
k4.column_type.type = TPrimitiveType::DATE;
|
|
request->tablet_schema.columns.push_back(k4);
|
|
|
|
TColumn k5;
|
|
k5.column_name = "k5";
|
|
k5.column_type.type = TPrimitiveType::DATETIME;
|
|
request->tablet_schema.columns.push_back(k5);
|
|
|
|
TColumn k6;
|
|
k6.column_name = "k6";
|
|
k6.column_type.type = TPrimitiveType::DECIMAL;
|
|
k6.column_type.__set_precision(6);
|
|
k6.column_type.__set_scale(3);
|
|
request->tablet_schema.columns.push_back(k6);
|
|
|
|
TColumn k7;
|
|
k7.column_name = "k7";
|
|
k7.column_type.type = TPrimitiveType::SMALLINT;
|
|
k7.default_value = "0";
|
|
request->tablet_schema.columns.push_back(k7);
|
|
|
|
TColumn k8;
|
|
k8.column_name = "k8";
|
|
k8.column_type.type = TPrimitiveType::CHAR;
|
|
k8.column_type.__set_len(16);
|
|
k8.default_value = "char";
|
|
request->tablet_schema.columns.push_back(k8);
|
|
|
|
TColumn v;
|
|
v.column_name = "v";
|
|
v.column_type.type = TPrimitiveType::BIGINT;
|
|
v.__set_aggregation_type(TAggregationType::SUM);
|
|
request->tablet_schema.columns.push_back(v);
|
|
}
|
|
|
|
// SQL for generate data(./be/test/olap/test_data/all_types_1000):
|
|
//
|
|
// create table delete_test_row (k1 tinyint, k2 int, k3 varchar(64),
|
|
// k4 date, k5 datetime, k6 decimal(6,3), k7 smallint default "0",
|
|
// k8 char(16) default "char", v bigint sum) engine=olap distributed by
|
|
// random buckets 1 properties ("storage_type" = "row");
|
|
//
|
|
// load label label1 (data infile
|
|
// ("hdfs://host:port/dir")
|
|
// into table `delete_test_row` (k1,k2,v,k3,k4,k5,k6));
|
|
void set_default_push_request(TPushReq* request) {
|
|
request->tablet_id = 10003;
|
|
request->schema_hash = 1508825676;
|
|
request->__set_version(2);
|
|
request->__set_version_hash(1);
|
|
request->timeout = 86400;
|
|
request->push_type = TPushType::LOAD;
|
|
request->__set_http_file_path("./be/test/olap/test_data/all_types_1000");
|
|
}
|
|
|
|
class TestOLAPReaderRow : public testing::Test {
|
|
public:
|
|
TestOLAPReaderRow() : _runtime_stat("test") {
|
|
_profile = _obj_pool.add(new RuntimeProfile(&_obj_pool, "OlapScanner"));
|
|
OLAPReader::init_profile(_profile);
|
|
}
|
|
|
|
void SetUp() {
|
|
init_olap();
|
|
}
|
|
|
|
void TearDown() {
|
|
// Remove all dir.
|
|
OLAPEngine::get_instance()->drop_table(
|
|
_create_tablet.tablet_id, _create_tablet.tablet_schema.schema_hash);
|
|
while (0 == access(_tablet_path.c_str(), F_OK)) {
|
|
sleep(1);
|
|
}
|
|
ASSERT_EQ(OLAP_SUCCESS, remove_all_dir(config::storage_root_path));
|
|
}
|
|
|
|
void init_olap() {
|
|
// Create local data dir for OLAPEngine.
|
|
config::storage_root_path = "./test_run/row_table";
|
|
remove_all_dir(config::storage_root_path);
|
|
ASSERT_EQ(create_dir(config::storage_root_path), OLAP_SUCCESS);
|
|
|
|
// Initialize all singleton object.
|
|
OLAPRootPath::get_instance()->reload_root_paths(config::storage_root_path.c_str());
|
|
|
|
// 1. Prepare for query split key.
|
|
// create base tablet
|
|
OLAPStatus res = OLAP_SUCCESS;
|
|
set_default_create_tablet_request(&_create_tablet);
|
|
CommandExecutor command_executor = CommandExecutor();
|
|
res = command_executor.create_table(_create_tablet);
|
|
ASSERT_EQ(OLAP_SUCCESS, res);
|
|
OLAPTablePtr tablet = command_executor.get_table(
|
|
_create_tablet.tablet_id, _create_tablet.tablet_schema.schema_hash);
|
|
ASSERT_TRUE(tablet.get() != NULL);
|
|
_tablet_path = tablet->tablet_path();
|
|
|
|
// push data
|
|
set_default_push_request(&_push_req);
|
|
std::vector<TTabletInfo> tablets_info;
|
|
res = command_executor.push(_push_req, &tablets_info);
|
|
ASSERT_EQ(OLAP_SUCCESS, res);
|
|
ASSERT_EQ(1, tablets_info.size());
|
|
}
|
|
|
|
void init_scan_node() {
|
|
TUniqueId fragment_id;
|
|
TQueryOptions query_options;
|
|
query_options.disable_codegen = true;
|
|
//ExecEnv* exec_env = new ExecEnv();
|
|
//_runtime_stat.init(fragment_id, query_options, "test", exec_env);
|
|
|
|
TDescriptorTable t_desc_table;
|
|
|
|
// table descriptors
|
|
TTableDescriptor t_table_desc;
|
|
|
|
t_table_desc.id = 0;
|
|
t_table_desc.tableType = TTableType::OLAP_TABLE;
|
|
t_table_desc.numCols = 0;
|
|
t_table_desc.numClusteringCols = 0;
|
|
t_table_desc.olapTable.tableName = "";
|
|
t_table_desc.tableName = "";
|
|
t_table_desc.dbName = "";
|
|
t_table_desc.__isset.mysqlTable = true;
|
|
t_desc_table.tableDescriptors.push_back(t_table_desc);
|
|
t_desc_table.__isset.tableDescriptors = true;
|
|
// TSlotDescriptor
|
|
int offset = 1;
|
|
int i = 0;
|
|
// k1
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::TINYINT));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k1");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(int8_t);
|
|
}
|
|
++i;
|
|
// k2
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::INT));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k2");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(int32_t);
|
|
}
|
|
++i;
|
|
// k3
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::VARCHAR));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k3");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(StringValue);
|
|
}
|
|
++i;
|
|
// k4
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::DATE));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k4");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(DateTimeValue);
|
|
}
|
|
++i;
|
|
// k5
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::DATETIME));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k5");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(DateTimeValue);
|
|
}
|
|
++i;
|
|
// k6
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::DECIMAL));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k6");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(decimal12_t);
|
|
}
|
|
++i;
|
|
// k7
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::SMALLINT));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k7");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(int16_t);
|
|
}
|
|
++i;
|
|
// k8
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::CHAR));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k8");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(StringValue);
|
|
}
|
|
++i;
|
|
// v
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::BIGINT));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("v");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(int64_t);
|
|
}
|
|
|
|
t_desc_table.__isset.slotDescriptors = true;
|
|
// TTupleDescriptor
|
|
TTupleDescriptor t_tuple_desc;
|
|
t_tuple_desc.id = 0;
|
|
t_tuple_desc.byteSize = offset;
|
|
t_tuple_desc.numNullBytes = 1;
|
|
t_tuple_desc.tableId = 0;
|
|
t_tuple_desc.__isset.tableId = true;
|
|
t_desc_table.tupleDescriptors.push_back(t_tuple_desc);
|
|
|
|
DescriptorTbl::create(&_obj_pool, t_desc_table, &_desc_tbl);
|
|
}
|
|
|
|
void init_scan_node_k1_v() {
|
|
TUniqueId fragment_id;
|
|
TQueryOptions query_options;
|
|
query_options.disable_codegen = true;
|
|
//ExecEnv* exec_env = new ExecEnv();
|
|
//_runtime_stat.init(fragment_id, query_options, "test", exec_env);
|
|
|
|
TDescriptorTable t_desc_table;
|
|
|
|
// table descriptors
|
|
TTableDescriptor t_table_desc;
|
|
|
|
t_table_desc.id = 0;
|
|
t_table_desc.tableType = TTableType::OLAP_TABLE;
|
|
t_table_desc.numCols = 0;
|
|
t_table_desc.numClusteringCols = 0;
|
|
t_table_desc.olapTable.tableName = "";
|
|
t_table_desc.tableName = "";
|
|
t_table_desc.dbName = "";
|
|
t_table_desc.__isset.mysqlTable = true;
|
|
t_desc_table.tableDescriptors.push_back(t_table_desc);
|
|
t_desc_table.__isset.tableDescriptors = true;
|
|
// TSlotDescriptor
|
|
int offset = 1;
|
|
int i = 0;
|
|
// k1
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::TINYINT));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k1");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(int8_t);
|
|
}
|
|
++i;
|
|
// v
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::BIGINT));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("v");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(int64_t);
|
|
}
|
|
|
|
t_desc_table.__isset.slotDescriptors = true;
|
|
// TTupleDescriptor
|
|
TTupleDescriptor t_tuple_desc;
|
|
t_tuple_desc.id = 0;
|
|
t_tuple_desc.byteSize = offset;
|
|
t_tuple_desc.numNullBytes = 1;
|
|
t_tuple_desc.tableId = 0;
|
|
t_tuple_desc.__isset.tableId = true;
|
|
t_desc_table.tupleDescriptors.push_back(t_tuple_desc);
|
|
|
|
DescriptorTbl::create(&_obj_pool, t_desc_table, &_desc_tbl);
|
|
}
|
|
|
|
private:
|
|
TCreateTabletReq _create_tablet;
|
|
std::string _tablet_path;
|
|
TPushReq _push_req;
|
|
|
|
TPlanNode _tnode;
|
|
ObjectPool _obj_pool;
|
|
DescriptorTbl* _desc_tbl;
|
|
RuntimeState _runtime_stat;
|
|
vector<TScanRangeParams> _scan_ranges;
|
|
RuntimeProfile* _profile;
|
|
};
|
|
|
|
TEST_F(TestOLAPReaderRow, next_tuple_with_key_range) {
|
|
init_scan_node();
|
|
|
|
TFetchRequest fetch_reques;
|
|
|
|
fetch_reques.__set_aggregation(false);
|
|
fetch_reques.__set_schema_hash(1508825676);
|
|
fetch_reques.__set_version(_push_req.version);
|
|
fetch_reques.__set_version_hash(_push_req.version_hash);
|
|
fetch_reques.__set_tablet_id(10003);
|
|
|
|
TFetchStartKey start_key;
|
|
start_key.__set_key(std::vector<std::string>(1, "0"));
|
|
fetch_reques.__set_start_key(std::vector<TFetchStartKey>(1, start_key));
|
|
fetch_reques.__set_range("ge");
|
|
|
|
TFetchEndKey end_key;
|
|
end_key.__set_key(std::vector<std::string>(1, "100"));
|
|
fetch_reques.__set_end_key(std::vector<TFetchEndKey>(1, end_key));
|
|
fetch_reques.__set_end_range("le");
|
|
|
|
std::vector<std::string> field_vec;
|
|
field_vec.push_back("k1");
|
|
field_vec.push_back("k2");
|
|
field_vec.push_back("k3");
|
|
field_vec.push_back("k4");
|
|
field_vec.push_back("k5");
|
|
field_vec.push_back("k6");
|
|
field_vec.push_back("k7");
|
|
field_vec.push_back("k8");
|
|
field_vec.push_back("v");
|
|
fetch_reques.__set_field(field_vec);
|
|
|
|
TupleDescriptor *tuple_desc = _desc_tbl->get_tuple_descriptor(0);
|
|
OLAPReader olap_reader(*tuple_desc);
|
|
ASSERT_TRUE(olap_reader.init(fetch_reques, NULL, _profile).ok());
|
|
|
|
char tuple_buf[1024];
|
|
bzero(tuple_buf, 1024);
|
|
Tuple *tuple = reinterpret_cast<Tuple*>(tuple_buf);
|
|
bool eof;
|
|
int64_t raw_rows_read = 0;
|
|
ASSERT_TRUE(olap_reader.next_tuple(tuple, &raw_rows_read, &eof).ok());
|
|
|
|
ASSERT_EQ(0, *reinterpret_cast<const int8_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[0]->tuple_offset())));
|
|
ASSERT_EQ(0, *reinterpret_cast<const int32_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[1]->tuple_offset())));
|
|
{
|
|
StringValue *slot = reinterpret_cast<StringValue *>(
|
|
tuple->get_slot(tuple_desc->slots()[2]->tuple_offset()));
|
|
ASSERT_STREQ("26a91490-1851-4001-a9ad-6ef0cf2c3aa4",
|
|
std::string(slot->ptr, slot->len).c_str());
|
|
}
|
|
{
|
|
DateTimeValue *slot = reinterpret_cast<DateTimeValue *>(
|
|
tuple->get_slot(tuple_desc->slots()[3]->tuple_offset()));
|
|
ASSERT_STREQ("2014-04-27", slot->debug_string().c_str());
|
|
}
|
|
{
|
|
DateTimeValue *slot = reinterpret_cast<DateTimeValue *>(
|
|
tuple->get_slot(tuple_desc->slots()[4]->tuple_offset()));
|
|
ASSERT_STREQ("2014-04-27 22:23:20", slot->debug_string().c_str());
|
|
}
|
|
{
|
|
DecimalValue *slot = reinterpret_cast<DecimalValue *>(
|
|
tuple->get_slot(tuple_desc->slots()[5]->tuple_offset()));
|
|
ASSERT_STREQ("978.371", slot->to_string().c_str());
|
|
}
|
|
ASSERT_EQ(0, *reinterpret_cast<const int16_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[6]->tuple_offset())));
|
|
{
|
|
StringValue *slot = reinterpret_cast<StringValue *>(
|
|
tuple->get_slot(tuple_desc->slots()[7]->tuple_offset()));
|
|
ASSERT_STREQ("char", std::string(slot->ptr, slot->len).c_str());
|
|
}
|
|
ASSERT_EQ(0, *reinterpret_cast<const int64_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[8]->tuple_offset())));
|
|
}
|
|
|
|
TEST_F(TestOLAPReaderRow, next_tuple_with_where_condition) {
|
|
init_scan_node();
|
|
|
|
TFetchRequest fetch_reques;
|
|
|
|
fetch_reques.__set_aggregation(false);
|
|
fetch_reques.__set_schema_hash(1508825676);
|
|
fetch_reques.__set_version(_push_req.version);
|
|
fetch_reques.__set_version_hash(_push_req.version_hash);
|
|
fetch_reques.__set_tablet_id(10003);
|
|
|
|
TCondition condition;
|
|
condition.column_name = "k2";
|
|
condition.condition_op = "<<";
|
|
condition.condition_values.push_back("0");
|
|
fetch_reques.where.push_back(condition);
|
|
|
|
TFetchStartKey start_key;
|
|
start_key.__set_key(std::vector<std::string>(1, "0"));
|
|
fetch_reques.__set_start_key(std::vector<TFetchStartKey>(1, start_key));
|
|
fetch_reques.__set_range("ge");
|
|
|
|
TFetchEndKey end_key;
|
|
end_key.__set_key(std::vector<std::string>(1, "0"));
|
|
fetch_reques.__set_end_key(std::vector<TFetchEndKey>(1, end_key));
|
|
fetch_reques.__set_end_range("le");
|
|
|
|
std::vector<std::string> field_vec;
|
|
field_vec.push_back("k1");
|
|
field_vec.push_back("k2");
|
|
field_vec.push_back("k3");
|
|
field_vec.push_back("k4");
|
|
field_vec.push_back("k5");
|
|
field_vec.push_back("k6");
|
|
field_vec.push_back("k7");
|
|
field_vec.push_back("k8");
|
|
field_vec.push_back("v");
|
|
fetch_reques.__set_field(field_vec);
|
|
|
|
TupleDescriptor *tuple_desc = _desc_tbl->get_tuple_descriptor(0);
|
|
OLAPReader olap_reader(*tuple_desc);
|
|
ASSERT_TRUE(olap_reader.init(fetch_reques, NULL, _profile).ok());
|
|
|
|
char tuple_buf[1024];
|
|
bzero(tuple_buf, 1024);
|
|
Tuple *tuple = reinterpret_cast<Tuple*>(tuple_buf);
|
|
bool eof;
|
|
int64_t raw_rows_read = 0;
|
|
ASSERT_TRUE(olap_reader.next_tuple(tuple, &raw_rows_read, &eof).ok());
|
|
ASSERT_TRUE(eof);
|
|
}
|
|
|
|
|
|
TEST_F(TestOLAPReaderRow, next_tuple_without_aggregation) {
|
|
init_scan_node_k1_v();
|
|
|
|
TFetchRequest fetch_reques;
|
|
|
|
fetch_reques.__set_aggregation(false);
|
|
fetch_reques.__set_schema_hash(1508825676);
|
|
fetch_reques.__set_version(_push_req.version);
|
|
fetch_reques.__set_version_hash(_push_req.version_hash);
|
|
fetch_reques.__set_tablet_id(10003);
|
|
|
|
TFetchStartKey start_key;
|
|
start_key.__set_key(std::vector<std::string>(1, "0"));
|
|
fetch_reques.__set_start_key(std::vector<TFetchStartKey>(1, start_key));
|
|
fetch_reques.__set_range("ge");
|
|
|
|
TFetchEndKey end_key;
|
|
end_key.__set_key(std::vector<std::string>(1, "100"));
|
|
fetch_reques.__set_end_key(std::vector<TFetchEndKey>(1, end_key));
|
|
fetch_reques.__set_end_range("le");
|
|
|
|
std::vector<std::string> field_vec;
|
|
field_vec.push_back("k1");
|
|
field_vec.push_back("v");
|
|
fetch_reques.__set_field(field_vec);
|
|
|
|
TupleDescriptor *tuple_desc = _desc_tbl->get_tuple_descriptor(0);
|
|
OLAPReader olap_reader(*tuple_desc);
|
|
ASSERT_TRUE(olap_reader.init(fetch_reques, NULL, _profile).ok());
|
|
|
|
char tuple_buf[1024];
|
|
bzero(tuple_buf, 1024);
|
|
Tuple *tuple = reinterpret_cast<Tuple*>(tuple_buf);
|
|
bool eof;
|
|
int64_t raw_rows_read = 0;
|
|
ASSERT_TRUE(olap_reader.next_tuple(tuple, &raw_rows_read, &eof).ok());
|
|
|
|
ASSERT_EQ(0, *reinterpret_cast<const int8_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[0]->tuple_offset())));
|
|
ASSERT_EQ(0, *reinterpret_cast<const int64_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[1]->tuple_offset())));
|
|
}
|
|
|
|
TEST_F(TestOLAPReaderRow, next_tuple_with_aggregation) {
|
|
init_scan_node_k1_v();
|
|
|
|
TFetchRequest fetch_reques;
|
|
|
|
fetch_reques.__set_aggregation(true);
|
|
fetch_reques.__set_schema_hash(1508825676);
|
|
fetch_reques.__set_version(_push_req.version);
|
|
fetch_reques.__set_version_hash(_push_req.version_hash);
|
|
fetch_reques.__set_tablet_id(10003);
|
|
|
|
TFetchStartKey start_key;
|
|
start_key.__set_key(std::vector<std::string>(1, "0"));
|
|
fetch_reques.__set_start_key(std::vector<TFetchStartKey>(1, start_key));
|
|
fetch_reques.__set_range("ge");
|
|
|
|
TFetchEndKey end_key;
|
|
end_key.__set_key(std::vector<std::string>(1, "100"));
|
|
fetch_reques.__set_end_key(std::vector<TFetchEndKey>(1, end_key));
|
|
fetch_reques.__set_end_range("le");
|
|
|
|
std::vector<std::string> field_vec;
|
|
field_vec.push_back("k1");
|
|
field_vec.push_back("v");
|
|
fetch_reques.__set_field(field_vec);
|
|
|
|
TupleDescriptor *tuple_desc = _desc_tbl->get_tuple_descriptor(0);
|
|
OLAPReader olap_reader(*tuple_desc);
|
|
ASSERT_TRUE(olap_reader.init(fetch_reques, NULL, _profile).ok());
|
|
|
|
char tuple_buf[1024];
|
|
bzero(tuple_buf, 1024);
|
|
Tuple *tuple = reinterpret_cast<Tuple*>(tuple_buf);
|
|
bool eof;
|
|
int64_t raw_rows_read = 0;
|
|
ASSERT_TRUE(olap_reader.next_tuple(tuple, &raw_rows_read, &eof).ok());
|
|
|
|
ASSERT_EQ(0, *reinterpret_cast<const int8_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[0]->tuple_offset())));
|
|
ASSERT_EQ(153600, *reinterpret_cast<const int64_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[1]->tuple_offset())));
|
|
}
|
|
|
|
class TestOLAPReaderColumn : public testing::Test {
|
|
public:
|
|
TestOLAPReaderColumn() : _runtime_stat("test") {
|
|
_profile = _obj_pool.add(new RuntimeProfile(&_obj_pool, "OlapScanner"));
|
|
OLAPReader::init_profile(_profile);
|
|
|
|
}
|
|
|
|
void SetUp() {
|
|
init_olap();
|
|
}
|
|
|
|
void TearDown() {
|
|
// Remove all dir.
|
|
OLAPEngine::get_instance()->drop_table(
|
|
_create_tablet.tablet_id, _create_tablet.tablet_schema.schema_hash);
|
|
while (0 == access(_tablet_path.c_str(), F_OK)) {
|
|
sleep(1);
|
|
}
|
|
ASSERT_EQ(OLAP_SUCCESS, remove_all_dir(config::storage_root_path));
|
|
}
|
|
|
|
void init_olap() {
|
|
// Create local data dir for OLAPEngine.
|
|
config::storage_root_path = "./test_run/column_table";
|
|
remove_all_dir(config::storage_root_path);
|
|
ASSERT_EQ(create_dir(config::storage_root_path), OLAP_SUCCESS);
|
|
|
|
// Initialize all singleton object.
|
|
OLAPRootPath::get_instance()->reload_root_paths(config::storage_root_path.c_str());
|
|
|
|
// 1. Prepare for query split key.
|
|
// create base tablet
|
|
OLAPStatus res = OLAP_SUCCESS;
|
|
set_default_create_tablet_request(&_create_tablet);
|
|
_create_tablet.tablet_schema.storage_type = TStorageType::COLUMN;
|
|
CommandExecutor command_executor = CommandExecutor();
|
|
res = command_executor.create_table(_create_tablet);
|
|
ASSERT_EQ(OLAP_SUCCESS, res);
|
|
OLAPTablePtr tablet = command_executor.get_table(
|
|
_create_tablet.tablet_id, _create_tablet.tablet_schema.schema_hash);
|
|
ASSERT_TRUE(tablet.get() != NULL);
|
|
_tablet_path = tablet->tablet_path();
|
|
|
|
// push data
|
|
set_default_push_request(&_push_req);
|
|
std::vector<TTabletInfo> tablets_info;
|
|
res = command_executor.push(_push_req, &tablets_info);
|
|
ASSERT_EQ(OLAP_SUCCESS, res);
|
|
ASSERT_EQ(1, tablets_info.size());
|
|
}
|
|
|
|
void init_scan_node() {
|
|
TUniqueId fragment_id;
|
|
TQueryOptions query_options;
|
|
query_options.disable_codegen = true;
|
|
//ExecEnv* exec_env = new ExecEnv();
|
|
//_runtime_stat.init(fragment_id, query_options, "test", exec_env);
|
|
|
|
TDescriptorTable t_desc_table;
|
|
|
|
// table descriptors
|
|
TTableDescriptor t_table_desc;
|
|
|
|
t_table_desc.id = 0;
|
|
t_table_desc.tableType = TTableType::OLAP_TABLE;
|
|
t_table_desc.numCols = 0;
|
|
t_table_desc.numClusteringCols = 0;
|
|
t_table_desc.olapTable.tableName = "";
|
|
t_table_desc.tableName = "";
|
|
t_table_desc.dbName = "";
|
|
t_table_desc.__isset.mysqlTable = true;
|
|
t_desc_table.tableDescriptors.push_back(t_table_desc);
|
|
t_desc_table.__isset.tableDescriptors = true;
|
|
// TSlotDescriptor
|
|
int offset = 1;
|
|
int i = 0;
|
|
// k1
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::TINYINT));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k1");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(int8_t);
|
|
}
|
|
++i;
|
|
// k2
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::INT));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k2");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(int32_t);
|
|
}
|
|
++i;
|
|
// k3
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::VARCHAR));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k3");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(StringValue);
|
|
}
|
|
++i;
|
|
// k4
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::DATE));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k4");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(DateTimeValue);
|
|
}
|
|
++i;
|
|
// k5
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::DATETIME));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k5");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(DateTimeValue);
|
|
}
|
|
++i;
|
|
// k6
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::DECIMAL));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k6");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(decimal12_t);
|
|
}
|
|
++i;
|
|
// k7
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::SMALLINT));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k7");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(int16_t);
|
|
}
|
|
++i;
|
|
// k8
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::CHAR));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k8");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(StringValue);
|
|
}
|
|
++i;
|
|
// v
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::BIGINT));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("v");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(int64_t);
|
|
}
|
|
|
|
t_desc_table.__isset.slotDescriptors = true;
|
|
// TTupleDescriptor
|
|
TTupleDescriptor t_tuple_desc;
|
|
t_tuple_desc.id = 0;
|
|
t_tuple_desc.byteSize = offset;
|
|
t_tuple_desc.numNullBytes = 1;
|
|
t_tuple_desc.tableId = 0;
|
|
t_tuple_desc.__isset.tableId = true;
|
|
t_desc_table.tupleDescriptors.push_back(t_tuple_desc);
|
|
|
|
DescriptorTbl::create(&_obj_pool, t_desc_table, &_desc_tbl);
|
|
}
|
|
|
|
|
|
void init_scan_node_k1_v() {
|
|
TUniqueId fragment_id;
|
|
TQueryOptions query_options;
|
|
query_options.disable_codegen = true;
|
|
//ExecEnv* exec_env = new ExecEnv();
|
|
//_runtime_stat.init(fragment_id, query_options, "test", exec_env);
|
|
|
|
TDescriptorTable t_desc_table;
|
|
|
|
// table descriptors
|
|
TTableDescriptor t_table_desc;
|
|
|
|
t_table_desc.id = 0;
|
|
t_table_desc.tableType = TTableType::OLAP_TABLE;
|
|
t_table_desc.numCols = 0;
|
|
t_table_desc.numClusteringCols = 0;
|
|
t_table_desc.olapTable.tableName = "";
|
|
t_table_desc.tableName = "";
|
|
t_table_desc.dbName = "";
|
|
t_table_desc.__isset.mysqlTable = true;
|
|
t_desc_table.tableDescriptors.push_back(t_table_desc);
|
|
t_desc_table.__isset.tableDescriptors = true;
|
|
// TSlotDescriptor
|
|
int offset = 1;
|
|
int i = 0;
|
|
// k1
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::TINYINT));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k1");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(int8_t);
|
|
}
|
|
++i;
|
|
// v
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::BIGINT));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("v");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(int64_t);
|
|
}
|
|
|
|
t_desc_table.__isset.slotDescriptors = true;
|
|
// TTupleDescriptor
|
|
TTupleDescriptor t_tuple_desc;
|
|
t_tuple_desc.id = 0;
|
|
t_tuple_desc.byteSize = offset;
|
|
t_tuple_desc.numNullBytes = 1;
|
|
t_tuple_desc.tableId = 0;
|
|
t_tuple_desc.__isset.tableId = true;
|
|
t_desc_table.tupleDescriptors.push_back(t_tuple_desc);
|
|
|
|
DescriptorTbl::create(&_obj_pool, t_desc_table, &_desc_tbl);
|
|
}
|
|
|
|
private:
|
|
TCreateTabletReq _create_tablet;
|
|
std::string _tablet_path;
|
|
TPushReq _push_req;
|
|
|
|
TPlanNode _tnode;
|
|
ObjectPool _obj_pool;
|
|
DescriptorTbl* _desc_tbl;
|
|
RuntimeState _runtime_stat;
|
|
vector<TScanRangeParams> _scan_ranges;
|
|
RuntimeProfile* _profile;
|
|
};
|
|
|
|
|
|
TEST_F(TestOLAPReaderColumn, next_tuple) {
|
|
init_scan_node();
|
|
|
|
TFetchRequest fetch_reques;
|
|
|
|
fetch_reques.__set_schema_hash(1508825676);
|
|
fetch_reques.__set_version(_push_req.version);
|
|
fetch_reques.__set_version_hash(_push_req.version_hash);
|
|
fetch_reques.__set_tablet_id(10003);
|
|
|
|
TFetchStartKey start_key;
|
|
start_key.__set_key(std::vector<std::string>(1, "0"));
|
|
fetch_reques.__set_start_key(std::vector<TFetchStartKey>(1, start_key));
|
|
fetch_reques.__set_range("ge");
|
|
|
|
TFetchEndKey end_key;
|
|
end_key.__set_key(std::vector<std::string>(1, "100"));
|
|
fetch_reques.__set_end_key(std::vector<TFetchEndKey>(1, end_key));
|
|
fetch_reques.__set_end_range("le");
|
|
|
|
std::vector<std::string> field_vec;
|
|
field_vec.push_back("k1");
|
|
field_vec.push_back("k2");
|
|
field_vec.push_back("k3");
|
|
field_vec.push_back("k4");
|
|
field_vec.push_back("k5");
|
|
field_vec.push_back("k6");
|
|
field_vec.push_back("k7");
|
|
field_vec.push_back("k8");
|
|
field_vec.push_back("v");
|
|
fetch_reques.__set_field(field_vec);
|
|
|
|
TupleDescriptor *tuple_desc = _desc_tbl->get_tuple_descriptor(0);
|
|
OLAPReader olap_reader(*tuple_desc);
|
|
ASSERT_TRUE(olap_reader.init(fetch_reques, NULL, _profile).ok());
|
|
|
|
char tuple_buf[1024];
|
|
bzero(tuple_buf, 1024);
|
|
Tuple *tuple = reinterpret_cast<Tuple*>(tuple_buf);
|
|
bool eof;
|
|
int64_t raw_rows_read = 0;
|
|
ASSERT_TRUE(olap_reader.next_tuple(tuple, &raw_rows_read, &eof).ok());
|
|
|
|
ASSERT_EQ(0, *reinterpret_cast<const int8_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[0]->tuple_offset())));
|
|
ASSERT_EQ(0, *reinterpret_cast<const int32_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[1]->tuple_offset())));
|
|
{
|
|
StringValue *slot = reinterpret_cast<StringValue *>(
|
|
tuple->get_slot(tuple_desc->slots()[2]->tuple_offset()));
|
|
ASSERT_STREQ("26a91490-1851-4001-a9ad-6ef0cf2c3aa4",
|
|
std::string(slot->ptr, slot->len).c_str());
|
|
}
|
|
{
|
|
DateTimeValue *slot = reinterpret_cast<DateTimeValue *>(
|
|
tuple->get_slot(tuple_desc->slots()[3]->tuple_offset()));
|
|
ASSERT_STREQ("2014-04-27", slot->debug_string().c_str());
|
|
}
|
|
{
|
|
DateTimeValue *slot = reinterpret_cast<DateTimeValue *>(
|
|
tuple->get_slot(tuple_desc->slots()[4]->tuple_offset()));
|
|
ASSERT_STREQ("2014-04-27 22:23:20", slot->debug_string().c_str());
|
|
}
|
|
{
|
|
DecimalValue *slot = reinterpret_cast<DecimalValue *>(
|
|
tuple->get_slot(tuple_desc->slots()[5]->tuple_offset()));
|
|
ASSERT_STREQ("978.371", slot->to_string().c_str());
|
|
}
|
|
ASSERT_EQ(0, *reinterpret_cast<const int16_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[6]->tuple_offset())));
|
|
{
|
|
StringValue *slot = reinterpret_cast<StringValue *>(
|
|
tuple->get_slot(tuple_desc->slots()[7]->tuple_offset()));
|
|
ASSERT_STREQ("char", std::string(slot->ptr, slot->len).c_str());
|
|
}
|
|
ASSERT_EQ(0, *reinterpret_cast<const int64_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[8]->tuple_offset())));
|
|
}
|
|
|
|
TEST_F(TestOLAPReaderColumn, next_tuple_without_aggregation) {
|
|
init_scan_node_k1_v();
|
|
|
|
TFetchRequest fetch_reques;
|
|
|
|
fetch_reques.__set_aggregation(false);
|
|
fetch_reques.__set_schema_hash(1508825676);
|
|
fetch_reques.__set_version(_push_req.version);
|
|
fetch_reques.__set_version_hash(_push_req.version_hash);
|
|
fetch_reques.__set_tablet_id(10003);
|
|
|
|
TFetchStartKey start_key;
|
|
start_key.__set_key(std::vector<std::string>(1, "0"));
|
|
fetch_reques.__set_start_key(std::vector<TFetchStartKey>(1, start_key));
|
|
fetch_reques.__set_range("ge");
|
|
|
|
TFetchEndKey end_key;
|
|
end_key.__set_key(std::vector<std::string>(1, "100"));
|
|
fetch_reques.__set_end_key(std::vector<TFetchEndKey>(1, end_key));
|
|
fetch_reques.__set_end_range("le");
|
|
|
|
std::vector<std::string> field_vec;
|
|
field_vec.push_back("k1");
|
|
field_vec.push_back("v");
|
|
fetch_reques.__set_field(field_vec);
|
|
|
|
TupleDescriptor *tuple_desc = _desc_tbl->get_tuple_descriptor(0);
|
|
OLAPReader olap_reader(*tuple_desc);
|
|
ASSERT_TRUE(olap_reader.init(fetch_reques, NULL, _profile).ok());
|
|
|
|
char tuple_buf[1024];
|
|
bzero(tuple_buf, 1024);
|
|
Tuple *tuple = reinterpret_cast<Tuple*>(tuple_buf);
|
|
bool eof;
|
|
int64_t raw_rows_read = 0;
|
|
ASSERT_TRUE(olap_reader.next_tuple(tuple, &raw_rows_read, &eof).ok());
|
|
|
|
ASSERT_EQ(0, *reinterpret_cast<const int8_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[0]->tuple_offset())));
|
|
ASSERT_EQ(0, *reinterpret_cast<const int64_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[1]->tuple_offset())));
|
|
}
|
|
|
|
TEST_F(TestOLAPReaderColumn, next_tuple_with_aggregation) {
|
|
init_scan_node_k1_v();
|
|
|
|
TFetchRequest fetch_reques;
|
|
|
|
fetch_reques.__set_aggregation(true);
|
|
fetch_reques.__set_schema_hash(1508825676);
|
|
fetch_reques.__set_version(_push_req.version);
|
|
fetch_reques.__set_version_hash(_push_req.version_hash);
|
|
fetch_reques.__set_tablet_id(10003);
|
|
|
|
TFetchStartKey start_key;
|
|
start_key.__set_key(std::vector<std::string>(1, "0"));
|
|
fetch_reques.__set_start_key(std::vector<TFetchStartKey>(1, start_key));
|
|
fetch_reques.__set_range("ge");
|
|
|
|
TFetchEndKey end_key;
|
|
end_key.__set_key(std::vector<std::string>(1, "100"));
|
|
fetch_reques.__set_end_key(std::vector<TFetchEndKey>(1, end_key));
|
|
fetch_reques.__set_end_range("le");
|
|
|
|
std::vector<std::string> field_vec;
|
|
field_vec.push_back("k1");
|
|
field_vec.push_back("v");
|
|
fetch_reques.__set_field(field_vec);
|
|
|
|
TupleDescriptor *tuple_desc = _desc_tbl->get_tuple_descriptor(0);
|
|
OLAPReader olap_reader(*tuple_desc);
|
|
ASSERT_TRUE(olap_reader.init(fetch_reques, NULL, _profile).ok());
|
|
|
|
char tuple_buf[1024];
|
|
bzero(tuple_buf, 1024);
|
|
Tuple *tuple = reinterpret_cast<Tuple*>(tuple_buf);
|
|
bool eof;
|
|
int64_t raw_rows_read = 0;
|
|
ASSERT_TRUE(olap_reader.next_tuple(tuple, &raw_rows_read, &eof).ok());
|
|
|
|
ASSERT_EQ(0, *reinterpret_cast<const int8_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[0]->tuple_offset())));
|
|
ASSERT_EQ(153600, *reinterpret_cast<const int64_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[1]->tuple_offset())));
|
|
}
|
|
|
|
class TestOLAPReaderColumnDeleteCondition : public testing::Test {
|
|
public:
|
|
TestOLAPReaderColumnDeleteCondition() : _runtime_stat("test") {
|
|
_profile = _obj_pool.add(new RuntimeProfile(&_obj_pool, "OlapScanner"));
|
|
OLAPReader::init_profile(_profile);
|
|
}
|
|
|
|
void SetUp() {
|
|
init_olap();
|
|
init_scan_node();
|
|
}
|
|
|
|
void TearDown() {
|
|
// Remove all dir.
|
|
OLAPEngine::get_instance()->drop_table(
|
|
_create_tablet.tablet_id, _create_tablet.tablet_schema.schema_hash);
|
|
while (0 == access(_tablet_path.c_str(), F_OK)) {
|
|
sleep(1);
|
|
}
|
|
ASSERT_EQ(OLAP_SUCCESS, remove_all_dir(config::storage_root_path));
|
|
}
|
|
|
|
void init_olap() {
|
|
// Create local data dir for OLAPEngine.
|
|
config::storage_root_path = "./test_run/row_table";
|
|
remove_all_dir(config::storage_root_path);
|
|
ASSERT_EQ(create_dir(config::storage_root_path), OLAP_SUCCESS);
|
|
|
|
// Initialize all singleton object.
|
|
OLAPRootPath::get_instance()->reload_root_paths(config::storage_root_path.c_str());
|
|
|
|
// 1. Prepare for query split key.
|
|
// create base tablet
|
|
OLAPStatus res = OLAP_SUCCESS;
|
|
set_default_create_tablet_request(&_create_tablet);
|
|
CommandExecutor command_executor = CommandExecutor();
|
|
res = command_executor.create_table(_create_tablet);
|
|
ASSERT_EQ(OLAP_SUCCESS, res);
|
|
OLAPTablePtr tablet = command_executor.get_table(
|
|
_create_tablet.tablet_id, _create_tablet.tablet_schema.schema_hash);
|
|
ASSERT_TRUE(tablet.get() != NULL);
|
|
_tablet_path = tablet->tablet_path();
|
|
|
|
// push data
|
|
set_default_push_request(&_push_req);
|
|
std::vector<TTabletInfo> tablets_info;
|
|
res = command_executor.push(_push_req, &tablets_info);
|
|
ASSERT_EQ(OLAP_SUCCESS, res);
|
|
ASSERT_EQ(1, tablets_info.size());
|
|
|
|
// delete data
|
|
set_default_push_request(&_delete_req);
|
|
_delete_req.version = 3;
|
|
_delete_req.version_hash = 2;
|
|
_delete_req.push_type = TPushType::DELETE;
|
|
_delete_req.__isset.http_file_path = false;
|
|
|
|
TCondition condition;
|
|
condition.column_name = "k2";
|
|
condition.condition_op = "=";
|
|
condition.condition_values.push_back("0");
|
|
_delete_req.delete_conditions.push_back(condition);
|
|
tablets_info.clear();
|
|
res = command_executor.delete_data(_delete_req, &tablets_info);
|
|
ASSERT_EQ(OLAP_SUCCESS, res);
|
|
ASSERT_EQ(1, tablets_info.size());
|
|
}
|
|
|
|
void init_scan_node() {
|
|
TUniqueId fragment_id;
|
|
TQueryOptions query_options;
|
|
query_options.disable_codegen = true;
|
|
//ExecEnv* exec_env = new ExecEnv();
|
|
//_runtime_stat.init(fragment_id, query_options, "test", exec_env);
|
|
|
|
TDescriptorTable t_desc_table;
|
|
|
|
// table descriptors
|
|
TTableDescriptor t_table_desc;
|
|
|
|
t_table_desc.id = 0;
|
|
t_table_desc.tableType = TTableType::OLAP_TABLE;
|
|
t_table_desc.numCols = 0;
|
|
t_table_desc.numClusteringCols = 0;
|
|
t_table_desc.olapTable.tableName = "";
|
|
t_table_desc.tableName = "";
|
|
t_table_desc.dbName = "";
|
|
t_table_desc.__isset.mysqlTable = true;
|
|
t_desc_table.tableDescriptors.push_back(t_table_desc);
|
|
t_desc_table.__isset.tableDescriptors = true;
|
|
// TSlotDescriptor
|
|
int offset = 1;
|
|
int i = 0;
|
|
// k1
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::TINYINT));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k1");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(int8_t);
|
|
}
|
|
++i;
|
|
// k2
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::INT));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k2");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(int32_t);
|
|
}
|
|
++i;
|
|
// k3
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::VARCHAR));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k3");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(StringValue);
|
|
}
|
|
++i;
|
|
// k4
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::DATE));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k4");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(DateTimeValue);
|
|
}
|
|
++i;
|
|
// k5
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::DATETIME));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k5");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(DateTimeValue);
|
|
}
|
|
++i;
|
|
// k6
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::DECIMAL));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k6");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(decimal12_t);
|
|
}
|
|
++i;
|
|
// k7
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::SMALLINT));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k7");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(int16_t);
|
|
}
|
|
++i;
|
|
// k8
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::CHAR));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k8");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(StringValue);
|
|
}
|
|
++i;
|
|
// v
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::BIGINT));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("v");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(int64_t);
|
|
}
|
|
|
|
t_desc_table.__isset.slotDescriptors = true;
|
|
// TTupleDescriptor
|
|
TTupleDescriptor t_tuple_desc;
|
|
t_tuple_desc.id = 0;
|
|
t_tuple_desc.byteSize = offset;
|
|
t_tuple_desc.numNullBytes = 1;
|
|
t_tuple_desc.tableId = 0;
|
|
t_tuple_desc.__isset.tableId = true;
|
|
t_desc_table.tupleDescriptors.push_back(t_tuple_desc);
|
|
|
|
DescriptorTbl::create(&_obj_pool, t_desc_table, &_desc_tbl);
|
|
}
|
|
|
|
|
|
void init_scan_node_k1_v() {
|
|
TUniqueId fragment_id;
|
|
TQueryOptions query_options;
|
|
query_options.disable_codegen = true;
|
|
//ExecEnv* exec_env = new ExecEnv();
|
|
//_runtime_stat.init(fragment_id, query_options, "test", exec_env);
|
|
|
|
TDescriptorTable t_desc_table;
|
|
|
|
// table descriptors
|
|
TTableDescriptor t_table_desc;
|
|
|
|
t_table_desc.id = 0;
|
|
t_table_desc.tableType = TTableType::OLAP_TABLE;
|
|
t_table_desc.numCols = 0;
|
|
t_table_desc.numClusteringCols = 0;
|
|
t_table_desc.olapTable.tableName = "";
|
|
t_table_desc.tableName = "";
|
|
t_table_desc.dbName = "";
|
|
t_table_desc.__isset.mysqlTable = true;
|
|
t_desc_table.tableDescriptors.push_back(t_table_desc);
|
|
t_desc_table.__isset.tableDescriptors = true;
|
|
// TSlotDescriptor
|
|
int offset = 1;
|
|
int i = 0;
|
|
// k1
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::TINYINT));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("k1");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(int8_t);
|
|
}
|
|
++i;
|
|
// v
|
|
{
|
|
TSlotDescriptor t_slot_desc;
|
|
t_slot_desc.__set_id(i);
|
|
t_slot_desc.__set_slotType(gen_type_desc(TPrimitiveType::BIGINT));
|
|
t_slot_desc.__set_columnPos(i);
|
|
t_slot_desc.__set_byteOffset(offset);
|
|
t_slot_desc.__set_nullIndicatorByte(0);
|
|
t_slot_desc.__set_nullIndicatorBit(-1);
|
|
t_slot_desc.__set_slotIdx(i);
|
|
t_slot_desc.__set_isMaterialized(true);
|
|
t_slot_desc.__set_colName("v");
|
|
t_desc_table.slotDescriptors.push_back(t_slot_desc);
|
|
offset += sizeof(int64_t);
|
|
}
|
|
|
|
t_desc_table.__isset.slotDescriptors = true;
|
|
// TTupleDescriptor
|
|
TTupleDescriptor t_tuple_desc;
|
|
t_tuple_desc.id = 0;
|
|
t_tuple_desc.byteSize = offset;
|
|
t_tuple_desc.numNullBytes = 1;
|
|
t_tuple_desc.tableId = 0;
|
|
t_tuple_desc.__isset.tableId = true;
|
|
t_desc_table.tupleDescriptors.push_back(t_tuple_desc);
|
|
|
|
DescriptorTbl::create(&_obj_pool, t_desc_table, &_desc_tbl);
|
|
}
|
|
|
|
private:
|
|
TCreateTabletReq _create_tablet;
|
|
std::string _tablet_path;
|
|
TPushReq _push_req;
|
|
TPushReq _delete_req;
|
|
|
|
TPlanNode _tnode;
|
|
ObjectPool _obj_pool;
|
|
DescriptorTbl* _desc_tbl;
|
|
RuntimeState _runtime_stat;
|
|
vector<TScanRangeParams> _scan_ranges;
|
|
RuntimeProfile* _profile;
|
|
};
|
|
|
|
TEST_F(TestOLAPReaderColumnDeleteCondition, next_tuple) {
|
|
init_scan_node();
|
|
|
|
TFetchRequest fetch_reques;
|
|
|
|
fetch_reques.__set_schema_hash(1508825676);
|
|
fetch_reques.__set_version(_delete_req.version);
|
|
fetch_reques.__set_version_hash(_delete_req.version_hash);
|
|
fetch_reques.__set_tablet_id(10003);
|
|
|
|
TFetchStartKey start_key;
|
|
start_key.__set_key(std::vector<std::string>(1, "0"));
|
|
fetch_reques.__set_start_key(std::vector<TFetchStartKey>(1, start_key));
|
|
fetch_reques.__set_range("ge");
|
|
|
|
TFetchEndKey end_key;
|
|
end_key.__set_key(std::vector<std::string>(1, "100"));
|
|
fetch_reques.__set_end_key(std::vector<TFetchEndKey>(1, end_key));
|
|
fetch_reques.__set_end_range("le");
|
|
|
|
std::vector<std::string> field_vec;
|
|
field_vec.push_back("k1");
|
|
field_vec.push_back("k2");
|
|
field_vec.push_back("k3");
|
|
field_vec.push_back("k4");
|
|
field_vec.push_back("k5");
|
|
field_vec.push_back("k6");
|
|
field_vec.push_back("k7");
|
|
field_vec.push_back("k8");
|
|
field_vec.push_back("v");
|
|
fetch_reques.__set_field(field_vec);
|
|
|
|
TupleDescriptor *tuple_desc = _desc_tbl->get_tuple_descriptor(0);
|
|
OLAPReader olap_reader(*tuple_desc);
|
|
ASSERT_TRUE(olap_reader.init(fetch_reques, NULL, _profile).ok());
|
|
|
|
char tuple_buf[1024];
|
|
bzero(tuple_buf, 1024);
|
|
Tuple *tuple = reinterpret_cast<Tuple*>(tuple_buf);
|
|
bool eof;
|
|
int64_t raw_rows_read = 0;
|
|
ASSERT_TRUE(olap_reader.next_tuple(tuple, &raw_rows_read, &eof).ok());
|
|
|
|
ASSERT_EQ(0, *reinterpret_cast<const int8_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[0]->tuple_offset())));
|
|
ASSERT_EQ(128, *reinterpret_cast<const int32_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[1]->tuple_offset())));
|
|
{
|
|
StringValue *slot = reinterpret_cast<StringValue *>(
|
|
tuple->get_slot(tuple_desc->slots()[2]->tuple_offset()));
|
|
ASSERT_STREQ("a1d033e6-2944-4b4e-b432-ea804c89dcd7",
|
|
std::string(slot->ptr, slot->len).c_str());
|
|
}
|
|
{
|
|
DateTimeValue *slot = reinterpret_cast<DateTimeValue *>(
|
|
tuple->get_slot(tuple_desc->slots()[3]->tuple_offset()));
|
|
ASSERT_STREQ("2014-03-23", slot->debug_string().c_str());
|
|
}
|
|
{
|
|
DateTimeValue *slot = reinterpret_cast<DateTimeValue *>(
|
|
tuple->get_slot(tuple_desc->slots()[4]->tuple_offset()));
|
|
ASSERT_STREQ("2014-03-23 05:39:17", slot->debug_string().c_str());
|
|
}
|
|
{
|
|
DecimalValue *slot = reinterpret_cast<DecimalValue *>(
|
|
tuple->get_slot(tuple_desc->slots()[5]->tuple_offset()));
|
|
ASSERT_STREQ("-484.89", slot->to_string().c_str());
|
|
}
|
|
ASSERT_EQ(0, *reinterpret_cast<const int16_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[6]->tuple_offset())));
|
|
{
|
|
StringValue *slot = reinterpret_cast<StringValue *>(
|
|
tuple->get_slot(tuple_desc->slots()[7]->tuple_offset()));
|
|
ASSERT_STREQ("char", std::string(slot->ptr, slot->len).c_str());
|
|
}
|
|
ASSERT_EQ(12800, *reinterpret_cast<const int64_t*>
|
|
(tuple->get_slot(tuple_desc->slots()[8]->tuple_offset())));
|
|
|
|
}
|
|
|
|
} // namespace palo
|
|
|
|
int main(int argc, char** argv) {
|
|
std::string conffile = std::string(getenv("DORIS_HOME")) + "/conf/be.conf";
|
|
if (!palo::config::init(conffile.c_str(), false)) {
|
|
fprintf(stderr, "error read config file. \n");
|
|
return -1;
|
|
}
|
|
palo::init_glog("be-test");
|
|
::testing::InitGoogleTest(&argc, argv);
|
|
|
|
int ret = palo::OLAP_SUCCESS;
|
|
palo::set_up();
|
|
ret = RUN_ALL_TESTS();
|
|
palo::tear_down();
|
|
|
|
google::protobuf::ShutdownProtobufLibrary();
|
|
return ret;
|
|
}
|