diff --git a/Framework/Core/include/Framework/AnalysisHelpers.h b/Framework/Core/include/Framework/AnalysisHelpers.h index 55d2490dff1bc..95be6c7e407b3 100644 --- a/Framework/Core/include/Framework/AnalysisHelpers.h +++ b/Framework/Core/include/Framework/AnalysisHelpers.h @@ -297,6 +297,7 @@ struct Spawns : decltype(transformBase()) { using extension_t = typename metadata::extension_table_t; using base_table_t = typename metadata::base_table_t; using expression_pack_t = typename metadata::expression_pack_t; + static constexpr size_t N = framework::pack_size(expression_pack_t{}); constexpr auto pack() { @@ -318,7 +319,13 @@ struct Spawns : decltype(transformBase()) { } std::shared_ptr table = nullptr; std::shared_ptr extension = nullptr; + std::array projectors = [](framework::pack) -> std::array + { + return {{std::move(C::Projector())...}}; + } + (expression_pack_t{}); std::shared_ptr projector = nullptr; + std::shared_ptr schema = std::make_shared(o2::soa::createFieldsFromColumns(expression_pack_t{})); }; template @@ -365,6 +372,7 @@ struct Defines : decltype(transformBase()) { std::array projectors; std::shared_ptr projector = nullptr; + std::shared_ptr schema = std::make_shared(o2::soa::createFieldsFromColumns(placeholders_pack_t{})); }; template @@ -828,8 +836,10 @@ template auto Extend(T const& table) { using output_t = Join, o2::aod::Hash<"JOIN/0"_h>, o2::aod::Hash<"JOIN"_h>, Cs...>>; + static std::array projectors{{std::move(Cs::Projector())...}}; static std::shared_ptr projector = nullptr; - return output_t{{o2::framework::spawner(framework::pack{}, {table.asArrowTable()}, "dynamicExtension", projector), table.asArrowTable()}, 0}; + static auto schema = std::make_shared(o2::soa::createFieldsFromColumns(framework::pack{})); + return output_t{{o2::framework::spawner(framework::pack{}, {table.asArrowTable()}, "dynamicExtension", projectors.data(), projector, schema), table.asArrowTable()}, 0}; } /// Template function to attach dynamic columns on-the-fly (e.g. inside diff --git a/Framework/Core/include/Framework/AnalysisManagers.h b/Framework/Core/include/Framework/AnalysisManagers.h index 1d894b2b67948..e57960fadb1d9 100644 --- a/Framework/Core/include/Framework/AnalysisManagers.h +++ b/Framework/Core/include/Framework/AnalysisManagers.h @@ -287,8 +287,13 @@ bool prepareOutput(ProcessingContext& context, T& spawns) using base_table_t = typename T::base_table_t::table_t; originalTable = makeEmptyTable(o2::aod::label()); } + using D = o2::aod::Hash; - spawns.extension = std::make_shared(o2::framework::spawner>(originalTable, o2::aod::label(), spawns.projector)); + spawns.extension = std::make_shared(o2::framework::spawner(originalTable, + o2::aod::label(), + spawns.projectors.data(), + spawns.projector, + spawns.schema)); spawns.table = std::make_shared(soa::ArrowHelpers::joinTables({spawns.extension->asArrowTable(), originalTable}, std::span{T::spawnable_t::table_t::originalLabels})); return true; } @@ -309,8 +314,13 @@ bool prepareOutput(ProcessingContext& context, T& defines) using base_table_t = typename T::base_table_t::table_t; originalTable = makeEmptyTable(o2::aod::label()); } + using D = o2::aod::Hash; - defines.extension = std::make_shared(o2::framework::spawner>(originalTable, o2::aod::label(), defines.projectors.data(), defines.projector)); + defines.extension = std::make_shared(o2::framework::spawner(originalTable, + o2::aod::label(), + defines.projectors.data(), + defines.projector, + defines.schema)); defines.table = std::make_shared(soa::ArrowHelpers::joinTables({defines.extension->asArrowTable(), originalTable}, std::span{T::spawnable_t::table_t::originalLabels})); return true; } diff --git a/Framework/Core/include/Framework/TableBuilder.h b/Framework/Core/include/Framework/TableBuilder.h index e2d12789ef922..f941bf29bd8c8 100644 --- a/Framework/Core/include/Framework/TableBuilder.h +++ b/Framework/Core/include/Framework/TableBuilder.h @@ -768,80 +768,51 @@ std::shared_ptr spawnerHelper(std::shared_ptr const& /// Expression-based column generator to materialize columns template requires(soa::has_configurable_extension::metadata>) -auto spawner(std::vector>&& tables, const char* name, o2::framework::expressions::Projector* projectors, std::shared_ptr& projector) +auto spawner(std::shared_ptr const& fullTable, const char* name, o2::framework::expressions::Projector* projectors, std::shared_ptr& projector, std::shared_ptr const& schema) { using placeholders_pack_t = typename o2::aod::MetadataTrait::metadata::placeholders_pack_t; - auto fullTable = soa::ArrowHelpers::joinTables(std::move(tables), std::span{o2::aod::MetadataTrait::metadata::base_table_t::originalLabels}); if (fullTable->num_rows() == 0) { return makeEmptyTable(name, placeholders_pack_t{}); } - static auto new_schema = std::make_shared(o2::soa::createFieldsFromColumns(placeholders_pack_t{})); - - return spawnerHelper(fullTable, new_schema, framework::pack_size(placeholders_pack_t{}), projectors, name, projector); + return spawnerHelper(fullTable, schema, framework::pack_size(placeholders_pack_t{}), projectors, name, projector); } template requires(soa::has_configurable_extension::metadata>) -auto spawner(std::shared_ptr const& fullTable, const char* name, o2::framework::expressions::Projector* projectors, std::shared_ptr& projector) +auto spawner(std::vector>&& tables, const char* name, o2::framework::expressions::Projector* projectors, std::shared_ptr& projector, std::shared_ptr const& schema) { - using placeholders_pack_t = typename o2::aod::MetadataTrait::metadata::placeholders_pack_t; - if (fullTable->num_rows() == 0) { - return makeEmptyTable(name, placeholders_pack_t{}); - } - static auto new_schema = std::make_shared(o2::soa::createFieldsFromColumns(placeholders_pack_t{})); - - return spawnerHelper(fullTable, new_schema, framework::pack_size(placeholders_pack_t{}), projectors, name, projector); + auto fullTable = soa::ArrowHelpers::joinTables(std::move(tables), std::span{o2::aod::MetadataTrait::metadata::base_table_t::originalLabels}); + return spawner(fullTable, name, projectors, projector, schema); } template requires(soa::has_extension::metadata> && !soa::has_configurable_extension::metadata>) -auto spawner(std::vector>&& tables, const char* name, std::shared_ptr& projector) +auto spawner(std::shared_ptr const& fullTable, const char* name, expressions::Projector* projectors, std::shared_ptr& projector, std::shared_ptr const& schema) { using expression_pack_t = typename o2::aod::MetadataTrait::metadata::expression_pack_t; - auto fullTable = soa::ArrowHelpers::joinTables(std::move(tables), std::span{o2::aod::MetadataTrait::metadata::base_table_t::originalLabels}); if (fullTable->num_rows() == 0) { return makeEmptyTable(name, expression_pack_t{}); } - static auto new_schema = std::make_shared(o2::soa::createFieldsFromColumns(expression_pack_t{})); - - auto projectors = [](framework::pack) -> std::array - { - return {{std::move(C::Projector())...}}; - } - (expression_pack_t{}); - - return spawnerHelper(fullTable, new_schema, framework::pack_size(expression_pack_t{}), projectors.data(), name, projector); + return spawnerHelper(fullTable, schema, framework::pack_size(expression_pack_t{}), projectors, name, projector); } template requires(soa::has_extension::metadata> && !soa::has_configurable_extension::metadata>) -auto spawner(std::shared_ptr const& fullTable, const char* name, std::shared_ptr& projector) +auto spawner(std::vector>&& tables, const char* name, expressions::Projector* projectors, std::shared_ptr& projector, std::shared_ptr const& schema) { - using expression_pack_t = typename o2::aod::MetadataTrait::metadata::expression_pack_t; - if (fullTable->num_rows() == 0) { - return makeEmptyTable(name, expression_pack_t{}); - } - static auto new_schema = std::make_shared(o2::soa::createFieldsFromColumns(expression_pack_t{})); - auto projectors = [](framework::pack) -> std::array - { - return {{std::move(C::Projector())...}}; - } - (expression_pack_t{}); - - return spawnerHelper(fullTable, new_schema, framework::pack_size(expression_pack_t{}), projectors.data(), name, projector); + auto fullTable = soa::ArrowHelpers::joinTables(std::move(tables), std::span{o2::aod::MetadataTrait::metadata::base_table_t::originalLabels}); + return spawner(fullTable, name, projectors, projector, schema); } template -auto spawner(framework::pack columns, std::vector>&& tables, const char* name, std::shared_ptr& projector) +auto spawner(framework::pack, std::vector>&& tables, const char* name, expressions::Projector* projectors, std::shared_ptr& projector, std::shared_ptr const& schema) { std::array labels{"original"}; auto fullTable = soa::ArrowHelpers::joinTables(std::move(tables), std::span{labels}); if (fullTable->num_rows() == 0) { return makeEmptyTable(name, framework::pack{}); } - static auto new_schema = std::make_shared(o2::soa::createFieldsFromColumns(columns)); - std::array projectors{{std::move(C::Projector())...}}; - return spawnerHelper(fullTable, new_schema, sizeof...(C), projectors.data(), name, projector); + return spawnerHelper(fullTable, schema, sizeof...(C), projectors, name, projector); } template diff --git a/Framework/Core/src/AODReaderHelpers.cxx b/Framework/Core/src/AODReaderHelpers.cxx index c413f2520919d..4dbd2877476be 100644 --- a/Framework/Core/src/AODReaderHelpers.cxx +++ b/Framework/Core/src/AODReaderHelpers.cxx @@ -158,7 +158,13 @@ auto make_spawn(InputSpec const& input, ProcessingContext& pc) using metadata_t = o2::aod::MetadataTrait::metadata; constexpr auto sources = metadata_t::sources; static std::shared_ptr projector = nullptr; - return o2::framework::spawner(extractOriginals(pc), input.binding.c_str(), projector); + static std::shared_ptr schema = std::make_shared(o2::soa::createFieldsFromColumns(typename metadata_t::expression_pack_t{})); + static auto projectors = [](framework::pack) -> std::array + { + return {{std::move(C::Projector())...}}; + } + (typename metadata_t::expression_pack_t{}); + return o2::framework::spawner(extractOriginals(pc), input.binding.c_str(), projectors.data(), projector, schema); } } // namespace diff --git a/Framework/Core/test/test_TableSpawner.cxx b/Framework/Core/test/test_TableSpawner.cxx index 2291ba5f4f787..e200adf37ccb4 100644 --- a/Framework/Core/test/test_TableSpawner.cxx +++ b/Framework/Core/test/test_TableSpawner.cxx @@ -50,10 +50,9 @@ TEST_CASE("TestTableSpawner") auto t1 = b1.finalize(); Points st1{t1}; - std::shared_ptr projector = nullptr; - auto expoints_a = o2::soa::Extend(st1); - auto extension = ExPointsExtension{o2::framework::spawner>(t1, o2::aod::Hash<"ExPoints"_h>::str, projector)}; + Spawns s; + auto extension = ExPointsExtension{o2::framework::spawner>(t1, o2::aod::Hash<"ExPoints"_h>::str, s.projectors.data(), s.projector, s.schema)}; auto expoints = ExPoints{{t1, extension.asArrowTable()}, 0}; REQUIRE(expoints_a.size() == 9); @@ -81,7 +80,7 @@ TEST_CASE("TestTableSpawner") Defines excpts; excpts.projectors[0] = test::x * test::x + test::y * test::y + test::z * test::z; - auto extension_2 = ExcPointsCfgExtension{o2::framework::spawner>({t1}, o2::aod::Hash<"ExcPoints"_h>::str, excpts.projectors.data(), excpts.projector)}; + auto extension_2 = ExcPointsCfgExtension{o2::framework::spawner>({t1}, o2::aod::Hash<"ExcPoints"_h>::str, excpts.projectors.data(), excpts.projector, excpts.schema)}; auto excpoints = ExcPoints{{t1, extension_2.asArrowTable()}, 0}; rex = extension.begin();