This is an automated email from the ASF dual-hosted git repository.

eldenmoon pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 78849f6e64 [refactor](predicate) refactor function parse_to_predicte  
(#23343)
78849f6e64 is described below

commit 78849f6e645b6068c0b4f77d3f783652d695f257
Author: Chenyang Sun <csun5...@gmail.com>
AuthorDate: Wed Aug 23 11:52:20 2023 +0800

    [refactor](predicate) refactor function parse_to_predicte  (#23343)
    
    Refactored the interface of the parse_to_predicte function, we will be 
utilizing this interface to support the decomposition of variant columns.
    
    The "column" parameter might represent a column resulting from the 
decomposition of a variant column. Instead of using a "unique_id" for 
identification, we are utilizing a "path" to denote this column.
---
 be/src/olap/delete_handler.cpp  | 18 +++++++++++-------
 be/src/olap/predicate_creator.h | 10 ++--------
 be/src/olap/reader.cpp          | 19 +++++++++----------
 3 files changed, 22 insertions(+), 25 deletions(-)

diff --git a/be/src/olap/delete_handler.cpp b/be/src/olap/delete_handler.cpp
index e410c088ce..46bfe56cb7 100644
--- a/be/src/olap/delete_handler.cpp
+++ b/be/src/olap/delete_handler.cpp
@@ -251,7 +251,7 @@ Status DeleteHandler::init(TabletSchemaSPtr tablet_schema,
         if (delete_pred->version().first > version) {
             continue;
         }
-        // Need the tablet schema at the delete condition to parse the 
accurate column unique id
+        // Need the tablet schema at the delete condition to parse the 
accurate column
         const auto& delete_pred_related_schema = delete_pred->tablet_schema();
         auto& delete_condition = delete_pred->delete_predicate();
         DeleteConditions temp;
@@ -262,10 +262,12 @@ Status DeleteHandler::init(TabletSchemaSPtr tablet_schema,
                 return Status::Error<DELETE_INVALID_PARAMETERS>(
                         "fail to parse condition. condition={}", 
sub_predicate);
             }
-            condition.__set_column_unique_id(
-                    
delete_pred_related_schema->column(condition.column_name).unique_id());
+            int32_t col_unique_id =
+                    
delete_pred_related_schema->column(condition.column_name).unique_id();
+            const auto& column = tablet_schema->column_by_uid(col_unique_id);
+            uint32_t index = tablet_schema->field_index(col_unique_id);
             auto predicate =
-                    parse_to_predicate(tablet_schema, condition, 
_predicate_arena.get(), true);
+                    parse_to_predicate(column, index, condition, 
_predicate_arena.get(), true);
             if (predicate != nullptr) {
                 temp.column_predicate_vec.push_back(predicate);
             }
@@ -274,8 +276,6 @@ Status DeleteHandler::init(TabletSchemaSPtr tablet_schema,
         for (const auto& in_predicate : delete_condition.in_predicates()) {
             TCondition condition;
             condition.__set_column_name(in_predicate.column_name());
-            condition.__set_column_unique_id(
-                    
delete_pred_related_schema->column(condition.column_name).unique_id());
             if (in_predicate.is_not_in()) {
                 condition.__set_condition_op("!*=");
             } else {
@@ -284,8 +284,12 @@ Status DeleteHandler::init(TabletSchemaSPtr tablet_schema,
             for (const auto& value : in_predicate.values()) {
                 condition.condition_values.push_back(value);
             }
+            int32_t col_unique_id =
+                    
delete_pred_related_schema->column(condition.column_name).unique_id();
+            const auto& column = tablet_schema->column_by_uid(col_unique_id);
+            uint32_t index = tablet_schema->field_index(col_unique_id);
             temp.column_predicate_vec.push_back(
-                    parse_to_predicate(tablet_schema, condition, 
_predicate_arena.get(), true));
+                    parse_to_predicate(column, index, condition, 
_predicate_arena.get(), true));
         }
 
         _del_conds.emplace_back(std::move(temp));
diff --git a/be/src/olap/predicate_creator.h b/be/src/olap/predicate_creator.h
index 362484000e..95548c829c 100644
--- a/be/src/olap/predicate_creator.h
+++ b/be/src/olap/predicate_creator.h
@@ -265,16 +265,10 @@ ColumnPredicate* create_list_predicate(const 
TabletColumn& column, int index,
 }
 
 // This method is called in reader and in deletehandler.
-// When it is called by delete handler, then it should use the delete 
predicate's tablet schema
-// to parse the conditions.
-inline ColumnPredicate* parse_to_predicate(TabletSchemaSPtr tablet_schema,
+// The "column" parameter might represent a column resulting from the 
decomposition of a variant column.
+inline ColumnPredicate* parse_to_predicate(const TabletColumn& column, 
uint32_t index,
                                            const TCondition& condition, 
vectorized::Arena* arena,
                                            bool opposite = false) {
-    int32_t col_unique_id = condition.column_unique_id;
-    // TODO: not equal and not in predicate is not pushed down
-    const TabletColumn& column = tablet_schema->column_by_uid(col_unique_id);
-    uint32_t index = tablet_schema->field_index(col_unique_id);
-
     if (to_lower(condition.condition_op) == "is") {
         return new NullPredicate(index, 
to_lower(condition.condition_values[0]) == "null",
                                  opposite);
diff --git a/be/src/olap/reader.cpp b/be/src/olap/reader.cpp
index a3a6c5de18..b86217d537 100644
--- a/be/src/olap/reader.cpp
+++ b/be/src/olap/reader.cpp
@@ -458,22 +458,21 @@ Status TabletReader::_init_orderby_keys_param(const 
ReaderParams& read_params) {
 
 Status TabletReader::_init_conditions_param(const ReaderParams& read_params) {
     for (auto& condition : read_params.conditions) {
-        // These conditions is passed from OlapScannode, but not set column 
unique id here, so that set it here because it
-        // is too complicated to modify related interface
         TCondition tmp_cond = condition;
         RETURN_IF_ERROR(_tablet_schema->have_column(tmp_cond.column_name));
-        auto condition_col_uid = 
_tablet_schema->column(tmp_cond.column_name).unique_id();
-        tmp_cond.__set_column_unique_id(condition_col_uid);
+        // The "column" parameter might represent a column resulting from the 
decomposition of a variant column.
+        // Instead of using a "unique_id" for identification, we are utilizing 
a "path" to denote this column.
+        const auto& column = _tablet_schema->column(tmp_cond.column_name);
+        uint32_t index = _tablet_schema->field_index(tmp_cond.column_name);
         ColumnPredicate* predicate =
-                parse_to_predicate(_tablet_schema, tmp_cond, 
_predicate_arena.get());
+                parse_to_predicate(column, index, tmp_cond, 
_predicate_arena.get());
         if (predicate != nullptr) {
             // record condition value into predicate_params in order to 
pushdown segment_iterator,
             // _gen_predicate_result_sign will build predicate result unique 
sign with condition value
             auto predicate_params = predicate->predicate_params();
             predicate_params->value = condition.condition_values[0];
             predicate_params->marked_by_runtime_filter = 
condition.marked_by_runtime_filter;
-            if (_tablet_schema->column_by_uid(condition_col_uid).aggregation() 
!=
-                FieldAggregationMethod::OLAP_FIELD_AGGREGATION_NONE) {
+            if (column.aggregation() != 
FieldAggregationMethod::OLAP_FIELD_AGGREGATION_NONE) {
                 _value_col_predicates.push_back(predicate);
             } else {
                 _col_predicates.push_back(predicate);
@@ -538,10 +537,10 @@ void 
TabletReader::_init_conditions_param_except_leafnode_of_andnode(
         const ReaderParams& read_params) {
     for (const auto& condition : 
read_params.conditions_except_leafnode_of_andnode) {
         TCondition tmp_cond = condition;
-        auto condition_col_uid = 
_tablet_schema->column(tmp_cond.column_name).unique_id();
-        tmp_cond.__set_column_unique_id(condition_col_uid);
+        const auto& column = _tablet_schema->column(tmp_cond.column_name);
+        uint32_t index = _tablet_schema->field_index(tmp_cond.column_name);
         ColumnPredicate* predicate =
-                parse_to_predicate(_tablet_schema, tmp_cond, 
_predicate_arena.get());
+                parse_to_predicate(column, index, tmp_cond, 
_predicate_arena.get());
         if (predicate != nullptr) {
             auto predicate_params = predicate->predicate_params();
             predicate_params->marked_by_runtime_filter = 
condition.marked_by_runtime_filter;


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

Reply via email to