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()); }
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); }
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; }
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()); }
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; }