Coverage Report

Created: 2026-10-20 19:14

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/exprs/function/ai/ai_functions.h
Line
Count
Source
1
// Licensed to the Apache Software Foundation (ASF) under one
2
// or more contributor license agreements.  See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership.  The ASF licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License.  You may obtain a copy of the License at
8
//
9
//   http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied.  See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
#pragma once
19
20
#include <gen_cpp/FrontendService.h>
21
#include <gen_cpp/PaloInternalService_types.h>
22
#include <glog/logging.h>
23
24
#include <algorithm>
25
#include <cstdlib>
26
#include <memory>
27
#include <string>
28
#include <type_traits>
29
#include <utility>
30
#include <vector>
31
32
#include "common/config.h"
33
#include "common/status.h"
34
#include "core/column/column_array.h"
35
#include "core/column/column_const.h"
36
#include "core/column/column_nullable.h"
37
#include "core/cow.h"
38
#include "core/data_type/data_type_array.h"
39
#include "core/data_type/data_type_nullable.h"
40
#include "core/data_type/data_type_number.h"
41
#include "core/data_type/define_primitive_type.h"
42
#include "core/data_type/primitive_type.h"
43
#include "exec/common/util.hpp"
44
#include "exprs/function/ai/ai_adapter.h"
45
#include "exprs/function/ai/ai_request_executor.h"
46
#include "exprs/function/function.h"
47
#include "runtime/query_context.h"
48
#include "runtime/runtime_state.h"
49
#include "util/defer_op.h"
50
#include "util/string_util.h"
51
#include "util/threadpool.h"
52
#include "util/time.h"
53
54
namespace doris {
55
56
// Base class for AI-based functions
57
template <typename Derived>
58
class AIFunction : public IFunction {
59
public:
60
20
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE8get_nameB5cxx11Ev
Line
Count
Source
60
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_17FunctionAIExtractEE8get_nameB5cxx11Ev
Line
Count
Source
60
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_19FunctionAISentimentEE8get_nameB5cxx11Ev
Line
Count
Source
60
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE8get_nameB5cxx11Ev
Line
Count
Source
60
3
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_14FunctionAIMaskEE8get_nameB5cxx11Ev
Line
Count
Source
60
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE8get_nameB5cxx11Ev
Line
Count
Source
60
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE8get_nameB5cxx11Ev
Line
Count
Source
60
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_19FunctionAITranslateEE8get_nameB5cxx11Ev
Line
Count
Source
60
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE8get_nameB5cxx11Ev
Line
Count
Source
60
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_16FunctionAIFilterEE8get_nameB5cxx11Ev
Line
Count
Source
60
6
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_13FunctionEmbedEE8get_nameB5cxx11Ev
Line
Count
Source
60
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE8get_nameB5cxx11Ev
Line
Count
Source
60
2
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
61
62
    // If the user doesn't provide the first arg, `resource_name`
63
    // FE will add the `resource_name` to the arguments list using the Session Variable.
64
    // So the value here should be the maximum number that the function can accept.
65
12
    size_t get_number_of_arguments() const override {
66
12
        return assert_cast<const Derived&>(*this).number_of_arguments;
67
12
    }
_ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE23get_number_of_argumentsEv
Line
Count
Source
65
2
    size_t get_number_of_arguments() const override {
66
2
        return assert_cast<const Derived&>(*this).number_of_arguments;
67
2
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISentimentEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE23get_number_of_argumentsEv
_ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE23get_number_of_argumentsEv
Line
Count
Source
65
4
    size_t get_number_of_arguments() const override {
66
4
        return assert_cast<const Derived&>(*this).number_of_arguments;
67
4
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE23get_number_of_argumentsEv
_ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE23get_number_of_argumentsEv
Line
Count
Source
65
1
    size_t get_number_of_arguments() const override {
66
1
        return assert_cast<const Derived&>(*this).number_of_arguments;
67
1
    }
_ZNK5doris10AIFunctionINS_16FunctionAIFilterEE23get_number_of_argumentsEv
Line
Count
Source
65
1
    size_t get_number_of_arguments() const override {
66
1
        return assert_cast<const Derived&>(*this).number_of_arguments;
67
1
    }
_ZNK5doris10AIFunctionINS_13FunctionEmbedEE23get_number_of_argumentsEv
Line
Count
Source
65
4
    size_t get_number_of_arguments() const override {
66
4
        return assert_cast<const Derived&>(*this).number_of_arguments;
67
4
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE23get_number_of_argumentsEv
68
69
0
    bool is_blockable() const override { return true; }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISentimentEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_16FunctionAIFilterEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_13FunctionEmbedEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE12is_blockableEv
70
71
1
    Status close(FunctionContext* context, FunctionContext::FunctionStateScope scope) override {
72
1
        if (scope == FunctionContext::FunctionStateScope::THREAD_LOCAL) {
73
            // Release this execution context's cached clients.
74
1
            context->set_function_state(scope, nullptr);
75
1
        }
76
1
        return Status::OK();
77
1
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_18FunctionAIClassifyEE5closeEPNS_15FunctionContextENS3_18FunctionStateScopeE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_17FunctionAIExtractEE5closeEPNS_15FunctionContextENS3_18FunctionStateScopeE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_19FunctionAISentimentEE5closeEPNS_15FunctionContextENS3_18FunctionStateScopeE
_ZN5doris10AIFunctionINS_19FunctionAISummarizeEE5closeEPNS_15FunctionContextENS3_18FunctionStateScopeE
Line
Count
Source
71
1
    Status close(FunctionContext* context, FunctionContext::FunctionStateScope scope) override {
72
1
        if (scope == FunctionContext::FunctionStateScope::THREAD_LOCAL) {
73
            // Release this execution context's cached clients.
74
1
            context->set_function_state(scope, nullptr);
75
1
        }
76
1
        return Status::OK();
77
1
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_14FunctionAIMaskEE5closeEPNS_15FunctionContextENS3_18FunctionStateScopeE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_18FunctionAIGenerateEE5closeEPNS_15FunctionContextENS3_18FunctionStateScopeE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_20FunctionAIFixGrammarEE5closeEPNS_15FunctionContextENS3_18FunctionStateScopeE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_19FunctionAITranslateEE5closeEPNS_15FunctionContextENS3_18FunctionStateScopeE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_20FunctionAISimilarityEE5closeEPNS_15FunctionContextENS3_18FunctionStateScopeE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_16FunctionAIFilterEE5closeEPNS_15FunctionContextENS3_18FunctionStateScopeE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_13FunctionEmbedEE5closeEPNS_15FunctionContextENS3_18FunctionStateScopeE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE5closeEPNS_15FunctionContextENS3_18FunctionStateScopeE
78
79
24
    bool use_default_implementation_for_nulls() const final { return false; }
_ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE36use_default_implementation_for_nullsEv
Line
Count
Source
79
4
    bool use_default_implementation_for_nulls() const final { return false; }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE36use_default_implementation_for_nullsEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISentimentEE36use_default_implementation_for_nullsEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE36use_default_implementation_for_nullsEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE36use_default_implementation_for_nullsEv
_ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE36use_default_implementation_for_nullsEv
Line
Count
Source
79
8
    bool use_default_implementation_for_nulls() const final { return false; }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE36use_default_implementation_for_nullsEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE36use_default_implementation_for_nullsEv
_ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE36use_default_implementation_for_nullsEv
Line
Count
Source
79
2
    bool use_default_implementation_for_nulls() const final { return false; }
_ZNK5doris10AIFunctionINS_16FunctionAIFilterEE36use_default_implementation_for_nullsEv
Line
Count
Source
79
2
    bool use_default_implementation_for_nulls() const final { return false; }
_ZNK5doris10AIFunctionINS_13FunctionEmbedEE36use_default_implementation_for_nullsEv
Line
Count
Source
79
8
    bool use_default_implementation_for_nulls() const final { return false; }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE36use_default_implementation_for_nullsEv
80
81
23
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const final {
82
23
        bool has_nullable_argument = std::ranges::any_of(
83
25
                arguments, [](const auto& argument) { return argument->is_nullable(); });
_ZZNK5doris10AIFunctionINS_18FunctionAIClassifyEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EEENKUlRKT_E_clIS7_EEDaSE_
Line
Count
Source
83
6
                arguments, [](const auto& argument) { return argument->is_nullable(); });
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_17FunctionAIExtractEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EEENKUlRKT_E_clIS7_EEDaSE_
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_19FunctionAISentimentEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EEENKUlRKT_E_clIS7_EEDaSE_
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_19FunctionAISummarizeEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EEENKUlRKT_E_clIS7_EEDaSE_
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_14FunctionAIMaskEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EEENKUlRKT_E_clIS7_EEDaSE_
_ZZNK5doris10AIFunctionINS_18FunctionAIGenerateEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EEENKUlRKT_E_clIS7_EEDaSE_
Line
Count
Source
83
7
                arguments, [](const auto& argument) { return argument->is_nullable(); });
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EEENKUlRKT_E_clIS7_EEDaSE_
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_19FunctionAITranslateEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EEENKUlRKT_E_clIS7_EEDaSE_
_ZZNK5doris10AIFunctionINS_20FunctionAISimilarityEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EEENKUlRKT_E_clIS7_EEDaSE_
Line
Count
Source
83
2
                arguments, [](const auto& argument) { return argument->is_nullable(); });
_ZZNK5doris10AIFunctionINS_16FunctionAIFilterEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EEENKUlRKT_E_clIS7_EEDaSE_
Line
Count
Source
83
2
                arguments, [](const auto& argument) { return argument->is_nullable(); });
_ZZNK5doris10AIFunctionINS_13FunctionEmbedEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EEENKUlRKT_E_clIS7_EEDaSE_
Line
Count
Source
83
8
                arguments, [](const auto& argument) { return argument->is_nullable(); });
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EEENKUlRKT_E_clIS7_EEDaSE_
84
23
        DataTypePtr return_type =
85
23
                assert_cast<const Derived&>(*this).get_nested_return_type_impl(arguments);
86
23
        return has_nullable_argument ? make_nullable(return_type) : return_type;
87
23
    }
_ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
81
3
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const final {
82
3
        bool has_nullable_argument = std::ranges::any_of(
83
3
                arguments, [](const auto& argument) { return argument->is_nullable(); });
84
3
        DataTypePtr return_type =
85
3
                assert_cast<const Derived&>(*this).get_nested_return_type_impl(arguments);
86
3
        return has_nullable_argument ? make_nullable(return_type) : return_type;
87
3
    }
_ZNK5doris10AIFunctionINS_17FunctionAIExtractEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
81
1
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const final {
82
1
        bool has_nullable_argument = std::ranges::any_of(
83
1
                arguments, [](const auto& argument) { return argument->is_nullable(); });
84
1
        DataTypePtr return_type =
85
1
                assert_cast<const Derived&>(*this).get_nested_return_type_impl(arguments);
86
1
        return has_nullable_argument ? make_nullable(return_type) : return_type;
87
1
    }
_ZNK5doris10AIFunctionINS_19FunctionAISentimentEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
81
1
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const final {
82
1
        bool has_nullable_argument = std::ranges::any_of(
83
1
                arguments, [](const auto& argument) { return argument->is_nullable(); });
84
1
        DataTypePtr return_type =
85
1
                assert_cast<const Derived&>(*this).get_nested_return_type_impl(arguments);
86
1
        return has_nullable_argument ? make_nullable(return_type) : return_type;
87
1
    }
_ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
81
1
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const final {
82
1
        bool has_nullable_argument = std::ranges::any_of(
83
1
                arguments, [](const auto& argument) { return argument->is_nullable(); });
84
1
        DataTypePtr return_type =
85
1
                assert_cast<const Derived&>(*this).get_nested_return_type_impl(arguments);
86
1
        return has_nullable_argument ? make_nullable(return_type) : return_type;
87
1
    }
_ZNK5doris10AIFunctionINS_14FunctionAIMaskEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
81
1
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const final {
82
1
        bool has_nullable_argument = std::ranges::any_of(
83
1
                arguments, [](const auto& argument) { return argument->is_nullable(); });
84
1
        DataTypePtr return_type =
85
1
                assert_cast<const Derived&>(*this).get_nested_return_type_impl(arguments);
86
1
        return has_nullable_argument ? make_nullable(return_type) : return_type;
87
1
    }
_ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
81
5
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const final {
82
5
        bool has_nullable_argument = std::ranges::any_of(
83
5
                arguments, [](const auto& argument) { return argument->is_nullable(); });
84
5
        DataTypePtr return_type =
85
5
                assert_cast<const Derived&>(*this).get_nested_return_type_impl(arguments);
86
5
        return has_nullable_argument ? make_nullable(return_type) : return_type;
87
5
    }
_ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
81
1
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const final {
82
1
        bool has_nullable_argument = std::ranges::any_of(
83
1
                arguments, [](const auto& argument) { return argument->is_nullable(); });
84
1
        DataTypePtr return_type =
85
1
                assert_cast<const Derived&>(*this).get_nested_return_type_impl(arguments);
86
1
        return has_nullable_argument ? make_nullable(return_type) : return_type;
87
1
    }
_ZNK5doris10AIFunctionINS_19FunctionAITranslateEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
81
1
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const final {
82
1
        bool has_nullable_argument = std::ranges::any_of(
83
1
                arguments, [](const auto& argument) { return argument->is_nullable(); });
84
1
        DataTypePtr return_type =
85
1
                assert_cast<const Derived&>(*this).get_nested_return_type_impl(arguments);
86
1
        return has_nullable_argument ? make_nullable(return_type) : return_type;
87
1
    }
_ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
81
2
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const final {
82
2
        bool has_nullable_argument = std::ranges::any_of(
83
2
                arguments, [](const auto& argument) { return argument->is_nullable(); });
84
2
        DataTypePtr return_type =
85
2
                assert_cast<const Derived&>(*this).get_nested_return_type_impl(arguments);
86
2
        return has_nullable_argument ? make_nullable(return_type) : return_type;
87
2
    }
_ZNK5doris10AIFunctionINS_16FunctionAIFilterEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
81
2
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const final {
82
2
        bool has_nullable_argument = std::ranges::any_of(
83
2
                arguments, [](const auto& argument) { return argument->is_nullable(); });
84
2
        DataTypePtr return_type =
85
2
                assert_cast<const Derived&>(*this).get_nested_return_type_impl(arguments);
86
2
        return has_nullable_argument ? make_nullable(return_type) : return_type;
87
2
    }
_ZNK5doris10AIFunctionINS_13FunctionEmbedEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
Line
Count
Source
81
5
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const final {
82
5
        bool has_nullable_argument = std::ranges::any_of(
83
5
                arguments, [](const auto& argument) { return argument->is_nullable(); });
84
5
        DataTypePtr return_type =
85
5
                assert_cast<const Derived&>(*this).get_nested_return_type_impl(arguments);
86
5
        return has_nullable_argument ? make_nullable(return_type) : return_type;
87
5
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE
88
89
    using PreparedFunctionImpl::execute;
90
91
    virtual Status build_prompt(const Columns& prompt_columns, size_t row_num,
92
107
                                std::string& prompt) const {
93
107
        StringRef text_ref = prompt_columns[0]->get_data_at(row_num);
94
107
        prompt = std::string(text_ref.data, text_ref.size);
95
96
107
        return Status::OK();
97
107
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE12build_promptERKSt6vectorINS_3COWINS_7IColumnEE13immutable_ptrIS5_EESaIS8_EEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE12build_promptERKSt6vectorINS_3COWINS_7IColumnEE13immutable_ptrIS5_EESaIS8_EEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
_ZNK5doris10AIFunctionINS_19FunctionAISentimentEE12build_promptERKSt6vectorINS_3COWINS_7IColumnEE13immutable_ptrIS5_EESaIS8_EEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
92
5
                                std::string& prompt) const {
93
5
        StringRef text_ref = prompt_columns[0]->get_data_at(row_num);
94
5
        prompt = std::string(text_ref.data, text_ref.size);
95
96
5
        return Status::OK();
97
5
    }
_ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE12build_promptERKSt6vectorINS_3COWINS_7IColumnEE13immutable_ptrIS5_EESaIS8_EEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
92
11
                                std::string& prompt) const {
93
11
        StringRef text_ref = prompt_columns[0]->get_data_at(row_num);
94
11
        prompt = std::string(text_ref.data, text_ref.size);
95
96
11
        return Status::OK();
97
11
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE12build_promptERKSt6vectorINS_3COWINS_7IColumnEE13immutable_ptrIS5_EESaIS8_EEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE12build_promptERKSt6vectorINS_3COWINS_7IColumnEE13immutable_ptrIS5_EESaIS8_EEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
_ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE12build_promptERKSt6vectorINS_3COWINS_7IColumnEE13immutable_ptrIS5_EESaIS8_EEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
92
1
                                std::string& prompt) const {
93
1
        StringRef text_ref = prompt_columns[0]->get_data_at(row_num);
94
1
        prompt = std::string(text_ref.data, text_ref.size);
95
96
1
        return Status::OK();
97
1
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE12build_promptERKSt6vectorINS_3COWINS_7IColumnEE13immutable_ptrIS5_EESaIS8_EEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE12build_promptERKSt6vectorINS_3COWINS_7IColumnEE13immutable_ptrIS5_EESaIS8_EEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
_ZNK5doris10AIFunctionINS_16FunctionAIFilterEE12build_promptERKSt6vectorINS_3COWINS_7IColumnEE13immutable_ptrIS5_EESaIS8_EEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
92
65
                                std::string& prompt) const {
93
65
        StringRef text_ref = prompt_columns[0]->get_data_at(row_num);
94
65
        prompt = std::string(text_ref.data, text_ref.size);
95
96
65
        return Status::OK();
97
65
    }
_ZNK5doris10AIFunctionINS_13FunctionEmbedEE12build_promptERKSt6vectorINS_3COWINS_7IColumnEE13immutable_ptrIS5_EESaIS8_EEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
92
25
                                std::string& prompt) const {
93
25
        StringRef text_ref = prompt_columns[0]->get_data_at(row_num);
94
25
        prompt = std::string(text_ref.data, text_ref.size);
95
96
25
        return Status::OK();
97
25
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE12build_promptERKSt6vectorINS_3COWINS_7IColumnEE13immutable_ptrIS5_EESaIS8_EEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
98
99
    Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
100
92
                        uint32_t result, size_t input_rows_count) const override {
101
92
        auto* executor = get_executor(context);
102
92
        if (block.get_by_position(arguments[0]).column->only_null()) {
103
1
            if (executor->statistics()) {
104
1
                executor->statistics()->record_input(input_rows_count, input_rows_count);
105
1
            }
106
1
            block.get_by_position(result).column =
107
1
                    block.get_by_position(result).type->create_column_const(input_rows_count,
108
1
                                                                            Field());
109
1
            return Status::OK();
110
1
        }
111
112
91
        AIResource config;
113
91
        std::shared_ptr<AIAdapter> adapter;
114
91
        if (Status status = this->_init_from_resource(context, block, arguments, config, adapter);
115
91
            !status.ok()) {
116
0
            return status;
117
0
        }
118
119
91
        return assert_cast<const Derived&>(*this).execute(context, block, arguments, result,
120
91
                                                          input_rows_count, config, adapter);
121
91
    }
_ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
100
2
                        uint32_t result, size_t input_rows_count) const override {
101
2
        auto* executor = get_executor(context);
102
2
        if (block.get_by_position(arguments[0]).column->only_null()) {
103
0
            if (executor->statistics()) {
104
0
                executor->statistics()->record_input(input_rows_count, input_rows_count);
105
0
            }
106
0
            block.get_by_position(result).column =
107
0
                    block.get_by_position(result).type->create_column_const(input_rows_count,
108
0
                                                                            Field());
109
0
            return Status::OK();
110
0
        }
111
112
2
        AIResource config;
113
2
        std::shared_ptr<AIAdapter> adapter;
114
2
        if (Status status = this->_init_from_resource(context, block, arguments, config, adapter);
115
2
            !status.ok()) {
116
0
            return status;
117
0
        }
118
119
2
        return assert_cast<const Derived&>(*this).execute(context, block, arguments, result,
120
2
                                                          input_rows_count, config, adapter);
121
2
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
_ZNK5doris10AIFunctionINS_19FunctionAISentimentEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
100
2
                        uint32_t result, size_t input_rows_count) const override {
101
2
        auto* executor = get_executor(context);
102
2
        if (block.get_by_position(arguments[0]).column->only_null()) {
103
0
            if (executor->statistics()) {
104
0
                executor->statistics()->record_input(input_rows_count, input_rows_count);
105
0
            }
106
0
            block.get_by_position(result).column =
107
0
                    block.get_by_position(result).type->create_column_const(input_rows_count,
108
0
                                                                            Field());
109
0
            return Status::OK();
110
0
        }
111
112
2
        AIResource config;
113
2
        std::shared_ptr<AIAdapter> adapter;
114
2
        if (Status status = this->_init_from_resource(context, block, arguments, config, adapter);
115
2
            !status.ok()) {
116
0
            return status;
117
0
        }
118
119
2
        return assert_cast<const Derived&>(*this).execute(context, block, arguments, result,
120
2
                                                          input_rows_count, config, adapter);
121
2
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
_ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
100
4
                        uint32_t result, size_t input_rows_count) const override {
101
4
        auto* executor = get_executor(context);
102
4
        if (block.get_by_position(arguments[0]).column->only_null()) {
103
1
            if (executor->statistics()) {
104
1
                executor->statistics()->record_input(input_rows_count, input_rows_count);
105
1
            }
106
1
            block.get_by_position(result).column =
107
1
                    block.get_by_position(result).type->create_column_const(input_rows_count,
108
1
                                                                            Field());
109
1
            return Status::OK();
110
1
        }
111
112
3
        AIResource config;
113
3
        std::shared_ptr<AIAdapter> adapter;
114
3
        if (Status status = this->_init_from_resource(context, block, arguments, config, adapter);
115
3
            !status.ok()) {
116
0
            return status;
117
0
        }
118
119
3
        return assert_cast<const Derived&>(*this).execute(context, block, arguments, result,
120
3
                                                          input_rows_count, config, adapter);
121
3
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
_ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
100
22
                        uint32_t result, size_t input_rows_count) const override {
101
22
        auto* executor = get_executor(context);
102
22
        if (block.get_by_position(arguments[0]).column->only_null()) {
103
0
            if (executor->statistics()) {
104
0
                executor->statistics()->record_input(input_rows_count, input_rows_count);
105
0
            }
106
0
            block.get_by_position(result).column =
107
0
                    block.get_by_position(result).type->create_column_const(input_rows_count,
108
0
                                                                            Field());
109
0
            return Status::OK();
110
0
        }
111
112
22
        AIResource config;
113
22
        std::shared_ptr<AIAdapter> adapter;
114
22
        if (Status status = this->_init_from_resource(context, block, arguments, config, adapter);
115
22
            !status.ok()) {
116
0
            return status;
117
0
        }
118
119
22
        return assert_cast<const Derived&>(*this).execute(context, block, arguments, result,
120
22
                                                          input_rows_count, config, adapter);
121
22
    }
