github-actions[bot] commented on code in PR #17594:
URL: https://github.com/apache/doris/pull/17594#discussion_r1135854172


##########
be/src/vec/exec/format/parquet/fix_length_dict_decoder.hpp:
##########
@@ -31,7 +31,7 @@ class FixLengthDictDecoder final : public BaseDictDecoder {
     ~FixLengthDictDecoder() override = default;

Review Comment:
   warning: only virtual member functions can be marked 'override' 
[clang-diagnostic-error]
   
   ```suggestion
       ~FixLengthDictDecoder() = default;
   ```
   



##########
be/src/vec/exec/format/parquet/vparquet_group_reader.cpp:
##########
@@ -608,4 +940,117 @@ ParquetColumnReader::Statistics 
RowGroupReader::statistics() {
     return st;
 }
 
+// TODO Performance Optimization
+Status RowGroupReader::_execute_conjuncts(const std::vector<VExprContext*>& 
ctxs,
+                                          const std::vector<IColumn::Filter*>& 
filters,
+                                          Block* block, IColumn::Filter* 
result_filter,
+                                          bool* can_filter_all) {
+    *can_filter_all = false;
+    auto* __restrict result_filter_data = result_filter->data();
+    for (auto* ctx : ctxs) {
+        int result_column_id = -1;
+        RETURN_IF_ERROR(ctx->execute(block, &result_column_id));
+        ColumnPtr& filter_column = 
block->get_by_position(result_column_id).column;
+        if (auto* nullable_column = 
check_and_get_column<ColumnNullable>(*filter_column)) {
+            size_t column_size = nullable_column->size();
+            if (column_size == 0) {
+                *can_filter_all = true;
+                return Status::OK();
+            } else {
+                const ColumnPtr& nested_column = 
nullable_column->get_nested_column_ptr();
+                const IColumn::Filter& filter =
+                        assert_cast<const 
ColumnUInt8&>(*nested_column).get_data();
+                auto* __restrict filter_data = filter.data();
+                const size_t size = filter.size();
+                auto* __restrict null_map_data = 
nullable_column->get_null_map_data().data();
+
+                for (size_t i = 0; i < size; ++i) {
+                    result_filter_data[i] &= (!null_map_data[i]) & 
filter_data[i];
+                }
+//                size_t count = size - 
simd::count_zero_num((int8_t*)filter_data, size);
+//                if (count == 0) {
+//                    *can_filter_all = true;
+//                    return Status::OK();
+//                }
+                if (memchr(filter_data, 0x1, size) == nullptr) {
+                    *can_filter_all = true;
+                    return Status::OK();
+                }
+            }
+        } else if (auto* const_column = 
check_and_get_column<ColumnConst>(*filter_column)) {
+            // filter all
+            if (!const_column->get_bool(0)) {
+                *can_filter_all = true;
+                return Status::OK();
+            }
+        } else {
+            const IColumn::Filter& filter =
+                    assert_cast<const ColumnUInt8&>(*filter_column).get_data();
+            auto* __restrict filter_data = filter.data();
+
+            const size_t size = filter.size();
+            for (size_t i = 0; i < size; ++i) {
+                result_filter_data[i] &= filter_data[i];
+            }
+
+            if (memchr(filter_data, 0x1, size) == nullptr) {
+                *can_filter_all = true;
+                return Status::OK();
+            }
+        }
+    }
+    for (auto* filter : filters) {
+        auto* __restrict filter_data = filter->data();
+        const size_t size = filter->size();
+        for (size_t i = 0; i < size; ++i) {
+            result_filter_data[i] &= filter_data[i];
+        }
+    }
+    return Status::OK();
+}
+
+// TODO Performance Optimization
+Status RowGroupReader::_execute_conjuncts_and_filter_block(
+        const std::vector<VExprContext*>& ctxs, const 
std::vector<IColumn::Filter*>& filters,
+        Block* block, std::vector<uint32_t>& columns_to_filter, int 
column_to_keep) {
+    IColumn::Filter result_filter(block->rows(), 1);
+    bool can_filter_all;
+    RETURN_IF_ERROR(_execute_conjuncts(ctxs, filters, block, &result_filter, 
&can_filter_all));
+    if (can_filter_all) {
+        for (auto& col : columns_to_filter) {
+            
std::move(*block->get_by_position(col).column).assume_mutable()->clear();
+        }
+    } else {
+        RETURN_IF_ERROR(_filter_block_internal(block, columns_to_filter, 
result_filter));
+    }
+    Block::erase_useless_column(block, column_to_keep);
+//    clock_gettime(CLOCK_MONOTONIC, &endT);
+//    fprintf(stderr, "==> filter_block %lu ns\n", (endT.tv_sec - 
startT.tv_sec) * 1000000000 + (endT.tv_nsec - startT.tv_nsec));
+    return Status::OK();
+}
+
+// TODO Performance Optimization
+Status RowGroupReader::_execute_conjuncts_and_filter_block2(
+        const std::vector<VExprContext*>& ctxs, const 
std::vector<IColumn::Filter*>& filters,
+        Block* block, std::vector<uint32_t>& columns_to_filter, int 
column_to_keep) {
+    struct timespec startT, endT;
+    clock_gettime(CLOCK_MONOTONIC, &startT);
+    IColumn::Filter result_filter(block->rows(), 1);
+    bool can_filter_all;
+    RETURN_IF_ERROR(_execute_conjuncts(ctxs, filters, block, &result_filter, 
&can_filter_all));
+    clock_gettime(CLOCK_MONOTONIC, &endT);
+    fprintf(stderr, "==> dict_filter_block %lu ns\n", (endT.tv_sec - 
startT.tv_sec) * 1000000000 + (endT.tv_nsec - startT.tv_nsec));
+    if (can_filter_all) {
+        for (auto& col : columns_to_filter) {
+            
std::move(*block->get_by_position(col).column).assume_mutable()->clear();

Review Comment:
   warning: std::move of the const expression has no effect; remove std::move() 
[performance-move-const-arg]
   
   ```suggestion
               *block->get_by_position(col).column.assume_mutable()->clear();
   ```
   



##########
be/src/vec/functions/function.cpp:
##########
@@ -37,63 +37,52 @@
 ColumnPtr wrap_in_nullable(const ColumnPtr& src, const Block& block, const 
ColumnNumbers& args,
                            size_t result, size_t input_rows_count) {
     ColumnPtr result_null_map_column;
+
     /// If result is already nullable.
     ColumnPtr src_not_nullable = src;
-    MutableColumnPtr mutable_result_null_map_column;
 
-    if (auto* nullable = check_and_get_column<ColumnNullable>(*src)) {
+    if (src->only_null())
+        return src;
+    else if (auto* nullable = check_and_get_column<ColumnNullable>(*src)) {
         src_not_nullable = nullable->get_nested_column_ptr();
         result_null_map_column = nullable->get_null_map_column_ptr();
     }
 
     for (const auto& arg : args) {
         const ColumnWithTypeAndName& elem = block.get_by_position(arg);
-        if (!elem.type->is_nullable()) {
-            continue;
-        }
+        if (!elem.type->is_nullable()) continue;
 
-        bool is_const = is_column_const(*elem.column);
         /// Const Nullable that are NULL.
-        if (is_const && assert_cast<const 
ColumnConst*>(elem.column.get())->only_null()) {
+        if (elem.column->only_null())

Review Comment:
   warning: statement should be inside braces 
[readability-braces-around-statements]
   
   ```suggestion
           if (elem.column->only_null()) {
   ```
   
   be/src/vec/functions/function.cpp:57:
   ```diff
   -                                                                            
Null());
   +                                                                            
Null());
   + }
   ```
   



##########
be/src/vec/functions/function.cpp:
##########
@@ -37,63 +37,52 @@ namespace doris::vectorized {
 ColumnPtr wrap_in_nullable(const ColumnPtr& src, const Block& block, const 
ColumnNumbers& args,
                            size_t result, size_t input_rows_count) {
     ColumnPtr result_null_map_column;
+
     /// If result is already nullable.
     ColumnPtr src_not_nullable = src;
-    MutableColumnPtr mutable_result_null_map_column;
 
-    if (auto* nullable = check_and_get_column<ColumnNullable>(*src)) {
+    if (src->only_null())

Review Comment:
   warning: statement should be inside braces 
[readability-braces-around-statements]
   
   ```suggestion
       if (src->only_null()) {
   ```
   
   be/src/vec/functions/function.cpp:45:
   ```diff
   -     else if (auto* nullable = check_and_get_column<ColumnNullable>(*src)) {
   +     } else if (auto* nullable = 
check_and_get_column<ColumnNullable>(*src)) {
   ```
   



##########
be/src/vec/functions/function.cpp:
##########
@@ -264,6 +258,16 @@
         return execute_impl(context, block, args, result, input_rows_count);
 }
 
+Status PreparedFunctionImpl::execute_without_low_cardinality_columns777(
+        FunctionContext* context, Block& block,
+        const ColumnNumbers& args, size_t result, size_t input_rows_count, 
bool dry_run) {
+    if (dry_run)
+        return execute_impl_dry_run(context, block, args, result,
+                                     input_rows_count);
+    else
+        return execute_impl(context, block, args, result, input_rows_count);

Review Comment:
   warning: statement should be inside braces 
[readability-braces-around-statements]
   
   ```suggestion
       else {
           return execute_impl(context, block, args, result, input_rows_count);
   }
   ```
   



##########
be/src/vec/functions/function.cpp:
##########
@@ -264,6 +258,16 @@
         return execute_impl(context, block, args, result, input_rows_count);
 }
 
+Status PreparedFunctionImpl::execute_without_low_cardinality_columns777(
+        FunctionContext* context, Block& block,
+        const ColumnNumbers& args, size_t result, size_t input_rows_count, 
bool dry_run) {
+    if (dry_run)

Review Comment:
   warning: statement should be inside braces 
[readability-braces-around-statements]
   
   ```suggestion
       if (dry_run) {
   ```
   
   be/src/vec/functions/function.cpp:266:
   ```diff
   -     else
   +     } else
   ```
   



##########
be/src/vec/functions/function.cpp:
##########
@@ -37,63 +37,52 @@
 ColumnPtr wrap_in_nullable(const ColumnPtr& src, const Block& block, const 
ColumnNumbers& args,
                            size_t result, size_t input_rows_count) {
     ColumnPtr result_null_map_column;
+
     /// If result is already nullable.
     ColumnPtr src_not_nullable = src;
-    MutableColumnPtr mutable_result_null_map_column;
 
-    if (auto* nullable = check_and_get_column<ColumnNullable>(*src)) {
+    if (src->only_null())
+        return src;
+    else if (auto* nullable = check_and_get_column<ColumnNullable>(*src)) {
         src_not_nullable = nullable->get_nested_column_ptr();
         result_null_map_column = nullable->get_null_map_column_ptr();
     }
 
     for (const auto& arg : args) {
         const ColumnWithTypeAndName& elem = block.get_by_position(arg);
-        if (!elem.type->is_nullable()) {
-            continue;
-        }
+        if (!elem.type->is_nullable()) continue;
 
-        bool is_const = is_column_const(*elem.column);
         /// Const Nullable that are NULL.
-        if (is_const && assert_cast<const 
ColumnConst*>(elem.column.get())->only_null()) {
+        if (elem.column->only_null())
             return 
block.get_by_position(result).type->create_column_const(input_rows_count,
                                                                            
Null());
-        }
-        if (is_const) {
-            continue;
-        }
 
-        if (auto* nullable = assert_cast<const 
ColumnNullable*>(elem.column.get())) {
+        if (is_column_const(*elem.column)) continue;
+
+        if (auto* nullable = 
check_and_get_column<ColumnNullable>(*elem.column)) {
             const ColumnPtr& null_map_column = 
nullable->get_null_map_column_ptr();
             if (!result_null_map_column) {
-                result_null_map_column = 
null_map_column->clone_resized(input_rows_count);
+                result_null_map_column = 
null_map_column->clone_resized(null_map_column->size());
             } else {
-                if (!mutable_result_null_map_column) {
-                    mutable_result_null_map_column =
-                            
(*std::move(result_null_map_column)).assume_mutable();
-                }
+                MutableColumnPtr mutable_result_null_map_column =
+                        (*std::move(result_null_map_column)).assume_mutable();
 
                 NullMap& result_null_map =
                         
assert_cast<ColumnUInt8&>(*mutable_result_null_map_column).get_data();
                 const NullMap& src_null_map =
                         assert_cast<const 
ColumnUInt8&>(*null_map_column).get_data();
 
                 VectorizedUtils::update_null_map(result_null_map, 
src_null_map);
+                result_null_map_column = 
std::move(mutable_result_null_map_column);
             }
         }
     }
 
-    if (!result_null_map_column) {
-        if (is_column_const(*src)) {
-            return ColumnConst::create(
-                    make_nullable(assert_cast<const 
ColumnConst&>(*src).get_data_column_ptr(),
-                                  false),
-                    input_rows_count);
-        }
-        return ColumnNullable::create(src, 
ColumnUInt8::create(input_rows_count, 0));
-    }
+    if (!result_null_map_column) return make_nullable(src);

Review Comment:
   warning: statement should be inside braces 
[readability-braces-around-statements]
   
   ```suggestion
       if (!result_null_map_column) { return make_nullable(src);
   }
   ```
   



##########
be/src/vec/exprs/vdirect_in_predicate.h:
##########
@@ -87,8 +106,14 @@ class VDirectInPredicate final : public VExpr {
 
     std::shared_ptr<HybridSetBase> get_set_func() const override { return 
_filter; }
 
+    void set_test_filter(std::unique_ptr<ArraySet<Int32, 2>>&& filter) { 
_test_filter = std::move(filter); }
+
+    void set_test_filter2(ArraySet<Int32, 2>& filter) { _test_filter2 = 
std::move(filter); }

Review Comment:
   warning: std::move of the variable 'filter' of the trivially-copyable type 
'ArraySet<doris::vectorized::Int32, 2>' (aka 'ArraySet<int, 2>') has no effect; 
remove std::move() [performance-move-const-arg]
   
   ```suggestion
       void set_test_filter2(ArraySet<Int32, 2>& filter) { _test_filter2 = 
filter; }
   ```
   



##########
be/src/vec/exec/format/parquet/fix_length_dict_decoder.hpp:
##########
@@ -31,7 +31,7 @@
     ~FixLengthDictDecoder() override = default;
 
     Status decode_values(MutableColumnPtr& doris_column, DataTypePtr& 
data_type,
-                         ColumnSelectVector& select_vector) override {
+                         ColumnSelectVector& select_vector, bool 
is_dict_filter) override {

Review Comment:
   warning: unknown type name 'ColumnSelectVector' [clang-diagnostic-error]
   ```cpp
                            ColumnSelectVector& select_vector, bool 
is_dict_filter) override {
                            ^
   ```
   



##########
be/src/vec/functions/function.cpp:
##########
@@ -37,63 +37,52 @@
 ColumnPtr wrap_in_nullable(const ColumnPtr& src, const Block& block, const 
ColumnNumbers& args,
                            size_t result, size_t input_rows_count) {
     ColumnPtr result_null_map_column;
+
     /// If result is already nullable.
     ColumnPtr src_not_nullable = src;
-    MutableColumnPtr mutable_result_null_map_column;
 
-    if (auto* nullable = check_and_get_column<ColumnNullable>(*src)) {
+    if (src->only_null())
+        return src;
+    else if (auto* nullable = check_and_get_column<ColumnNullable>(*src)) {
         src_not_nullable = nullable->get_nested_column_ptr();
         result_null_map_column = nullable->get_null_map_column_ptr();
     }
 
     for (const auto& arg : args) {
         const ColumnWithTypeAndName& elem = block.get_by_position(arg);
-        if (!elem.type->is_nullable()) {
-            continue;
-        }
+        if (!elem.type->is_nullable()) continue;
 
-        bool is_const = is_column_const(*elem.column);
         /// Const Nullable that are NULL.
-        if (is_const && assert_cast<const 
ColumnConst*>(elem.column.get())->only_null()) {
+        if (elem.column->only_null())
             return 
block.get_by_position(result).type->create_column_const(input_rows_count,
                                                                            
Null());
-        }
-        if (is_const) {
-            continue;
-        }
 
-        if (auto* nullable = assert_cast<const 
ColumnNullable*>(elem.column.get())) {
+        if (is_column_const(*elem.column)) continue;

Review Comment:
   warning: statement should be inside braces 
[readability-braces-around-statements]
   
   ```suggestion
           if (is_column_const(*elem.column)) { continue;
   }
   ```
   



##########
be/src/vec/functions/function.cpp:
##########
@@ -37,63 +37,52 @@
 ColumnPtr wrap_in_nullable(const ColumnPtr& src, const Block& block, const 
ColumnNumbers& args,
                            size_t result, size_t input_rows_count) {
     ColumnPtr result_null_map_column;
+
     /// If result is already nullable.
     ColumnPtr src_not_nullable = src;
-    MutableColumnPtr mutable_result_null_map_column;
 
-    if (auto* nullable = check_and_get_column<ColumnNullable>(*src)) {
+    if (src->only_null())
+        return src;
+    else if (auto* nullable = check_and_get_column<ColumnNullable>(*src)) {
         src_not_nullable = nullable->get_nested_column_ptr();
         result_null_map_column = nullable->get_null_map_column_ptr();
     }
 
     for (const auto& arg : args) {
         const ColumnWithTypeAndName& elem = block.get_by_position(arg);
-        if (!elem.type->is_nullable()) {
-            continue;
-        }
+        if (!elem.type->is_nullable()) continue;

Review Comment:
   warning: statement should be inside braces 
[readability-braces-around-statements]
   
   ```suggestion
           if (!elem.type->is_nullable()) { continue;
   }
   ```
   



-- 
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