Coverage Report

Created: 2026-03-16 01:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/exprs/function/function_math_log.h
Line
Count
Source
1
2
// Licensed to the Apache Software Foundation (ASF) under one
3
// or more contributor license agreements.  See the NOTICE file
4
// distributed with this work for additional information
5
// regarding copyright ownership.  The ASF licenses this file
6
// to you under the Apache License, Version 2.0 (the
7
// "License"); you may not use this file except in compliance
8
// with the License.  You may obtain a copy of the License at
9
//
10
//   http://www.apache.org/licenses/LICENSE-2.0
11
//
12
// Unless required by applicable law or agreed to in writing,
13
// software distributed under the License is distributed on an
14
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
// KIND, either express or implied.  See the License for the
16
// specific language governing permissions and limitations
17
// under the License.
18
19
#pragma once
20
21
#include "core/assert_cast.h"
22
#include "core/data_type/data_type_number.h"
23
#include "core/types.h"
24
#include "exprs/function/function.h"
25
26
namespace doris {
27
28
template <typename Impl>
29
class FunctionMathLog : public IFunction {
30
public:
31
    using IFunction::execute;
32
33
    static constexpr auto name = Impl::name;
34
9
    static FunctionPtr create() { return std::make_shared<FunctionMathLog>(); }
_ZN5doris15FunctionMathLogINS_6ImplLnEE6createEv
Line
Count
Source
34
3
    static FunctionPtr create() { return std::make_shared<FunctionMathLog>(); }
_ZN5doris15FunctionMathLogINS_8ImplLog2EE6createEv
Line
Count
Source
34
3
    static FunctionPtr create() { return std::make_shared<FunctionMathLog>(); }
_ZN5doris15FunctionMathLogINS_9ImplLog10EE6createEv
Line
Count
Source
34
3
    static FunctionPtr create() { return std::make_shared<FunctionMathLog>(); }
35
36
private:
37
3
    String get_name() const override { return name; }
_ZNK5doris15FunctionMathLogINS_6ImplLnEE8get_nameB5cxx11Ev
Line
Count
Source
37
1
    String get_name() const override { return name; }
_ZNK5doris15FunctionMathLogINS_8ImplLog2EE8get_nameB5cxx11Ev
Line
Count
Source
37
1
    String get_name() const override { return name; }
_ZNK5doris15FunctionMathLogINS_9ImplLog10EE8get_nameB5cxx11Ev
Line
Count
Source
37
1
    String get_name() const override { return name; }
38
3
    size_t get_number_of_arguments() const override { return 1; }
_ZNK5doris15FunctionMathLogINS_6ImplLnEE23get_number_of_argumentsEv
Line
Count
Source
38
1
    size_t get_number_of_arguments() const override { return 1; }
_ZNK5doris15FunctionMathLogINS_8ImplLog2EE23get_number_of_argumentsEv
Line
Count
Source
38
1
    size_t get_number_of_arguments() const override { return 1; }
_ZNK5doris15FunctionMathLogINS_9ImplLog10EE23get_number_of_argumentsEv
Line
Count
Source
38
1
    size_t get_number_of_arguments() const override { return 1; }
39
40
3
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
41
3
        return make_nullable(std::make_shared<DataTypeFloat64>());
42
3
    }
_ZNK5doris15FunctionMathLogINS_6ImplLnEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
40
1
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
41
1
        return make_nullable(std::make_shared<DataTypeFloat64>());
42
1
    }
_ZNK5doris15FunctionMathLogINS_8ImplLog2EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
40
1
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
41
1
        return make_nullable(std::make_shared<DataTypeFloat64>());
42
1
    }
_ZNK5doris15FunctionMathLogINS_9ImplLog10EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
40
1
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
41
1
        return make_nullable(std::make_shared<DataTypeFloat64>());
42
1
    }
43
44
    static void execute_in_iterations(const double* src_data, double* dst_data, NullMap& null_map,
45
3
                                      size_t size) {
46
18
        for (size_t i = 0; i < size; i++) {
47
15
            null_map[i] = src_data[i] <= 0;
48
15
            Impl::execute(&src_data[i], &dst_data[i]);
49
15
        }
50
3
    }
_ZN5doris15FunctionMathLogINS_6ImplLnEE21execute_in_iterationsEPKdPdRNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEm
Line
Count
Source
45
1
                                      size_t size) {
46
6
        for (size_t i = 0; i < size; i++) {
47
5
            null_map[i] = src_data[i] <= 0;
48
5
            Impl::execute(&src_data[i], &dst_data[i]);
49
5
        }
50
1
    }
_ZN5doris15FunctionMathLogINS_8ImplLog2EE21execute_in_iterationsEPKdPdRNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEm
Line
Count
Source
45
1
                                      size_t size) {
46
6
        for (size_t i = 0; i < size; i++) {
47
5
            null_map[i] = src_data[i] <= 0;
48
5
            Impl::execute(&src_data[i], &dst_data[i]);
49
5
        }
50
1
    }