_ZNK5doris10AIFunctionINS_16FunctionAIFilterEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
100
47
                        uint32_t result, size_t input_rows_count) const override {
101
47
        auto* executor = get_executor(context);
102
47
        if (block.get_by_position(arguments[0]).column->only_null()) {
103
0
            if (executor->statistics()) {
104
0
                executor->statistics()->record_input(input_rows_count, input_rows_count);
105
0
            }
106
0
            block.get_by_position(result).column =
107
0
                    block.get_by_position(result).type->create_column_const(input_rows_count,
108
0
                                                                            Field());
109
0
            return Status::OK();
110
0
        }
111
112
47
        AIResource config;
113
47
        std::shared_ptr<AIAdapter> adapter;
114
47
        if (Status status = this->_init_from_resource(context, block, arguments, config, adapter);
115
47
            !status.ok()) {
116
0
            return status;
117
0
        }
118
119
47
        return assert_cast<const Derived&>(*this).execute(context, block, arguments, result,
120
47
                                                          input_rows_count, config, adapter);
121
47
    }
_ZNK5doris10AIFunctionINS_13FunctionEmbedEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Line
Count
Source
100
15
                        uint32_t result, size_t input_rows_count) const override {
101
15
        auto* executor = get_executor(context);
102
15
        if (block.get_by_position(arguments[0]).column->only_null()) {
103
0
            if (executor->statistics()) {
104
0
                executor->statistics()->record_input(input_rows_count, input_rows_count);
105
0
            }
106
0
            block.get_by_position(result).column =
107
0
                    block.get_by_position(result).type->create_column_const(input_rows_count,
108
0
                                                                            Field());
109
0
            return Status::OK();
110
0
        }
111
112
15
        AIResource config;
113
15
        std::shared_ptr<AIAdapter> adapter;
114
15
        if (Status status = this->_init_from_resource(context, block, arguments, config, adapter);
115
15
            !status.ok()) {
116
0
            return status;
117
0
        }
118
119
15
        return assert_cast<const Derived&>(*this).execute(context, block, arguments, result,
120
15
                                                          input_rows_count, config, adapter);
121
15
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
122
123
protected:
124
    // Reads the shared AI context window size from query options. String AI batch functions and
125
    // ai_agg both use the same byte-based session variable so batching behavior stays consistent.
126
91
    static int64_t get_ai_context_window_size(FunctionContext* context) {
127
91
        DORIS_CHECK(context != nullptr);
128
91
        QueryContext* query_ctx = context->state()->get_query_ctx();
129
91
        DORIS_CHECK(query_ctx != nullptr);
130
131
91
        return query_ctx->query_options().ai_context_window_size;
132
91
    }
_ZN5doris10AIFunctionINS_18FunctionAIClassifyEE26get_ai_context_window_sizeEPNS_15FunctionContextE
Line
Count
Source
126
2
    static int64_t get_ai_context_window_size(FunctionContext* context) {
127
2
        DORIS_CHECK(context != nullptr);
128
2
        QueryContext* query_ctx = context->state()->get_query_ctx();
129
2
        DORIS_CHECK(query_ctx != nullptr);
130
131
2
        return query_ctx->query_options().ai_context_window_size;
132
2
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_17FunctionAIExtractEE26get_ai_context_window_sizeEPNS_15FunctionContextE
_ZN5doris10AIFunctionINS_19FunctionAISentimentEE26get_ai_context_window_sizeEPNS_15FunctionContextE
Line
Count
Source
126
2
    static int64_t get_ai_context_window_size(FunctionContext* context) {
127
2
        DORIS_CHECK(context != nullptr);
128
2
        QueryContext* query_ctx = context->state()->get_query_ctx();
129
2
        DORIS_CHECK(query_ctx != nullptr);
130
131
2
        return query_ctx->query_options().ai_context_window_size;
132
2
    }
_ZN5doris10AIFunctionINS_19FunctionAISummarizeEE26get_ai_context_window_sizeEPNS_15FunctionContextE
Line
Count
Source
126
5
    static int64_t get_ai_context_window_size(FunctionContext* context) {
127
5
        DORIS_CHECK(context != nullptr);
128
5
        QueryContext* query_ctx = context->state()->get_query_ctx();
129
5
        DORIS_CHECK(query_ctx != nullptr);
130
131
5
        return query_ctx->query_options().ai_context_window_size;
132
5
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_14FunctionAIMaskEE26get_ai_context_window_sizeEPNS_15FunctionContextE
_ZN5doris10AIFunctionINS_18FunctionAIGenerateEE26get_ai_context_window_sizeEPNS_15FunctionContextE
Line
Count
Source
126
2
    static int64_t get_ai_context_window_size(FunctionContext* context) {
127
2
        DORIS_CHECK(context != nullptr);
128
2
        QueryContext* query_ctx = context->state()->get_query_ctx();
129
2
        DORIS_CHECK(query_ctx != nullptr);
130
131
2
        return query_ctx->query_options().ai_context_window_size;
132
2
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_20FunctionAIFixGrammarEE26get_ai_context_window_sizeEPNS_15FunctionContextE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_19FunctionAITranslateEE26get_ai_context_window_sizeEPNS_15FunctionContextE
_ZN5doris10AIFunctionINS_20FunctionAISimilarityEE26get_ai_context_window_sizeEPNS_15FunctionContextE
Line
Count
Source
126
22
    static int64_t get_ai_context_window_size(FunctionContext* context) {
127
22
        DORIS_CHECK(context != nullptr);
128
22
        QueryContext* query_ctx = context->state()->get_query_ctx();
129
22
        DORIS_CHECK(query_ctx != nullptr);
130
131
22
        return query_ctx->query_options().ai_context_window_size;
132
22
    }
_ZN5doris10AIFunctionINS_16FunctionAIFilterEE26get_ai_context_window_sizeEPNS_15FunctionContextE
Line
Count
Source
126
47
    static int64_t get_ai_context_window_size(FunctionContext* context) {
127
47
        DORIS_CHECK(context != nullptr);
128
47
        QueryContext* query_ctx = context->state()->get_query_ctx();
129
47
        DORIS_CHECK(query_ctx != nullptr);
130
131
47
        return query_ctx->query_options().ai_context_window_size;
132
47
    }
_ZN5doris10AIFunctionINS_13FunctionEmbedEE26get_ai_context_window_sizeEPNS_15FunctionContextE
Line
Count
Source
126
11
    static int64_t get_ai_context_window_size(FunctionContext* context) {
127
11
        DORIS_CHECK(context != nullptr);
128
11
        QueryContext* query_ctx = context->state()->get_query_ctx();
129
11
        DORIS_CHECK(query_ctx != nullptr);
130
131
11
        return query_ctx->query_options().ai_context_window_size;
132
11
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE26get_ai_context_window_sizeEPNS_15FunctionContextE
133
134
11
    MutableColumnPtr create_result_column() const { return ColumnString::create(); }
_ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE20create_result_columnEv
Line
Count
Source
134
2
    MutableColumnPtr create_result_column() const { return ColumnString::create(); }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE20create_result_columnEv
_ZNK5doris10AIFunctionINS_19FunctionAISentimentEE20create_result_columnEv
Line
Count
Source
134
2
    MutableColumnPtr create_result_column() const { return ColumnString::create(); }
_ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE20create_result_columnEv
Line
Count
Source
134
5
    MutableColumnPtr create_result_column() const { return ColumnString::create(); }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE20create_result_columnEv
_ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE20create_result_columnEv
Line
Count
Source
134
2
    MutableColumnPtr create_result_column() const { return ColumnString::create(); }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE20create_result_columnEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE20create_result_columnEv
135
136
    // Provider-reusable hook for AI functions(string) -> string.
137
    Status append_batch_results(const std::vector<std::string>& batch_results,
138
16
                                IColumn& col_result) const {
139
16
        auto& string_col = assert_cast<ColumnString&>(col_result);
140
21
        for (const auto& batch_result : batch_results) {
141
21
            string_col.insert_data(batch_result.data(), batch_result.size());
142
21
        }
143
16
        return Status::OK();
144
16
    }
_ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE20append_batch_resultsERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERNS_7IColumnE
Line
Count
Source
138
2
                                IColumn& col_result) const {
139
2
        auto& string_col = assert_cast<ColumnString&>(col_result);
140
2
        for (const auto& batch_result : batch_results) {
141
2
            string_col.insert_data(batch_result.data(), batch_result.size());
142
2
        }
143
2
        return Status::OK();
144
2
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE20append_batch_resultsERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERNS_7IColumnE
_ZNK5doris10AIFunctionINS_19FunctionAISentimentEE20append_batch_resultsERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERNS_7IColumnE
Line
Count
Source
138
2
                                IColumn& col_result) const {
139
2
        auto& string_col = assert_cast<ColumnString&>(col_result);
140
4
        for (const auto& batch_result : batch_results) {
141
4
            string_col.insert_data(batch_result.data(), batch_result.size());
142
4
        }
143
2
        return Status::OK();
144
2
    }
_ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE20append_batch_resultsERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERNS_7IColumnE
Line
Count
Source
138
10
                                IColumn& col_result) const {
139
10
        auto& string_col = assert_cast<ColumnString&>(col_result);
140
10
        for (const auto& batch_result : batch_results) {
141
10
            string_col.insert_data(batch_result.data(), batch_result.size());
142
10
        }
143
10
        return Status::OK();
144
10
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE20append_batch_resultsERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERNS_7IColumnE
_ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE20append_batch_resultsERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERNS_7IColumnE
Line
Count
Source
138
2
                                IColumn& col_result) const {
139
2
        auto& string_col = assert_cast<ColumnString&>(col_result);
140
5
        for (const auto& batch_result : batch_results) {
141
5
            string_col.insert_data(batch_result.data(), batch_result.size());
142
5
        }
143
2
        return Status::OK();
144
2
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE20append_batch_resultsERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERNS_7IColumnE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE20append_batch_resultsERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERNS_7IColumnE
145
146
98
    static void normalize_endpoint(AIResource& config) {
147
        // 1. If users configure only the version root like `.../v1` or `.../v1beta`, append
148
        //    `models/<model>:batchEmbedContents` for `embed`, and `models/<model>:generateContent`
149
        //    for other AI scalar functions.
150
        // 2. `:embedContent` -> `:batchEmbedContents`
151
98
        if (iequal(config.provider_type, "GEMINI")) {
152
4
            if (iequal(Derived::name, "embed") && config.endpoint.ends_with(":embedContent")) {
153
1
                static constexpr std::string_view legacy_suffix = ":embedContent";
154
1
                config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
155
1
                                        legacy_suffix.size(), ":batchEmbedContents");
156
1
                return;
157
1
            }
158
159
3
            if (!config.endpoint.ends_with("v1") && !config.endpoint.ends_with("v1beta")) {
160
1
                return;
161
1
            }
162
163
2
            std::string model_name = config.model_name;
164
2
            if (!model_name.starts_with("models/")) {
165
2
                model_name = "models/" + model_name;
166
2
            }
167
168
2
            config.endpoint += "/";
169
2
            config.endpoint += model_name;
170
2
            config.endpoint +=
171
2
                    iequal(Derived::name, "embed") ? ":batchEmbedContents" : ":generateContent";
172
2
            return;
173
3
        }
174
175
        // The endpoint `v1/completions` does not support `system_prompt`.
176
        // To ensure a clear structure and stable AI results.
177
        // Convert from `v1/completions` to `v1/chat/completions`
178
94
        if (config.endpoint.ends_with("v1/completions")) {
179
1
            static constexpr std::string_view legacy_suffix = "v1/completions";
180
1
            config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
181
1
                                    legacy_suffix.size(), "v1/chat/completions");
182
1
        }
183
94
    }
_ZN5doris10AIFunctionINS_18FunctionAIClassifyEE18normalize_endpointERNS_10AIResourceE
Line
Count
Source
146
2
    static void normalize_endpoint(AIResource& config) {
147
        // 1. If users configure only the version root like `.../v1` or `.../v1beta`, append
148
        //    `models/<model>:batchEmbedContents` for `embed`, and `models/<model>:generateContent`
149
        //    for other AI scalar functions.
150
        // 2. `:embedContent` -> `:batchEmbedContents`
151
2
        if (iequal(config.provider_type, "GEMINI")) {
152
0
            if (iequal(Derived::name, "embed") && config.endpoint.ends_with(":embedContent")) {
153
0
                static constexpr std::string_view legacy_suffix = ":embedContent";
154
0
                config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
155
0
                                        legacy_suffix.size(), ":batchEmbedContents");
156
0
                return;
157
0
            }
158
159
0
            if (!config.endpoint.ends_with("v1") && !config.endpoint.ends_with("v1beta")) {
160
0
                return;
161
0
            }
162
163
0
            std::string model_name = config.model_name;
164
0
            if (!model_name.starts_with("models/")) {
165
0
                model_name = "models/" + model_name;
166
0
            }
167
168
0
            config.endpoint += "/";
169
0
            config.endpoint += model_name;
170
0
            config.endpoint +=
171
0
                    iequal(Derived::name, "embed") ? ":batchEmbedContents" : ":generateContent";
172
0
            return;
173
0
        }
174
175
        // The endpoint `v1/completions` does not support `system_prompt`.
176
        // To ensure a clear structure and stable AI results.
177
        // Convert from `v1/completions` to `v1/chat/completions`
178
2
        if (config.endpoint.ends_with("v1/completions")) {
179
0
            static constexpr std::string_view legacy_suffix = "v1/completions";
180
0
            config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
181
0
                                    legacy_suffix.size(), "v1/chat/completions");
182
0
        }
183
2
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_17FunctionAIExtractEE18normalize_endpointERNS_10AIResourceE
_ZN5doris10AIFunctionINS_19FunctionAISentimentEE18normalize_endpointERNS_10AIResourceE
Line
Count
Source
146
7
    static void normalize_endpoint(AIResource& config) {
147
        // 1. If users configure only the version root like `.../v1` or `.../v1beta`, append
148
        //    `models/<model>:batchEmbedContents` for `embed`, and `models/<model>:generateContent`
149
        //    for other AI scalar functions.
150
        // 2. `:embedContent` -> `:batchEmbedContents`
151
7
        if (iequal(config.provider_type, "GEMINI")) {
152
2
            if (iequal(Derived::name, "embed") && config.endpoint.ends_with(":embedContent")) {
153
0
                static constexpr std::string_view legacy_suffix = ":embedContent";
154
0
                config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
155
0
                                        legacy_suffix.size(), ":batchEmbedContents");
156
0
                return;
157
0
            }
158
159
2
            if (!config.endpoint.ends_with("v1") && !config.endpoint.ends_with("v1beta")) {
160
1
                return;
161
1
            }
162
163
1
            std::string model_name = config.model_name;
164
1
            if (!model_name.starts_with("models/")) {
165
1
                model_name = "models/" + model_name;
166
1
            }
167
168
1
            config.endpoint += "/";
169
1
            config.endpoint += model_name;
170
1
            config.endpoint +=
171
1
                    iequal(Derived::name, "embed") ? ":batchEmbedContents" : ":generateContent";
172
1
            return;
173
2
        }
174
175
        // The endpoint `v1/completions` does not support `system_prompt`.
176
        // To ensure a clear structure and stable AI results.
177
        // Convert from `v1/completions` to `v1/chat/completions`
178
5
        if (config.endpoint.ends_with("v1/completions")) {
179
1
            static constexpr std::string_view legacy_suffix = "v1/completions";
180
1
            config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
181
1
                                    legacy_suffix.size(), "v1/chat/completions");
182
1
        }
