eldenmoon commented on code in PR #26749:
URL: https://github.com/apache/doris/pull/26749#discussion_r1403846367
##########
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:
types.size() > 1 will be ignored and not push down
--
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]