_ZN5doris15FunctionMathLogINS_9ImplLog10EE21execute_in_iterationsEPKdPdRNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEm
Line
Count
Source
45
1
                                      size_t size) {
46
6
        for (size_t i = 0; i < size; i++) {
47
5
            null_map[i] = src_data[i] <= 0;
48
5
            Impl::execute(&src_data[i], &dst_data[i]);
49
5
        }
50
1
    }
51
52
    Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
53
3
                        uint32_t result, size_t input_rows_count) const override {
54
3
        const auto* col =
55
3
                assert_cast<const ColumnFloat64*>(block.get_by_position(arguments[0]).column.get());
56
57
3
        const auto& src_data = col->get_data();
58
3
        const size_t size = src_data.size();
59
60
3
        auto dst = ColumnFloat64::create();
61
3
        auto& dst_data = dst->get_data();
62
3
        dst_data.resize(size);
63
64
3
        auto null_column = ColumnUInt8::create();
65
3
        auto& null_map = null_column->get_data();
66
3
        null_map.resize(size);
67
68
3
        execute_in_iterations(col->get_data().data(), dst_data.data(), null_map, size);
69
70
3
        block.replace_by_position(result,
71
3
                                  ColumnNullable::create(std::move(dst), std::move(null_column)));
72
3
        return Status::OK();
73
3
    }
_ZNK5doris15FunctionMathLogINS_6ImplLnEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
53
1
                        uint32_t result, size_t input_rows_count) const override {
54
1
        const auto* col =
55
1
                assert_cast<const ColumnFloat64*>(block.get_by_position(arguments[0]).column.get());
56
57
1
        const auto& src_data = col->get_data();
58
1
        const size_t size = src_data.size();
59
60
1
        auto dst = ColumnFloat64::create();
61
1
        auto& dst_data = dst->get_data();
62
1
        dst_data.resize(size);
63
64
1
        auto null_column = ColumnUInt8::create();
65
1
        auto& null_map = null_column->get_data();
66
1
        null_map.resize(size);
67
68
1
        execute_in_iterations(col->get_data().data(), dst_data.data(), null_map, size);
69
70
1
        block.replace_by_position(result,
71
1
                                  ColumnNullable::create(std::move(dst), std::move(null_column)));
72
1
        return Status::OK();
73
1
    }
_ZNK5doris15FunctionMathLogINS_8ImplLog2EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
53
1
                        uint32_t result, size_t input_rows_count) const override {
54
1
        const auto* col =
55
1
                assert_cast<const ColumnFloat64*>(block.get_by_position(arguments[0]).column.get());
56
57
1
        const auto& src_data = col->get_data();
58
1
        const size_t size = src_data.size();
59
60
1
        auto dst = ColumnFloat64::create();
61
1
        auto& dst_data = dst->get_data();
62
1
        dst_data.resize(size);
63
64
1
        auto null_column = ColumnUInt8::create();
65
1
        auto& null_map = null_column->get_data();
66
1
        null_map.resize(size);
67
68
1
        execute_in_iterations(col->get_data().data(), dst_data.data(), null_map, size);
69
70
1
        block.replace_by_position(result,
71
1
                                  ColumnNullable::create(std::move(dst), std::move(null_column)));
72
1
        return Status::OK();
73
1
    }
_ZNK5doris15FunctionMathLogINS_9ImplLog10EE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
53
1
                        uint32_t result, size_t input_rows_count) const override {
54
1
        const auto* col =
55
1
                assert_cast<const ColumnFloat64*>(block.get_by_position(arguments[0]).column.get());
56
57
1
        const auto& src_data = col->get_data();
58
1
        const size_t size = src_data.size();
59
60
1
        auto dst = ColumnFloat64::create();
61
1
        auto& dst_data = dst->get_data();
62
1
        dst_data.resize(size);
63
64
1
        auto null_column = ColumnUInt8::create();
65
1
        auto& null_map = null_column->get_data();
66
1
        null_map.resize(size);
67
68
1
        execute_in_iterations(col->get_data().data(), dst_data.data(), null_map, size);
69
70
1
        block.replace_by_position(result,
71
1
                                  ColumnNullable::create(std::move(dst), std::move(null_column)));
72
1
        return Status::OK();
73
1
    }
74
};
75
76
struct ImplLog10 {
77
    static constexpr auto name = "log10";
78
5
    static void execute(const double* src, double* dst) { *dst = std::log10(*src); }
79
};
80
81
struct ImplLog2 {
82
    static constexpr auto name = "log2";
83
5
    static void execute(const double* src, double* dst) { *dst = std::log2(*src); }
84
};
85
86
struct ImplLn {
87
    static constexpr auto name = "ln";
88
5
    static void execute(const double* src, double* dst) { *dst = std::log(*src); }
89
};
90
91
} // namespace doris