// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. #include "vec/columns/column_object.h" #include #include #include #include "vec/columns/common_column_test.h" namespace doris::vectorized { class ColumnObjectTest : public ::testing::Test {}; auto construct_dst_varint_column() { // 1. create an empty variant column vectorized::ColumnObject::Subcolumns dynamic_subcolumns; dynamic_subcolumns.create_root(vectorized::ColumnObject::Subcolumn(0, true, true /*root*/)); dynamic_subcolumns.add(vectorized::PathInData("v.f"), vectorized::ColumnObject::Subcolumn {0, true}); dynamic_subcolumns.add(vectorized::PathInData("v.e"), vectorized::ColumnObject::Subcolumn {0, true}); dynamic_subcolumns.add(vectorized::PathInData("v.b"), vectorized::ColumnObject::Subcolumn {0, true}); dynamic_subcolumns.add(vectorized::PathInData("v.b.d"), vectorized::ColumnObject::Subcolumn {0, true}); dynamic_subcolumns.add(vectorized::PathInData("v.c.d"), vectorized::ColumnObject::Subcolumn {0, true}); return ColumnObject::create(std::move(dynamic_subcolumns), true); } TEST_F(ColumnObjectTest, permute) { auto column_variant = construct_dst_varint_column(); { // test empty column and limit == 0 IColumn::Permutation permutation(0); auto col = column_variant->clone_empty(); col->permute(permutation, 0); EXPECT_EQ(col->size(), 0); } MutableColumns columns; columns.push_back(column_variant->get_ptr()); assert_column_vector_permute(columns, 0); assert_column_vector_permute(columns, 1); assert_column_vector_permute(columns, column_variant->size()); assert_column_vector_permute(columns, UINT64_MAX); } // TEST TEST_F(ColumnObjectTest, test_pop_back) { ColumnObject::Subcolumn subcolumn(0, true /* is_nullable */, false /* is_root */); Field field_int(123); Field field_string("hello"); subcolumn.insert(field_int); subcolumn.insert(field_string); subcolumn.pop_back(1); EXPECT_EQ(subcolumn.size(), 1); EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nullable(Int8)"); subcolumn.pop_back(1); EXPECT_EQ(subcolumn.size(), 0); EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nothing"); } TEST_F(ColumnObjectTest, test_pop_back_multiple_types) { ColumnObject::Subcolumn subcolumn(0, true /* is_nullable */, false /* is_root */); Field field_int8(42); subcolumn.insert(field_int8); EXPECT_EQ(subcolumn.size(), 1); EXPECT_EQ(subcolumn.data_types.size(), 1); EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int8)"); EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nullable(Int8)"); Field field_int16(12345); subcolumn.insert(field_int16); EXPECT_EQ(subcolumn.size(), 2); EXPECT_EQ(subcolumn.data_types.size(), 2); EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int8)"); EXPECT_EQ(subcolumn.data_types[1]->get_name(), "Nullable(Int16)"); EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nullable(Int16)"); Field field_int32(1234567); subcolumn.insert(field_int32); EXPECT_EQ(subcolumn.size(), 3); EXPECT_EQ(subcolumn.data_types.size(), 3); EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int8)"); EXPECT_EQ(subcolumn.data_types[1]->get_name(), "Nullable(Int16)"); EXPECT_EQ(subcolumn.data_types[2]->get_name(), "Nullable(Int32)"); EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nullable(Int32)"); subcolumn.pop_back(1); EXPECT_EQ(subcolumn.size(), 2); EXPECT_EQ(subcolumn.data_types.size(), 2); EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int8)"); EXPECT_EQ(subcolumn.data_types[1]->get_name(), "Nullable(Int16)"); EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nullable(Int16)"); subcolumn.pop_back(1); EXPECT_EQ(subcolumn.size(), 1); EXPECT_EQ(subcolumn.data_types.size(), 1); EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int8)"); EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nullable(Int8)"); subcolumn.pop_back(1); EXPECT_EQ(subcolumn.size(), 0); EXPECT_EQ(subcolumn.data_types.size(), 0); EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nothing"); subcolumn.insert(field_int32); EXPECT_EQ(subcolumn.size(), 1); EXPECT_EQ(subcolumn.data_types.size(), 1); EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int32)"); EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nullable(Int32)"); subcolumn.insert(field_int16); EXPECT_EQ(subcolumn.size(), 2); EXPECT_EQ(subcolumn.data_types.size(), 1); EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int32)"); EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nullable(Int32)"); subcolumn.insert(field_int8); EXPECT_EQ(subcolumn.size(), 3); EXPECT_EQ(subcolumn.data_types.size(), 1); EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int32)"); EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nullable(Int32)"); subcolumn.pop_back(1); EXPECT_EQ(subcolumn.size(), 2); EXPECT_EQ(subcolumn.data_types.size(), 1); EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int32)"); EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nullable(Int32)"); Field field_string("hello"); subcolumn.insert(field_string); EXPECT_EQ(subcolumn.size(), 3); EXPECT_EQ(subcolumn.data_types.size(), 2); EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int32)"); EXPECT_EQ(subcolumn.data_types[1]->get_name(), "Nullable(JSONB)"); EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nullable(JSONB)"); subcolumn.pop_back(3); EXPECT_EQ(subcolumn.size(), 0); EXPECT_EQ(subcolumn.data_types.size(), 0); EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nothing"); } } // namespace doris::vectorized