@@ -50,7 +50,6 @@ O2_DECLARE_DYNAMIC_LOG(rate_limiting);
5050
5151namespace o2 ::framework
5252{
53-
5453class EndOfStreamContext ;
5554class ProcessingContext ;
5655
@@ -578,45 +577,80 @@ o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec()
578577 } },
579578 .adjustTopology = [](WorkflowSpecNode& node, ConfigContext const & ctx) {
580579 auto & workflow = node.specs ;
581- auto spawner = std::ranges::find_if (workflow, [](DataProcessorSpec const & spec) { return spec.name .starts_with (" internal-dpl-aod-spawner" ); });
582- auto analysisCCDB = std::ranges::find_if (workflow, [](DataProcessorSpec const & spec) { return spec.name .starts_with (" internal-dpl-aod-ccdb" ); });
583- auto builder = std::ranges::find_if (workflow, [](DataProcessorSpec const & spec) { return spec.name .starts_with (" internal-dpl-aod-index-builder" ); });
584- auto writer = std::ranges::find_if (workflow, [](DataProcessorSpec const & spec) { return spec.name .starts_with (" internal-dpl-aod-writer" ); });
585580 auto & dec = ctx.services ().get <DanglingEdgesContext>();
586581 dec.requestedAODs .clear ();
587582 dec.requestedDYNs .clear ();
588- dec.providedDYNs .clear ();
589- dec.providedTIMs .clear ();
590- dec.requestedTIMs .clear ();
591583
592584 auto inputSpecLessThan = [](InputSpec const & lhs, InputSpec const & rhs) { return DataSpecUtils::describe (lhs) < DataSpecUtils::describe (rhs); };
593585 auto outputSpecLessThan = [](OutputSpec const & lhs, OutputSpec const & rhs) { return DataSpecUtils::describe (lhs) < DataSpecUtils::describe (rhs); };
594586
587+ auto builder = std::ranges::find_if (workflow, [](DataProcessorSpec const & spec) { return spec.name .starts_with (" internal-dpl-aod-index-builder" ); });
595588 if (builder != workflow.end ()) {
596589 // collect currently requested IDXs
597590 dec.requestedIDXs .clear ();
591+ dec.providedIDXs .clear ();
598592 for (auto & d : workflow | views::exclude_by_name (builder->name )) {
599593 d.inputs |
600- views::partial_match_filter (header::DataOrigin{ " IDX " } ) |
594+ views::filter_with_params_by_name ( " index-records " ) |
601595 sinks::update_input_list{dec.requestedIDXs };
596+ d.outputs |
597+ views::filter_with_params_by_name (" index-records" ) |
598+ sinks::update_output_list{dec.providedIDXs };
602599 }
600+ std::ranges::sort (dec.requestedIDXs , inputSpecLessThan);
601+ std::ranges::sort (dec.providedIDXs , outputSpecLessThan);
602+ dec.builderInputs .clear ();
603+ dec.requestedIDXs |
604+ views::filter_not_matching (dec.providedIDXs ) |
605+ sinks::append_to{dec.builderInputs };
603606 // recreate inputs and outputs
604607 builder->inputs .clear ();
605608 builder->outputs .clear ();
609+ AnalysisSupportHelpers::addMissingOutputsToBuilder (dec.builderInputs , dec.requestedAODs , dec.requestedDYNs , *builder);
610+ if (!builder->inputs .empty ()) {
611+ // load real AlgorithmSpec before deployment
612+ builder->algorithm = PluginManager::loadAlgorithmFromPlugin (" O2FrameworkOnDemandTablesSupport" , " IndexTableBuilder" , ctx);
613+ }
614+ }
615+
616+ auto analysisCCDB = std::ranges::find_if (workflow, [](DataProcessorSpec const & spec) { return spec.name .starts_with (" internal-dpl-aod-ccdb" ); });
617+ if (analysisCCDB != workflow.end ()) {
618+ dec.requestedTIMs .clear ();
619+ dec.providedTIMs .clear ();
620+ for (auto & d : workflow | views::exclude_by_name (analysisCCDB->name )) {
621+ d.inputs |
622+ views::filter_with_params_by_name_starting (" ccdb:" ) |
623+ sinks::update_input_list{dec.requestedTIMs };
624+ d.outputs |
625+ views::filter_with_params_by_name_starting (" ccdb:" ) |
626+ sinks::append_to{dec.providedTIMs };
627+ }
628+ std::ranges::sort (dec.requestedTIMs , inputSpecLessThan);
629+ std::ranges::sort (dec.providedTIMs , outputSpecLessThan);
630+ // Use ranges::to<std::vector<>> in C++23...
631+ dec.analysisCCDBInputs .clear ();
632+ dec.requestedTIMs |
633+ views::filter_not_matching (dec.providedTIMs ) |
634+ sinks::append_to{dec.analysisCCDBInputs };
606635
636+ // recreate inputs and outputs
637+ analysisCCDB->outputs .clear ();
638+ analysisCCDB->inputs .clear ();
639+ AnalysisSupportHelpers::addMissingOutputsToBuilder (dec.analysisCCDBInputs , dec.requestedAODs , dec.requestedDYNs , *analysisCCDB);
607640 // load real AlgorithmSpec before deployment
608- builder->algorithm = PluginManager::loadAlgorithmFromPlugin (" O2FrameworkOnDemandTablesSupport" , " IndexTableBuilder" , ctx);
609- AnalysisSupportHelpers::addMissingOutputsToBuilder (dec.requestedIDXs , dec.requestedAODs , dec.requestedDYNs , *builder);
641+ analysisCCDB->algorithm = PluginManager::loadAlgorithmFromPlugin (" O2FrameworkCCDBSupport" , " AnalysisCCDBFetcherPlugin" , ctx);
610642 }
611643
644+ auto spawner = std::ranges::find_if (workflow, [](DataProcessorSpec const & spec) { return spec.name .starts_with (" internal-dpl-aod-spawner" ); });
612645 if (spawner != workflow.end ()) {
646+ dec.providedDYNs .clear ();
613647 // collect currently requested DYNs
614648 for (auto & d : workflow | views::exclude_by_name (spawner->name )) {
615649 d.inputs |
616- views::partial_match_filter (header::DataOrigin{ " DYN " } ) |
650+ views::filter_with_params_by_name ( " projectors " ) |
617651 sinks::update_input_list{dec.requestedDYNs };
618652 d.outputs |
619- views::partial_match_filter (header::DataOrigin{ " DYN " } ) |
653+ views::filter_with_params_by_name ( " projectors " ) |
620654 sinks::append_to{dec.providedDYNs };
621655 }
622656 std::ranges::sort (dec.requestedDYNs , inputSpecLessThan);
@@ -628,32 +662,14 @@ o2::framework::ServiceSpec ArrowSupport::arrowBackendSpec()
628662 // recreate inputs and outputs
629663 spawner->outputs .clear ();
630664 spawner->inputs .clear ();
631-
632- // load real AlgorithmSpec before deployment
633- spawner->algorithm = PluginManager::loadAlgorithmFromPlugin (" O2FrameworkOnDemandTablesSupport" , " ExtendedTableSpawner" , ctx);
634665 AnalysisSupportHelpers::addMissingOutputsToSpawner ({}, dec.spawnerInputs , dec.requestedAODs , *spawner);
635- }
636-
637- if (analysisCCDB != workflow.end ()) {
638- for (auto & d : workflow | views::exclude_by_name (analysisCCDB->name )) {
639- d.inputs | views::partial_match_filter (header::DataOrigin{" ATIM" }) | sinks::update_input_list{dec.requestedTIMs };
640- d.outputs | views::partial_match_filter (header::DataOrigin{" ATIM" }) | sinks::append_to{dec.providedTIMs };
666+ if (!spawner->inputs .empty ()) {
667+ // load real AlgorithmSpec before deployment
668+ spawner->algorithm = PluginManager::loadAlgorithmFromPlugin (" O2FrameworkOnDemandTablesSupport" , " ExtendedTableSpawner" , ctx);
641669 }
642- std::ranges::sort (dec.requestedTIMs , inputSpecLessThan);
643- std::ranges::sort (dec.providedTIMs , outputSpecLessThan);
644- // Use ranges::to<std::vector<>> in C++23...
645- dec.analysisCCDBInputs .clear ();
646- dec.requestedTIMs | views::filter_not_matching (dec.providedTIMs ) | sinks::append_to{dec.analysisCCDBInputs };
647-
648- // recreate inputs and outputs
649- analysisCCDB->outputs .clear ();
650- analysisCCDB->inputs .clear ();
651- // load real AlgorithmSpec before deployment
652- // FIXME how can I make the lookup depend on DYN tables as well??
653- analysisCCDB->algorithm = PluginManager::loadAlgorithmFromPlugin (" O2FrameworkCCDBSupport" , " AnalysisCCDBFetcherPlugin" , ctx);
654- AnalysisSupportHelpers::addMissingOutputsToBuilder (dec.analysisCCDBInputs , dec.requestedAODs , dec.requestedDYNs , *analysisCCDB);
655670 }
656671
672+ auto writer = std::ranges::find_if (workflow, [](DataProcessorSpec const & spec) { return spec.name .starts_with (" internal-dpl-aod-writer" ); });
657673 if (writer != workflow.end ()) {
658674 workflow.erase (writer);
659675 }
0 commit comments