xiaokang commented on code in PR #35344:
URL: https://github.com/apache/doris/pull/35344#discussion_r1616542077


##########
be/src/vec/exprs/vexpr.h:
##########
@@ -231,6 +231,47 @@ class VExpr {
         return nullptr;
     }
 
+    // fast_execute can direct copy expr filter result which build by apply 
index in segment_iterator
+    virtual bool fast_execute(Block& block, const ColumnNumbers& arguments, 
size_t result,
+                              size_t input_rows_count, const std::string& 
function_name) {
+        std::string result_column_name = gen_predicate_result_sign(block, 
arguments, function_name);
+        if (!block.has(result_column_name)) {
+            return false;
+        }
+
+        auto result_column =
+                
block.get_by_name(result_column_name).column->convert_to_full_column_if_const();
+        auto& result_info = block.get_by_position(result);
+        if (result_info.type->is_nullable()) {
+            block.replace_by_position(
+                    result, ColumnNullable::create(std::move(result_column),
+                                                   
ColumnUInt8::create(input_rows_count, 0)));
+        } else {
+            block.replace_by_position(result, std::move(result_column));
+        }
+
+        return true;
+    }
+
+    virtual std::string gen_predicate_result_sign(Block& block, const 
ColumnNumbers& arguments,

Review Comment:
   remove virtual



##########
be/src/vec/exprs/vin_predicate.cpp:
##########
@@ -116,12 +119,52 @@ Status VInPredicate::execute(VExprContext* context, 
Block* block, int* result_co
     size_t num_columns_without_result = block->columns();
     // prepare a column to save result
     block->insert({nullptr, _data_type, _expr_name});
+
+    if (_can_fast_execute) {
+        auto can_fast_execute = 
fast_execute(context->fn_context(_fn_context_index), *block,
+                                             arguments, 
num_columns_without_result, block->rows());
+        if (can_fast_execute) {
+            *result_column_id = num_columns_without_result;
+            return Status::OK();
+        }
+    }
+
     RETURN_IF_ERROR(_function->execute(context->fn_context(_fn_context_index), 
*block, arguments,
                                        num_columns_without_result, 
block->rows(), false));
     *result_column_id = num_columns_without_result;
     return Status::OK();
 }
 
+bool VInPredicate::fast_execute(FunctionContext* context, Block& block,
+                                const ColumnNumbers& arguments, size_t result,
+                                size_t input_rows_count) {
+    std::string column_name = block.get_by_position(arguments[0]).name;
+    std::string result_column_name = BeConsts::BLOCK_TEMP_COLUMN_PREFIX + 
column_name + "_in_list_";

Review Comment:
   use a common function generate the column name consistently



##########
be/src/vec/exprs/vexpr.h:
##########
@@ -231,6 +231,47 @@ class VExpr {
         return nullptr;
     }
 
+    // fast_execute can direct copy expr filter result which build by apply 
index in segment_iterator
+    virtual bool fast_execute(Block& block, const ColumnNumbers& arguments, 
size_t result,
+                              size_t input_rows_count, const std::string& 
function_name) {
+        std::string result_column_name = gen_predicate_result_sign(block, 
arguments, function_name);
+        if (!block.has(result_column_name)) {
+            return false;
+        }
+
+        auto result_column =
+                
block.get_by_name(result_column_name).column->convert_to_full_column_if_const();
+        auto& result_info = block.get_by_position(result);
+        if (result_info.type->is_nullable()) {
+            block.replace_by_position(
+                    result, ColumnNullable::create(std::move(result_column),
+                                                   
ColumnUInt8::create(input_rows_count, 0)));
+        } else {
+            block.replace_by_position(result, std::move(result_column));
+        }
+
+        return true;
+    }
+
+    virtual std::string gen_predicate_result_sign(Block& block, const 
ColumnNumbers& arguments,
+                                                  const std::string& 
function_name) {
+        std::string pred_result_sign;
+        std::string column_name = block.get_by_position(arguments[0]).name;
+        pred_result_sign += BeConsts::BLOCK_TEMP_COLUMN_PREFIX + column_name + 
"_";
+        if (function_name == "in") {
+            pred_result_sign += "in_list_";

Review Comment:
   change to consistent name



##########
be/src/vec/exprs/vin_predicate.cpp:
##########
@@ -116,12 +119,52 @@ Status VInPredicate::execute(VExprContext* context, 
Block* block, int* result_co
     size_t num_columns_without_result = block->columns();
     // prepare a column to save result
     block->insert({nullptr, _data_type, _expr_name});
+
+    if (_can_fast_execute) {
+        auto can_fast_execute = 
fast_execute(context->fn_context(_fn_context_index), *block,
+                                             arguments, 
num_columns_without_result, block->rows());
+        if (can_fast_execute) {
+            *result_column_id = num_columns_without_result;
+            return Status::OK();
+        }
+    }
+
     RETURN_IF_ERROR(_function->execute(context->fn_context(_fn_context_index), 
*block, arguments,
                                        num_columns_without_result, 
block->rows(), false));
     *result_column_id = num_columns_without_result;
     return Status::OK();
 }
 
+bool VInPredicate::fast_execute(FunctionContext* context, Block& block,
+                                const ColumnNumbers& arguments, size_t result,
+                                size_t input_rows_count) {
+    std::string column_name = block.get_by_position(arguments[0]).name;
+    std::string result_column_name = BeConsts::BLOCK_TEMP_COLUMN_PREFIX + 
column_name + "_in_list_";

Review Comment:
   use a common function generate the column name consistently



##########
be/src/vec/exprs/vexpr.h:
##########
@@ -231,6 +231,47 @@ class VExpr {
         return nullptr;
     }
 
+    // fast_execute can direct copy expr filter result which build by apply 
index in segment_iterator
+    virtual bool fast_execute(Block& block, const ColumnNumbers& arguments, 
size_t result,

Review Comment:
   remove virtual



-- 
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: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to