183
5
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_19FunctionAISummarizeEE18normalize_endpointERNS_10AIResourceE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_14FunctionAIMaskEE18normalize_endpointERNS_10AIResourceE
_ZN5doris10AIFunctionINS_18FunctionAIGenerateEE18normalize_endpointERNS_10AIResourceE
Line
Count
Source
146
3
    static void normalize_endpoint(AIResource& config) {
147
        // 1. If users configure only the version root like `.../v1` or `.../v1beta`, append
148
        //    `models/<model>:batchEmbedContents` for `embed`, and `models/<model>:generateContent`
149
        //    for other AI scalar functions.
150
        // 2. `:embedContent` -> `:batchEmbedContents`
151
3
        if (iequal(config.provider_type, "GEMINI")) {
152
0
            if (iequal(Derived::name, "embed") && config.endpoint.ends_with(":embedContent")) {
153
0
                static constexpr std::string_view legacy_suffix = ":embedContent";
154
0
                config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
155
0
                                        legacy_suffix.size(), ":batchEmbedContents");
156
0
                return;
157
0
            }
158
159
0
            if (!config.endpoint.ends_with("v1") && !config.endpoint.ends_with("v1beta")) {
160
0
                return;
161
0
            }
162
163
0
            std::string model_name = config.model_name;
164
0
            if (!model_name.starts_with("models/")) {
165
0
                model_name = "models/" + model_name;
166
0
            }
167
168
0
            config.endpoint += "/";
169
0
            config.endpoint += model_name;
170
0
            config.endpoint +=
171
0
                    iequal(Derived::name, "embed") ? ":batchEmbedContents" : ":generateContent";
172
0
            return;
173
0
        }
174
175
        // The endpoint `v1/completions` does not support `system_prompt`.
176
        // To ensure a clear structure and stable AI results.
177
        // Convert from `v1/completions` to `v1/chat/completions`
178
3
        if (config.endpoint.ends_with("v1/completions")) {
179
0
            static constexpr std::string_view legacy_suffix = "v1/completions";
180
0
            config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
181
0
                                    legacy_suffix.size(), "v1/chat/completions");
182
0
        }
183
3
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_20FunctionAIFixGrammarEE18normalize_endpointERNS_10AIResourceE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_19FunctionAITranslateEE18normalize_endpointERNS_10AIResourceE
_ZN5doris10AIFunctionINS_20FunctionAISimilarityEE18normalize_endpointERNS_10AIResourceE
Line
Count
Source
146
22
    static void normalize_endpoint(AIResource& config) {
147
        // 1. If users configure only the version root like `.../v1` or `.../v1beta`, append
148
        //    `models/<model>:batchEmbedContents` for `embed`, and `models/<model>:generateContent`
149
        //    for other AI scalar functions.
150
        // 2. `:embedContent` -> `:batchEmbedContents`
151
22
        if (iequal(config.provider_type, "GEMINI")) {
152
0
            if (iequal(Derived::name, "embed") && config.endpoint.ends_with(":embedContent")) {
153
0
                static constexpr std::string_view legacy_suffix = ":embedContent";
154
0
                config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
155
0
                                        legacy_suffix.size(), ":batchEmbedContents");
156
0
                return;
157
0
            }
158
159
0
            if (!config.endpoint.ends_with("v1") && !config.endpoint.ends_with("v1beta")) {
160
0
                return;
161
0
            }
162
163
0
            std::string model_name = config.model_name;
164
0
            if (!model_name.starts_with("models/")) {
165
0
                model_name = "models/" + model_name;
166
0
            }
167
168
0
            config.endpoint += "/";
169
0
            config.endpoint += model_name;
170
0
            config.endpoint +=
171
0
                    iequal(Derived::name, "embed") ? ":batchEmbedContents" : ":generateContent";
172
0
            return;
173
0
        }
174
175
        // The endpoint `v1/completions` does not support `system_prompt`.
176
        // To ensure a clear structure and stable AI results.
177
        // Convert from `v1/completions` to `v1/chat/completions`
178
22
        if (config.endpoint.ends_with("v1/completions")) {
179
0
            static constexpr std::string_view legacy_suffix = "v1/completions";
180
0
            config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
181
0
                                    legacy_suffix.size(), "v1/chat/completions");
182
0
        }
183
22
    }
_ZN5doris10AIFunctionINS_16FunctionAIFilterEE18normalize_endpointERNS_10AIResourceE
Line
Count
Source
146
47
    static void normalize_endpoint(AIResource& config) {
147
        // 1. If users configure only the version root like `.../v1` or `.../v1beta`, append
148
        //    `models/<model>:batchEmbedContents` for `embed`, and `models/<model>:generateContent`
149
        //    for other AI scalar functions.
150
        // 2. `:embedContent` -> `:batchEmbedContents`
151
47
        if (iequal(config.provider_type, "GEMINI")) {
152
0
            if (iequal(Derived::name, "embed") && config.endpoint.ends_with(":embedContent")) {
153
0
                static constexpr std::string_view legacy_suffix = ":embedContent";
154
0
                config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
155
0
                                        legacy_suffix.size(), ":batchEmbedContents");
156
0
                return;
157
0
            }
158
159
0
            if (!config.endpoint.ends_with("v1") && !config.endpoint.ends_with("v1beta")) {
160
0
                return;
161
0
            }
162
163
0
            std::string model_name = config.model_name;
164
0
            if (!model_name.starts_with("models/")) {
165
0
                model_name = "models/" + model_name;
166
0
            }
167
168
0
            config.endpoint += "/";
169
0
            config.endpoint += model_name;
170
0
            config.endpoint +=
171
0
                    iequal(Derived::name, "embed") ? ":batchEmbedContents" : ":generateContent";
172
0
            return;
173
0
        }
174
175
        // The endpoint `v1/completions` does not support `system_prompt`.
176
        // To ensure a clear structure and stable AI results.
177
        // Convert from `v1/completions` to `v1/chat/completions`
178
47
        if (config.endpoint.ends_with("v1/completions")) {
179
0
            static constexpr std::string_view legacy_suffix = "v1/completions";
180
0
            config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
181
0
                                    legacy_suffix.size(), "v1/chat/completions");
182
0
        }
183
47
    }
_ZN5doris10AIFunctionINS_13FunctionEmbedEE18normalize_endpointERNS_10AIResourceE
Line
Count
Source
146
17
    static void normalize_endpoint(AIResource& config) {
147
        // 1. If users configure only the version root like `.../v1` or `.../v1beta`, append
148
        //    `models/<model>:batchEmbedContents` for `embed`, and `models/<model>:generateContent`
149
        //    for other AI scalar functions.
150
        // 2. `:embedContent` -> `:batchEmbedContents`
151
17
        if (iequal(config.provider_type, "GEMINI")) {
152
2
            if (iequal(Derived::name, "embed") && config.endpoint.ends_with(":embedContent")) {
153
1
                static constexpr std::string_view legacy_suffix = ":embedContent";
154
1
                config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
155
1
                                        legacy_suffix.size(), ":batchEmbedContents");
156
1
                return;
157
1
            }
158
159
1
            if (!config.endpoint.ends_with("v1") && !config.endpoint.ends_with("v1beta")) {
160
0
                return;
161
0
            }
162
163
1
            std::string model_name = config.model_name;
164
1
            if (!model_name.starts_with("models/")) {
165
1
                model_name = "models/" + model_name;
166
1
            }
167
168
1
            config.endpoint += "/";
169
1
            config.endpoint += model_name;
170
1
            config.endpoint +=
171
1
                    iequal(Derived::name, "embed") ? ":batchEmbedContents" : ":generateContent";
172
1
            return;
173
1
        }
174
175
        // The endpoint `v1/completions` does not support `system_prompt`.
176
        // To ensure a clear structure and stable AI results.
177
        // Convert from `v1/completions` to `v1/chat/completions`
178
15
        if (config.endpoint.ends_with("v1/completions")) {
179
0
            static constexpr std::string_view legacy_suffix = "v1/completions";
180
0
            config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
181
0
                                    legacy_suffix.size(), "v1/chat/completions");
182
0
        }
183
15
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE18normalize_endpointERNS_10AIResourceE
184
185
473
    static AIRequestExecutor* get_executor(FunctionContext* context) {
186
        // Retain the cache across batches/Blocks, including Blocks with only NULL inputs.
187
473
        auto* executor = static_cast<AIRequestExecutor*>(
188
473
                context->get_function_state(FunctionContext::FunctionStateScope::THREAD_LOCAL));
189
473
        if (executor == nullptr) {
190
61
            auto* runtime_state = context->state();
191
            // Disabled profiles need the connection cache, but no statistics owner.
192
61
            auto statistics = runtime_state->enable_profile()
193
61
                                      ? runtime_state->get_query_ctx()->get_ai_statistics(
194
12
                                                runtime_state->fragment_id())
195
61
                                      : nullptr;
196
61
            auto state = std::make_shared<AIRequestExecutor>(std::move(statistics));
197
61
            executor = state.get();
198
61
            context->set_function_state(FunctionContext::FunctionStateScope::THREAD_LOCAL,
199
61
                                        std::move(state));
200
61
        }
201
473
        return executor;
202
473
    }
_ZN5doris10AIFunctionINS_18FunctionAIClassifyEE12get_executorEPNS_15FunctionContextE
Line
Count
Source
185
8
    static AIRequestExecutor* get_executor(FunctionContext* context) {
186
        // Retain the cache across batches/Blocks, including Blocks with only NULL inputs.
187
8
        auto* executor = static_cast<AIRequestExecutor*>(
188
8
                context->get_function_state(FunctionContext::FunctionStateScope::THREAD_LOCAL));
189
8
        if (executor == nullptr) {
190
2
            auto* runtime_state = context->state();
191
            // Disabled profiles need the connection cache, but no statistics owner.
192
2
            auto statistics = runtime_state->enable_profile()
193
2
                                      ? runtime_state->get_query_ctx()->get_ai_statistics(
194
0
                                                runtime_state->fragment_id())
195
2
                                      : nullptr;
196
2
            auto state = std::make_shared<AIRequestExecutor>(std::move(statistics));
197
2
            executor = state.get();
198
2
            context->set_function_state(FunctionContext::FunctionStateScope::THREAD_LOCAL,
199
2
                                        std::move(state));
200
2
        }
201
8
        return executor;
202
8
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_17FunctionAIExtractEE12get_executorEPNS_15FunctionContextE
_ZN5doris10AIFunctionINS_19FunctionAISentimentEE12get_executorEPNS_15FunctionContextE
Line
Count
Source
185
10
    static AIRequestExecutor* get_executor(FunctionContext* context) {
186
        // Retain the cache across batches/Blocks, including Blocks with only NULL inputs.
187
10
        auto* executor = static_cast<AIRequestExecutor*>(
188
10
                context->get_function_state(FunctionContext::FunctionStateScope::THREAD_LOCAL));
189
10
        if (executor == nullptr) {
190
5
            auto* runtime_state = context->state();
191
            // Disabled profiles need the connection cache, but no statistics owner.
192
5
            auto statistics = runtime_state->enable_profile()
193
5
                                      ? runtime_state->get_query_ctx()->get_ai_statistics(
194
0
                                                runtime_state->fragment_id())
195
5
                                      : nullptr;
196
5
            auto state = std::make_shared<AIRequestExecutor>(std::move(statistics));
197
5
            executor = state.get();
198
5
            context->set_function_state(FunctionContext::FunctionStateScope::THREAD_LOCAL,
199
5
                                        std::move(state));
200
5
        }
201
10
        return executor;
202
10
    }
_ZN5doris10AIFunctionINS_19FunctionAISummarizeEE12get_executorEPNS_15FunctionContextE
Line
Count
Source
185
50
    static AIRequestExecutor* get_executor(FunctionContext* context) {
186
        // Retain the cache across batches/Blocks, including Blocks with only NULL inputs.
187
50
        auto* executor = static_cast<AIRequestExecutor*>(
188
50
                context->get_function_state(FunctionContext::FunctionStateScope::THREAD_LOCAL));
189
50
        if (executor == nullptr) {
190
4
            auto* runtime_state = context->state();
191
            // Disabled profiles need the connection cache, but no statistics owner.
192
4
            auto statistics = runtime_state->enable_profile()
193
4
                                      ? runtime_state->get_query_ctx()->get_ai_statistics(
194
3
                                                runtime_state->fragment_id())
195
4
                                      : nullptr;
196
4
            auto state = std::make_shared<AIRequestExecutor>(std::move(statistics));
197
4
            executor = state.get();
198
4
            context->set_function_state(FunctionContext::FunctionStateScope::THREAD_LOCAL,
199
4
                                        std::move(state));
200
4
        }
201
50
        return executor;
202
50
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_14FunctionAIMaskEE12get_executorEPNS_15FunctionContextE
_ZN5doris10AIFunctionINS_18FunctionAIGenerateEE12get_executorEPNS_15FunctionContextE
Line
Count
Source
185
11
    static AIRequestExecutor* get_executor(FunctionContext* context) {
186
        // Retain the cache across batches/Blocks, including Blocks with only NULL inputs.
187
11
        auto* executor = static_cast<AIRequestExecutor*>(
188
11
                context->get_function_state(FunctionContext::FunctionStateScope::THREAD_LOCAL));
189
11
        if (executor == nullptr) {
190
4
            auto* runtime_state = context->state();
191
            // Disabled profiles need the connection cache, but no statistics owner.
192
4
            auto statistics = runtime_state->enable_profile()
193
4
                                      ? runtime_state->get_query_ctx()->get_ai_statistics(
194
2
                                                runtime_state->fragment_id())
195
4
                                      : nullptr;
196
4
            auto state = std::make_shared<AIRequestExecutor>(std::move(statistics));
197
4
            executor = state.get();
198
4
            context->set_function_state(FunctionContext::FunctionStateScope::THREAD_LOCAL,
199
4
                                        std::move(state));
200
4
        }
201
11
        return executor;
202
11
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_20FunctionAIFixGrammarEE12get_executorEPNS_15FunctionContextE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_19FunctionAITranslateEE12get_executorEPNS_15FunctionContextE
_ZN5doris10AIFunctionINS_20FunctionAISimilarityEE12get_executorEPNS_15FunctionContextE
Line
Count
Source
185
88
    static AIRequestExecutor* get_executor(FunctionContext* context) {
186
        // Retain the cache across batches/Blocks, including Blocks with only NULL inputs.
187
88
        auto* executor = static_cast<AIRequestExecutor*>(
188
88
                context->get_function_state(FunctionContext::FunctionStateScope::THREAD_LOCAL));
189
88
        if (executor == nullptr) {
190
5
            auto* runtime_state = context->state();
191
            // Disabled profiles need the connection cache, but no statistics owner.
192
5
            auto statistics = runtime_state->enable_profile()
193
5
                                      ? runtime_state->get_query_ctx()->get_ai_statistics(
194
2
                                                runtime_state->fragment_id())
195
5
                                      : nullptr;
196
5
            auto state = std::make_shared<AIRequestExecutor>(std::move(statistics));
197
5
            executor = state.get();
198
5
            context->set_function_state(FunctionContext::FunctionStateScope::THREAD_LOCAL,
199
5
                                        std::move(state));
200
5
        }
201
88
        return executor;
202
88
    }
_ZN5doris10AIFunctionINS_16FunctionAIFilterEE12get_executorEPNS_15FunctionContextE
Line
Count
Source
185
190
    static AIRequestExecutor* get_executor(FunctionContext* context) {
186
        // Retain the cache across batches/Blocks, including Blocks with only NULL inputs.
187
190
        auto* executor = static_cast<AIRequestExecutor*>(
188
190
                context->get_function_state(FunctionContext::FunctionStateScope::THREAD_LOCAL));
189
190
        if (executor == nullptr) {
190
13
            auto* runtime_state = context->state();
191
            // Disabled profiles need the connection cache, but no statistics owner.
192
13
            auto statistics = runtime_state->enable_profile()
193
13
                                      ? runtime_state->get_query_ctx()->get_ai_statistics(
194
0
                                                runtime_state->fragment_id())
195
13
                                      : nullptr;
196
13
            auto state = std::make_shared<AIRequestExecutor>(std::move(statistics));
197
13
            executor = state.get();
198
13
            context->set_function_state(FunctionContext::FunctionStateScope::THREAD_LOCAL,
199
13
                                        std::move(state));
200
13
        }
201
190
        return executor;
202
190
    }
_ZN5doris10AIFunctionINS_13FunctionEmbedEE12get_executorEPNS_15FunctionContextE
Line
Count
Source
185
112
    static AIRequestExecutor* get_executor(FunctionContext* context) {
186
        // Retain the cache across batches/Blocks, including Blocks with only NULL inputs.
187
112
        auto* executor = static_cast<AIRequestExecutor*>(
188
112
                context->get_function_state(FunctionContext::FunctionStateScope::THREAD_LOCAL));
189
112
        if (executor == nullptr) {
190
26
            auto* runtime_state = context->state();
191
            // Disabled profiles need the connection cache, but no statistics owner.
192
26
            auto statistics = runtime_state->enable_profile()
193
26
                                      ? runtime_state->get_query_ctx()->get_ai_statistics(
194
5
                                                runtime_state->fragment_id())
195
26
                                      : nullptr;
196
26
            auto state = std::make_shared<AIRequestExecutor>(std::move(statistics));
197
26
            executor = state.get();
198
26
            context->set_function_state(FunctionContext::FunctionStateScope::THREAD_LOCAL,
199
26
                                        std::move(state));
200
26
        }
201
112
        return executor;
202
112
    }
_ZN5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE12get_executorEPNS_15FunctionContextE
Line
Count
Source
185
4
    static AIRequestExecutor* get_executor(FunctionContext* context) {
186
        // Retain the cache across batches/Blocks, including Blocks with only NULL inputs.
187
4
        auto* executor = static_cast<AIRequestExecutor*>(
188
4
                context->get_function_state(FunctionContext::FunctionStateScope::THREAD_LOCAL));
189
4
        if (executor == nullptr) {
190
2
            auto* runtime_state = context->state();
191
            // Disabled profiles need the connection cache, but no statistics owner.
192
2
            auto statistics = runtime_state->enable_profile()
193
2
                                      ? runtime_state->get_query_ctx()->get_ai_statistics(
194
0
                                                runtime_state->fragment_id())
195
2
                                      : nullptr;
196
2
            auto state = std::make_shared<AIRequestExecutor>(std::move(statistics));
197
2
            executor = state.get();
198
2
            context->set_function_state(FunctionContext::FunctionStateScope::THREAD_LOCAL,
199
2
                                        std::move(state));
200
2
        }
201
4
        return executor;
202
4
    }
203
204
    static void record_input(FunctionContext* context, size_t rows,
205
110
                             const ColumnUInt8::MutablePtr& null_map) {
206
110
        if (const auto& statistics = get_executor(context)->statistics()) {
207
27
            const int64_t skipped = null_map ? std::count_if(null_map->get_data().begin(),
208
16
                                                             null_map->get_data().end(),
209
49
                                                             [](UInt8 value) { return value != 0; })
_ZZN5doris10AIFunctionINS_19FunctionAISummarizeEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEEENKUlhE_clEh
Line
Count
Source
209
17
                                                             [](UInt8 value) { return value != 0; })
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_19FunctionAISentimentEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEEENKUlhE_clEh
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_14FunctionAIMaskEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEEENKUlhE_clEh
_ZZN5doris10AIFunctionINS_18FunctionAIGenerateEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEEENKUlhE_clEh
Line
Count
Source
209
1
                                                             [](UInt8 value) { return value != 0; })
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_20FunctionAIFixGrammarEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEEENKUlhE_clEh
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_17FunctionAIExtractEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEEENKUlhE_clEh
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_18FunctionAIClassifyEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEEENKUlhE_clEh
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_19FunctionAITranslateEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEEENKUlhE_clEh
_ZZN5doris10AIFunctionINS_20FunctionAISimilarityEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEEENKUlhE_clEh
Line
Count
Source
209
4
                                                             [](UInt8 value) { return value != 0; })
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_16FunctionAIFilterEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEEENKUlhE_clEh
_ZZN5doris10AIFunctionINS_13FunctionEmbedEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEEENKUlhE_clEh
Line
Count
Source
209
27
                                                             [](UInt8 value) { return value != 0; })
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEEENKUlhE_clEh
210
27
                                             : 0;
211
27
            statistics->record_input(rows, skipped);
212
27
        }
