1123 lines
		
	
	
		
			38 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			1123 lines
		
	
	
		
			38 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_);
 | 
						|
  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);
 | 
						|
}
 | 
						|
 | 
						|
}  // namespace test
 | 
						|
 | 
						|
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();
 | 
						|
}
 |