Files
oceanbase/src/sql/engine/aggregate/ob_exec_hash_struct.cpp
wangzelin.wzl 93a1074b0c patch 4.0
2022-10-24 17:57:12 +08:00

110 lines
3.7 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 "ob_exec_hash_struct.h"
#include "common/row/ob_row_store.h"
namespace oceanbase
{
using namespace common;
namespace sql
{
//When there's stored_row_ and reserved_cells_, use store_row's reserved_cells_ for calc hash.
//Other, use row_ for calc hash
uint64_t ObHashCols::inner_hash() const
{
uint64_t result = 99194853094755497L;
if (hash_col_idx_ != NULL) {
int64_t group_col_count = hash_col_idx_->count();
if (stored_row_ != NULL
&& stored_row_->reserved_cells_count_ > 0) {
const ObObj *cells = stored_row_->reserved_cells_;
for (int32_t i = 0; i < group_col_count; ++i) {
if (hash_col_idx_->at(i).index_ < stored_row_->reserved_cells_count_) {
const ObObj &cell = cells[hash_col_idx_->at(i).index_];
result = cell.is_string_type() ?
cell.varchar_murmur_hash(hash_col_idx_->at(i).cs_type_, result) :
cell.hash(result);
}
}
} else if (row_ != NULL && row_->is_valid()) {
const ObObj *cells = row_->cells_;
const int32_t *projector = row_->projector_;
for (int64_t i = 0; i < group_col_count; ++i) {
int64_t real_index = row_->projector_size_ > 0 ?
projector[hash_col_idx_->at(i).index_] : hash_col_idx_->at(i).index_;
const ObObj &cell = cells[real_index];
result = cell.is_string_type() ?
cell.varchar_murmur_hash(hash_col_idx_->at(i).cs_type_, result) :
cell.hash(result);
}
}
}
return result;
}
//When there is stored_row_ reserved_cells, use stored_row_'s reserved_cells_ for calc equal.
//Other use row_.
bool ObHashCols::operator ==(const ObHashCols &other) const
{
bool result = true;
const ObObj *lcell = NULL;
const ObObj *rcell = NULL;
if (OB_ISNULL(hash_col_idx_)) {
result = false;
} else {
int64_t group_col_count = hash_col_idx_->count();
//当group_col_count<=0是hash group by const的情况,应该认为是一个分组,所以result要初始化为true
for (int32_t i = 0; i < group_col_count && result; ++i) {
int64_t group_idx = hash_col_idx_->at(i).index_;
if (stored_row_ != NULL) {
if (group_idx < stored_row_->reserved_cells_count_) {
lcell = &stored_row_->reserved_cells_[group_idx];
}
} else if (row_ != NULL) {
if (row_->is_valid()) {
int64_t real_idx = row_->projector_size_ > 0 ? row_->projector_[group_idx] : group_idx;
lcell = &row_->cells_[real_idx];
}
}
if (other.stored_row_ != NULL) {
if (group_idx < other.stored_row_->reserved_cells_count_) {
rcell = &other.stored_row_->reserved_cells_[group_idx];
}
} else if (other.row_ != NULL) {
if (other.row_->is_valid()) {
int64_t real_idx = other.row_->projector_size_ > 0 ? other.row_->projector_[group_idx] : group_idx;
rcell = &other.row_->cells_[real_idx];
}
}
if (NULL == lcell || NULL == rcell) {
result = false;
} else {
result = lcell->is_equal(*rcell, hash_col_idx_->at(i).cs_type_);
}
}
}
return result;
}
void ObHashCols::set_stored_row(const ObRowStore::StoredRow *stored_row)
{
stored_row_ = stored_row;
row_ = NULL;
}
}//ns sql
}//ns oceanbase