213
110
    }
_ZN5doris10AIFunctionINS_18FunctionAIClassifyEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEE
Line
Count
Source
205
2
                             const ColumnUInt8::MutablePtr& null_map) {
206
2
        if (const auto& statistics = get_executor(context)->statistics()) {
207
0
            const int64_t skipped = null_map ? std::count_if(null_map->get_data().begin(),
208
0
                                                             null_map->get_data().end(),
209
0
                                                             [](UInt8 value) { return value != 0; })
210
0
                                             : 0;
211
0
            statistics->record_input(rows, skipped);
212
0
        }
213
2
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_17FunctionAIExtractEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEE
_ZN5doris10AIFunctionINS_19FunctionAISentimentEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEE
Line
Count
Source
205
2
                             const ColumnUInt8::MutablePtr& null_map) {
206
2
        if (const auto& statistics = get_executor(context)->statistics()) {
207
0
            const int64_t skipped = null_map ? std::count_if(null_map->get_data().begin(),
208
0
                                                             null_map->get_data().end(),
209
0
                                                             [](UInt8 value) { return value != 0; })
210
0
                                             : 0;
211
0
            statistics->record_input(rows, skipped);
212
0
        }
213
2
    }
_ZN5doris10AIFunctionINS_19FunctionAISummarizeEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEE
Line
Count
Source
205
6
                             const ColumnUInt8::MutablePtr& null_map) {
206
6
        if (const auto& statistics = get_executor(context)->statistics()) {
207
6
            const int64_t skipped = null_map ? std::count_if(null_map->get_data().begin(),
208
6
                                                             null_map->get_data().end(),
209
6
                                                             [](UInt8 value) { return value != 0; })
210
6
                                             : 0;
211
6
            statistics->record_input(rows, skipped);
212
6
        }
213
6
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_14FunctionAIMaskEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEE
_ZN5doris10AIFunctionINS_18FunctionAIGenerateEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEE
Line
Count
Source
205
3
                             const ColumnUInt8::MutablePtr& null_map) {
206
3
        if (const auto& statistics = get_executor(context)->statistics()) {
207
1
            const int64_t skipped = null_map ? std::count_if(null_map->get_data().begin(),
208
1
                                                             null_map->get_data().end(),
209
1
                                                             [](UInt8 value) { return value != 0; })
210
1
                                             : 0;
211
1
            statistics->record_input(rows, skipped);
212
1
        }
213
3
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_20FunctionAIFixGrammarEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_19FunctionAITranslateEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEE
_ZN5doris10AIFunctionINS_20FunctionAISimilarityEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEE
Line
Count
Source
205
22
                             const ColumnUInt8::MutablePtr& null_map) {
206
22
        if (const auto& statistics = get_executor(context)->statistics()) {
207
7
            const int64_t skipped = null_map ? std::count_if(null_map->get_data().begin(),
208
1
                                                             null_map->get_data().end(),
209
1
                                                             [](UInt8 value) { return value != 0; })
210
7
                                             : 0;
211
7
            statistics->record_input(rows, skipped);
212
7
        }
213
22
    }
_ZN5doris10AIFunctionINS_16FunctionAIFilterEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEE
Line
Count
Source
205
47
                             const ColumnUInt8::MutablePtr& null_map) {
206
47
        if (const auto& statistics = get_executor(context)->statistics()) {
207
0
            const int64_t skipped = null_map ? std::count_if(null_map->get_data().begin(),
208
0
                                                             null_map->get_data().end(),
209
0
                                                             [](UInt8 value) { return value != 0; })
210
0
                                             : 0;
211
0
            statistics->record_input(rows, skipped);
212
0
        }
213
47
    }
_ZN5doris10AIFunctionINS_13FunctionEmbedEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEE
Line
Count
Source
205
28
                             const ColumnUInt8::MutablePtr& null_map) {
206
28
        if (const auto& statistics = get_executor(context)->statistics()) {
207
13
            const int64_t skipped = null_map ? std::count_if(null_map->get_data().begin(),
208
8
                                                             null_map->get_data().end(),
209
8
                                                             [](UInt8 value) { return value != 0; })
210
13
                                             : 0;
211
13
            statistics->record_input(rows, skipped);
212
13
        }
213
28
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE12record_inputEPNS_15FunctionContextEmRKNS_3COWINS_7IColumnEE11mutable_ptrINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEE
214
215
    Status send_request_to_llm(const std::string& request_body, std::string& response,
216
                               const AIResource& config, std::shared_ptr<AIAdapter>& adapter,
217
62
                               FunctionContext* context) const {
218
62
        return get_executor(context)->execute(request_body, response, config, *adapter,
219
62
                                              context->state()->get_query_ctx());
220
62
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
_ZNK5doris10AIFunctionINS_19FunctionAISentimentEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Line
Count
Source
217
3
                               FunctionContext* context) const {
218
3
        return get_executor(context)->execute(request_body, response, config, *adapter,
219
3
                                              context->state()->get_query_ctx());
220
3
    }
_ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Line
Count
Source
217
20
                               FunctionContext* context) const {
218
20
        return get_executor(context)->execute(request_body, response, config, *adapter,
219
20
                                              context->state()->get_query_ctx());
220
20
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_16FunctionAIFilterEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
_ZNK5doris10AIFunctionINS_13FunctionEmbedEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Line
Count
Source
217
37
                               FunctionContext* context) const {
218
37
        return get_executor(context)->execute(request_body, response, config, *adapter,
219
37
                                              context->state()->get_query_ctx());
220
37
    }
_ZNK5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Line
Count
Source
217
2
                               FunctionContext* context) const {
218
2
        return get_executor(context)->execute(request_body, response, config, *adapter,
219
2
                                              context->state()->get_query_ctx());
220
2
    }
221
222
    // Provider-reusable helper for string-returning functions.
223
    // Estimates one batch entry size using the raw prompt length plus the fixed JSON wrapper cost.
224
110
    size_t estimate_batch_entry_size(size_t idx, const std::string& prompt) const {
225
110
        static constexpr size_t json_wrapper_size = 20;
226
110
        return prompt.size() + std::to_string(idx).size() + json_wrapper_size;
227
110
    }
_ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE25estimate_batch_entry_sizeEmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
224
2
    size_t estimate_batch_entry_size(size_t idx, const std::string& prompt) const {
225
2
        static constexpr size_t json_wrapper_size = 20;
226
2
        return prompt.size() + std::to_string(idx).size() + json_wrapper_size;
227
2
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE25estimate_batch_entry_sizeEmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
_ZNK5doris10AIFunctionINS_19FunctionAISentimentEE25estimate_batch_entry_sizeEmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
224
4
    size_t estimate_batch_entry_size(size_t idx, const std::string& prompt) const {
225
4
        static constexpr size_t json_wrapper_size = 20;
226
4
        return prompt.size() + std::to_string(idx).size() + json_wrapper_size;
227
4
    }
_ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE25estimate_batch_entry_sizeEmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
224
10
    size_t estimate_batch_entry_size(size_t idx, const std::string& prompt) const {
225
10
        static constexpr size_t json_wrapper_size = 20;
226
10
        return prompt.size() + std::to_string(idx).size() + json_wrapper_size;
227
10
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE25estimate_batch_entry_sizeEmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
_ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE25estimate_batch_entry_sizeEmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
224
5
    size_t estimate_batch_entry_size(size_t idx, const std::string& prompt) const {
225
5
        static constexpr size_t json_wrapper_size = 20;
226
5
        return prompt.size() + std::to_string(idx).size() + json_wrapper_size;
227
5
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE25estimate_batch_entry_sizeEmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE25estimate_batch_entry_sizeEmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
_ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE25estimate_batch_entry_sizeEmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
224
25
    size_t estimate_batch_entry_size(size_t idx, const std::string& prompt) const {
225
25
        static constexpr size_t json_wrapper_size = 20;
226
25
        return prompt.size() + std::to_string(idx).size() + json_wrapper_size;
227
25
    }
_ZNK5doris10AIFunctionINS_16FunctionAIFilterEE25estimate_batch_entry_sizeEmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
224
64
    size_t estimate_batch_entry_size(size_t idx, const std::string& prompt) const {
225
64
        static constexpr size_t json_wrapper_size = 20;
226
64
        return prompt.size() + std::to_string(idx).size() + json_wrapper_size;
227
64
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE25estimate_batch_entry_sizeEmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
228
229
    // Provider-reusable helper for string-returning functions.
230
    // Executes one batch request and parses the provider result into one string per input row.
231
    Status execute_batch_request(const std::vector<std::string>& batch_prompts,
232
                                 std::vector<std::string>& results, const AIResource& config,
233
                                 std::shared_ptr<AIAdapter>& adapter,
234
96
                                 FunctionContext* context) const {
235
96
#ifdef BE_TEST
236
96
        const char* test_result = std::getenv("AI_TEST_RESULT");
237
96
        if (test_result != nullptr) {
238
78
            const auto& statistics = get_executor(context)->statistics();
239
78
            const auto parse_start = statistics ? MonotonicNanos() : 0;
240
78
            bool parse_failed = true;
241
78
            Defer record_parse([&] {
242
78
                if (statistics) {
243
7
                    statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
244
7
                }
245
78
            });
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_19FunctionAISummarizeEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE_clEv
_ZZNK5doris10AIFunctionINS_19FunctionAISentimentEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE_clEv
Line
Count
Source
241
1
            Defer record_parse([&] {
242
1
                if (statistics) {
243
0
                    statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
244
0
                }
245
1
            });
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_14FunctionAIMaskEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE_clEv
_ZZNK5doris10AIFunctionINS_18FunctionAIGenerateEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE_clEv
Line
Count
Source
241
2
            Defer record_parse([&] {
242
2
                if (statistics) {
243
0
                    statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
244
0
                }
245
2
            });
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE_clEv
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_17FunctionAIExtractEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE_clEv
_ZZNK5doris10AIFunctionINS_18FunctionAIClassifyEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE_clEv
Line
Count
Source
241
2
            Defer record_parse([&] {
242
2
                if (statistics) {
243
0
                    statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
244
0
                }
245
2
            });
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_19FunctionAITranslateEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE_clEv
_ZZNK5doris10AIFunctionINS_20FunctionAISimilarityEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE_clEv
Line
Count
Source
241
22
            Defer record_parse([&] {
242
22
                if (statistics) {
243
7
                    statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
244
7
                }
245
22
            });
_ZZNK5doris10AIFunctionINS_16FunctionAIFilterEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE_clEv
Line
Count
Source
241
51
            Defer record_parse([&] {
242
51
                if (statistics) {
243
0
                    statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
244
0
                }
245
51
            });
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE_clEv
246
78
            std::vector<std::string> parsed_test_response;
247
78
            RETURN_IF_ERROR(
248
78
                    adapter->parse_response(std::string(test_result), parsed_test_response));
249
77
            if (parsed_test_response.empty()) {
250
0
                return Status::InternalError("AI returned empty result");
251
0
            }
252
77
            if (parsed_test_response.size() != batch_prompts.size()) {
253
5
                return Status::RuntimeError(
254
5
                        "Failed to parse {} batch result, expected {} items but got {}", get_name(),
255
5
                        batch_prompts.size(), parsed_test_response.size());
256
5
            }
257
72
            results = std::move(parsed_test_response);
258
72
            parse_failed = false;
259
72
            return Status::OK();
260
77
        }
261
18
        if (config.provider_type == "MOCK") {
262
1
            results.clear();
263
1
            results.reserve(batch_prompts.size());
264
1
            for (const auto& prompt : batch_prompts) {
265
1
                results.emplace_back("this is a mock response. " + prompt);
266
1
            }
267
1
            return Status::OK();
268
1
        }
269
17
#endif
270
271
17
        std::string batch_prompt;
272
17
        RETURN_IF_ERROR(build_batch_prompt(batch_prompts, batch_prompt));
273
274
17
        std::vector<std::string> inputs = {batch_prompt};
275
17
        std::vector<std::string> parsed_response;
276
277
17
        std::string request_body;
278
17
        RETURN_IF_ERROR(adapter->build_request_payload(
279
17
                inputs, assert_cast<const Derived&>(*this).system_prompt, request_body));
280
281
17
        std::string response;
282
17
        RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
283
16
        const auto& statistics = get_executor(context)->statistics();
284
16
        const auto parse_start = statistics ? MonotonicNanos() : 0;
285
16
        bool parse_failed = true;
286
16
        Defer record_parse([&] {
287
16
            if (statistics) {
288
14
                statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
289
14
            }
290
16
        });
_ZZNK5doris10AIFunctionINS_19FunctionAISummarizeEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE0_clEv
Line
Count
Source
286
14
        Defer record_parse([&] {
287
14
            if (statistics) {
288
14
                statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
289
14
            }
290
14
        });
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_19FunctionAISentimentEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE0_clEv
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_14FunctionAIMaskEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE0_clEv
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_18FunctionAIGenerateEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE0_clEv
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE0_clEv
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_17FunctionAIExtractEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE0_clEv
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_18FunctionAIClassifyEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE0_clEv
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_19FunctionAITranslateEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE0_clEv
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_20FunctionAISimilarityEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE0_clEv
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_16FunctionAIFilterEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE0_clEv
_ZZNK5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlvE0_clEv
Line
Count
Source
286
2
        Defer record_parse([&] {
287
2
            if (statistics) {
288
0
                statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
289
0
            }
290
2
        });
291
16
        RETURN_IF_ERROR(adapter->parse_response(response, parsed_response));
292
15
        if (parsed_response.empty()) {
293
1
            return Status::InternalError("AI returned empty result");
294
1
        }
295
14
        if (parsed_response.size() != batch_prompts.size()) {
296
2
            LOG(WARNING) << "AI batch result size mismatch, function=" << get_name()
297
2
                         << ", provider=" << config.provider_type << ", model=" << config.model_name
298
2
                         << ", expected_rows=" << batch_prompts.size()
299
2
                         << ", actual_rows=" << parsed_response.size()
300
2
                         << ", response_body=" << response;
301
2
            return Status::RuntimeError(
302
2
                    "Failed to parse {} batch result, expected {} items but got {}", get_name(),
303
2
                    batch_prompts.size(), parsed_response.size());
304
2
        }
305
12
        results = std::move(parsed_response);
306
12
        parse_failed = false;
307
12
        return Status::OK();
308
14
    }
_ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Line
Count
Source
234
2
                                 FunctionContext* context) const {
235
2
#ifdef BE_TEST
236
2
        const char* test_result = std::getenv("AI_TEST_RESULT");
237
2
        if (test_result != nullptr) {
238
2
            const auto& statistics = get_executor(context)->statistics();
239
2
            const auto parse_start = statistics ? MonotonicNanos() : 0;
240
2
            bool parse_failed = true;
241
2
            Defer record_parse([&] {
242
2
                if (statistics) {
243
2
                    statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
244
2
                }
245
2
            });
246
2
            std::vector<std::string> parsed_test_response;
247
2
            RETURN_IF_ERROR(
248
2
                    adapter->parse_response(std::string(test_result), parsed_test_response));
249
2
            if (parsed_test_response.empty()) {
250
0
                return Status::InternalError("AI returned empty result");
251
0
            }
252
2
            if (parsed_test_response.size() != batch_prompts.size()) {
253
0
                return Status::RuntimeError(
254
0
                        "Failed to parse {} batch result, expected {} items but got {}", get_name(),
255
0
                        batch_prompts.size(), parsed_test_response.size());
256
0
            }
257
2
            results = std::move(parsed_test_response);
258
2
            parse_failed = false;
259
2
            return Status::OK();
260
2
        }
261
0
        if (config.provider_type == "MOCK") {
262
0
            results.clear();
263
0
            results.reserve(batch_prompts.size());
264
0
            for (const auto& prompt : batch_prompts) {
265
0
                results.emplace_back("this is a mock response. " + prompt);
266
0
            }
267
0
            return Status::OK();
268
0
        }
269
0
#endif
270
271
0
        std::string batch_prompt;
272
0
        RETURN_IF_ERROR(build_batch_prompt(batch_prompts, batch_prompt));
273
274
0
        std::vector<std::string> inputs = {batch_prompt};
275
0
        std::vector<std::string> parsed_response;
276
277
0
        std::string request_body;
278
0
        RETURN_IF_ERROR(adapter->build_request_payload(
279
0
                inputs, assert_cast<const Derived&>(*this).system_prompt, request_body));
280
281
0
        std::string response;
282
0
        RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
283
0
        const auto& statistics = get_executor(context)->statistics();
284
0
        const auto parse_start = statistics ? MonotonicNanos() : 0;
285
0
        bool parse_failed = true;
286
0
        Defer record_parse([&] {
287
0
            if (statistics) {
288
0
                statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
289
0
            }
290
0
        });
291
0
        RETURN_IF_ERROR(adapter->parse_response(response, parsed_response));
292
0
        if (parsed_response.empty()) {
293
0
            return Status::InternalError("AI returned empty result");
294
0
        }
295
0
        if (parsed_response.size() != batch_prompts.size()) {
296
0
            LOG(WARNING) << "AI batch result size mismatch, function=" << get_name()
297
0
                         << ", provider=" << config.provider_type << ", model=" << config.model_name
298
0
                         << ", expected_rows=" << batch_prompts.size()
299
0
                         << ", actual_rows=" << parsed_response.size()
300
0
                         << ", response_body=" << response;
301
0
            return Status::RuntimeError(
302
0
                    "Failed to parse {} batch result, expected {} items but got {}", get_name(),
303
0
                    batch_prompts.size(), parsed_response.size());
304
0
        }
305
0
        results = std::move(parsed_response);
306
0
        parse_failed = false;
307
0
        return Status::OK();
308
0
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
_ZNK5doris10AIFunctionINS_19FunctionAISentimentEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Line
Count
Source
234
2
                                 FunctionContext* context) const {
235
2
#ifdef BE_TEST
236
2
        const char* test_result = std::getenv("AI_TEST_RESULT");
237
2
        if (test_result != nullptr) {
238
1
            const auto& statistics = get_executor(context)->statistics();
239
1
            const auto parse_start = statistics ? MonotonicNanos() : 0;
240
1
            bool parse_failed = true;
241
1
            Defer record_parse([&] {
242
1
                if (statistics) {
243
1
                    statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
244
1
                }
245
1
            });
246
1
            std::vector<std::string> parsed_test_response;
247
1
            RETURN_IF_ERROR(
248
1
                    adapter->parse_response(std::string(test_result), parsed_test_response));
249
1
            if (parsed_test_response.empty()) {
250
0
                return Status::InternalError("AI returned empty result");
251
0
            }
252
1
            if (parsed_test_response.size() != batch_prompts.size()) {
253
0
                return Status::RuntimeError(
254
0
                        "Failed to parse {} batch result, expected {} items but got {}", get_name(),
255
0
                        batch_prompts.size(), parsed_test_response.size());
256
0
            }
257
1
            results = std::move(parsed_test_response);
258
1
            parse_failed = false;
259
1
            return Status::OK();
260
1
        }
261
1
        if (config.provider_type == "MOCK") {
262
1
            results.clear();
263
1
            results.reserve(batch_prompts.size());
264
1
            for (const auto& prompt : batch_prompts) {
265
1
                results.emplace_back("this is a mock response. " + prompt);
266
1
            }
267
1
            return Status::OK();
268
1
        }
269
0
#endif
270
271
0
        std::string batch_prompt;
272
0
        RETURN_IF_ERROR(build_batch_prompt(batch_prompts, batch_prompt));
273
274
0
        std::vector<std::string> inputs = {batch_prompt};
275
0
        std::vector<std::string> parsed_response;
276
277
0
        std::string request_body;
278
0
        RETURN_IF_ERROR(adapter->build_request_payload(
279
0
                inputs, assert_cast<const Derived&>(*this).system_prompt, request_body));
280
281
0
        std::string response;
282
0
        RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
283
0
        const auto& statistics = get_executor(context)->statistics();
284
0
        const auto parse_start = statistics ? MonotonicNanos() : 0;
285
0
        bool parse_failed = true;
286
0
        Defer record_parse([&] {
287
0
            if (statistics) {
288
0
                statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
289
0
            }
290
0
        });
291
0
        RETURN_IF_ERROR(adapter->parse_response(response, parsed_response));
292
0
        if (parsed_response.empty()) {
293
0
            return Status::InternalError("AI returned empty result");
294
0
        }
295
0
        if (parsed_response.size() != batch_prompts.size()) {
296
0
            LOG(WARNING) << "AI batch result size mismatch, function=" << get_name()
297
0
                         << ", provider=" << config.provider_type << ", model=" << config.model_name
298
0
                         << ", expected_rows=" << batch_prompts.size()
299
0
                         << ", actual_rows=" << parsed_response.size()
300
0
                         << ", response_body=" << response;
301
0
            return Status::RuntimeError(
302
0
                    "Failed to parse {} batch result, expected {} items but got {}", get_name(),
303
0
                    batch_prompts.size(), parsed_response.size());
304
0
        }
305
0
        results = std::move(parsed_response);
306
0
        parse_failed = false;
307
0
        return Status::OK();
308
0
    }
_ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Line
Count
Source
234
15
                                 FunctionContext* context) const {
235
15
#ifdef BE_TEST
236
15
        const char* test_result = std::getenv("AI_TEST_RESULT");
237
15
        if (test_result != nullptr) {
238
0
            const auto& statistics = get_executor(context)->statistics();
239
0
            const auto parse_start = statistics ? MonotonicNanos() : 0;
240
0
            bool parse_failed = true;
241
0
            Defer record_parse([&] {
242
0
                if (statistics) {
243
0
                    statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
244
0
                }
245
0
            });
246
0
            std::vector<std::string> parsed_test_response;
247
0
            RETURN_IF_ERROR(
248
0
                    adapter->parse_response(std::string(test_result), parsed_test_response));
249
0
            if (parsed_test_response.empty()) {
250
0
                return Status::InternalError("AI returned empty result");
251
0
            }
252
0
            if (parsed_test_response.size() != batch_prompts.size()) {
253
0
                return Status::RuntimeError(
254
0
                        "Failed to parse {} batch result, expected {} items but got {}", get_name(),
255
0
                        batch_prompts.size(), parsed_test_response.size());
256
0
            }
257
0
            results = std::move(parsed_test_response);
258
0
            parse_failed = false;
259
0
            return Status::OK();
260
0
        }
261
15
        if (config.provider_type == "MOCK") {
262
0
            results.clear();
263
0
            results.reserve(batch_prompts.size());
264
0
            for (const auto& prompt : batch_prompts) {
265
0
                results.emplace_back("this is a mock response. " + prompt);
266
0
            }
267
0
            return Status::OK();
268
0
        }
269
15
#endif
270
271
15
        std::string batch_prompt;
272
15
        RETURN_IF_ERROR(build_batch_prompt(batch_prompts, batch_prompt));
273
274
15
        std::vector<std::string> inputs = {batch_prompt};
275
15
        std::vector<std::string> parsed_response;
276
277
15
        std::string request_body;
278
15
        RETURN_IF_ERROR(adapter->build_request_payload(
279
15
                inputs, assert_cast<const Derived&>(*this).system_prompt, request_body));
280
281
15
        std::string response;
282
15
        RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
283
14
        const auto& statistics = get_executor(context)->statistics();
284
14
        const auto parse_start = statistics ? MonotonicNanos() : 0;
285
14
        bool parse_failed = true;
286
14
        Defer record_parse([&] {
287
14
            if (statistics) {
288
14
                statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
289
14
            }
290
14
        });
291
14
        RETURN_IF_ERROR(adapter->parse_response(response, parsed_response));
292
13
        if (parsed_response.empty()) {
293
1
            return Status::InternalError("AI returned empty result");
294
1
        }
295
12
        if (parsed_response.size() != batch_prompts.size()) {
296
1
            LOG(WARNING) << "AI batch result size mismatch, function=" << get_name()
297
1
                         << ", provider=" << config.provider_type << ", model=" << config.model_name
298
1
                         << ", expected_rows=" << batch_prompts.size()
299
1
                         << ", actual_rows=" << parsed_response.size()
300
1
                         << ", response_body=" << response;
301
1
            return Status::RuntimeError(
302
1
                    "Failed to parse {} batch result, expected {} items but got {}", get_name(),
303
1
                    batch_prompts.size(), parsed_response.size());
304
1
        }
305
11
        results = std::move(parsed_response);
306
11
        parse_failed = false;
307
11
        return Status::OK();
308
12
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
_ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Line
Count
Source
234
2
                                 FunctionContext* context) const {
235
2
#ifdef BE_TEST
236
2
        const char* test_result = std::getenv("AI_TEST_RESULT");
237
2
        if (test_result != nullptr) {
238
2
            const auto& statistics = get_executor(context)->statistics();
239
2
            const auto parse_start = statistics ? MonotonicNanos() : 0;
240
2
            bool parse_failed = true;
241
2
            Defer record_parse([&] {
242
2
                if (statistics) {
243
2
                    statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
244
2
                }
245
2
            });
246
2
            std::vector<std::string> parsed_test_response;
247
2
            RETURN_IF_ERROR(
248
2
                    adapter->parse_response(std::string(test_result), parsed_test_response));
249
2
            if (parsed_test_response.empty()) {
250
0
                return Status::InternalError("AI returned empty result");
251
0
            }
252
2
            if (parsed_test_response.size() != batch_prompts.size()) {
253
0
                return Status::RuntimeError(
254
0
                        "Failed to parse {} batch result, expected {} items but got {}", get_name(),
255
0
                        batch_prompts.size(), parsed_test_response.size());
256
0
            }
257
2
            results = std::move(parsed_test_response);
258
2
            parse_failed = false;
259
2
            return Status::OK();
260
2
        }
261
0
        if (config.provider_type == "MOCK") {
262
0
            results.clear();
263
0
            results.reserve(batch_prompts.size());
264
0
            for (const auto& prompt : batch_prompts) {
265
0
                results.emplace_back("this is a mock response. " + prompt);
266
0
            }
267
0
            return Status::OK();
268
0
        }
269
0
#endif
270
271
0
        std::string batch_prompt;
272
0
        RETURN_IF_ERROR(build_batch_prompt(batch_prompts, batch_prompt));
273
274
0
        std::vector<std::string> inputs = {batch_prompt};
275
0
        std::vector<std::string> parsed_response;
276
277
0
        std::string request_body;
278
0
        RETURN_IF_ERROR(adapter->build_request_payload(
279
0
                inputs, assert_cast<const Derived&>(*this).system_prompt, request_body));
280
281
0
        std::string response;
282
0
        RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
283
0
        const auto& statistics = get_executor(context)->statistics();
284
0
        const auto parse_start = statistics ? MonotonicNanos() : 0;
285
0
        bool parse_failed = true;
286
0
        Defer record_parse([&] {
287
0
            if (statistics) {
288
0
                statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
289
0
            }
290
0
        });
291
0
        RETURN_IF_ERROR(adapter->parse_response(response, parsed_response));
292
0
        if (parsed_response.empty()) {
293
0
            return Status::InternalError("AI returned empty result");
294
0
        }
295
0
        if (parsed_response.size() != batch_prompts.size()) {
296
0
            LOG(WARNING) << "AI batch result size mismatch, function=" << get_name()
297
0
                         << ", provider=" << config.provider_type << ", model=" << config.model_name
298
0
                         << ", expected_rows=" << batch_prompts.size()
299
0
                         << ", actual_rows=" << parsed_response.size()
300
0
                         << ", response_body=" << response;
301
0
            return Status::RuntimeError(
302
0
                    "Failed to parse {} batch result, expected {} items but got {}", get_name(),
303
0
                    batch_prompts.size(), parsed_response.size());
304
0
        }
305
0
        results = std::move(parsed_response);
306
0
        parse_failed = false;
307
0
        return Status::OK();
308
0
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
_ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Line
Count
Source
234
22
                                 FunctionContext* context) const {
235
22
#ifdef BE_TEST
236
22
        const char* test_result = std::getenv("AI_TEST_RESULT");
237
22
        if (test_result != nullptr) {
238
22
            const auto& statistics = get_executor(context)->statistics();
239
22
            const auto parse_start = statistics ? MonotonicNanos() : 0;
240
22
            bool parse_failed = true;
241
22
            Defer record_parse([&] {
242
22
                if (statistics) {
243
22
                    statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
244
22
                }
245
22
            });
246
22
            std::vector<std::string> parsed_test_response;
247
22
            RETURN_IF_ERROR(
248
22
                    adapter->parse_response(std::string(test_result), parsed_test_response));
249
22
            if (parsed_test_response.empty()) {
250
0
                return Status::InternalError("AI returned empty result");
251
0
            }
252
22
            if (parsed_test_response.size() != batch_prompts.size()) {
253
0
                return Status::RuntimeError(
254
0
                        "Failed to parse {} batch result, expected {} items but got {}", get_name(),
255
0
                        batch_prompts.size(), parsed_test_response.size());
256
0
            }
257
22
            results = std::move(parsed_test_response);
258
22
            parse_failed = false;
259
22
            return Status::OK();
260
22
        }
261
0
        if (config.provider_type == "MOCK") {
262
0
            results.clear();
263
0
            results.reserve(batch_prompts.size());
264
0
            for (const auto& prompt : batch_prompts) {
265
0
                results.emplace_back("this is a mock response. " + prompt);
266
0
            }
267
0
            return Status::OK();
268
0
        }
269
0
#endif
270
271
0
        std::string batch_prompt;
272
0
        RETURN_IF_ERROR(build_batch_prompt(batch_prompts, batch_prompt));
273
274
0
        std::vector<std::string> inputs = {batch_prompt};
275
0
        std::vector<std::string> parsed_response;
276
277
0
        std::string request_body;
278
0
        RETURN_IF_ERROR(adapter->build_request_payload(
279
0
                inputs, assert_cast<const Derived&>(*this).system_prompt, request_body));
280
281
0
        std::string response;
282
0
        RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
283
0
        const auto& statistics = get_executor(context)->statistics();
284
0
        const auto parse_start = statistics ? MonotonicNanos() : 0;
285
0
        bool parse_failed = true;
286
0
        Defer record_parse([&] {
287
0
            if (statistics) {
288
0
                statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
289
0
            }
290
0
        });
291
0
        RETURN_IF_ERROR(adapter->parse_response(response, parsed_response));
292
0
        if (parsed_response.empty()) {
293
0
            return Status::InternalError("AI returned empty result");
294
0
        }
295
0
        if (parsed_response.size() != batch_prompts.size()) {
296
0
            LOG(WARNING) << "AI batch result size mismatch, function=" << get_name()
297
0
                         << ", provider=" << config.provider_type << ", model=" << config.model_name
298
0
                         << ", expected_rows=" << batch_prompts.size()
299
0
                         << ", actual_rows=" << parsed_response.size()
300
0
                         << ", response_body=" << response;
301
0
            return Status::RuntimeError(
302
0
                    "Failed to parse {} batch result, expected {} items but got {}", get_name(),
303
0
                    batch_prompts.size(), parsed_response.size());
304
0
        }
305
0
        results = std::move(parsed_response);
306
0
        parse_failed = false;
307
0
        return Status::OK();
308
0
    }
_ZNK5doris10AIFunctionINS_16FunctionAIFilterEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Line
Count
Source
234
51
                                 FunctionContext* context) const {
235
51
#ifdef BE_TEST
236
51
        const char* test_result = std::getenv("AI_TEST_RESULT");
237
51
        if (test_result != nullptr) {
238
51
            const auto& statistics = get_executor(context)->statistics();
239
51
            const auto parse_start = statistics ? MonotonicNanos() : 0;
240
51
            bool parse_failed = true;
241
51
            Defer record_parse([&] {
242
51
                if (statistics) {
243
51
                    statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
244
51
                }
245
51
            });
246
51
            std::vector<std::string> parsed_test_response;
247
51
            RETURN_IF_ERROR(
248
51
                    adapter->parse_response(std::string(test_result), parsed_test_response));
249
50
            if (parsed_test_response.empty()) {
250
0
                return Status::InternalError("AI returned empty result");
251
0
            }
252
50
            if (parsed_test_response.size() != batch_prompts.size()) {
253
5
                return Status::RuntimeError(
254
5
                        "Failed to parse {} batch result, expected {} items but got {}", get_name(),
255
5
                        batch_prompts.size(), parsed_test_response.size());
256
5
            }
257
45
            results = std::move(parsed_test_response);
258
45
            parse_failed = false;
259
45
            return Status::OK();
260
50
        }
261
0
        if (config.provider_type == "MOCK") {
262
0
            results.clear();
263
0
            results.reserve(batch_prompts.size());
264
0
            for (const auto& prompt : batch_prompts) {
265
0
                results.emplace_back("this is a mock response. " + prompt);
266
0
            }
267
0
            return Status::OK();
268
0
        }
269
0
#endif
270
271
0
        std::string batch_prompt;
272
0
        RETURN_IF_ERROR(build_batch_prompt(batch_prompts, batch_prompt));
273
274
0
        std::vector<std::string> inputs = {batch_prompt};
275
0
        std::vector<std::string> parsed_response;
276
277
0
        std::string request_body;
278
0
        RETURN_IF_ERROR(adapter->build_request_payload(
279
0
                inputs, assert_cast<const Derived&>(*this).system_prompt, request_body));
280
281
0
        std::string response;
282
0
        RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
283
0
        const auto& statistics = get_executor(context)->statistics();
284
0
        const auto parse_start = statistics ? MonotonicNanos() : 0;
285
0
        bool parse_failed = true;
286
0
        Defer record_parse([&] {
287
0
            if (statistics) {
288
0
                statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
289
0
            }
290
0
        });
291
0
        RETURN_IF_ERROR(adapter->parse_response(response, parsed_response));
292
0
        if (parsed_response.empty()) {
293
0
            return Status::InternalError("AI returned empty result");
294
0
        }
295
0
        if (parsed_response.size() != batch_prompts.size()) {
296
0
            LOG(WARNING) << "AI batch result size mismatch, function=" << get_name()
297
0
                         << ", provider=" << config.provider_type << ", model=" << config.model_name
298
0
                         << ", expected_rows=" << batch_prompts.size()
299
0
                         << ", actual_rows=" << parsed_response.size()
300
0
                         << ", response_body=" << response;
301
0
            return Status::RuntimeError(
302
0
                    "Failed to parse {} batch result, expected {} items but got {}", get_name(),
303
0
                    batch_prompts.size(), parsed_response.size());
304
0
        }
305
0
        results = std::move(parsed_response);
306
0
        parse_failed = false;
307
0
        return Status::OK();
308
0
    }
_ZNK5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE21execute_batch_requestERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERSB_RKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Line
Count
Source
234
2
                                 FunctionContext* context) const {
235
2
#ifdef BE_TEST
236
2
        const char* test_result = std::getenv("AI_TEST_RESULT");
237
2
        if (test_result != nullptr) {
238
0
            const auto& statistics = get_executor(context)->statistics();
239
0
            const auto parse_start = statistics ? MonotonicNanos() : 0;
240
0
            bool parse_failed = true;
241
0
            Defer record_parse([&] {
242
0
                if (statistics) {
243
0
                    statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
244
0
                }
245
0
            });
246
0
            std::vector<std::string> parsed_test_response;
247
0
            RETURN_IF_ERROR(
248
0
                    adapter->parse_response(std::string(test_result), parsed_test_response));
249
0
            if (parsed_test_response.empty()) {
250
0
                return Status::InternalError("AI returned empty result");
251
0
            }
252
0
            if (parsed_test_response.size() != batch_prompts.size()) {
253
0
                return Status::RuntimeError(
254
0
                        "Failed to parse {} batch result, expected {} items but got {}", get_name(),
255
0
                        batch_prompts.size(), parsed_test_response.size());
256
0
            }
257
0
            results = std::move(parsed_test_response);
258
0
            parse_failed = false;
259
0
            return Status::OK();
260
0
        }
261
2
        if (config.provider_type == "MOCK") {
262
0
            results.clear();
263
0
            results.reserve(batch_prompts.size());
264
0
            for (const auto& prompt : batch_prompts) {
265
0
                results.emplace_back("this is a mock response. " + prompt);
266
0
            }
267
0
            return Status::OK();
268
0
        }
269
2
#endif
270
271
2
        std::string batch_prompt;
272
2
        RETURN_IF_ERROR(build_batch_prompt(batch_prompts, batch_prompt));
273
274
2
        std::vector<std::string> inputs = {batch_prompt};
275
2
        std::vector<std::string> parsed_response;
276
277
2
        std::string request_body;
278
2
        RETURN_IF_ERROR(adapter->build_request_payload(
279
2
                inputs, assert_cast<const Derived&>(*this).system_prompt, request_body));
280
281
2
        std::string response;
282
2
        RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
283
2
        const auto& statistics = get_executor(context)->statistics();
284
2
        const auto parse_start = statistics ? MonotonicNanos() : 0;
285
2
        bool parse_failed = true;
286
2
        Defer record_parse([&] {
287
2
            if (statistics) {
288
2
                statistics->record_parse(MonotonicNanos() - parse_start, parse_failed);
289
2
            }
290
2
        });
291
2
        RETURN_IF_ERROR(adapter->parse_response(response, parsed_response));
292
2
        if (parsed_response.empty()) {
293
0
            return Status::InternalError("AI returned empty result");
294
0
        }
295
2
        if (parsed_response.size() != batch_prompts.size()) {
296
1
            LOG(WARNING) << "AI batch result size mismatch, function=" << get_name()
297
1
                         << ", provider=" << config.provider_type << ", model=" << config.model_name
298
1
                         << ", expected_rows=" << batch_prompts.size()
299
1
                         << ", actual_rows=" << parsed_response.size()
300
1
                         << ", response_body=" << response;
301
1
            return Status::RuntimeError(
302
1
                    "Failed to parse {} batch result, expected {} items but got {}", get_name(),
303
1
                    batch_prompts.size(), parsed_response.size());
304
1
        }
305
1
        results = std::move(parsed_response);
306
1
        parse_failed = false;
307
1
        return Status::OK();
308
2
    }
