HappenLee commented on a change in pull request #8373: URL: https://github.com/apache/incubator-doris/pull/8373#discussion_r820543213
########## File path: be/src/exprs/bitmap_function.cpp ########## @@ -358,21 +358,17 @@ BigIntVal BitmapFunctions::bitmap_min(FunctionContext* ctx, const StringVal& src StringVal BitmapFunctions::to_bitmap(doris_udf::FunctionContext* ctx, const doris_udf::StringVal& src) { + if(src.is_null) { Review comment: `if (` ########## File path: be/src/vec/functions/function_bitmap.cpp ########## @@ -125,23 +151,48 @@ struct BitmapHash { } }; -struct NameBitmapCount { +class FunctionBitmapCount : public IFunction { Review comment: why bitmap count is always nullable? ########## File path: be/src/vec/functions/function_bitmap.cpp ########## @@ -125,23 +151,48 @@ struct BitmapHash { } }; -struct NameBitmapCount { +class FunctionBitmapCount : public IFunction { +public: static constexpr auto name = "bitmap_count"; -}; -struct BitmapCount { - using ReturnType = DataTypeInt64; - static constexpr auto TYPE_INDEX = TypeIndex::BitMap; - using Type = DataTypeBitMap::FieldType; - using ReturnColumnType = ColumnVector<Int64>; - using ReturnColumnContainer = ColumnVector<Int64>::Container; + String get_name() const override { return name; } - static Status vector(const std::vector<BitmapValue>& data, ReturnColumnContainer& res) { - size_t size = data.size(); - res.reserve(size); - for (size_t i = 0; i < size; ++i) { - res.push_back(data[i].cardinality()); + static FunctionPtr create() { return std::make_shared<FunctionBitmapCount>(); } + + DataTypePtr get_return_type_impl(const DataTypes& arguments) const override { + return std::make_shared<DataTypeInt64>(); + } + + size_t get_number_of_arguments() const override { return 1; } + + bool use_default_implementation_for_nulls() const override { return false; } + + bool use_default_implementation_for_constants() const override { return true; } + + Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments, + size_t result, size_t input_rows_count) override { + auto res_data_column = ColumnInt64::create(); + auto& res = res_data_column->get_data(); + auto data_null_map = ColumnUInt8::create(input_rows_count, 0); + auto& null_map = data_null_map->get_data(); + + auto column = block.get_by_position(arguments[0]).column->convert_to_full_column_if_const(); + if (auto* nullable = check_and_get_column<const ColumnNullable>(*column)) { + VectorizedUtils::update_null_map(null_map, nullable->get_null_map_data()); + column = nullable->get_nested_column_ptr(); + } + auto str_col = assert_cast<const ColumnBitmap*>(column.get()); + const auto& col_data = str_col->get_data(); + + res.reserve(input_rows_count); + for (size_t i = 0; i < input_rows_count; ++i) { + if(null_map[i]) { Review comment: if ( -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org