@@ -143,25 +143,26 @@ void AnalysisSupportHelpers::addMissingOutputsToSpawner(std::vector<OutputSpec>
143143 std::vector<InputSpec>& requestedAODs,
144144 DataProcessorSpec& publisher)
145145{
146- for (auto & input : requestedSpecials) {
147- if (std::any_of (providedSpecials.begin (), providedSpecials.end (), [&input](auto const & x) {
148- return DataSpecUtils::match (input, x);
149- })) {
150- continue ;
151- }
152- auto concrete = DataSpecUtils::asConcreteDataMatcher (input);
153- publisher.outputs .emplace_back (concrete.origin , concrete.description , concrete.subSpec );
154- for (auto & i : input.metadata ) {
155- if ((i.type == VariantType::String) && (i.name .find (" input:" ) != std::string::npos)) {
156- auto spec = DataSpecUtils::fromMetadataString (i.defaultValue .get <std::string>());
157- auto j = std::find (publisher.inputs .begin (), publisher.inputs .end (), spec);
158- if (j == publisher.inputs .end ()) {
159- publisher.inputs .push_back (spec);
160- }
161- DataSpecUtils::updateInputList (requestedAODs, std::move (spec));
162- }
163- }
146+ requestedSpecials |
147+ views::filter_not_matching (providedSpecials) | // filter the inputs that are already provided
148+ std::views::transform ([](auto const & req){ // create outputspecs for unmatched inputs
149+ return DataSpecUtils::asOutputSpec (req);
150+ }) |
151+ sinks::append_to (publisher.outputs ); // append them to the publisher outputs
152+
153+ std::vector<InputSpec> additionalInputs;
154+ for (auto & input : requestedSpecials | views::filter_not_matching (providedSpecials)) {
155+ input.metadata |
156+ std::views::filter ([](auto const & param){ // filter config params that are strings starting with "input:"
157+ return (param.type == VariantType::String) && (param.name .find (" input:" ) != std::string::npos);
158+ }) |
159+ std::views::transform ([](auto const & param){ // parse them into InputSpecs
160+ return DataSpecUtils::fromMetadataString (param.defaultValue .template get <std::string>());
161+ }) |
162+ sinks::update_input_list{additionalInputs}; // store into a temporary
164163 }
164+ additionalInputs | sinks::update_input_list{requestedAODs}; // update requestedAODs
165+ additionalInputs | sinks::update_input_list{publisher.inputs }; // update publisher inputs
165166}
166167
167168void AnalysisSupportHelpers::addMissingOutputsToBuilder (std::vector<InputSpec> const & requestedSpecials,
0 commit comments