309
310
    Status append_results_with_statistics(FunctionContext* context,
311
                                          const std::vector<std::string>& results,
312
83
                                          IColumn& column) const {
313
83
        const auto& statistics = get_executor(context)->statistics();
314
83
        const auto parse_start = statistics ? MonotonicNanos() : 0;
315
83
        Status status = assert_cast<const Derived&>(*this).append_batch_results(results, column);
316
83
        if (statistics) {
317
17
            statistics->record_parse(MonotonicNanos() - parse_start, !status.ok());
318
17
        }
319
83
        return status;
320
83
    }
_ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE30append_results_with_statisticsEPNS_15FunctionContextERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERNS_7IColumnE
Line
Count
Source
312
2
                                          IColumn& column) const {
313
2
        const auto& statistics = get_executor(context)->statistics();
314
2
        const auto parse_start = statistics ? MonotonicNanos() : 0;
315
2
        Status status = assert_cast<const Derived&>(*this).append_batch_results(results, column);
316
2
        if (statistics) {
317
0
            statistics->record_parse(MonotonicNanos() - parse_start, !status.ok());
318
0
        }
319
2
        return status;
320
2
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE30append_results_with_statisticsEPNS_15FunctionContextERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERNS_7IColumnE
_ZNK5doris10AIFunctionINS_19FunctionAISentimentEE30append_results_with_statisticsEPNS_15FunctionContextERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERNS_7IColumnE
Line
Count
Source
312
2
                                          IColumn& column) const {
313
2
        const auto& statistics = get_executor(context)->statistics();
314
2
        const auto parse_start = statistics ? MonotonicNanos() : 0;
315
2
        Status status = assert_cast<const Derived&>(*this).append_batch_results(results, column);
316
2
        if (statistics) {
317
0
            statistics->record_parse(MonotonicNanos() - parse_start, !status.ok());
318
0
        }
319
2
        return status;
320
2
    }
_ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE30append_results_with_statisticsEPNS_15FunctionContextERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERNS_7IColumnE
Line
Count
Source
312
10
                                          IColumn& column) const {
313
10
        const auto& statistics = get_executor(context)->statistics();
314
10
        const auto parse_start = statistics ? MonotonicNanos() : 0;
315
10
        Status status = assert_cast<const Derived&>(*this).append_batch_results(results, column);
316
10
        if (statistics) {
317
10
            statistics->record_parse(MonotonicNanos() - parse_start, !status.ok());
318
10
        }
319
10
        return status;
320
10
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE30append_results_with_statisticsEPNS_15FunctionContextERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERNS_7IColumnE
_ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE30append_results_with_statisticsEPNS_15FunctionContextERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERNS_7IColumnE
Line
Count
Source
312
2
                                          IColumn& column) const {
313
2
        const auto& statistics = get_executor(context)->statistics();
314
2
        const auto parse_start = statistics ? MonotonicNanos() : 0;
315
2
        Status status = assert_cast<const Derived&>(*this).append_batch_results(results, column);
316
2
        if (statistics) {
317
0
            statistics->record_parse(MonotonicNanos() - parse_start, !status.ok());
318
0
        }
319
2
        return status;
320
2
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE30append_results_with_statisticsEPNS_15FunctionContextERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERNS_7IColumnE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE30append_results_with_statisticsEPNS_15FunctionContextERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERNS_7IColumnE
_ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE30append_results_with_statisticsEPNS_15FunctionContextERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERNS_7IColumnE
Line
Count
Source
312
22
                                          IColumn& column) const {
313
22
        const auto& statistics = get_executor(context)->statistics();
314
22
        const auto parse_start = statistics ? MonotonicNanos() : 0;
315
22
        Status status = assert_cast<const Derived&>(*this).append_batch_results(results, column);
316
22
        if (statistics) {
317
7
            statistics->record_parse(MonotonicNanos() - parse_start, !status.ok());
318
7
        }
319
22
        return status;
320
22
    }
_ZNK5doris10AIFunctionINS_16FunctionAIFilterEE30append_results_with_statisticsEPNS_15FunctionContextERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERNS_7IColumnE
Line
Count
Source
312
45
                                          IColumn& column) const {
313
45
        const auto& statistics = get_executor(context)->statistics();
314
45
        const auto parse_start = statistics ? MonotonicNanos() : 0;
315
45
        Status status = assert_cast<const Derived&>(*this).append_batch_results(results, column);
316
45
        if (statistics) {
317
0
            statistics->record_parse(MonotonicNanos() - parse_start, !status.ok());
318
0
        }
319
45
        return status;
320
45
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE30append_results_with_statisticsEPNS_15FunctionContextERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERNS_7IColumnE
321
322
    // Provider-reusable helper for string-returning functions.
323
    // Runs the common batch execution flow; derived classes only need to define how one batch of
324
    // string results is inserted into the final output column.
325
    Status execute(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
326
                   uint32_t result, size_t input_rows_count, const AIResource& config,
327
82
                   std::shared_ptr<AIAdapter>& adapter) const {
328
82
        Columns prompt_columns;
329
82
        prompt_columns.reserve(arguments.size() - 1);
330
82
        ColumnUInt8::MutablePtr result_null_map;
331
188
        for (size_t i = 1; i < arguments.size(); ++i) {
332
106
            const auto& argument = block.get_by_position(arguments[i]);
333
106
            if (argument.type->is_nullable()) {
334
13
                const auto& [column, is_const] = unpack_if_const(argument.column);
335
13
                const auto& nullable =
336
13
                        assert_cast<const ColumnNullable&, TypeCheckOnRelease::DISABLE>(*column);
337
13
                if (!result_null_map) {
338
12
                    result_null_map = ColumnUInt8::create(input_rows_count, 0);
339
12
                }
340
13
                VectorizedUtils::update_null_map(result_null_map->get_data(),
341
13
                                                 nullable.get_null_map_data(), is_const);
342
13
            }
343
106
            prompt_columns.emplace_back(
344
106
                    argument.unnest_nullable(argument.type->is_nullable()
345
106
                                                     ? argument.get_nullable_column_info()
346
106
                                                     : NullableColumnInfo {},
347
106
                                             false)
348
106
                            .column);
349
106
        }
350
351
82
        record_input(context, input_rows_count, result_null_map);
352
353
82
        if (result_null_map &&
354
82
            !simd::contain_zero(result_null_map->get_data().data(), input_rows_count)) {
355
2
            block.get_by_position(result).column =
356
2
                    block.get_by_position(result).type->create_column_const(input_rows_count,
357
2
                                                                            Field());
358
2
            return Status::OK();
359
2
        }
360
361
80
        auto col_result = assert_cast<const Derived&>(*this).create_result_column();
362
80
        std::vector<std::string> batch_prompts;
363
80
        size_t current_batch_size = 2; // []
364
80
        const size_t max_batch_prompt_size =
365
80
                static_cast<size_t>(get_ai_context_window_size(context));
366
80
        const NullMap* null_map = result_null_map ? &result_null_map->get_data() : nullptr;
367
368
204
        for (size_t i = 0; i < input_rows_count; ++i) {
369
124
            if (null_map && (*null_map)[i]) {
370
14
                continue;
371
14
            }
372
373
110
            std::string prompt;
374
110
            RETURN_IF_ERROR(
375
110
                    assert_cast<const Derived&>(*this).build_prompt(prompt_columns, i, prompt));
376
377
110
            size_t entry_size = estimate_batch_entry_size(batch_prompts.size(), prompt);
378
110
            if (entry_size > max_batch_prompt_size) {
379
14
                if (!batch_prompts.empty()) {
380
1
                    std::vector<std::string> batch_results;
381
1
                    RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results,
382
1
                                                                config, adapter, context));
383
1
                    RETURN_IF_ERROR(
384
1
                            append_results_with_statistics(context, batch_results, *col_result));
385
1
                    batch_prompts.clear();
386
1
                    current_batch_size = 2;
387
1
                }
388
389
14
                std::vector<std::string> single_prompts;
390
14
                single_prompts.emplace_back(std::move(prompt));
391
14
                std::vector<std::string> single_results;
392
14
                RETURN_IF_ERROR(this->execute_batch_request(single_prompts, single_results, config,
393
14
                                                            adapter, context));
394
14
                RETURN_IF_ERROR(
395
14
                        append_results_with_statistics(context, single_results, *col_result));
396
14
                continue;
397
14
            }
398
399
96
            size_t additional_size = entry_size + (batch_prompts.empty() ? 0 : 1);
400
96
            if (!batch_prompts.empty() &&
401
96
                current_batch_size + additional_size > max_batch_prompt_size) {
402
2
                std::vector<std::string> batch_results;
403
2
                RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results, config,
404
2
                                                            adapter, context));
405
2
                RETURN_IF_ERROR(
406
2
                        append_results_with_statistics(context, batch_results, *col_result));
407
2
                batch_prompts.clear();
408
2
                current_batch_size = 2;
409
2
                additional_size = entry_size;
410
2
            }
411
412
96
            batch_prompts.emplace_back(std::move(prompt));
413
96
            current_batch_size += additional_size;
414
96
        }
415
416
80
        if (!batch_prompts.empty()) {
417
72
            std::vector<std::string> batch_results;
418
72
            RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results, config,
419
72
                                                        adapter, context));
420
66
            RETURN_IF_ERROR(append_results_with_statistics(context, batch_results, *col_result));
421
66
        }
422
423
47
        if (!result_null_map) {
424
37
            block.replace_by_position(result, std::move(col_result));
425
37
            return Status::OK();
426
37
        }
427
428
10
        if (!simd::contain_one(result_null_map->get_data().data(), input_rows_count)) {
429
1
            block.replace_by_position(result, ColumnNullable::create(std::move(col_result),
430
1
                                                                     std::move(result_null_map)));
431
1
            return Status::OK();
432
1
        }
433
434
9
        auto nested_result = col_result->clone_empty();
435
9
        size_t result_row = 0;
436
31
        for (UInt8 is_null : result_null_map->get_data()) {
437
31
            if (is_null) {
438
14
                nested_result->insert_default();
439
17
            } else {
440
17
                nested_result->insert_from(*col_result, result_row++);
441
17
            }
442
31
        }
443
444
9
        block.replace_by_position(result, ColumnNullable::create(std::move(nested_result),
445
9
                                                                 std::move(result_null_map)));
446
9
        return Status::OK();
447
10
    }
_ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE7executeEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmRKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
Line
Count
Source
327
2
                   std::shared_ptr<AIAdapter>& adapter) const {
328
2
        Columns prompt_columns;
329
2
        prompt_columns.reserve(arguments.size() - 1);
330
2
        ColumnUInt8::MutablePtr result_null_map;
331
6
        for (size_t i = 1; i < arguments.size(); ++i) {
332
4
            const auto& argument = block.get_by_position(arguments[i]);
333
4
            if (argument.type->is_nullable()) {
334
1
                const auto& [column, is_const] = unpack_if_const(argument.column);
335
1
                const auto& nullable =
336
1
                        assert_cast<const ColumnNullable&, TypeCheckOnRelease::DISABLE>(*column);
337
1
                if (!result_null_map) {
338
1
                    result_null_map = ColumnUInt8::create(input_rows_count, 0);
339
1
                }
340
1
                VectorizedUtils::update_null_map(result_null_map->get_data(),
341
1
                                                 nullable.get_null_map_data(), is_const);
342
1
            }
343
4
            prompt_columns.emplace_back(
344
4
                    argument.unnest_nullable(argument.type->is_nullable()
345
4
                                                     ? argument.get_nullable_column_info()
346
4
                                                     : NullableColumnInfo {},
347
4
                                             false)
348
4
                            .column);
349
4
        }
350
351
2
        record_input(context, input_rows_count, result_null_map);
352
353
2
        if (result_null_map &&
354
2
            !simd::contain_zero(result_null_map->get_data().data(), input_rows_count)) {
355
0
            block.get_by_position(result).column =
356
0
                    block.get_by_position(result).type->create_column_const(input_rows_count,
357
0
                                                                            Field());
358
0
            return Status::OK();
359
0
        }
360
361
2
        auto col_result = assert_cast<const Derived&>(*this).create_result_column();
362
2
        std::vector<std::string> batch_prompts;
363
2
        size_t current_batch_size = 2; // []
364
2
        const size_t max_batch_prompt_size =
365
2
                static_cast<size_t>(get_ai_context_window_size(context));
366
2
        const NullMap* null_map = result_null_map ? &result_null_map->get_data() : nullptr;
367
368
6
        for (size_t i = 0; i < input_rows_count; ++i) {
369
4
            if (null_map && (*null_map)[i]) {
370
2
                continue;
371
2
            }
372
373
2
            std::string prompt;
374
2
            RETURN_IF_ERROR(
375
2
                    assert_cast<const Derived&>(*this).build_prompt(prompt_columns, i, prompt));
376
377
2
            size_t entry_size = estimate_batch_entry_size(batch_prompts.size(), prompt);
378
2
            if (entry_size > max_batch_prompt_size) {
379
0
                if (!batch_prompts.empty()) {
380
0
                    std::vector<std::string> batch_results;
381
0
                    RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results,
382
0
                                                                config, adapter, context));
383
0
                    RETURN_IF_ERROR(
384
0
                            append_results_with_statistics(context, batch_results, *col_result));
385
0
                    batch_prompts.clear();
386
0
                    current_batch_size = 2;
387
0
                }
388
389
0
                std::vector<std::string> single_prompts;
390
0
                single_prompts.emplace_back(std::move(prompt));
391
0
                std::vector<std::string> single_results;
392
0
                RETURN_IF_ERROR(this->execute_batch_request(single_prompts, single_results, config,
393
0
                                                            adapter, context));
394
0
                RETURN_IF_ERROR(
395
0
                        append_results_with_statistics(context, single_results, *col_result));
396
0
                continue;
397
0
            }
398
399
2
            size_t additional_size = entry_size + (batch_prompts.empty() ? 0 : 1);
400
2
            if (!batch_prompts.empty() &&
401
2
                current_batch_size + additional_size > max_batch_prompt_size) {
402
0
                std::vector<std::string> batch_results;
403
0
                RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results, config,
404
0
                                                            adapter, context));
405
0
                RETURN_IF_ERROR(
406
0
                        append_results_with_statistics(context, batch_results, *col_result));
407
0
                batch_prompts.clear();
408
0
                current_batch_size = 2;
409
0
                additional_size = entry_size;
410
0
            }
411
412
2
            batch_prompts.emplace_back(std::move(prompt));
413
2
            current_batch_size += additional_size;
414
2
        }
415
416
2
        if (!batch_prompts.empty()) {
417
2
            std::vector<std::string> batch_results;
418
2
            RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results, config,
419
2
                                                        adapter, context));
420
2
            RETURN_IF_ERROR(append_results_with_statistics(context, batch_results, *col_result));
421
2
        }
422
423
2
        if (!result_null_map) {
424
1
            block.replace_by_position(result, std::move(col_result));
425
1
            return Status::OK();
426
1
        }
427
428
1
        if (!simd::contain_one(result_null_map->get_data().data(), input_rows_count)) {
429
0
            block.replace_by_position(result, ColumnNullable::create(std::move(col_result),
430
0
                                                                     std::move(result_null_map)));
431
0
            return Status::OK();
432
0
        }
433
434
1
        auto nested_result = col_result->clone_empty();
435
1
        size_t result_row = 0;
436
3
        for (UInt8 is_null : result_null_map->get_data()) {
437
3
            if (is_null) {
438
2
                nested_result->insert_default();
439
2
            } else {
440
1
                nested_result->insert_from(*col_result, result_row++);
441
1
            }
442
3
        }
443
444
1
        block.replace_by_position(result, ColumnNullable::create(std::move(nested_result),
445
1
                                                                 std::move(result_null_map)));
446
1
        return Status::OK();
447
1
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE7executeEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmRKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
_ZNK5doris10AIFunctionINS_19FunctionAISentimentEE7executeEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmRKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
Line
Count
Source
327
2
                   std::shared_ptr<AIAdapter>& adapter) const {
328
2
        Columns prompt_columns;
329
2
        prompt_columns.reserve(arguments.size() - 1);
330
2
        ColumnUInt8::MutablePtr result_null_map;
331
4
        for (size_t i = 1; i < arguments.size(); ++i) {
332
2
            const auto& argument = block.get_by_position(arguments[i]);
333
2
            if (argument.type->is_nullable()) {
334
0
                const auto& [column, is_const] = unpack_if_const(argument.column);
335
0
                const auto& nullable =
336
0
                        assert_cast<const ColumnNullable&, TypeCheckOnRelease::DISABLE>(*column);
337
0
                if (!result_null_map) {
338
0
                    result_null_map = ColumnUInt8::create(input_rows_count, 0);
339
0
                }
340
0
                VectorizedUtils::update_null_map(result_null_map->get_data(),
341
0
                                                 nullable.get_null_map_data(), is_const);
342
0
            }
343
2
            prompt_columns.emplace_back(
344
2
                    argument.unnest_nullable(argument.type->is_nullable()
345
2
                                                     ? argument.get_nullable_column_info()
346
2
                                                     : NullableColumnInfo {},
347
2
                                             false)
348
2
                            .column);
349
2
        }
350
351
2
        record_input(context, input_rows_count, result_null_map);
352
353
2
        if (result_null_map &&
354
2
            !simd::contain_zero(result_null_map->get_data().data(), input_rows_count)) {
355
0
            block.get_by_position(result).column =
356
0
                    block.get_by_position(result).type->create_column_const(input_rows_count,
357
0
                                                                            Field());
358
0
            return Status::OK();
359
0
        }
360
361
2
        auto col_result = assert_cast<const Derived&>(*this).create_result_column();
362
2
        std::vector<std::string> batch_prompts;
363
2
        size_t current_batch_size = 2; // []
364
2
        const size_t max_batch_prompt_size =
365
2
                static_cast<size_t>(get_ai_context_window_size(context));
366
2
        const NullMap* null_map = result_null_map ? &result_null_map->get_data() : nullptr;
367
368
6
        for (size_t i = 0; i < input_rows_count; ++i) {
369
4
            if (null_map && (*null_map)[i]) {
370
0
                continue;
371
0
            }
372
373
4
            std::string prompt;
374
4
            RETURN_IF_ERROR(
375
4
                    assert_cast<const Derived&>(*this).build_prompt(prompt_columns, i, prompt));
376
377
4
            size_t entry_size = estimate_batch_entry_size(batch_prompts.size(), prompt);
378
4
            if (entry_size > max_batch_prompt_size) {
379
0
                if (!batch_prompts.empty()) {
380
0
                    std::vector<std::string> batch_results;
381
0
                    RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results,
382
0
                                                                config, adapter, context));
383
0
                    RETURN_IF_ERROR(
384
0
                            append_results_with_statistics(context, batch_results, *col_result));
385
0
                    batch_prompts.clear();
386
0
                    current_batch_size = 2;
387
0
                }
388
389
0
                std::vector<std::string> single_prompts;
390
0
                single_prompts.emplace_back(std::move(prompt));
391
0
                std::vector<std::string> single_results;
392
0
                RETURN_IF_ERROR(this->execute_batch_request(single_prompts, single_results, config,
393
0
                                                            adapter, context));
394
0
                RETURN_IF_ERROR(
395
0
                        append_results_with_statistics(context, single_results, *col_result));
396
0
                continue;
397
0
            }
398
399
4
            size_t additional_size = entry_size + (batch_prompts.empty() ? 0 : 1);
400
4
            if (!batch_prompts.empty() &&
401
4
                current_batch_size + additional_size > max_batch_prompt_size) {
402
0
                std::vector<std::string> batch_results;
403
0
                RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results, config,
404
0
                                                            adapter, context));
