MCPcopy Create free account
hub / github.com/ByConity/ByConity / prunePartsByIndex

Method prunePartsByIndex

src/QueryPlan/TableScanStep.cpp:607–675  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

605}
606
607void TableScanExecutor::prunePartsByIndex(MergeTreeData::DataPartsVector & parts) const
608{
609 if (parts.empty())
610 return;
611
612 auto part_values = MergeTreeDataSelectExecutor::filterPartsByVirtualColumns(storage, parts, select_query_info, context);
613
614 if (part_values && part_values->empty())
615 {
616 parts.clear();
617 return;
618 }
619
620 ReadFromMergeTree::AnalysisResult result;
621 if (select_query_info.partition_filter)
622 {
623 /// If partition filter exist reconstruct query info
624 SelectQueryOptions options;
625 auto mutable_context = Context::createCopy(context);
626 ASTPtr copy_select = select_query_info.query->clone();
627 auto & copy_select_query = copy_select->as<ASTSelectQuery &>();
628 std::vector<String> setting_names{"enable_partition_filter_push_down"};
629 for (auto & setting_name : setting_names)
630 {
631 SettingChange setting;
632 setting.name = setting_name;
633 setting.value = Field(false);
634 if (copy_select_query.settings())
635 {
636 auto * set_ast = copy_select_query.settings()->as<ASTSetQuery>();
637 auto it = std::find_if(set_ast->changes.begin(), set_ast->changes.end(), [&](const SettingChange & change) {
638 return change.name == setting_name;
639 });
640 if (it != set_ast->changes.end())
641 it->value = Field(false);
642 else
643 set_ast->changes.emplace_back(setting);
644 }
645 else
646 {
647 ASTSetQuery set_ast;
648 set_ast.is_standalone = false;
649 set_ast.changes.emplace_back(setting);
650 copy_select_query.setExpression(ASTSelectQuery::Expression::SETTINGS, std::make_shared<ASTSetQuery>(set_ast));
651 }
652 }
653
654 copy_select_query.setExpression(ASTSelectQuery::Expression::WHERE, select_query_info.partition_filter->clone());
655 copy_select_query.setExpression(ASTSelectQuery::Expression::PREWHERE, nullptr);
656 auto interpreter = std::make_shared<InterpreterSelectQuery>(copy_select, mutable_context, options);
657 interpreter->execute();
658 LOG_TRACE(log, "Construct partition filter query {}", queryToString(copy_select));
659 MergeTreeDataSelectExecutor::filterPartsByPartition(
660 parts, part_values, storage_metadata, storage, interpreter->getQueryInfo(), context, max_added_blocks.get(), log, result.index_stats);
661 }
662 else
663 {
664 MergeTreeDataSelectExecutor::filterPartsByPartition(

Callers

nothing calls this directly

Calls 13

queryToStringFunction · 0.85
getQueryInfoMethod · 0.80
FieldClass · 0.50
emptyMethod · 0.45
clearMethod · 0.45
cloneMethod · 0.45
settingsMethod · 0.45
beginMethod · 0.45
endMethod · 0.45
emplace_backMethod · 0.45
setExpressionMethod · 0.45
executeMethod · 0.45

Tested by

no test coverage detected