Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion be/src/core/column/column.h
Original file line number Diff line number Diff line change
Expand Up @@ -452,7 +452,8 @@ class IColumn : public COW<IColumn> {
* // nullable -> predict_column
* // string (dictionary) -> column_dictionary
*/
virtual Status filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) {
virtual Status filter_by_selector(const uint16_t* sel, size_t sel_size,
IColumn* col_ptr) const {
throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR,
"Method filter_by_selector is not supported for {}, only "
"column_nullable, column_dictionary and predict_column support",
Expand Down
3 changes: 2 additions & 1 deletion be/src/core/column/column_decimal.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,8 @@ class ColumnDecimal final : public COWHelper<IColumn, ColumnDecimal<T>> {
memset(data.data() + old_size, 0, length * sizeof(data[0]));
}

Status filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) override {
Status filter_by_selector(const uint16_t* sel, size_t sel_size,
IColumn* col_ptr) const override {
Self* output = assert_cast<Self*>(col_ptr);
auto& res_data = output->get_data();
DCHECK(res_data.empty())
Expand Down
17 changes: 10 additions & 7 deletions be/src/core/column/column_dictionary.h
Original file line number Diff line number Diff line change
Expand Up @@ -152,19 +152,23 @@ class ColumnDictI32 final : public COWHelper<IColumn, ColumnDictI32> {
"permute not supported in ColumnDictionary");
}

Status filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) override {
Status filter_by_selector(const uint16_t* sel, size_t sel_size,
IColumn* col_ptr) const override {
auto* res_col = assert_cast<ColumnString*>(col_ptr);
_strings.resize(sel_size);
if (sel_size == 0) {
return Status::OK();
}
std::vector<StringRef> strings(sel_size);
size_t length = 0;
for (size_t i = 0; i != sel_size; ++i) {
auto& value = _dict.get_value(_codes[sel[i]]);
_strings[i].data = value.data;
_strings[i].size = value.size;
const auto& value = _dict.get_value(_codes[sel[i]]);
strings[i].data = value.data;
strings[i].size = value.size;
length += value.size;
}
res_col->get_offsets().reserve(sel_size + res_col->get_offsets().size());
res_col->get_chars().reserve(length + res_col->get_chars().size());
res_col->insert_many_strings_without_reserve(_strings.data(), sel_size);
res_col->insert_many_strings_without_reserve(strings.data(), sel_size);
return Status::OK();
}

Expand Down Expand Up @@ -454,7 +458,6 @@ class ColumnDictI32 final : public COWHelper<IColumn, ColumnDictI32> {
Dictionary _dict;
Container _codes;
std::pair<RowsetId, uint32_t> _rowset_segment_id;
std::vector<StringRef> _strings;
};

} // namespace doris
10 changes: 4 additions & 6 deletions be/src/core/column/column_nullable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -450,17 +450,15 @@ size_t ColumnNullable::filter(const Filter& filter) {
return data_result_size;
}

Status ColumnNullable::filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) {
Status ColumnNullable::filter_by_selector(const uint16_t* sel, size_t sel_size,
IColumn* col_ptr) const {
auto* nullable_col_ptr = assert_cast<ColumnNullable*>(col_ptr);
// Access the nested column via const path to avoid assert_mutable_ref (which requires
// exclusive ownership). The output col_ptr was just created, so its nested column is exclusive.
auto nest_col_raw = const_cast<IColumn*>(
static_cast<const IColumn::WrappedPtr&>(nullable_col_ptr->_nested_column).get());
auto nested_column = nullable_col_ptr->get_nested_column_ptr();

/// `get_null_map_data` will set `_need_update_has_null` to true
auto& res_nullmap = nullable_col_ptr->get_null_map_data();

RETURN_IF_ERROR(get_nested_column().filter_by_selector(sel, sel_size, nest_col_raw));
RETURN_IF_ERROR(get_nested_column().filter_by_selector(sel, sel_size, nested_column.get()));
DCHECK(res_nullmap.empty());
res_nullmap.resize(sel_size);
auto& cur_nullmap = get_null_map_column().get_data();
Expand Down
3 changes: 2 additions & 1 deletion be/src/core/column/column_nullable.h
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,8 @@ class ColumnNullable final : public COWHelper<IColumn, ColumnNullable> {

size_t filter(const Filter& filter) override;

Status filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) override;
Status filter_by_selector(const uint16_t* sel, size_t sel_size,
IColumn* col_ptr) const override;
MutableColumnPtr permute(const Permutation& perm, size_t limit) const override;
// ColumnPtr index(const IColumn & indexes, size_t limit) const override;
int compare_at(size_t n, size_t m, const IColumn& rhs_, int null_direction_hint) const override;
Expand Down
3 changes: 2 additions & 1 deletion be/src/core/column/column_string.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,8 @@ size_t ColumnStr<T>::filter(const IColumn::Filter& filter) {
}

template <typename T>
Status ColumnStr<T>::filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) {
Status ColumnStr<T>::filter_by_selector(const uint16_t* sel, size_t sel_size,
IColumn* col_ptr) const {
if constexpr (std::is_same_v<UInt32, T>) {
auto* col = static_cast<ColumnStr<T>*>(col_ptr);
Chars& res_chars = col->chars;
Expand Down
3 changes: 2 additions & 1 deletion be/src/core/column/column_string.h
Original file line number Diff line number Diff line change
Expand Up @@ -502,7 +502,8 @@ class ColumnStr final : public COWHelper<IColumn, ColumnStr<T>> {
ColumnPtr filter(const IColumn::Filter& filt, ssize_t result_size_hint) const override;
size_t filter(const IColumn::Filter& filter) override;

Status filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) override;
Status filter_by_selector(const uint16_t* sel, size_t sel_size,
IColumn* col_ptr) const override;

MutableColumnPtr permute(const IColumn::Permutation& perm, size_t limit) const override;

Expand Down
3 changes: 2 additions & 1 deletion be/src/core/column/column_vector.h
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,8 @@ class ColumnVector final : public COWHelper<IColumn, ColumnVector<T>> {

void insert_value(const value_type value) { data.push_back(value); }

Status filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) override {
Status filter_by_selector(const uint16_t* sel, size_t sel_size,
IColumn* col_ptr) const override {
Self* output = assert_cast<Self*>(col_ptr);
auto& res_data = output->get_data();
DCHECK(res_data.empty())
Expand Down
12 changes: 6 additions & 6 deletions be/test/core/column/column_dictionary_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -248,8 +248,9 @@ TEST_F(ColumnDictionaryTest, permute) {
}
TEST_F(ColumnDictionaryTest, filter_by_selector) {
auto test_func = [&](const auto& source_column) {
auto src_size = source_column->size();
const auto& codes_data = source_column->get_data();
const auto& source = *source_column;
auto src_size = source.size();
const auto& codes_data = source.get_data();
EXPECT_TRUE(src_size <= UINT16_MAX);

auto target_column = ColumnString::create();
Expand All @@ -262,13 +263,12 @@ TEST_F(ColumnDictionaryTest, filter_by_selector) {
size_t sel_size = src_size / 2;
indices.resize(sel_size);

auto status =
source_column->filter_by_selector(indices.data(), sel_size, target_column.get());
auto status = source.filter_by_selector(indices.data(), sel_size, target_column.get());
EXPECT_TRUE(status.ok());
EXPECT_EQ(target_column->size(), sel_size);
for (size_t i = 0; i != sel_size; ++i) {
auto real_data = target_column->get_data_at(i);
auto expect_data = source_column->get_value(codes_data[indices[i]]);
auto expect_data = source.get_value(codes_data[indices[i]]);
if (real_data != expect_data) {
std::cout << "index: " << i << ", real_data: " << real_data.to_string()
<< "\nexpect_data: " << expect_data.to_string() << std::endl;
Expand Down Expand Up @@ -364,4 +364,4 @@ std::vector<StringRef> ColumnDictionaryTest::dict_array;
ColumnDictI32::MutablePtr ColumnDictionaryTest::column_dict_char;
ColumnDictI32::MutablePtr ColumnDictionaryTest::column_dict_varchar;
ColumnDictI32::MutablePtr ColumnDictionaryTest::column_dict_str;
} // namespace doris
} // namespace doris
3 changes: 2 additions & 1 deletion be/test/core/column/column_nullable_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,8 @@ TEST(ColumnNullableTest, PredicateTest) {
EXPECT_FALSE(null_dst->has_null());

uint16_t selector[] = {5, 8}; // both null
EXPECT_EQ(nullable_pred->filter_by_selector(selector, 2, null_dst.get()), Status::OK());
const IColumn& nullable_src = *nullable_pred;
EXPECT_EQ(nullable_src.filter_by_selector(selector, 2, null_dst.get()), Status::OK());
// filter_by_selector must announce to update has_null to make below right.
EXPECT_TRUE(null_dst->has_null());
}
Expand Down
4 changes: 2 additions & 2 deletions be/test/core/column/column_string_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -978,8 +978,8 @@ TEST_F(ColumnStringTest, filter_by_selector) {
}
std::cout << std::endl;

auto status =
source_column->filter_by_selector(indices.data(), sel_size, target_column.get());
const auto& source = *source_column;
auto status = source.filter_by_selector(indices.data(), sel_size, target_column.get());
EXPECT_TRUE(status.ok());
EXPECT_EQ(target_column->size(), sel_size);
for (size_t i = 0; i != sel_size; ++i) {
Expand Down
Loading