405
0
                RETURN_IF_ERROR(
406
0
                        append_results_with_statistics(context, batch_results, *col_result));
407
0
                batch_prompts.clear();
408
0
                current_batch_size = 2;
409
0
                additional_size = entry_size;
410
0
            }
411
412
4
            batch_prompts.emplace_back(std::move(prompt));
413
4
            current_batch_size += additional_size;
414
4
        }
415
416
2
        if (!batch_prompts.empty()) {
417
2
            std::vector<std::string> batch_results;
418
2
            RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results, config,
419
2
                                                        adapter, context));
420
2
            RETURN_IF_ERROR(append_results_with_statistics(context, batch_results, *col_result));
421
2
        }
422
423
2
        if (!result_null_map) {
424
2
            block.replace_by_position(result, std::move(col_result));
425
2
            return Status::OK();
426
2
        }
427
428
0
        if (!simd::contain_one(result_null_map->get_data().data(), input_rows_count)) {
429
0
            block.replace_by_position(result, ColumnNullable::create(std::move(col_result),
430
0
                                                                     std::move(result_null_map)));
431
0
            return Status::OK();
432
0
        }
433
434
0
        auto nested_result = col_result->clone_empty();
435
0
        size_t result_row = 0;
436
0
        for (UInt8 is_null : result_null_map->get_data()) {
437
0
            if (is_null) {
438
0
                nested_result->insert_default();
439
0
            } else {
440
0
                nested_result->insert_from(*col_result, result_row++);
441
0
            }
442
0
        }
443
444
0
        block.replace_by_position(result, ColumnNullable::create(std::move(nested_result),
445
0
                                                                 std::move(result_null_map)));
446
0
        return Status::OK();
447
0
    }
_ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE7executeEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmRKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
Line
Count
Source
327
6
                   std::shared_ptr<AIAdapter>& adapter) const {
328
6
        Columns prompt_columns;
329
6
        prompt_columns.reserve(arguments.size() - 1);
330
6
        ColumnUInt8::MutablePtr result_null_map;
331
12
        for (size_t i = 1; i < arguments.size(); ++i) {
332
6
            const auto& argument = block.get_by_position(arguments[i]);
333
6
            if (argument.type->is_nullable()) {
334
6
                const auto& [column, is_const] = unpack_if_const(argument.column);
335
6
                const auto& nullable =
336
6
                        assert_cast<const ColumnNullable&, TypeCheckOnRelease::DISABLE>(*column);
337
6
                if (!result_null_map) {
338
6
                    result_null_map = ColumnUInt8::create(input_rows_count, 0);
339
6
                }
340
6
                VectorizedUtils::update_null_map(result_null_map->get_data(),
341
6
                                                 nullable.get_null_map_data(), is_const);
342
6
            }
343
6
            prompt_columns.emplace_back(
344
6
                    argument.unnest_nullable(argument.type->is_nullable()
345
6
                                                     ? argument.get_nullable_column_info()
346
6
                                                     : NullableColumnInfo {},
347
6
                                             false)
348
6
                            .column);
349
6
        }
350
351
6
        record_input(context, input_rows_count, result_null_map);
352
353
6
        if (result_null_map &&
354
6
            !simd::contain_zero(result_null_map->get_data().data(), input_rows_count)) {
355
1
            block.get_by_position(result).column =
356
1
                    block.get_by_position(result).type->create_column_const(input_rows_count,
357
1
                                                                            Field());
358
1
            return Status::OK();
359
1
        }
360
361
5
        auto col_result = assert_cast<const Derived&>(*this).create_result_column();
362
5
        std::vector<std::string> batch_prompts;
363
5
        size_t current_batch_size = 2; // []
364
5
        const size_t max_batch_prompt_size =
365
5
                static_cast<size_t>(get_ai_context_window_size(context));
366
5
        const NullMap* null_map = result_null_map ? &result_null_map->get_data() : nullptr;
367
368
20
        for (size_t i = 0; i < input_rows_count; ++i) {
369
15
            if (null_map && (*null_map)[i]) {
370
5
                continue;
371
5
            }
372
373
10
            std::string prompt;
374
10
            RETURN_IF_ERROR(
375
10
                    assert_cast<const Derived&>(*this).build_prompt(prompt_columns, i, prompt));
376
377
10
            size_t entry_size = estimate_batch_entry_size(batch_prompts.size(), prompt);
378
10
            if (entry_size > max_batch_prompt_size) {
379
10
                if (!batch_prompts.empty()) {
380
0
                    std::vector<std::string> batch_results;
381
0
                    RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results,
382
0
                                                                config, adapter, context));
383
0
                    RETURN_IF_ERROR(
384
0
                            append_results_with_statistics(context, batch_results, *col_result));
385
0
                    batch_prompts.clear();
386
0
                    current_batch_size = 2;
387
0
                }
388
389
10
                std::vector<std::string> single_prompts;
390
10
                single_prompts.emplace_back(std::move(prompt));
391
10
                std::vector<std::string> single_results;
392
10
                RETURN_IF_ERROR(this->execute_batch_request(single_prompts, single_results, config,
393
10
                                                            adapter, context));
394
10
                RETURN_IF_ERROR(
395
10
                        append_results_with_statistics(context, single_results, *col_result));
396
10
                continue;
397
10
            }
398
399
0
            size_t additional_size = entry_size + (batch_prompts.empty() ? 0 : 1);
400
0
            if (!batch_prompts.empty() &&
401
0
                current_batch_size + additional_size > max_batch_prompt_size) {
402
0
                std::vector<std::string> batch_results;
403
0
                RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results, config,
404
0
                                                            adapter, context));
405
0
                RETURN_IF_ERROR(
406
0
                        append_results_with_statistics(context, batch_results, *col_result));
407
0
                batch_prompts.clear();
408
0
                current_batch_size = 2;
409
0
                additional_size = entry_size;
410
0
            }
411
412
0
            batch_prompts.emplace_back(std::move(prompt));
413
0
            current_batch_size += additional_size;
414
0
        }
415
416
5
        if (!batch_prompts.empty()) {
417
0
            std::vector<std::string> batch_results;
418
0
            RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results, config,
419
0
                                                        adapter, context));
420
0
            RETURN_IF_ERROR(append_results_with_statistics(context, batch_results, *col_result));
421
0
        }
422
423
5
        if (!result_null_map) {
424
0
            block.replace_by_position(result, std::move(col_result));
425
0
            return Status::OK();
426
0
        }
427
428
5
        if (!simd::contain_one(result_null_map->get_data().data(), input_rows_count)) {
429
0
            block.replace_by_position(result, ColumnNullable::create(std::move(col_result),
430
0
                                                                     std::move(result_null_map)));
431
0
            return Status::OK();
432
0
        }
433
434
5
        auto nested_result = col_result->clone_empty();
435
5
        size_t result_row = 0;
436
15
        for (UInt8 is_null : result_null_map->get_data()) {
437
15
            if (is_null) {
438
5
                nested_result->insert_default();
439
10
            } else {
440
10
                nested_result->insert_from(*col_result, result_row++);
441
10
            }
442
15
        }
443
444
5
        block.replace_by_position(result, ColumnNullable::create(std::move(nested_result),
445
5
                                                                 std::move(result_null_map)));
446
5
        return Status::OK();
447
5
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE7executeEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmRKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
_ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE7executeEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmRKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
Line
Count
Source
327
3
                   std::shared_ptr<AIAdapter>& adapter) const {
328
3
        Columns prompt_columns;
329
3
        prompt_columns.reserve(arguments.size() - 1);
330
3
        ColumnUInt8::MutablePtr result_null_map;
331
6
        for (size_t i = 1; i < arguments.size(); ++i) {
332
3
            const auto& argument = block.get_by_position(arguments[i]);
333
3
            if (argument.type->is_nullable()) {
334
3
                const auto& [column, is_const] = unpack_if_const(argument.column);
335
3
                const auto& nullable =
336
3
                        assert_cast<const ColumnNullable&, TypeCheckOnRelease::DISABLE>(*column);
337
3
                if (!result_null_map) {
338
3
                    result_null_map = ColumnUInt8::create(input_rows_count, 0);
339
3
                }
340
3
                VectorizedUtils::update_null_map(result_null_map->get_data(),
341
3
                                                 nullable.get_null_map_data(), is_const);
342
3
            }
343
3
            prompt_columns.emplace_back(
344
3
                    argument.unnest_nullable(argument.type->is_nullable()
345
3
                                                     ? argument.get_nullable_column_info()
346
3
                                                     : NullableColumnInfo {},
347
3
                                             false)
348
3
                            .column);
349
3
        }
350
351
3
        record_input(context, input_rows_count, result_null_map);
352
353
3
        if (result_null_map &&
354
3
            !simd::contain_zero(result_null_map->get_data().data(), input_rows_count)) {
355
1
            block.get_by_position(result).column =
356
1
                    block.get_by_position(result).type->create_column_const(input_rows_count,
357
1
                                                                            Field());
358
1
            return Status::OK();
359
1
        }
360
361
2
        auto col_result = assert_cast<const Derived&>(*this).create_result_column();
362
2
        std::vector<std::string> batch_prompts;
363
2
        size_t current_batch_size = 2; // []
364
2
        const size_t max_batch_prompt_size =
365
2
                static_cast<size_t>(get_ai_context_window_size(context));
366
2
        const NullMap* null_map = result_null_map ? &result_null_map->get_data() : nullptr;
367
368
10
        for (size_t i = 0; i < input_rows_count; ++i) {
369
8
            if (null_map && (*null_map)[i]) {
370
3
                continue;
371
3
            }
372
373
5
            std::string prompt;
374
5
            RETURN_IF_ERROR(
375
5
                    assert_cast<const Derived&>(*this).build_prompt(prompt_columns, i, prompt));
376
377
5
            size_t entry_size = estimate_batch_entry_size(batch_prompts.size(), prompt);
378
5
            if (entry_size > max_batch_prompt_size) {
379
0
                if (!batch_prompts.empty()) {
380
0
                    std::vector<std::string> batch_results;
381
0
                    RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results,
382
0
                                                                config, adapter, context));
383
0
                    RETURN_IF_ERROR(
384
0
                            append_results_with_statistics(context, batch_results, *col_result));
385
0
                    batch_prompts.clear();
386
0
                    current_batch_size = 2;
387
0
                }
388
389
0
                std::vector<std::string> single_prompts;
390
0
                single_prompts.emplace_back(std::move(prompt));
391
0
                std::vector<std::string> single_results;
392
0
                RETURN_IF_ERROR(this->execute_batch_request(single_prompts, single_results, config,
393
0
                                                            adapter, context));
394
0
                RETURN_IF_ERROR(
395
0
                        append_results_with_statistics(context, single_results, *col_result));
396
0
                continue;
397
0
            }
398
399
5
            size_t additional_size = entry_size + (batch_prompts.empty() ? 0 : 1);
400
5
            if (!batch_prompts.empty() &&
401
5
                current_batch_size + additional_size > max_batch_prompt_size) {
402
0
                std::vector<std::string> batch_results;
403
0
                RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results, config,
404
0
                                                            adapter, context));
405
0
                RETURN_IF_ERROR(
406
0
                        append_results_with_statistics(context, batch_results, *col_result));
407
0
                batch_prompts.clear();
408
0
                current_batch_size = 2;
409
0
                additional_size = entry_size;
410
0
            }
411
412
5
            batch_prompts.emplace_back(std::move(prompt));
413
5
            current_batch_size += additional_size;
414
5
        }
415
416
2
        if (!batch_prompts.empty()) {
417
2
            std::vector<std::string> batch_results;
418
2
            RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results, config,
419
2
                                                        adapter, context));
420
2
            RETURN_IF_ERROR(append_results_with_statistics(context, batch_results, *col_result));
421
2
        }
422
423
2
        if (!result_null_map) {
424
0
            block.replace_by_position(result, std::move(col_result));
425
0
            return Status::OK();
426
0
        }
427
428
2
        if (!simd::contain_one(result_null_map->get_data().data(), input_rows_count)) {
429
1
            block.replace_by_position(result, ColumnNullable::create(std::move(col_result),
430
1
                                                                     std::move(result_null_map)));
431
1
            return Status::OK();
432
1
        }
433
434
1
        auto nested_result = col_result->clone_empty();
435
1
        size_t result_row = 0;
436
5
        for (UInt8 is_null : result_null_map->get_data()) {
437
5
            if (is_null) {
438
3
                nested_result->insert_default();
439
3
            } else {
440
2
                nested_result->insert_from(*col_result, result_row++);
441
2
            }
442
5
        }
443
444
1
        block.replace_by_position(result, ColumnNullable::create(std::move(nested_result),
445
1
                                                                 std::move(result_null_map)));
446
1
        return Status::OK();
447
2
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE7executeEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmRKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE7executeEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmRKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
_ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE7executeEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmRKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
Line
Count
Source
327
22
                   std::shared_ptr<AIAdapter>& adapter) const {
328
22
        Columns prompt_columns;
329
22
        prompt_columns.reserve(arguments.size() - 1);
330
22
        ColumnUInt8::MutablePtr result_null_map;
331
66
        for (size_t i = 1; i < arguments.size(); ++i) {
332
44
            const auto& argument = block.get_by_position(arguments[i]);
333
44
            if (argument.type->is_nullable()) {
334
2
                const auto& [column, is_const] = unpack_if_const(argument.column);
335
2
                const auto& nullable =
336
2
                        assert_cast<const ColumnNullable&, TypeCheckOnRelease::DISABLE>(*column);
337
2
                if (!result_null_map) {
338
1
                    result_null_map = ColumnUInt8::create(input_rows_count, 0);
339
1
                }
340
2
                VectorizedUtils::update_null_map(result_null_map->get_data(),
341
2
                                                 nullable.get_null_map_data(), is_const);
342
2
            }
343
44
            prompt_columns.emplace_back(
344
44
                    argument.unnest_nullable(argument.type->is_nullable()
345
44
                                                     ? argument.get_nullable_column_info()
346
44
                                                     : NullableColumnInfo {},
347
44
                                             false)
348
44
                            .column);
349
44
        }
350
351
22
        record_input(context, input_rows_count, result_null_map);
352
353
22
        if (result_null_map &&
354
22
            !simd::contain_zero(result_null_map->get_data().data(), input_rows_count)) {
355
0
            block.get_by_position(result).column =
356
0
                    block.get_by_position(result).type->create_column_const(input_rows_count,
357
0
                                                                            Field());
358
0
            return Status::OK();
359
0
        }
360
361
22
        auto col_result = assert_cast<const Derived&>(*this).create_result_column();
362
22
        std::vector<std::string> batch_prompts;
363
22
        size_t current_batch_size = 2; // []
364
22
        const size_t max_batch_prompt_size =
365
22
                static_cast<size_t>(get_ai_context_window_size(context));
366
22
        const NullMap* null_map = result_null_map ? &result_null_map->get_data() : nullptr;
367
368
49
        for (size_t i = 0; i < input_rows_count; ++i) {
369
27
            if (null_map && (*null_map)[i]) {
370
2
                continue;
371
2
            }
372
373
25
            std::string prompt;
374
25
            RETURN_IF_ERROR(
375
25
                    assert_cast<const Derived&>(*this).build_prompt(prompt_columns, i, prompt));
376
377
25
            size_t entry_size = estimate_batch_entry_size(batch_prompts.size(), prompt);
378
25
            if (entry_size > max_batch_prompt_size) {
379
0
                if (!batch_prompts.empty()) {
380
0
                    std::vector<std::string> batch_results;
381
0
                    RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results,
382
0
                                                                config, adapter, context));
383
0
                    RETURN_IF_ERROR(
384
0
                            append_results_with_statistics(context, batch_results, *col_result));
385
0
                    batch_prompts.clear();
386
0
                    current_batch_size = 2;
387
0
                }
388
389
0
                std::vector<std::string> single_prompts;
390
0
                single_prompts.emplace_back(std::move(prompt));
391
0
                std::vector<std::string> single_results;
392
0
                RETURN_IF_ERROR(this->execute_batch_request(single_prompts, single_results, config,
393
0
                                                            adapter, context));
394
0
                RETURN_IF_ERROR(
395
0
                        append_results_with_statistics(context, single_results, *col_result));
396
0
                continue;
397
0
            }
398
399
25
            size_t additional_size = entry_size + (batch_prompts.empty() ? 0 : 1);
400
25
            if (!batch_prompts.empty() &&
401
25
                current_batch_size + additional_size > max_batch_prompt_size) {
402
0
                std::vector<std::string> batch_results;
403
0
                RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results, config,
404
0
                                                            adapter, context));
405
0
                RETURN_IF_ERROR(
406
0
                        append_results_with_statistics(context, batch_results, *col_result));
407
0
                batch_prompts.clear();
408
0
                current_batch_size = 2;
409
0
                additional_size = entry_size;
410
0
            }
411
412
25
            batch_prompts.emplace_back(std::move(prompt));
413
25
            current_batch_size += additional_size;
414
25
        }
415
416
22
        if (!batch_prompts.empty()) {
417
22
            std::vector<std::string> batch_results;
418
22
            RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results, config,
419
22
                                                        adapter, context));
420
22
            RETURN_IF_ERROR(append_results_with_statistics(context, batch_results, *col_result));
421
22
        }
422
423
16
        if (!result_null_map) {
424
15
            block.replace_by_position(result, std::move(col_result));
425
15
            return Status::OK();
426
15
        }
427
428
1
        if (!simd::contain_one(result_null_map->get_data().data(), input_rows_count)) {
429
0
            block.replace_by_position(result, ColumnNullable::create(std::move(col_result),
430
0
                                                                     std::move(result_null_map)));
431
0
            return Status::OK();
432
0
        }
433
434
1
        auto nested_result = col_result->clone_empty();
435
1
        size_t result_row = 0;
436
4
        for (UInt8 is_null : result_null_map->get_data()) {
437
4
            if (is_null) {
438
2
                nested_result->insert_default();
439
2
            } else {
440
2
                nested_result->insert_from(*col_result, result_row++);
441
2
            }
442
4
        }
443
444
1
        block.replace_by_position(result, ColumnNullable::create(std::move(nested_result),
445
1
                                                                 std::move(result_null_map)));
446
1
        return Status::OK();
447
1
    }
