xiaokang commented on code in PR #26749: URL: https://github.com/apache/doris/pull/26749#discussion_r1403929052
########## be/src/vec/exec/scan/new_olap_scan_node.cpp: ########## @@ -414,6 +419,49 @@ std::string NewOlapScanNode::get_name() { return fmt::format("VNewOlapScanNode({0})", _olap_scan_node.table_name); } +void NewOlapScanNode::_filter_and_collect_cast_type_for_variant( + const VExpr* expr, + phmap::flat_hash_map<std::string, std::vector<PrimitiveType>>& colname_to_cast_types) { + auto* cast_expr = dynamic_cast<const VCastExpr*>(expr); + if (cast_expr != nullptr) { + auto* src_slot = cast_expr->get_child(0)->node_type() == TExprNodeType::SLOT_REF + ? dynamic_cast<const VSlotRef*>(cast_expr->get_child(0).get()) + : nullptr; + if (src_slot == nullptr) { + return; + } + std::vector<SlotDescriptor*> slots = _output_tuple_desc->slots(); + SlotDescriptor* src_slot_desc = slots[_slot_id_to_slot_idx[src_slot->slot_id()]]; + PrimitiveType cast_dst_type = + cast_expr->get_target_type()->get_type_as_type_descriptor().type; + if (src_slot_desc->type().is_variant_type()) { + colname_to_cast_types[src_slot_desc->col_name()].push_back(cast_dst_type); + } + } + for (const auto& child : expr->children()) { + _filter_and_collect_cast_type_for_variant(child.get(), colname_to_cast_types); + } +} + +void NewOlapScanNode::get_cast_types_for_variants() { + phmap::flat_hash_map<std::string, std::vector<PrimitiveType>> colname_to_cast_types; + for (auto it = _conjuncts.begin(); it != _conjuncts.end();) { + auto& conjunct = *it; + if (conjunct->root()) { + _filter_and_collect_cast_type_for_variant(conjunct->root().get(), + colname_to_cast_types); + } + ++it; + } + // cast to one certain type for variant could utilize fully predicates performance + // when storage layer type equals to cast type + for (const auto& [slotid, types] : colname_to_cast_types) { + if (types.size() == 1) { + _cast_types_for_variants[slotid] = types[0]; + } Review Comment: add comment -- 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