oceanbase/unittest/sql/optimizer/test_skyline_prunning.cpp

1057 lines
41 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.
*/
#include <gtest/gtest.h>
#include <assert.h>
#include "sql/optimizer/ob_skyline_prunning.h"
#include "lib/allocator/page_arena.h"
using namespace oceanbase::sql;
using namespace oceanbase::common;
namespace test
{
class ObSkylinePrunningTest: public ::testing::Test
{
public:
ObSkylinePrunningTest() {}
virtual ~ObSkylinePrunningTest() {}
virtual void SetUp();
virtual void TearDown();
static void to_array(const uint64_t *columns, const int64_t column_cnt, ObIArray<uint64_t> &column_ids);
static void dummy_const_column_info(const int64_t column_cnt, ObIArray<bool> &column_const_info);
template<typename T>
static void check(const T *left,const T *right,
const ObSkylineDim::CompareStat status,
const ObSkylineDim::CompareStat reverse_status);
void check_index_back_dim(const bool left_index_back,
const bool left_has_interesting_order,
const bool left_can_extract_range,
const int64_t left_index_column_cnt,
const uint64_t *left, const int64_t left_cnt,
const bool right_index_back,
const bool right_has_interesting_order,
const bool right_can_extract_range,
const int64_t right_index_column_cnt,
const uint64_t *right, const int64_t right_cnt,
const ObSkylineDim::CompareStat status,
const ObSkylineDim::CompareStat reverse_status);
static void check_interest_dim(const uint64_t *left, const int64_t left_cnt,
const uint64_t *right, const int64_t right_cnt,
const ObSkylineDim::CompareStat status,
const ObSkylineDim::CompareStat reverse_status);
static void check_query_range_dim(const uint64_t *left, const int64_t left_cnt,
const uint64_t *right, const int64_t right_cnt,
const ObSkylineDim::CompareStat status,
const ObSkylineDim::CompareStat reverse_status);
ObIndexSkylineDim *create_skyline_index_dim(
const bool index_back,
const int64_t index_column_cnt,
const uint64_t *filter_ids, const int64_t filter_cnt,
const uint64_t *interest_ids, const int64_t interest_cnt,
const uint64_t *range_ids, const int64_t range_cnt);
protected:
ObArenaAllocator allocator_;
};
void ObSkylinePrunningTest::SetUp()
{
}
void ObSkylinePrunningTest::TearDown()
{
}
void ObSkylinePrunningTest::to_array(const uint64_t *columns,
const int64_t column_cnt,
ObIArray<uint64_t> &column_ids)
{
int ret = OB_SUCCESS;
for (int64_t i = 0; i < column_cnt; ++i) {
ret = column_ids.push_back(columns[i]);
ASSERT_EQ(ret, OB_SUCCESS);
}
}
void ObSkylinePrunningTest::dummy_const_column_info(const int64_t column_cnt,
ObIArray<bool> &column_const_info)
{
int ret = OB_SUCCESS;
for (int64_t i = 0; i < column_cnt; i++) {
ret = column_const_info.push_back(false);
ASSERT_EQ(ret, OB_SUCCESS);
}
}
ObIndexSkylineDim *ObSkylinePrunningTest::create_skyline_index_dim(
const bool index_back,
const int64_t index_column_cnt,
const uint64_t *filter_ids, const int64_t filter_cnt,
const uint64_t *interest_ids, const int64_t interest_cnt,
const uint64_t *range_ids, const int64_t range_cnt)
{
ObIndexSkylineDim *t = NULL;
ObSkylineDimFactory::get_instance().create_skyline_dim<ObIndexSkylineDim>(allocator_, t);
ObArray<uint64_t> filter_array;
to_array(filter_ids, filter_cnt, filter_array);
t->add_index_back_dim(index_back,
interest_cnt > 0,
range_cnt > 0,
index_column_cnt,
filter_array,
allocator_);
ObArray<uint64_t> interest_array;
ObArray<uint64_t> rowkey_array;
ObArray<bool> const_column_info;
to_array(interest_ids, interest_cnt, interest_array);
to_array(range_ids, range_cnt, rowkey_array);
dummy_const_column_info(interest_cnt, const_column_info);
t->add_interesting_order_dim(index_back, range_cnt > 0, filter_array, interest_array, const_column_info, allocator_);
t->add_query_range_dim(rowkey_array, allocator_, false);
return t;
}
template<typename T>
void ObSkylinePrunningTest::check(const T *left,const T *right,
const ObSkylineDim::CompareStat status,
const ObSkylineDim::CompareStat reverse_status)
{
ObSkylineDim::CompareStat tmp_status;
int ret = left->compare(*right, tmp_status);
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(status, tmp_status);
SHARE_SCHEMA_LOG(WARN, "check failed", K(status), K(tmp_status), K(*left), K(*right));
if (status != tmp_status) {
SHARE_SCHEMA_LOG(WARN, "check failed", K(status), K(tmp_status), K(*left), K(*right));
}
ret = right->compare(*left, tmp_status);
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(reverse_status, tmp_status);
SHARE_SCHEMA_LOG(WARN, "check failed", K(reverse_status), K(tmp_status), K(*left), K(*right));
if (reverse_status != tmp_status) {
SHARE_SCHEMA_LOG(WARN, "check failed", K(reverse_status), K(tmp_status), K(*left), K(*right));
}
}
void ObSkylinePrunningTest::check_index_back_dim(const bool left_index_back,
const bool left_has_interesting_order,
const bool left_can_extract_range,
const int64_t left_index_column_cnt,
const uint64_t *left, const int64_t left_cnt,
const bool right_index_back,
const bool right_has_interesting_order,
const bool right_can_extract_range,
const int64_t right_index_column_cnt,
const uint64_t *right, const int64_t right_cnt,
const ObSkylineDim::CompareStat status,
const ObSkylineDim::CompareStat reverse_status)
{
ObIndexBackDim left_dim;
left_dim.set_index_back(left_index_back);
left_dim.set_interesting_order(left_has_interesting_order);
left_dim.set_extract_range(left_can_extract_range);
left_dim.set_index_column_cnt(left_index_column_cnt);
if (left_cnt > 0) {
ObArray<uint64_t> left_ids;
to_array(left, left_cnt, left_ids);
left_dim.add_filter_column_ids(left_ids);
}
ObIndexBackDim right_dim;
right_dim.set_index_back(right_index_back);
right_dim.set_interesting_order(right_has_interesting_order);
right_dim.set_extract_range(right_can_extract_range);
right_dim.set_index_column_cnt(right_index_column_cnt);
if (right_cnt > 0) {
ObArray<uint64_t> right_ids;
to_array(right, right_cnt, right_ids);
right_dim.add_filter_column_ids(right_ids);
}
check(&left_dim, &right_dim, status, reverse_status);
}
void ObSkylinePrunningTest::check_interest_dim(const uint64_t *left, const int64_t left_cnt,
const uint64_t *right, const int64_t right_cnt,
const ObSkylineDim::CompareStat status,
const ObSkylineDim::CompareStat reverse_status)
{
ObArray<uint64_t> left_ids;
ObArray<uint64_t> right_ids;
ObArray<bool> left_const_column_info;
ObArray<bool> right_const_column_info;
to_array(left, left_cnt, left_ids);
to_array(right, right_cnt, right_ids);
dummy_const_column_info(left_cnt, left_const_column_info);
dummy_const_column_info(right_cnt, right_const_column_info);
ObInterestOrderDim left_dim;
if (left_cnt > 0) {
left_dim.set_intereting_order(true);
left_dim.add_interest_prefix_ids(left_ids);
left_dim.add_const_column_info(left_const_column_info);
} else {
left_dim.set_intereting_order(false);
}
ObInterestOrderDim right_dim;
if (right_cnt > 0) {
right_dim.set_intereting_order(true);
right_dim.add_interest_prefix_ids(right_ids);
right_dim.add_const_column_info(right_const_column_info);
} else {
right_dim.set_intereting_order(false);
}
check(&left_dim, &right_dim, status, reverse_status);
}
void ObSkylinePrunningTest::check_query_range_dim(const uint64_t *left, const int64_t left_cnt,
const uint64_t *right, const int64_t right_cnt,
const ObSkylineDim::CompareStat status,
const ObSkylineDim::CompareStat reverse_status)
{
ObArray<uint64_t> left_ids;
ObArray<uint64_t> right_ids;
to_array(left, left_cnt, left_ids);
to_array(right, right_cnt, right_ids);
ObQueryRangeDim left_dim;
if (left_cnt > 0) {
left_dim.add_rowkey_ids(left_ids);
}
ObQueryRangeDim right_dim;
if (right_cnt > 0) {
right_dim.add_rowkey_ids(right_ids);
}
check(&left_dim, &right_dim, status, reverse_status);
}
TEST_F(ObSkylinePrunningTest, basic)
{
int ret = OB_SUCCESS;
ObIndexBackDim *index_dim = NULL;
ret = ObSkylineDimFactory::get_instance()
.create_skyline_dim<ObIndexBackDim>(allocator_, index_dim);
ASSERT_EQ(OB_SUCCESS, ret);
ObQueryRangeDim *range_dim = NULL;
ret = ObSkylineDimFactory::get_instance()
.create_skyline_dim<ObQueryRangeDim>(allocator_, range_dim);
ASSERT_EQ(OB_SUCCESS, ret);
ObInterestOrderDim *interest_dim = NULL;
ret = ObSkylineDimFactory::get_instance()
.create_skyline_dim<ObInterestOrderDim>(allocator_, interest_dim);
ASSERT_EQ(OB_SUCCESS, ret);
ObIndexSkylineDim *index_skyline_dim = NULL;
ret = ObSkylineDimFactory::get_instance()
.create_skyline_dim<ObIndexSkylineDim>(allocator_, index_skyline_dim);
ASSERT_EQ(OB_SUCCESS, ret);
}
TEST_F(ObSkylinePrunningTest, index_dim)
{
{
ObIndexBackDim dim_true;
dim_true.set_index_back(true);
ObIndexBackDim dim_false;
dim_false.set_index_back(false);
ObIndexBackDim dim2_true;
dim2_true.set_index_back(true);
ObIndexBackDim dim2_false;
dim2_false.set_index_back(false);
// check(&dim_true, &dim_false, ObSkylineDim::RIGHT_DOMINATED, ObSkylineDim::LEFT_DOMINATED);
check(&dim_true, &dim2_true, ObSkylineDim::EQUAL, ObSkylineDim::EQUAL);
check(&dim_false, &dim2_false, ObSkylineDim::EQUAL, ObSkylineDim::EQUAL);
}
{
//left (not index back), right (index back)
//left_filter_columns = right_filter_columns
//left_index_column_cnt = right_index_column_cnt
//left dominate right
int64_t left_index_column_cnt = 2;
uint64_t left_filter_columns[] = { 17, 18};
int64_t left_filter_column_cnt = sizeof (left_filter_columns) / sizeof(uint64_t);
int64_t right_index_column_cnt = 2;
uint64_t right_filter_columns[] = {17, 18};
int64_t right_filter_column_cnt = sizeof (right_filter_columns) / sizeof(uint64_t);
check_index_back_dim(false, //index_back
false, //interesting order
false, //query range
left_index_column_cnt,
left_filter_columns,
left_filter_column_cnt,
true, //index_back
false, //interesting order
false, //query range
right_index_column_cnt,
right_filter_columns,
right_filter_column_cnt,
ObSkylineDim::LEFT_DOMINATED,
ObSkylineDim::RIGHT_DOMINATED);
}
{
//left (not index back), right (index back)
//left_filter_columns = right_filter_columns
//but left_index_column_cnt < right_index_column_cnt
//left dominate_right
int64_t left_index_column_cnt = 2;
uint64_t left_filter_columns[] = { 17, 18};
int64_t left_filter_column_cnt = sizeof (left_filter_columns) / sizeof(uint64_t);
int64_t right_index_column_cnt = 5;
uint64_t right_filter_columns[] = {17, 18};
int64_t right_filter_column_cnt = sizeof (right_filter_columns) / sizeof(uint64_t);
check_index_back_dim(false, //index_back
false, //interesting order
false, //query range
left_index_column_cnt,
left_filter_columns,
left_filter_column_cnt,
true, //index_back
false, //interesting order
false, //query range
right_index_column_cnt,
right_filter_columns,
right_filter_column_cnt,
ObSkylineDim::LEFT_DOMINATED,
ObSkylineDim::RIGHT_DOMINATED);
}
{
//left (not index back), right (index back)
//left_filter_columns = right_filter_columns
//but left_index_column_cnt > right_index_column_cnt
//left dominate_right
int64_t left_index_column_cnt = 6;
uint64_t left_filter_columns[] = { 17, 18};
int64_t left_filter_column_cnt = sizeof (left_filter_columns) / sizeof(uint64_t);
int64_t right_index_column_cnt = 4;
uint64_t right_filter_columns[] = {17, 18};
int64_t right_filter_column_cnt = sizeof (right_filter_columns) / sizeof(uint64_t);
check_index_back_dim(false, //index_back
false, //interesting order
false, //query range
left_index_column_cnt,
left_filter_columns,
left_filter_column_cnt,
true, //index_back
false, //interesting order
false, //query range
right_index_column_cnt,
right_filter_columns,
right_filter_column_cnt,
ObSkylineDim::UNCOMPARABLE,
ObSkylineDim::UNCOMPARABLE);
}
{
//left (not index back), right (index back)
//left_filter_columns = right_filter_columns = {}
//but left_index_column_cnt > right_index_column_cnt
//left dominate_right
//right need full index scan, not consider index_column_size
int64_t left_index_column_cnt = 4;
uint64_t left_filter_columns[] = {};
int64_t left_filter_column_cnt = sizeof (left_filter_columns) / sizeof(uint64_t);
int64_t right_index_column_cnt = 2;
uint64_t right_filter_columns[] = {};
int64_t right_filter_column_cnt = sizeof (right_filter_columns) / sizeof(uint64_t);
check_index_back_dim(false, //index_back
false, //interesting order
false, //query range
left_index_column_cnt,
left_filter_columns,
left_filter_column_cnt,
true, //index_back
false, //interesting order
false, //query range
right_index_column_cnt,
right_filter_columns,
right_filter_column_cnt,
ObSkylineDim::LEFT_DOMINATED,
ObSkylineDim::RIGHT_DOMINATED);
}
{
//left (not index back), right (index back)
//left_filter_columns > right_filter_columns
//but left_index_column_cnt = right_index_column_cnt
//left dominate_right
//right need full index scan, not consider index_column_size
int64_t left_index_column_cnt = 2;
uint64_t left_filter_columns[] = {17, 18};
int64_t left_filter_column_cnt = sizeof (left_filter_columns) / sizeof(uint64_t);
int64_t right_index_column_cnt = 2;
uint64_t right_filter_columns[] = {17};
int64_t right_filter_column_cnt = sizeof (right_filter_columns) / sizeof(uint64_t);
check_index_back_dim(false, //index_back
false, //interesting order
false, //query range
left_index_column_cnt,
left_filter_columns,
left_filter_column_cnt,
true, //index_back
false, //interesting order
false, //query range
right_index_column_cnt,
right_filter_columns,
right_filter_column_cnt,
ObSkylineDim::LEFT_DOMINATED,
ObSkylineDim::RIGHT_DOMINATED);
}
{
//left (not index back), right (index back)
//left_filter_columns > right_filter_columns
//but left_index_column_cnt > right_index_column_cnt
int64_t left_index_column_cnt = 4;
uint64_t left_filter_columns[] = {17, 18};
int64_t left_filter_column_cnt = sizeof (left_filter_columns) / sizeof(uint64_t);
int64_t right_index_column_cnt = 2;
uint64_t right_filter_columns[] = {17};
int64_t right_filter_column_cnt = sizeof (right_filter_columns) / sizeof(uint64_t);
check_index_back_dim(false, //index_back
false, //interesting order
false, //query range
left_index_column_cnt,
left_filter_columns,
left_filter_column_cnt,
true, //index_back
false, //interesting order
false, //query range
right_index_column_cnt,
right_filter_columns,
right_filter_column_cnt,
ObSkylineDim::UNCOMPARABLE,
ObSkylineDim::UNCOMPARABLE);
}
{
//left (not index back), right (index back)
//left_filter_columns > right_filter_columns
//but left_index_column_cnt < right_index_column_cnt
int64_t left_index_column_cnt = 2;
uint64_t left_filter_columns[] = {17, 18};
int64_t left_filter_column_cnt = sizeof (left_filter_columns) / sizeof(uint64_t);
int64_t right_index_column_cnt = 5;
uint64_t right_filter_columns[] = {17};
int64_t right_filter_column_cnt = sizeof (right_filter_columns) / sizeof(uint64_t);
check_index_back_dim(false, //index_back
false, //interesting order
false, //query range
left_index_column_cnt,
left_filter_columns,
left_filter_column_cnt,
true, //index_back
false, //interesting order
false, //query range
right_index_column_cnt,
right_filter_columns,
right_filter_column_cnt,
ObSkylineDim::LEFT_DOMINATED,
ObSkylineDim::RIGHT_DOMINATED);
}
{
//left (not index back), right (index back)
//left_filter_columns < right_filter_columns
//not comparable
int64_t left_index_column_cnt = 5;
uint64_t left_filter_columns[] = {17, 18, 19};
int64_t left_filter_column_cnt = sizeof (left_filter_columns) / sizeof(uint64_t);
int64_t right_index_column_cnt = 6;
uint64_t right_filter_columns[] = {17, 18};
int64_t right_filter_column_cnt = sizeof (right_filter_columns) / sizeof(uint64_t);
check_index_back_dim(true, //index_back
false, //interesting order
false, //query range
left_index_column_cnt,
left_filter_columns,
left_filter_column_cnt,
true, //index_back
false, //interesting order
false, //query range
right_index_column_cnt,
right_filter_columns,
right_filter_column_cnt,
ObSkylineDim::EQUAL,
ObSkylineDim::EQUAL);
}
{
//left (not index back), right (index back)
//left_filter_columns < right_filter_columns
//not comparable
int64_t left_index_column_cnt = 5;
uint64_t left_filter_columns[] = {17, 18};
int64_t left_filter_column_cnt = sizeof (left_filter_columns) / sizeof(uint64_t);
int64_t right_index_column_cnt = 6;
uint64_t right_filter_columns[] = {17, 18, 19};
int64_t right_filter_column_cnt = sizeof (right_filter_columns) / sizeof(uint64_t);
check_index_back_dim(true, //index_back
false, //interesting order
false, //query range
left_index_column_cnt,
left_filter_columns,
left_filter_column_cnt,
true, //index_back
false, //interesting order
false, //query range
right_index_column_cnt,
right_filter_columns,
right_filter_column_cnt,
ObSkylineDim::EQUAL,
ObSkylineDim::EQUAL);
}
{
//left (not index back), right (index back)
//left_filter_columns < right_filter_columns
//not comparable
int64_t left_index_column_cnt = 5;
int64_t right_index_column_cnt = 6;
check_index_back_dim(true, //index_back
false, //interesting order
false, //query range
left_index_column_cnt,
NULL,
0,
true, //index_back
false, //interesting order
false, //query range
right_index_column_cnt,
NULL,
0,
ObSkylineDim::EQUAL,
ObSkylineDim::EQUAL);
}
}
TEST_F(ObSkylinePrunningTest, interest_dim)
{
{
uint64_t column_ids[] = {16,17,18};
check_interest_dim(column_ids, sizeof(column_ids)/sizeof(uint64_t),
NULL, 0,
ObSkylineDim::LEFT_DOMINATED, ObSkylineDim::RIGHT_DOMINATED);
}
{
uint64_t column_ids[] = {16,17,18};
uint64_t column_ids2[] = {17, 18, 19};
check_interest_dim(column_ids, sizeof(column_ids)/sizeof(uint64_t),
column_ids2, sizeof(column_ids2)/sizeof(uint64_t),
ObSkylineDim::UNCOMPARABLE, ObSkylineDim::UNCOMPARABLE);
}
{
uint64_t column_ids[] = {16, 20, 23, 55};
uint64_t column_ids2[] = {16, 20, 23, 55};
check_interest_dim(column_ids, sizeof(column_ids)/sizeof(uint64_t),
column_ids2, sizeof(column_ids2)/sizeof(uint64_t),
ObSkylineDim::EQUAL, ObSkylineDim::EQUAL);
}
{
uint64_t column_ids[] = {16, 22, 25};
uint64_t column_ids2[] = {25, 22, 16};
check_interest_dim(column_ids, sizeof(column_ids)/sizeof(uint64_t),
column_ids2, sizeof(column_ids2)/sizeof(uint64_t),
ObSkylineDim::UNCOMPARABLE, ObSkylineDim::UNCOMPARABLE);
}
{
uint64_t column_ids[] = {16, 22, 25};
uint64_t column_ids2[] = {22, 25};
check_interest_dim(column_ids, sizeof(column_ids)/sizeof(uint64_t),
column_ids2, sizeof(column_ids2)/sizeof(uint64_t),
ObSkylineDim::UNCOMPARABLE, ObSkylineDim::UNCOMPARABLE);
}
{
uint64_t column_ids[] = {16, 22, 25};
uint64_t column_ids2[] = {16};
check_interest_dim(column_ids, sizeof(column_ids)/sizeof(uint64_t),
column_ids2, sizeof(column_ids2)/sizeof(uint64_t),
ObSkylineDim::LEFT_DOMINATED, ObSkylineDim::RIGHT_DOMINATED);
}
{
check_interest_dim(NULL, 0, NULL, 0,
ObSkylineDim::EQUAL, ObSkylineDim::EQUAL);
}
}
TEST_F(ObSkylinePrunningTest, query_range_dim)
{
{
uint64_t column_ids[] = {16,17,18};
check_query_range_dim(column_ids, sizeof(column_ids)/sizeof(uint64_t),
NULL, 0,
ObSkylineDim::LEFT_DOMINATED, ObSkylineDim::RIGHT_DOMINATED);
}
{
uint64_t column_ids[] = {16,17,18};
uint64_t column_ids2[] = {17, 18, 19};
check_query_range_dim(column_ids, sizeof(column_ids)/sizeof(uint64_t),
column_ids2, sizeof(column_ids2)/sizeof(uint64_t),
ObSkylineDim::UNCOMPARABLE, ObSkylineDim::UNCOMPARABLE);
}
{
uint64_t column_ids[] = {16, 20, 23, 55};
uint64_t column_ids2[] = {16, 20, 23, 55};
check_query_range_dim(column_ids, sizeof(column_ids)/sizeof(uint64_t),
column_ids2, sizeof(column_ids2)/sizeof(uint64_t),
ObSkylineDim::EQUAL, ObSkylineDim::EQUAL);
}
{
uint64_t column_ids[] = {16, 22, 25};
uint64_t column_ids2[] = {25, 22, 16};
check_query_range_dim(column_ids, sizeof(column_ids)/sizeof(uint64_t),
column_ids2, sizeof(column_ids2)/sizeof(uint64_t),
ObSkylineDim::EQUAL, ObSkylineDim::EQUAL);
}
{
uint64_t column_ids[] = {16, 22, 25};
uint64_t column_ids2[] = {22, 25};
check_query_range_dim(column_ids, sizeof(column_ids)/sizeof(uint64_t),
column_ids2, sizeof(column_ids2)/sizeof(uint64_t),
ObSkylineDim::LEFT_DOMINATED, ObSkylineDim::RIGHT_DOMINATED);
}
{
uint64_t column_ids[] = {16, 22, 25};
uint64_t column_ids2[] = {16};
check_query_range_dim(column_ids, sizeof(column_ids)/sizeof(uint64_t),
column_ids2, sizeof(column_ids2)/sizeof(uint64_t),
ObSkylineDim::LEFT_DOMINATED, ObSkylineDim::RIGHT_DOMINATED);
}
{
check_query_range_dim(NULL, 0, NULL, 0,
ObSkylineDim::EQUAL, ObSkylineDim::EQUAL);
}
}
TEST_F(ObSkylinePrunningTest, key_prefix_compare)
{
{
uint64_t left[] = {15, 16};
bool left_column_const[] = {false, false};
uint64_t right[] = {15, 16, 17, 18, 19};
bool right_column_const[] = {false, false, false, false, false};
KeyPrefixComp comp;
int ret = comp(left, left_column_const, sizeof(left)/sizeof(uint64_t),
right, right_column_const, sizeof(right)/sizeof(uint64_t));
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(comp.get_result(), ObSkylineDim::RIGHT_DOMINATED);
}
{
uint64_t left[] = {15, 17};
bool left_column_const[] = {false, false};
uint64_t right[] = {15, 16, 17, 18, 19};
bool right_column_const[] = {false, false, false, false, false};
KeyPrefixComp comp;
int ret = comp(left, left_column_const, sizeof(left)/sizeof(uint64_t),
right, right_column_const, sizeof(right)/sizeof(uint64_t));
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(comp.get_result(), ObSkylineDim::UNCOMPARABLE);
}
{
uint64_t left[] = {17};
bool left_column_const[] = {false};
uint64_t right[] = {15, 16, 17};
bool right_column_const[] = {false, false, false};
KeyPrefixComp comp;
int ret = comp(left, left_column_const, sizeof(left)/sizeof(uint64_t),
right, right_column_const, sizeof(right)/sizeof(uint64_t));
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(comp.get_result(), ObSkylineDim::UNCOMPARABLE);
}
{
uint64_t left[] = {15, 16, 17};
bool left_column_const[] = {false, false, false};
uint64_t right[] = {15, 16, 17};
bool right_column_const[] = {false, false, false};
KeyPrefixComp comp;
int ret = comp(left, left_column_const, sizeof(left)/sizeof(uint64_t),
right, right_column_const, sizeof(right)/sizeof(uint64_t));
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(comp.get_result(), ObSkylineDim::EQUAL);
}
{
uint64_t left[] = {15, 17};
bool left_column_const[] = {false, false};
uint64_t right[] = {15, 16, 17};
bool right_column_const[] = {false, true, false};
KeyPrefixComp comp;
int ret = comp(left, left_column_const, sizeof(left)/sizeof(uint64_t),
right, right_column_const, sizeof(right)/sizeof(uint64_t));
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(comp.get_result(), ObSkylineDim::RIGHT_DOMINATED);
}
{
uint64_t left[] = {15};
bool left_column_const[] = {false};
uint64_t right[] = {15, 16, 17};
bool right_column_const[] = {false, true, false};
KeyPrefixComp comp;
int ret = comp(left, left_column_const, sizeof(left)/sizeof(uint64_t),
right, right_column_const, sizeof(right)/sizeof(uint64_t));
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(comp.get_result(), ObSkylineDim::RIGHT_DOMINATED);
}
{
uint64_t left[] = {15, 16};
bool left_column_const[] = {false, false};
uint64_t right[] = {15, 16, 17};
bool right_column_const[] = {false, false, true};
KeyPrefixComp comp;
int ret = comp(left, left_column_const, sizeof(left)/sizeof(uint64_t),
right, right_column_const, sizeof(right)/sizeof(uint64_t));
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(comp.get_result(), ObSkylineDim::RIGHT_DOMINATED);
}
{
uint64_t left[] = {15, 16};
bool left_column_const[] = {false, false};
uint64_t right[] = {17, 15, 16};
bool right_column_const[] = {true, true, true};
KeyPrefixComp comp;
int ret = comp(left, left_column_const, sizeof(left)/sizeof(uint64_t),
right, right_column_const, sizeof(right)/sizeof(uint64_t));
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(comp.get_result(), ObSkylineDim::RIGHT_DOMINATED);
}
{
uint64_t left[] = {15, 16};
bool left_column_const[] = {false, false};
uint64_t right[] = {15, 17, 18};
bool right_column_const[] = {true, true, true};
KeyPrefixComp comp;
int ret = comp(left, left_column_const, sizeof(left)/sizeof(uint64_t),
right, right_column_const, sizeof(right)/sizeof(uint64_t));
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(comp.get_result(), ObSkylineDim::UNCOMPARABLE);
}
{
uint64_t left[] = {15, 16};
bool left_column_const[] = {false};
uint64_t right[] = {15, 16};
bool right_column_const[] = {true, true, true};
KeyPrefixComp comp;
int ret = comp(left, left_column_const, sizeof(left)/sizeof(uint64_t),
right, right_column_const, sizeof(right)/sizeof(uint64_t));
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(comp.get_result(), ObSkylineDim::EQUAL);
}
}
TEST_F(ObSkylinePrunningTest, range_subset_compare)
{
{
uint64_t left[] = {16, 18};
uint64_t right[] = {15, 16, 17, 18, 19};
RangeSubsetComp comp;
int ret = comp(left, sizeof(left)/sizeof(uint64_t),
right, sizeof(right)/sizeof(uint64_t));
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(comp.get_result(), ObSkylineDim::RIGHT_DOMINATED);
}
{
uint64_t left2[] = {17, 18, 19};
uint64_t right2[] = {17, 18, 19};
RangeSubsetComp comp2;
int ret = comp2(left2, sizeof(left2)/sizeof(uint64_t),
right2, sizeof(right2)/sizeof(uint64_t));
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(comp2.get_result(), ObSkylineDim::EQUAL);
}
{
uint64_t left2[] = {17, 18, 19};
uint64_t right2[] = {17, 18, 20};
RangeSubsetComp comp2;
int ret = comp2(left2, sizeof(left2)/sizeof(uint64_t),
right2, sizeof(right2)/sizeof(uint64_t));
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(comp2.get_result(), ObSkylineDim::UNCOMPARABLE);
}
{
uint64_t left2[] = {20};
uint64_t right2[] = {17, 18, 20};
RangeSubsetComp comp2;
int ret = comp2(left2, sizeof(left2)/sizeof(uint64_t),
right2, sizeof(right2)/sizeof(uint64_t));
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(comp2.get_result(), ObSkylineDim::RIGHT_DOMINATED);
}
}
TEST_F(ObSkylinePrunningTest, skyline_index_compare)
{
{
uint64_t left_interest_ids[] = {16, 17, 18};
uint64_t left_query_range_ids[] = {10, 20};
uint64_t right_interest_ids[] = {16, 17, 18};
uint64_t right_query_range_ids[] = {20, 10};
ObIndexSkylineDim *dim1 = create_skyline_index_dim(
false, 3 /*index_column_cnt*/, NULL, 0,
left_interest_ids, sizeof(left_interest_ids)/sizeof(uint64_t),
left_query_range_ids, sizeof(left_query_range_ids)/sizeof(uint64_t));
ObIndexSkylineDim *dim2 = create_skyline_index_dim(
false, 3 /*index_column_cnt*/, NULL, 0,
right_interest_ids, sizeof(right_interest_ids)/sizeof(uint64_t),
right_query_range_ids, sizeof(right_query_range_ids)/sizeof(uint64_t));
check(dim1, dim2, ObSkylineDim::EQUAL, ObSkylineDim::EQUAL);
}
{
uint64_t left_interest_ids[] = {16, 17, 18};
uint64_t left_query_range_ids[] = {10};
uint64_t right_interest_ids[] = {16, 17, 18};
uint64_t right_query_range_ids[] = {20};
ObIndexSkylineDim *dim1 = create_skyline_index_dim(
false, 3 /*index_column_cnt*/, NULL, 0,
left_interest_ids, sizeof(left_interest_ids)/sizeof(uint64_t),
left_query_range_ids, sizeof(left_query_range_ids)/sizeof(uint64_t));
ObIndexSkylineDim *dim2 = create_skyline_index_dim(
false, 3 /*index_column_cnt*/, NULL, 0,
right_interest_ids, sizeof(right_interest_ids)/sizeof(uint64_t),
right_query_range_ids, sizeof(right_query_range_ids)/sizeof(uint64_t));
check(dim1, dim2, ObSkylineDim::UNCOMPARABLE, ObSkylineDim::UNCOMPARABLE);
}
{
uint64_t left_interest_ids[] = {16, 17, 20};
uint64_t left_query_range_ids[] = {10, 20, 30};
uint64_t right_interest_ids[] = {16, 17, 20};
uint64_t right_query_range_ids[] = {30};
ObIndexSkylineDim *dim1 = create_skyline_index_dim(
false, 3/*index_column_cnt*/, NULL, 0,
left_interest_ids, sizeof(left_interest_ids)/sizeof(uint64_t),
left_query_range_ids, sizeof(left_query_range_ids)/sizeof(uint64_t));
ObIndexSkylineDim *dim2 = create_skyline_index_dim(
false, 3/*index_column_cnt*/, NULL, 0,
right_interest_ids, sizeof(right_interest_ids)/sizeof(uint64_t),
right_query_range_ids, sizeof(right_query_range_ids)/sizeof(uint64_t));
check(dim1, dim2, ObSkylineDim::LEFT_DOMINATED, ObSkylineDim::RIGHT_DOMINATED);
}
{
ObIndexSkylineDim *dim1 = create_skyline_index_dim(
true, 4/*index_column_cnt*/, NULL, 0,
NULL, 0, NULL, 0);
ObIndexSkylineDim *dim2 = create_skyline_index_dim(
true, 4/*index_column_cnt*/, NULL, 0,
NULL, 0, NULL, 0);
check(dim1, dim2, ObSkylineDim::EQUAL, ObSkylineDim::EQUAL);
}
{
uint64_t left_interest_ids[] = {16, 17, 20};
ObIndexSkylineDim *dim1 = create_skyline_index_dim(
false, 4/*index_column_cnt*/, NULL, 0,
left_interest_ids, sizeof(left_interest_ids)/sizeof(uint64_t),
NULL, 0);
ObIndexSkylineDim *dim2 = create_skyline_index_dim(
false, 4/*index_column_cnt*/, NULL, 0,
NULL, 0, NULL, 0);
check(dim1, dim2, ObSkylineDim::LEFT_DOMINATED, ObSkylineDim::RIGHT_DOMINATED);
}
{
uint64_t left_query_range_ids[] = {20, 10, 11};
ObIndexSkylineDim *dim1 = create_skyline_index_dim(
false, 4/*index_column_cnt*/, NULL, 0,
NULL, 0,
left_query_range_ids, sizeof(left_query_range_ids)/sizeof(uint64_t));
ObIndexSkylineDim *dim2 = create_skyline_index_dim(
false, 4/*index_column_cnt*/, NULL, 0,
NULL, 0, NULL, 0);
check(dim1, dim2, ObSkylineDim::LEFT_DOMINATED, ObSkylineDim::RIGHT_DOMINATED);
}
}
TEST_F(ObSkylinePrunningTest, has_dominate_index)
{
ObSkylineDimRecorder recorder;
uint64_t interest_ids[] = {16, 17};
uint64_t range_ids[] = {10, 20};
ObIndexSkylineDim *dim = create_skyline_index_dim(
false, 4/*index_column_cnt*/, NULL, 0,
interest_ids, sizeof(interest_ids)/sizeof(uint64_t),
range_ids, sizeof(range_ids)/sizeof(uint64_t));
uint64_t interest_ids_1[] = {16, 18};
uint64_t range_ids_1[] = {20, 10};
ObIndexSkylineDim *dim1 = create_skyline_index_dim(
false, 2/*index_column_cnt*/, NULL, 0,
interest_ids_1, sizeof(interest_ids_1)/sizeof(uint64_t),
range_ids_1, sizeof(range_ids_1)/sizeof(uint64_t));
uint64_t interest_ids_2[] = {16};
uint64_t range_ids_2[] = {10};
ObIndexSkylineDim *dim2 = create_skyline_index_dim(
false, 1/*index_column_cnt*/, NULL, 0,
interest_ids_2, sizeof(interest_ids_2)/sizeof(uint64_t),
range_ids_2, sizeof(range_ids_2)/sizeof(uint64_t));
bool has_add = false;
ObArray<int64_t> remove_idxs;
bool need_add = true;
int ret = recorder.has_dominate_dim(*dim, remove_idxs, need_add);
ASSERT_EQ(need_add ,true);
ASSERT_EQ(remove_idxs.count(), 0);
ret = recorder.add_index_dim(*dim, has_add);
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(true, has_add);
remove_idxs.reset();
ret = recorder.has_dominate_dim(*dim1, remove_idxs, need_add);
ASSERT_EQ(need_add ,true);
ASSERT_EQ(remove_idxs.count(), 0);
ret = recorder.add_index_dim(*dim1, has_add);
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(true, has_add);
ASSERT_EQ(recorder.get_dim_count(), 2);
remove_idxs.reset();
ret = recorder.has_dominate_dim(*dim2, remove_idxs, need_add);
ASSERT_EQ(need_add ,false);
ASSERT_EQ(remove_idxs.count(), 0);
ret = recorder.add_index_dim(*dim2, has_add);
ASSERT_EQ(false, has_add);
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(recorder.get_dim_count(), 2);
uint64_t interest_ids_3[] = {16, 17, 18};
uint64_t range_ids_3[] = {10, 20, 30};
ObIndexSkylineDim *dim3 = create_skyline_index_dim(
false, 3 /*index_column_cnt*/, NULL, 0,
interest_ids_3, sizeof(interest_ids_3)/sizeof(uint64_t),
range_ids_3, sizeof(range_ids_3)/sizeof(uint64_t));
ret = recorder.has_dominate_dim(*dim3, remove_idxs, need_add);
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(need_add, true);
ASSERT_EQ(remove_idxs.count(), 1);
ASSERT_EQ(remove_idxs.at(0), 0);
ret = recorder.add_index_dim(*dim3, has_add);
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(true, has_add);
ASSERT_EQ(recorder.get_dim_count(), 2);
//unprunning index
ObIndexSkylineDim *dim2_unprunning = create_skyline_index_dim(
false, 1/*index_column_cnt*/, NULL, 0,
interest_ids_2, sizeof(interest_ids_2)/sizeof(uint64_t),
range_ids_2, sizeof(range_ids_2)/sizeof(uint64_t));
dim2_unprunning->set_can_prunning(false); //can't prunning
remove_idxs.reset();
ret = recorder.has_dominate_dim(*dim2_unprunning, remove_idxs, need_add);
ASSERT_EQ(need_add ,false);
ASSERT_EQ(remove_idxs.count(), 0);
ret = recorder.add_index_dim(*dim2_unprunning, has_add);
ASSERT_EQ(true, has_add);
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_EQ(recorder.get_dim_count(), 3);
//check, can add again
uint64_t interest_ids_4[] = {20, 21, 22};
uint64_t range_ids_4[] = {19, 20};
ObIndexSkylineDim *dim4 = create_skyline_index_dim(
false, 4/*index_column_cnt*/, NULL, 0, //index back
interest_ids_4, sizeof(interest_ids_4)/sizeof(uint64_t),
range_ids_4, sizeof(range_ids_4)/sizeof(uint64_t));
remove_idxs.reset();
need_add = false;
has_add = false;
dim4->set_can_prunning(false);//can't prunning
recorder.has_dominate_dim(*dim4, remove_idxs, need_add);
ASSERT_EQ(need_add, true);
ret = recorder.add_index_dim(*dim4, has_add);
ASSERT_EQ(has_add, true);
uint64_t interest_ids_5[] = {20, 21};
uint64_t range_ids_5[] = {19};
ObIndexSkylineDim *dim5 = create_skyline_index_dim(
false, //index back
2/*index_column_cnt*/, NULL, 0, //filter_ids,
interest_ids_5, sizeof(interest_ids_5)/sizeof(uint64_t),
range_ids_5, sizeof(range_ids_5)/sizeof(uint64_t));
remove_idxs.reset();
need_add = false;
recorder.has_dominate_dim(*dim5, remove_idxs, need_add);
ASSERT_EQ(need_add, true);
}
}
int main(int argc, char **argv)
{
system("rm -rf test_skyline_prunning.log");
if(argc >= 2)
{
if (strcmp("DEBUG", argv[1]) == 0
|| strcmp("WARN", argv[1]) == 0)
OB_LOGGER.set_log_level(argv[1]);
}
OB_LOGGER.set_file_name("test_skyline_prunning.log", true);
oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
::testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
}