zhangstar333 commented on code in PR #21388:
URL: https://github.com/apache/doris/pull/21388#discussion_r1251728240


##########
be/src/vec/functions/function_java_udf.cpp:
##########
@@ -130,189 +141,177 @@ Status JavaFunctionCall::execute(FunctionContext* 
context, Block& block,
             context->get_function_state(FunctionContext::THREAD_LOCAL));
     JniEnv* jni_env =
             
reinterpret_cast<JniEnv*>(context->get_function_state(FunctionContext::FRAGMENT_LOCAL));
-    int arg_idx = 0;
-    ColumnPtr data_cols[arguments.size()];
-    ColumnPtr null_cols[arguments.size()];
-    for (size_t col_idx : arguments) {
-        ColumnWithTypeAndName& column = block.get_by_position(col_idx);
+    int arg_size = arguments.size();
+    ColumnPtr data_cols[arg_size];
+    ColumnPtr null_cols[arg_size];
+    jclass obj_class = env->FindClass("[Ljava/lang/Object;");
+    jclass arraylist_class = env->FindClass("Ljava/util/ArrayList;");
+    jobjectArray arg_objects = env->NewObjectArray(arg_size, obj_class, 
nullptr);
+    int64_t nullmap_address = 0;
+    for (size_t arg_idx = 0; arg_idx < arg_size; ++arg_idx) {
+        bool arg_column_nullable = false;
+        // get argument column and type
+        ColumnWithTypeAndName& column = 
block.get_by_position(arguments[arg_idx]);
+        auto column_type = column.type;
         data_cols[arg_idx] = column.column->convert_to_full_column_if_const();
-        if (!_argument_types[arg_idx]->equals(*column.type)) {
+
+        // check type
+        if (_argument_types[arg_idx]->equals(*column_type) == false) {
             return Status::InvalidArgument(strings::Substitute(
                     "$0-th input column's type $1 does not equal to required 
type $2", arg_idx,
-                    column.type->get_name(), 
_argument_types[arg_idx]->get_name()));
+                    column_type->get_name(), 
_argument_types[arg_idx]->get_name()));
         }
+
+        // get argument null map and nested column
         if (auto* nullable = check_and_get_column<const 
ColumnNullable>(*data_cols[arg_idx])) {
+            arg_column_nullable = true;
+            column_type = remove_nullable(column_type);
             null_cols[arg_idx] = nullable->get_null_map_column_ptr();
-            jni_ctx->input_nulls_buffer_ptr.get()[arg_idx] = 
reinterpret_cast<int64_t>(
+            data_cols[arg_idx] = nullable->get_nested_column_ptr();
+            nullmap_address = reinterpret_cast<int64_t>(
                     
check_and_get_column<ColumnVector<UInt8>>(null_cols[arg_idx])
                             ->get_data()
                             .data());
-            data_cols[arg_idx] = nullable->get_nested_column_ptr();
-        } else {
-            jni_ctx->input_nulls_buffer_ptr.get()[arg_idx] = -1;
         }
 
-        if (data_cols[arg_idx]->is_column_string()) {
+        // convert argument column data into java type
+        jobjectArray arr_obj = nullptr;
+        if (data_cols[arg_idx]->is_numeric() || 
data_cols[arg_idx]->is_column_decimal()) {
+            arr_obj = (jobjectArray)env->CallNonvirtualObjectMethod(
+                    jni_ctx->executor, jni_env->executor_cl,
+                    jni_env->executor_convert_basic_argument_id, arg_idx, 
arg_column_nullable,
+                    num_rows, nullmap_address,
+                    
reinterpret_cast<int64_t>(data_cols[arg_idx]->get_raw_data().data), 0);
+        } else if (data_cols[arg_idx]->is_column_string()) {
             const ColumnString* str_col =
                     assert_cast<const ColumnString*>(data_cols[arg_idx].get());
-            jni_ctx->input_values_buffer_ptr.get()[arg_idx] =
-                    reinterpret_cast<int64_t>(str_col->get_chars().data());
-            jni_ctx->input_offsets_ptrs.get()[arg_idx] =
-                    reinterpret_cast<int64_t>(str_col->get_offsets().data());
-        } else if (data_cols[arg_idx]->is_numeric() || 
data_cols[arg_idx]->is_column_decimal()) {
-            jni_ctx->input_values_buffer_ptr.get()[arg_idx] =
-                    
reinterpret_cast<int64_t>(data_cols[arg_idx]->get_raw_data().data);
+            arr_obj = (jobjectArray)env->CallNonvirtualObjectMethod(
+                    jni_ctx->executor, jni_env->executor_cl,
+                    jni_env->executor_convert_basic_argument_id, arg_idx, 
arg_column_nullable,
+                    num_rows, nullmap_address,
+                    reinterpret_cast<int64_t>(str_col->get_chars().data()),
+                    reinterpret_cast<int64_t>(str_col->get_offsets().data()));
         } else if (data_cols[arg_idx]->is_column_array()) {
             const ColumnArray* array_col =
                     assert_cast<const ColumnArray*>(data_cols[arg_idx].get());
-            jni_ctx->input_offsets_ptrs.get()[arg_idx] =
-                    
reinterpret_cast<int64_t>(array_col->get_offsets_column().get_raw_data().data);
             const ColumnNullable& array_nested_nullable =
                     assert_cast<const ColumnNullable&>(array_col->get_data());
             auto data_column_null_map = 
array_nested_nullable.get_null_map_column_ptr();
             auto data_column = array_nested_nullable.get_nested_column_ptr();
-            jni_ctx->input_array_nulls_buffer_ptr.get()[arg_idx] = 
reinterpret_cast<int64_t>(
+            auto offset_address =
+                    
reinterpret_cast<int64_t>(array_col->get_offsets_column().get_raw_data().data);
+            auto nested_nullmap_address = reinterpret_cast<int64_t>(
                     
check_and_get_column<ColumnVector<UInt8>>(data_column_null_map)
                             ->get_data()
                             .data());
-
-            //need pass FE, nullamp and offset, chars
+            int64_t nested_data_address = 0, nested_offset_address = 0;
+            // array type need pass address: [nullmap_address], 
offset_address, nested_nullmap_address, 
nested_data_address/nested_char_address,nested_offset_address
             if (data_column->is_column_string()) {

Review Comment:
   seems could use macro, but it will reduce the readability of the code and 
maybe not be worth it.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to