コード例 #1
0
TEST(get_next_param, orderby)
{
  ObStringBuf buf;
  ObScanParam scan_param; 
  ObRange q_range;
  ObScanner prev_result; 
  int64_t prev_limit_offset = 0;
  ObRange prev_tablet_range;

  ObRange cur_range;
  int64_t cur_limit_offset = 0;

  uint64_t table_id = 1001;

  /// last tablet and full fill
  q_range.border_flag_.set_max_value();
  q_range.border_flag_.set_min_value();
  EXPECT_EQ(scan_param.set(table_id, ObString(),q_range), OB_SUCCESS);
  //scan_param.set_scan_direction(ObScanParam::BACKWARD);
  prev_tablet_range.border_flag_.set_max_value();
  prev_tablet_range.border_flag_.set_min_value();
  EXPECT_EQ(scan_param.add_orderby_column(0),OB_SUCCESS);

  const char *c_ptr = "9";
  ObString str;
  ObCellInfo cell;
  str.assign((char*)c_ptr, static_cast<int32_t>(strlen(c_ptr)));
  EXPECT_EQ(buf.write_string(str, &cell.row_key_),OB_SUCCESS);
  EXPECT_EQ(prev_result.add_cell(cell),OB_SUCCESS);
  EXPECT_EQ(prev_result.set_is_req_fullfilled(false,1), OB_SUCCESS);
  EXPECT_EQ(prev_result.set_range(prev_tablet_range), OB_SUCCESS);

  EXPECT_EQ(get_next_range(scan_param, prev_result,prev_limit_offset,cur_range,cur_limit_offset,buf), OB_SUCCESS);
  EXPECT_EQ(cur_limit_offset, 1);
  EXPECT_TRUE(cur_range.border_flag_.is_min_value());
  EXPECT_TRUE(cur_range.border_flag_.is_max_value()); 
}
コード例 #2
0
TEST(ObGroupByParam, row_change)
{
  ObGroupByParam param;
  ObGroupByOperator groupby_operator;
  int64_t groupby_idx =  0;
  int64_t agg_idx = 1;
  ObAggregateFuncType agg_func = SUM;
  EXPECT_EQ(param.add_groupby_column(groupby_idx), OB_SUCCESS);
  EXPECT_EQ(param.add_aggregate_column(agg_idx, agg_func),OB_SUCCESS);
  ObStringBuf buffer;
  ObString str;
  const char *c_str = NULL;
  ObRowkey rowkey;
  ObCellInfo org_cell_info;
  ObCellArray org_cells;
  ObInnerCellInfo  *cell_out;
  ObString table_name;
  c_str = "table";
  str.assign((char*)c_str, static_cast<int32_t>(strlen(c_str)));
  EXPECT_EQ(buffer.write_string(str,&(table_name)), OB_SUCCESS);
  org_cell_info.table_name_ = table_name;

  c_str = "abc";
  rowkey = make_rowkey(c_str, &allocator_);
  EXPECT_EQ(buffer.write_string(rowkey,&(org_cell_info.row_key_)), OB_SUCCESS);

  int groupby_one_val = 1;
  org_cell_info.value_.set_int(groupby_one_val);
  EXPECT_EQ(org_cells.append(org_cell_info, cell_out),OB_SUCCESS);
  EXPECT_EQ(org_cells.append(org_cell_info, cell_out),OB_SUCCESS);

  int groupby_two_val = 2;
  c_str = "def";
  rowkey = make_rowkey(c_str, &allocator_);
  EXPECT_EQ(buffer.write_string(rowkey,&(org_cell_info.row_key_)), OB_SUCCESS);
  org_cell_info.value_.set_int(groupby_two_val);
  EXPECT_EQ(org_cells.append(org_cell_info, cell_out),OB_SUCCESS);
  EXPECT_EQ(org_cells.append(org_cell_info, cell_out),OB_SUCCESS);

  EXPECT_EQ(groupby_operator.init(param,1024*1024*10), OB_SUCCESS);
  EXPECT_EQ(groupby_operator.add_row(org_cells,0,1), OB_SUCCESS);
  EXPECT_EQ(groupby_operator.add_row(org_cells, 2,3), OB_SUCCESS);

  EXPECT_EQ(groupby_operator.get_cell_size(), 4);

  bool is_row_changed = false;
  EXPECT_EQ(groupby_operator.next_cell(), OB_SUCCESS);
  EXPECT_EQ(groupby_operator.get_cell(&cell_out, &is_row_changed), OB_SUCCESS);
  EXPECT_TRUE(is_row_changed);

  EXPECT_EQ(groupby_operator.next_cell(), OB_SUCCESS);
  EXPECT_EQ(groupby_operator.get_cell(&cell_out, &is_row_changed), OB_SUCCESS);
  EXPECT_FALSE(is_row_changed);

  EXPECT_EQ(groupby_operator.next_cell(), OB_SUCCESS);
  EXPECT_EQ(groupby_operator.get_cell(&cell_out, &is_row_changed), OB_SUCCESS);
  EXPECT_TRUE(is_row_changed);

  EXPECT_EQ(groupby_operator.next_cell(), OB_SUCCESS);
  EXPECT_EQ(groupby_operator.get_cell(&cell_out, &is_row_changed), OB_SUCCESS);
  EXPECT_FALSE(is_row_changed);

  EXPECT_EQ(groupby_operator.next_cell(), OB_ITER_END);
}
コード例 #3
0
TEST(ObSortedOperator, forward)
{
  const int32_t sharding_count = 5;
  const int32_t cell_count_each_sharding = 2;
  ObScanner *sharding_res_arr = new ObScanner[sharding_count];
  ObNewRange   *q_range_arr = new ObNewRange[sharding_count];
  ObStringBuf buf;
  char row_key_buf[32];
  int32_t row_key_len = 0;
  ObRowkey str;
  ObRowkey row_key;
  ObCellInfo cell;
  cell.table_id_ = 1;
  cell.column_id_ = 1;
  ObScanParam scan_param;
  EXPECT_EQ(scan_param.add_column(1),OB_SUCCESS);
  row_key_len = snprintf(row_key_buf, sizeof(row_key_buf),"%d",0);
  str = make_rowkey(row_key_buf,row_key_len, &allocator_);
  EXPECT_EQ(buf.write_string(str,&row_key),OB_SUCCESS);
  ObNewRange q_range;
  q_range.start_key_ = row_key;
  q_range.border_flag_.set_inclusive_start();
  q_range.end_key_.set_max_row();
  ObScanParam param;
  ObString table_name;
  EXPECT_EQ(param.set(1,table_name, q_range), OB_SUCCESS);

  ObMergerSortedOperator s_operator;
  EXPECT_EQ(s_operator.set_param(param), OB_SUCCESS);
  for (int32_t i = sharding_count * cell_count_each_sharding - 1; i >= 0; i -= 2)
  {
    int sharding_idx = (i-1)/2;
    /// prepare range
    if (i > 1)
    {
      row_key_len = snprintf(row_key_buf, sizeof(row_key_buf),"%d",i - 2);
    }
    else
    {
      row_key_len = snprintf(row_key_buf, sizeof(row_key_buf),"%d",0);
    }
    str = make_rowkey(row_key_buf,row_key_len, &allocator_);
    EXPECT_EQ(buf.write_string(str,&row_key),OB_SUCCESS);
    q_range_arr[sharding_idx].start_key_ = row_key;
    if (i > 1)
    {
      q_range_arr[sharding_idx].border_flag_.unset_inclusive_start();
    }
    else
    {
      q_range_arr[sharding_idx].border_flag_.set_inclusive_start();
    }
    q_range_arr[sharding_idx].border_flag_.set_max_value();

    /// first cell
    row_key_len = snprintf(row_key_buf, sizeof(row_key_buf),"%d",i - 1);
    str = make_rowkey(row_key_buf,row_key_len, &allocator_);
    EXPECT_EQ(buf.write_string(str,&row_key),OB_SUCCESS);
    cell.row_key_ = row_key;
    cell.value_.set_int(i - 1);
    EXPECT_EQ(sharding_res_arr[sharding_idx].add_cell(cell), OB_SUCCESS);

    /// second cell
    row_key_len = snprintf(row_key_buf, sizeof(row_key_buf),"%d",i);
    str = make_rowkey(row_key_buf,row_key_len, &allocator_);
    EXPECT_EQ(buf.write_string(str,&row_key),OB_SUCCESS);
    cell.row_key_ = row_key;
    cell.value_.set_int(i - 1);
    EXPECT_EQ(sharding_res_arr[sharding_idx].add_cell(cell), OB_SUCCESS);

    bool is_finish = true;
    EXPECT_EQ(s_operator.add_sharding_result(sharding_res_arr[sharding_idx], q_range_arr[sharding_idx],is_finish),false);
    if (sharding_idx == 0)
    {
      EXPECT_TRUE(is_finish);
    }
    else
    {
      EXPECT_FALSE(is_finish);
    }
  }
  EXPECT_EQ(s_operator.seal(),OB_SUCCESS);
  int32_t beg = 0;
  ObInnerCellInfo *cur_cell = NULL;
  int err = OB_SUCCESS;
  while ((err = s_operator.next_cell()) == OB_SUCCESS)
  {
    EXPECT_EQ(s_operator.get_cell(&cur_cell),OB_SUCCESS);
    row_key_len = snprintf(row_key_buf, sizeof(row_key_buf),"%d",beg);
    str = make_rowkey(row_key_buf,row_key_len, &allocator_);
    EXPECT_TRUE(cur_cell->row_key_ == str);
    beg ++;
  }
  EXPECT_EQ(OB_ITER_END, err);
  EXPECT_EQ(beg, sharding_count * cell_count_each_sharding);
  delete [] sharding_res_arr;
  delete [] q_range_arr;
}
コード例 #4
0
TEST(get_next_param, trivial_scan_backward)
{
  ObStringBuf buf;
  ObScanParam scan_param; 
  ObRange q_range;
  ObScanner prev_result; 
  int64_t prev_limit_offset = 0;
  ObRange prev_tablet_range;

  ObRange cur_range;
  int64_t cur_limit_offset = 0;

  uint64_t table_id = 1001;

  /// last tablet and full fill
  q_range.border_flag_.set_max_value();
  q_range.border_flag_.set_min_value();
  EXPECT_EQ(scan_param.set(table_id, ObString(),q_range), OB_SUCCESS);
  scan_param.set_scan_direction(ObScanParam::BACKWARD);
  prev_tablet_range.border_flag_.set_max_value();
  prev_tablet_range.border_flag_.set_min_value();

  EXPECT_EQ(prev_result.set_range(prev_tablet_range), OB_SUCCESS);
  EXPECT_EQ(prev_result.set_is_req_fullfilled(true,0), OB_SUCCESS);

  EXPECT_EQ(get_next_range(scan_param, prev_result,prev_limit_offset,cur_range,cur_limit_offset,buf), OB_ITER_END);

  /// last tablet but not fullfill
  ObCellInfo cell;
  ObString str;
  const char *c_ptr = "8";
  str.assign((char*)c_ptr, static_cast<int32_t>(strlen(c_ptr)));
  EXPECT_EQ(buf.write_string(str, &cell.row_key_),OB_SUCCESS);
  EXPECT_EQ(prev_result.add_cell(cell),OB_SUCCESS);
  EXPECT_EQ(prev_result.set_is_req_fullfilled(false,1), OB_SUCCESS);
  EXPECT_EQ(get_next_range(scan_param, prev_result,prev_limit_offset,cur_range,cur_limit_offset,buf), OB_SUCCESS);
  EXPECT_EQ(cur_limit_offset, 0);
  EXPECT_TRUE(cur_range.border_flag_.is_min_value());
  EXPECT_FALSE(cur_range.border_flag_.is_max_value());
  EXPECT_TRUE(cur_range.end_key_ == cell.row_key_);
  EXPECT_TRUE(cur_range.border_flag_.is_min_value());
  EXPECT_FALSE(cur_range.border_flag_.inclusive_end());

  /// middle table and full fill
  prev_tablet_range.reset();
  cur_range.reset();
  prev_result.clear();
  prev_tablet_range.start_key_ = cell.row_key_;
  c_ptr = "9";
  str.assign((char*)c_ptr, static_cast<int32_t>(strlen(c_ptr)));
  EXPECT_EQ(buf.write_string(str, &cell.row_key_),OB_SUCCESS);
  EXPECT_EQ(prev_result.add_cell(cell),OB_SUCCESS);
  EXPECT_EQ(prev_result.set_is_req_fullfilled(true,1), OB_SUCCESS);
  EXPECT_EQ(prev_result.set_range(prev_tablet_range), OB_SUCCESS);
  EXPECT_EQ(get_next_range(scan_param, prev_result,prev_limit_offset,cur_range,cur_limit_offset,buf), OB_SUCCESS);
  EXPECT_EQ(cur_limit_offset, 0);
  EXPECT_TRUE(cur_range.border_flag_.is_min_value());
  EXPECT_FALSE(cur_range.border_flag_.is_max_value());
  EXPECT_TRUE(cur_range.end_key_ == prev_tablet_range.start_key_);
  EXPECT_TRUE(cur_range.border_flag_.inclusive_end());

  /// middle table and not full fill
  cur_range.reset();
  prev_result.clear();
  c_ptr = "9";
  str.assign((char*)c_ptr, static_cast<int32_t>(strlen(c_ptr)));
  EXPECT_EQ(buf.write_string(str, &cell.row_key_),OB_SUCCESS);
  EXPECT_EQ(prev_result.add_cell(cell),OB_SUCCESS);
  EXPECT_EQ(prev_result.set_is_req_fullfilled(false,1), OB_SUCCESS);
  EXPECT_EQ(prev_result.set_range(prev_tablet_range), OB_SUCCESS);
  EXPECT_EQ(get_next_range(scan_param, prev_result,prev_limit_offset,cur_range,cur_limit_offset,buf), OB_SUCCESS);
  EXPECT_EQ(cur_limit_offset, 0);
  EXPECT_TRUE(cur_range.border_flag_.is_min_value());
  EXPECT_FALSE(cur_range.border_flag_.is_max_value());
  EXPECT_TRUE(cur_range.end_key_ == cell.row_key_);
  EXPECT_FALSE(cur_range.border_flag_.inclusive_end());
}
コード例 #5
0
        int ObNewRange::trim(const ObNewRange& r, ObStringBuf & string_buf)
        {
          int ret = OB_SUCCESS;
          if(r.table_id_ != table_id_)
          {
            ret = OB_ERROR;
            TBSYS_LOG(WARN, "table id is not equal table_id_[%ld] r.table_id_[%ld]",
                table_id_, r.table_id_);
          }

          if(OB_SUCCESS == ret)
          {
            if( 0 == compare_with_startkey2(r) ) // left interval equal
            {
              if( 0 == compare_with_endkey2(r) ) // both interval equal
              {
                ret = OB_EMPTY_RANGE;
              }
              else
              {
                if( compare_with_endkey2(r) > 0 ) // right interval great
                {
                  if(r.border_flag_.inclusive_end())
                  {
                    border_flag_.unset_inclusive_start();
                  }
                  else
                  {
                    border_flag_.set_inclusive_start();
                  }
                  ret = string_buf.write_string(r.end_key_, &start_key_);
                  if(OB_SUCCESS != ret)
                  {
                    TBSYS_LOG(WARN, "write start key fail:ret[%d]", ret);
                  }
                }
                else
                {
                  ret = OB_ERROR;
                  TBSYS_LOG(WARN, "r should be included by this range");
                }
              }
            }
            else if( 0 == compare_with_endkey2(r) ) // right interval equal
            {
              if( compare_with_startkey2(r) < 0 ) // left interval less
              {
                if(r.border_flag_.inclusive_start())
                {
                  border_flag_.unset_inclusive_end();
                }
                else
                {
                  border_flag_.set_inclusive_end();
                }
                ret = string_buf.write_string(r.start_key_, &end_key_);
                if(OB_SUCCESS != ret)
                {
                  TBSYS_LOG(WARN, "write end key fail:ret[%d]", ret);
                }
              }
              else
              {
                ret = OB_ERROR;

                TBSYS_LOG(WARN, "r should be included by this range");
              }
            }
            else
            {
              ret = OB_ERROR;

              TBSYS_LOG(WARN, "r should be included by this range");
            }
          }

          return ret;
        }