_ZNK5doris10AIFunctionINS_16FunctionAIFilterEE7executeEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmRKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
Line
Count
Source
327
47
                   std::shared_ptr<AIAdapter>& adapter) const {
328
47
        Columns prompt_columns;
329
47
        prompt_columns.reserve(arguments.size() - 1);
330
47
        ColumnUInt8::MutablePtr result_null_map;
331
94
        for (size_t i = 1; i < arguments.size(); ++i) {
332
47
            const auto& argument = block.get_by_position(arguments[i]);
333
47
            if (argument.type->is_nullable()) {
334
1
                const auto& [column, is_const] = unpack_if_const(argument.column);
335
1
                const auto& nullable =
336
1
                        assert_cast<const ColumnNullable&, TypeCheckOnRelease::DISABLE>(*column);
337
1
                if (!result_null_map) {
338
1
                    result_null_map = ColumnUInt8::create(input_rows_count, 0);
339
1
                }
340
1
                VectorizedUtils::update_null_map(result_null_map->get_data(),
341
1
                                                 nullable.get_null_map_data(), is_const);
342
1
            }
343
47
            prompt_columns.emplace_back(
344
47
                    argument.unnest_nullable(argument.type->is_nullable()
345
47
                                                     ? argument.get_nullable_column_info()
346
47
                                                     : NullableColumnInfo {},
347
47
                                             false)
348
47
                            .column);
349
47
        }
350
351
47
        record_input(context, input_rows_count, result_null_map);
352
353
47
        if (result_null_map &&
354
47
            !simd::contain_zero(result_null_map->get_data().data(), input_rows_count)) {
355
0
            block.get_by_position(result).column =
356
0
                    block.get_by_position(result).type->create_column_const(input_rows_count,
357
0
                                                                            Field());
358
0
            return Status::OK();
359
0
        }
360
361
47
        auto col_result = assert_cast<const Derived&>(*this).create_result_column();
362
47
        std::vector<std::string> batch_prompts;
363
47
        size_t current_batch_size = 2; // []
364
47
        const size_t max_batch_prompt_size =
365
47
                static_cast<size_t>(get_ai_context_window_size(context));
366
47
        const NullMap* null_map = result_null_map ? &result_null_map->get_data() : nullptr;
367
368
113
        for (size_t i = 0; i < input_rows_count; ++i) {
369
66
            if (null_map && (*null_map)[i]) {
370
2
                continue;
371
2
            }
372
373
64
            std::string prompt;
374
64
            RETURN_IF_ERROR(
375
64
                    assert_cast<const Derived&>(*this).build_prompt(prompt_columns, i, prompt));
376
377
64
            size_t entry_size = estimate_batch_entry_size(batch_prompts.size(), prompt);
378
64
            if (entry_size > max_batch_prompt_size) {
379
4
                if (!batch_prompts.empty()) {
380
1
                    std::vector<std::string> batch_results;
381
1
                    RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results,
382
1
                                                                config, adapter, context));
383
1
                    RETURN_IF_ERROR(
384
1
                            append_results_with_statistics(context, batch_results, *col_result));
385
1
                    batch_prompts.clear();
386
1
                    current_batch_size = 2;
387
1
                }
388
389
4
                std::vector<std::string> single_prompts;
390
4
                single_prompts.emplace_back(std::move(prompt));
391
4
                std::vector<std::string> single_results;
392
4
                RETURN_IF_ERROR(this->execute_batch_request(single_prompts, single_results, config,
393
4
                                                            adapter, context));
394
4
                RETURN_IF_ERROR(
395
4
                        append_results_with_statistics(context, single_results, *col_result));
396
4
                continue;
397
4
            }
398
399
60
            size_t additional_size = entry_size + (batch_prompts.empty() ? 0 : 1);
400
60
            if (!batch_prompts.empty() &&
401
60
                current_batch_size + additional_size > max_batch_prompt_size) {
402
2
                std::vector<std::string> batch_results;
403
2
                RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results, config,
404
2
                                                            adapter, context));
405
2
                RETURN_IF_ERROR(
406
2
                        append_results_with_statistics(context, batch_results, *col_result));
407
2
                batch_prompts.clear();
408
2
                current_batch_size = 2;
409
2
                additional_size = entry_size;
410
2
            }
411
412
60
            batch_prompts.emplace_back(std::move(prompt));
413
60
            current_batch_size += additional_size;
414
60
        }
415
416
47
        if (!batch_prompts.empty()) {
417
44
            std::vector<std::string> batch_results;
418
44
            RETURN_IF_ERROR(this->execute_batch_request(batch_prompts, batch_results, config,
419
44
                                                        adapter, context));
420
38
            RETURN_IF_ERROR(append_results_with_statistics(context, batch_results, *col_result));
421
38
        }
422
423
20
        if (!result_null_map) {
424
19
            block.replace_by_position(result, std::move(col_result));
425
19
            return Status::OK();
426
19
        }
427
428
1
        if (!simd::contain_one(result_null_map->get_data().data(), input_rows_count)) {
429
0
            block.replace_by_position(result, ColumnNullable::create(std::move(col_result),
430
0
                                                                     std::move(result_null_map)));
431
0
            return Status::OK();
432
0
        }
433
434
1
        auto nested_result = col_result->clone_empty();
435
1
        size_t result_row = 0;
436
4
        for (UInt8 is_null : result_null_map->get_data()) {
437
4
            if (is_null) {
438
2
                nested_result->insert_default();
439
2
            } else {
440
2
                nested_result->insert_from(*col_result, result_row++);
441
2
            }
442
4
        }
443
444
1
        block.replace_by_position(result, ColumnNullable::create(std::move(nested_result),
445
1
                                                                 std::move(result_null_map)));
446
1
        return Status::OK();
447
1
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE7executeEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmRKNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
448
449
private:
450
    // The ai resource must be literal
451
    Status _init_from_resource(FunctionContext* context, const Block& block,
452
                               const ColumnNumbers& arguments, AIResource& config,
453
91
                               std::shared_ptr<AIAdapter>& adapter) const {
454
91
        const ColumnWithTypeAndName& resource_column = block.get_by_position(arguments[0]);
455
91
        StringRef resource_name_ref = resource_column.column->get_data_at(0);
456
91
        std::string resource_name = std::string(resource_name_ref.data, resource_name_ref.size);
457
458
91
        const std::shared_ptr<std::map<std::string, TAIResource>>& ai_resources =
459
91
                context->state()->get_query_ctx()->get_ai_resources();
460
91
        DORIS_CHECK(ai_resources);
461
91
        auto it = ai_resources->find(resource_name);
462
91
        DORIS_CHECK(it != ai_resources->end());
463
91
        PrimitiveType input_type = INVALID_TYPE;
464
91
        if (arguments.size() > 1) {
465
90
            input_type =
466
90
                    remove_nullable(block.get_by_position(arguments[1]).type)->get_primitive_type();
467
90
        }
468
91
        config = assert_cast<const Derived&>(*this).select_ai_resource(it->second, input_type);
469
470
91
        normalize_endpoint(config);
471
472
91
        adapter = AIAdapterFactory::create_adapter(config.provider_type);
473
91
        DORIS_CHECK(adapter);
474
475
91
        adapter->init(config);
476
91
        return Status::OK();
477
91
    }
_ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
Line
Count
Source
453
2
                               std::shared_ptr<AIAdapter>& adapter) const {
454
2
        const ColumnWithTypeAndName& resource_column = block.get_by_position(arguments[0]);
455
2
        StringRef resource_name_ref = resource_column.column->get_data_at(0);
456
2
        std::string resource_name = std::string(resource_name_ref.data, resource_name_ref.size);
457
458
2
        const std::shared_ptr<std::map<std::string, TAIResource>>& ai_resources =
459
2
                context->state()->get_query_ctx()->get_ai_resources();
460
2
        DORIS_CHECK(ai_resources);
461
2
        auto it = ai_resources->find(resource_name);
462
2
        DORIS_CHECK(it != ai_resources->end());
463
2
        PrimitiveType input_type = INVALID_TYPE;
464
2
        if (arguments.size() > 1) {
465
2
            input_type =
466
2
                    remove_nullable(block.get_by_position(arguments[1]).type)->get_primitive_type();
467
2
        }
468
2
        config = assert_cast<const Derived&>(*this).select_ai_resource(it->second, input_type);
469
470
2
        normalize_endpoint(config);
471
472
2
        adapter = AIAdapterFactory::create_adapter(config.provider_type);
473
2
        DORIS_CHECK(adapter);
474
475
2
        adapter->init(config);
476
2
        return Status::OK();
477
2
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
_ZNK5doris10AIFunctionINS_19FunctionAISentimentEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
Line
Count
Source
453
2
                               std::shared_ptr<AIAdapter>& adapter) const {
454
2
        const ColumnWithTypeAndName& resource_column = block.get_by_position(arguments[0]);
455
2
        StringRef resource_name_ref = resource_column.column->get_data_at(0);
456
2
        std::string resource_name = std::string(resource_name_ref.data, resource_name_ref.size);
457
458
2
        const std::shared_ptr<std::map<std::string, TAIResource>>& ai_resources =
459
2
                context->state()->get_query_ctx()->get_ai_resources();
460
2
        DORIS_CHECK(ai_resources);
461
2
        auto it = ai_resources->find(resource_name);
462
2
        DORIS_CHECK(it != ai_resources->end());
463
2
        PrimitiveType input_type = INVALID_TYPE;
464
2
        if (arguments.size() > 1) {
465
2
            input_type =
466
2
                    remove_nullable(block.get_by_position(arguments[1]).type)->get_primitive_type();
467
2
        }
468
2
        config = assert_cast<const Derived&>(*this).select_ai_resource(it->second, input_type);
469
470
2
        normalize_endpoint(config);
471
472
2
        adapter = AIAdapterFactory::create_adapter(config.provider_type);
473
2
        DORIS_CHECK(adapter);
474
475
2
        adapter->init(config);
476
2
        return Status::OK();
477
2
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
_ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
Line
Count
Source
453
3
                               std::shared_ptr<AIAdapter>& adapter) const {
454
3
        const ColumnWithTypeAndName& resource_column = block.get_by_position(arguments[0]);
455
3
        StringRef resource_name_ref = resource_column.column->get_data_at(0);
456
3
        std::string resource_name = std::string(resource_name_ref.data, resource_name_ref.size);
457
458
3
        const std::shared_ptr<std::map<std::string, TAIResource>>& ai_resources =
459
3
                context->state()->get_query_ctx()->get_ai_resources();
460
3
        DORIS_CHECK(ai_resources);
461
3
        auto it = ai_resources->find(resource_name);
462
3
        DORIS_CHECK(it != ai_resources->end());
463
3
        PrimitiveType input_type = INVALID_TYPE;
464
3
        if (arguments.size() > 1) {
465
3
            input_type =
466
3
                    remove_nullable(block.get_by_position(arguments[1]).type)->get_primitive_type();
467
3
        }
468
3
        config = assert_cast<const Derived&>(*this).select_ai_resource(it->second, input_type);
469
470
3
        normalize_endpoint(config);
471
472
3
        adapter = AIAdapterFactory::create_adapter(config.provider_type);
473
3
        DORIS_CHECK(adapter);
474
475
3
        adapter->init(config);
476
3
        return Status::OK();
477
3
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
_ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
Line
Count
Source
453
22
                               std::shared_ptr<AIAdapter>& adapter) const {
454
22
        const ColumnWithTypeAndName& resource_column = block.get_by_position(arguments[0]);
455
22
        StringRef resource_name_ref = resource_column.column->get_data_at(0);
456
22
        std::string resource_name = std::string(resource_name_ref.data, resource_name_ref.size);
457
458
22
        const std::shared_ptr<std::map<std::string, TAIResource>>& ai_resources =
459
22
                context->state()->get_query_ctx()->get_ai_resources();
460
22
        DORIS_CHECK(ai_resources);
461
22
        auto it = ai_resources->find(resource_name);
462
22
        DORIS_CHECK(it != ai_resources->end());
463
22
        PrimitiveType input_type = INVALID_TYPE;
464
22
        if (arguments.size() > 1) {
465
22
            input_type =
466
22
                    remove_nullable(block.get_by_position(arguments[1]).type)->get_primitive_type();
467
22
        }
468
22
        config = assert_cast<const Derived&>(*this).select_ai_resource(it->second, input_type);
469
470
22
        normalize_endpoint(config);
471
472
22
        adapter = AIAdapterFactory::create_adapter(config.provider_type);
473
22
        DORIS_CHECK(adapter);
474
475
22
        adapter->init(config);
476
22
        return Status::OK();
477
22
    }
_ZNK5doris10AIFunctionINS_16FunctionAIFilterEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
Line
Count
Source
453
47
                               std::shared_ptr<AIAdapter>& adapter) const {
454
47
        const ColumnWithTypeAndName& resource_column = block.get_by_position(arguments[0]);
455
47
        StringRef resource_name_ref = resource_column.column->get_data_at(0);
456
47
        std::string resource_name = std::string(resource_name_ref.data, resource_name_ref.size);
457
458
47
        const std::shared_ptr<std::map<std::string, TAIResource>>& ai_resources =
459
47
                context->state()->get_query_ctx()->get_ai_resources();
460
47
        DORIS_CHECK(ai_resources);
461
47
        auto it = ai_resources->find(resource_name);
462
47
        DORIS_CHECK(it != ai_resources->end());
463
47
        PrimitiveType input_type = INVALID_TYPE;
464
47
        if (arguments.size() > 1) {
465
47
            input_type =
466
47
                    remove_nullable(block.get_by_position(arguments[1]).type)->get_primitive_type();
467
47
        }
468
47
        config = assert_cast<const Derived&>(*this).select_ai_resource(it->second, input_type);
469
470
47
        normalize_endpoint(config);
471
472
47
        adapter = AIAdapterFactory::create_adapter(config.provider_type);
473
47
        DORIS_CHECK(adapter);
474
475
47
        adapter->init(config);
476
47
        return Status::OK();
477
47
    }
_ZNK5doris10AIFunctionINS_13FunctionEmbedEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
Line
Count
Source
453
15
                               std::shared_ptr<AIAdapter>& adapter) const {
454
15
        const ColumnWithTypeAndName& resource_column = block.get_by_position(arguments[0]);
455
15
        StringRef resource_name_ref = resource_column.column->get_data_at(0);
456
15
        std::string resource_name = std::string(resource_name_ref.data, resource_name_ref.size);
457
458
15
        const std::shared_ptr<std::map<std::string, TAIResource>>& ai_resources =
459
15
                context->state()->get_query_ctx()->get_ai_resources();
460
15
        DORIS_CHECK(ai_resources);
461
15
        auto it = ai_resources->find(resource_name);
462
15
        DORIS_CHECK(it != ai_resources->end());
463
15
        PrimitiveType input_type = INVALID_TYPE;
464
15
        if (arguments.size() > 1) {
465
14
            input_type =
466
14
                    remove_nullable(block.get_by_position(arguments[1]).type)->get_primitive_type();
467
14
        }
468
15
        config = assert_cast<const Derived&>(*this).select_ai_resource(it->second, input_type);
469
470
15
        normalize_endpoint(config);
471
472
15
        adapter = AIAdapterFactory::create_adapter(config.provider_type);
473
15
        DORIS_CHECK(adapter);
474
475
15
        adapter->init(config);
476
15
        return Status::OK();
477
15
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_10AIResourceERSt10shared_ptrINS_9AIAdapterEE
478
479
76
    AIResource select_ai_resource(const TAIResource& resource, PrimitiveType /*input_type*/) const {
480
76
        return AIResource(resource);
481
76
    }
_ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE18select_ai_resourceERKNS_11TAIResourceENS_13PrimitiveTypeE
Line
Count
Source
479
2
    AIResource select_ai_resource(const TAIResource& resource, PrimitiveType /*input_type*/) const {
480
2
        return AIResource(resource);
481
2
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE18select_ai_resourceERKNS_11TAIResourceENS_13PrimitiveTypeE
_ZNK5doris10AIFunctionINS_19FunctionAISentimentEE18select_ai_resourceERKNS_11TAIResourceENS_13PrimitiveTypeE
Line
Count
Source
479
2
    AIResource select_ai_resource(const TAIResource& resource, PrimitiveType /*input_type*/) const {
480
2
        return AIResource(resource);
481
2
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE18select_ai_resourceERKNS_11TAIResourceENS_13PrimitiveTypeE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE18select_ai_resourceERKNS_11TAIResourceENS_13PrimitiveTypeE
_ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE18select_ai_resourceERKNS_11TAIResourceENS_13PrimitiveTypeE
Line
Count
Source
479
3
    AIResource select_ai_resource(const TAIResource& resource, PrimitiveType /*input_type*/) const {
480
3
        return AIResource(resource);
481
3
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE18select_ai_resourceERKNS_11TAIResourceENS_13PrimitiveTypeE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE18select_ai_resourceERKNS_11TAIResourceENS_13PrimitiveTypeE
_ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE18select_ai_resourceERKNS_11TAIResourceENS_13PrimitiveTypeE
Line
Count
Source
479
22
    AIResource select_ai_resource(const TAIResource& resource, PrimitiveType /*input_type*/) const {
480
22
        return AIResource(resource);
481
22
    }
_ZNK5doris10AIFunctionINS_16FunctionAIFilterEE18select_ai_resourceERKNS_11TAIResourceENS_13PrimitiveTypeE
Line
Count
Source
479
47
    AIResource select_ai_resource(const TAIResource& resource, PrimitiveType /*input_type*/) const {
480
47
        return AIResource(resource);
481
47
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE18select_ai_resourceERKNS_11TAIResourceENS_13PrimitiveTypeE
482
483
    // Serializes one text batch into the shared JSON-array prompt format consumed by LLM
484
    // providers for batch string functions.
485
    Status build_batch_prompt(const std::vector<std::string>& batch_prompts,
486
17
                              std::string& prompt) const {
487
17
        rapidjson::StringBuffer buffer;
488
17
        rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
489
490
17
        writer.StartArray();
491
41
        for (size_t i = 0; i < batch_prompts.size(); ++i) {
492
24
            writer.StartObject();
493
24
            writer.Key("idx");
494
24
            writer.Uint64(i);
495
24
            writer.Key("input");
496
24
            writer.String(batch_prompts[i].data(),
497
24
                          static_cast<rapidjson::SizeType>(batch_prompts[i].size()));
498
24
            writer.EndObject();
499
24
        }
500
17
        writer.EndArray();
501
502
17
        prompt = buffer.GetString();
503
17
        return Status::OK();
504
17
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE18build_batch_promptERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERS9_
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE18build_batch_promptERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERS9_
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISentimentEE18build_batch_promptERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERS9_
_ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE18build_batch_promptERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERS9_
Line
Count
Source
486
15
                              std::string& prompt) const {
487
15
        rapidjson::StringBuffer buffer;
488
15
        rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
489
490
15
        writer.StartArray();
491
35
        for (size_t i = 0; i < batch_prompts.size(); ++i) {
492
20
            writer.StartObject();
493
20
            writer.Key("idx");
494
20
            writer.Uint64(i);
495
20
            writer.Key("input");
496
20
            writer.String(batch_prompts[i].data(),
497
20
                          static_cast<rapidjson::SizeType>(batch_prompts[i].size()));
498
20
            writer.EndObject();
499
20
        }
500
15
        writer.EndArray();
501
502
15
        prompt = buffer.GetString();
503
15
        return Status::OK();
504
15
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE18build_batch_promptERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERS9_
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE18build_batch_promptERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERS9_
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE18build_batch_promptERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERS9_
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE18build_batch_promptERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERS9_
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE18build_batch_promptERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERS9_
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_16FunctionAIFilterEE18build_batch_promptERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERS9_
_ZNK5doris10AIFunctionINS_31FunctionAIFilterBatchTestHelperEE18build_batch_promptERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EERS9_
Line
Count
Source
486
2
                              std::string& prompt) const {
487
2
        rapidjson::StringBuffer buffer;
488
2
        rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
489
490
2
        writer.StartArray();
491
6
        for (size_t i = 0; i < batch_prompts.size(); ++i) {
492
4
            writer.StartObject();
493
4
            writer.Key("idx");
494
4
            writer.Uint64(i);
495
4
            writer.Key("input");
496
4
            writer.String(batch_prompts[i].data(),
497
4
                          static_cast<rapidjson::SizeType>(batch_prompts[i].size()));
498
4
            writer.EndObject();
499
4
        }
500
2
        writer.EndArray();
501
502
2
        prompt = buffer.GetString();
503
2
        return Status::OK();
504
2
    }
505
};
506
507
} // namespace doris