Skip to content

Commit 930d837

Browse files
authored
DPL Analysis: move spawner caches outside of the spawner function (#14281)
1 parent dbf8b73 commit 930d837

File tree

5 files changed

+45
-49
lines changed

5 files changed

+45
-49
lines changed

Framework/Core/include/Framework/AnalysisHelpers.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ struct Spawns : decltype(transformBase<T>()) {
297297
using extension_t = typename metadata::extension_table_t;
298298
using base_table_t = typename metadata::base_table_t;
299299
using expression_pack_t = typename metadata::expression_pack_t;
300+
static constexpr size_t N = framework::pack_size(expression_pack_t{});
300301

301302
constexpr auto pack()
302303
{
@@ -318,7 +319,13 @@ struct Spawns : decltype(transformBase<T>()) {
318319
}
319320
std::shared_ptr<typename T::table_t> table = nullptr;
320321
std::shared_ptr<extension_t> extension = nullptr;
322+
std::array<o2::framework::expressions::Projector, N> projectors = []<typename... C>(framework::pack<C...>) -> std::array<expressions::Projector, sizeof...(C)>
323+
{
324+
return {{std::move(C::Projector())...}};
325+
}
326+
(expression_pack_t{});
321327
std::shared_ptr<gandiva::Projector> projector = nullptr;
328+
std::shared_ptr<arrow::Schema> schema = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(expression_pack_t{}));
322329
};
323330

324331
template <typename T>
@@ -365,6 +372,7 @@ struct Defines : decltype(transformBase<T>()) {
365372

366373
std::array<o2::framework::expressions::Projector, N> projectors;
367374
std::shared_ptr<gandiva::Projector> projector = nullptr;
375+
std::shared_ptr<arrow::Schema> schema = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(placeholders_pack_t{}));
368376
};
369377

370378
template <typename T>
@@ -828,8 +836,10 @@ template <soa::is_table T, soa::is_spawnable_column... Cs>
828836
auto Extend(T const& table)
829837
{
830838
using output_t = Join<T, soa::Table<o2::aod::Hash<"JOIN"_h>, o2::aod::Hash<"JOIN/0"_h>, o2::aod::Hash<"JOIN"_h>, Cs...>>;
839+
static std::array<framework::expressions::Projector, sizeof...(Cs)> projectors{{std::move(Cs::Projector())...}};
831840
static std::shared_ptr<gandiva::Projector> projector = nullptr;
832-
return output_t{{o2::framework::spawner(framework::pack<Cs...>{}, {table.asArrowTable()}, "dynamicExtension", projector), table.asArrowTable()}, 0};
841+
static auto schema = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(framework::pack<Cs...>{}));
842+
return output_t{{o2::framework::spawner(framework::pack<Cs...>{}, {table.asArrowTable()}, "dynamicExtension", projectors.data(), projector, schema), table.asArrowTable()}, 0};
833843
}
834844

835845
/// Template function to attach dynamic columns on-the-fly (e.g. inside

Framework/Core/include/Framework/AnalysisManagers.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,8 +287,13 @@ bool prepareOutput(ProcessingContext& context, T& spawns)
287287
using base_table_t = typename T::base_table_t::table_t;
288288
originalTable = makeEmptyTable<base_table_t>(o2::aod::label<metadata::extension_table_t::ref>());
289289
}
290+
using D = o2::aod::Hash<metadata::extension_table_t::ref.desc_hash>;
290291

291-
spawns.extension = std::make_shared<typename T::extension_t>(o2::framework::spawner<o2::aod::Hash<metadata::extension_table_t::ref.desc_hash>>(originalTable, o2::aod::label<metadata::extension_table_t::ref>(), spawns.projector));
292+
spawns.extension = std::make_shared<typename T::extension_t>(o2::framework::spawner<D>(originalTable,
293+
o2::aod::label<metadata::extension_table_t::ref>(),
294+
spawns.projectors.data(),
295+
spawns.projector,
296+
spawns.schema));
292297
spawns.table = std::make_shared<typename T::spawnable_t::table_t>(soa::ArrowHelpers::joinTables({spawns.extension->asArrowTable(), originalTable}, std::span{T::spawnable_t::table_t::originalLabels}));
293298
return true;
294299
}
@@ -309,8 +314,13 @@ bool prepareOutput(ProcessingContext& context, T& defines)
309314
using base_table_t = typename T::base_table_t::table_t;
310315
originalTable = makeEmptyTable<base_table_t>(o2::aod::label<metadata::extension_table_t::ref>());
311316
}
317+
using D = o2::aod::Hash<metadata::extension_table_t::ref.desc_hash>;
312318

313-
defines.extension = std::make_shared<typename T::extension_t>(o2::framework::spawner<o2::aod::Hash<metadata::extension_table_t::ref.desc_hash>>(originalTable, o2::aod::label<metadata::extension_table_t::ref>(), defines.projectors.data(), defines.projector));
319+
defines.extension = std::make_shared<typename T::extension_t>(o2::framework::spawner<D>(originalTable,
320+
o2::aod::label<metadata::extension_table_t::ref>(),
321+
defines.projectors.data(),
322+
defines.projector,
323+
defines.schema));
314324
defines.table = std::make_shared<typename T::spawnable_t::table_t>(soa::ArrowHelpers::joinTables({defines.extension->asArrowTable(), originalTable}, std::span{T::spawnable_t::table_t::originalLabels}));
315325
return true;
316326
}

Framework/Core/include/Framework/TableBuilder.h

Lines changed: 12 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -768,80 +768,51 @@ std::shared_ptr<arrow::Table> spawnerHelper(std::shared_ptr<arrow::Table> const&
768768
/// Expression-based column generator to materialize columns
769769
template <aod::is_aod_hash D>
770770
requires(soa::has_configurable_extension<typename o2::aod::MetadataTrait<D>::metadata>)
771-
auto spawner(std::vector<std::shared_ptr<arrow::Table>>&& tables, const char* name, o2::framework::expressions::Projector* projectors, std::shared_ptr<gandiva::Projector>& projector)
771+
auto spawner(std::shared_ptr<arrow::Table> const& fullTable, const char* name, o2::framework::expressions::Projector* projectors, std::shared_ptr<gandiva::Projector>& projector, std::shared_ptr<arrow::Schema> const& schema)
772772
{
773773
using placeholders_pack_t = typename o2::aod::MetadataTrait<D>::metadata::placeholders_pack_t;
774-
auto fullTable = soa::ArrowHelpers::joinTables(std::move(tables), std::span{o2::aod::MetadataTrait<D>::metadata::base_table_t::originalLabels});
775774
if (fullTable->num_rows() == 0) {
776775
return makeEmptyTable(name, placeholders_pack_t{});
777776
}
778-
static auto new_schema = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(placeholders_pack_t{}));
779-
780-
return spawnerHelper(fullTable, new_schema, framework::pack_size(placeholders_pack_t{}), projectors, name, projector);
777+
return spawnerHelper(fullTable, schema, framework::pack_size(placeholders_pack_t{}), projectors, name, projector);
781778
}
782779

783780
template <aod::is_aod_hash D>
784781
requires(soa::has_configurable_extension<typename o2::aod::MetadataTrait<D>::metadata>)
785-
auto spawner(std::shared_ptr<arrow::Table> const& fullTable, const char* name, o2::framework::expressions::Projector* projectors, std::shared_ptr<gandiva::Projector>& projector)
782+
auto spawner(std::vector<std::shared_ptr<arrow::Table>>&& tables, const char* name, o2::framework::expressions::Projector* projectors, std::shared_ptr<gandiva::Projector>& projector, std::shared_ptr<arrow::Schema> const& schema)
786783
{
787-
using placeholders_pack_t = typename o2::aod::MetadataTrait<D>::metadata::placeholders_pack_t;
788-
if (fullTable->num_rows() == 0) {
789-
return makeEmptyTable(name, placeholders_pack_t{});
790-
}
791-
static auto new_schema = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(placeholders_pack_t{}));
792-
793-
return spawnerHelper(fullTable, new_schema, framework::pack_size(placeholders_pack_t{}), projectors, name, projector);
784+
auto fullTable = soa::ArrowHelpers::joinTables(std::move(tables), std::span{o2::aod::MetadataTrait<D>::metadata::base_table_t::originalLabels});
785+
return spawner<D>(fullTable, name, projectors, projector, schema);
794786
}
795787

796788
template <aod::is_aod_hash D>
797789
requires(soa::has_extension<typename o2::aod::MetadataTrait<D>::metadata> && !soa::has_configurable_extension<typename o2::aod::MetadataTrait<D>::metadata>)
798-
auto spawner(std::vector<std::shared_ptr<arrow::Table>>&& tables, const char* name, std::shared_ptr<gandiva::Projector>& projector)
790+
auto spawner(std::shared_ptr<arrow::Table> const& fullTable, const char* name, expressions::Projector* projectors, std::shared_ptr<gandiva::Projector>& projector, std::shared_ptr<arrow::Schema> const& schema)
799791
{
800792
using expression_pack_t = typename o2::aod::MetadataTrait<D>::metadata::expression_pack_t;
801-
auto fullTable = soa::ArrowHelpers::joinTables(std::move(tables), std::span{o2::aod::MetadataTrait<D>::metadata::base_table_t::originalLabels});
802793
if (fullTable->num_rows() == 0) {
803794
return makeEmptyTable(name, expression_pack_t{});
804795
}
805-
static auto new_schema = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(expression_pack_t{}));
806-
807-
auto projectors = []<typename... C>(framework::pack<C...>) -> std::array<expressions::Projector, sizeof...(C)>
808-
{
809-
return {{std::move(C::Projector())...}};
810-
}
811-
(expression_pack_t{});
812-
813-
return spawnerHelper(fullTable, new_schema, framework::pack_size(expression_pack_t{}), projectors.data(), name, projector);
796+
return spawnerHelper(fullTable, schema, framework::pack_size(expression_pack_t{}), projectors, name, projector);
814797
}
815798

816799
template <aod::is_aod_hash D>
817800
requires(soa::has_extension<typename o2::aod::MetadataTrait<D>::metadata> && !soa::has_configurable_extension<typename o2::aod::MetadataTrait<D>::metadata>)
818-
auto spawner(std::shared_ptr<arrow::Table> const& fullTable, const char* name, std::shared_ptr<gandiva::Projector>& projector)
801+
auto spawner(std::vector<std::shared_ptr<arrow::Table>>&& tables, const char* name, expressions::Projector* projectors, std::shared_ptr<gandiva::Projector>& projector, std::shared_ptr<arrow::Schema> const& schema)
819802
{
820-
using expression_pack_t = typename o2::aod::MetadataTrait<D>::metadata::expression_pack_t;
821-
if (fullTable->num_rows() == 0) {
822-
return makeEmptyTable(name, expression_pack_t{});
823-
}
824-
static auto new_schema = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(expression_pack_t{}));
825-
auto projectors = []<typename... C>(framework::pack<C...>) -> std::array<expressions::Projector, sizeof...(C)>
826-
{
827-
return {{std::move(C::Projector())...}};
828-
}
829-
(expression_pack_t{});
830-
831-
return spawnerHelper(fullTable, new_schema, framework::pack_size(expression_pack_t{}), projectors.data(), name, projector);
803+
auto fullTable = soa::ArrowHelpers::joinTables(std::move(tables), std::span{o2::aod::MetadataTrait<D>::metadata::base_table_t::originalLabels});
804+
return spawner<D>(fullTable, name, projectors, projector, schema);
832805
}
833806

834807
template <typename... C>
835-
auto spawner(framework::pack<C...> columns, std::vector<std::shared_ptr<arrow::Table>>&& tables, const char* name, std::shared_ptr<gandiva::Projector>& projector)
808+
auto spawner(framework::pack<C...>, std::vector<std::shared_ptr<arrow::Table>>&& tables, const char* name, expressions::Projector* projectors, std::shared_ptr<gandiva::Projector>& projector, std::shared_ptr<arrow::Schema> const& schema)
836809
{
837810
std::array<const char*, 1> labels{"original"};
838811
auto fullTable = soa::ArrowHelpers::joinTables(std::move(tables), std::span<const char* const>{labels});
839812
if (fullTable->num_rows() == 0) {
840813
return makeEmptyTable(name, framework::pack<C...>{});
841814
}
842-
static auto new_schema = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(columns));
843-
std::array<expressions::Projector, sizeof...(C)> projectors{{std::move(C::Projector())...}};
844-
return spawnerHelper(fullTable, new_schema, sizeof...(C), projectors.data(), name, projector);
815+
return spawnerHelper(fullTable, schema, sizeof...(C), projectors, name, projector);
845816
}
846817

847818
template <typename... T>

Framework/Core/src/AODReaderHelpers.cxx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,13 @@ auto make_spawn(InputSpec const& input, ProcessingContext& pc)
158158
using metadata_t = o2::aod::MetadataTrait<D>::metadata;
159159
constexpr auto sources = metadata_t::sources;
160160
static std::shared_ptr<gandiva::Projector> projector = nullptr;
161-
return o2::framework::spawner<D>(extractOriginals<sources.size(), sources>(pc), input.binding.c_str(), projector);
161+
static std::shared_ptr<arrow::Schema> schema = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(typename metadata_t::expression_pack_t{}));
162+
static auto projectors = []<typename... C>(framework::pack<C...>) -> std::array<expressions::Projector, sizeof...(C)>
163+
{
164+
return {{std::move(C::Projector())...}};
165+
}
166+
(typename metadata_t::expression_pack_t{});
167+
return o2::framework::spawner<D>(extractOriginals<sources.size(), sources>(pc), input.binding.c_str(), projectors.data(), projector, schema);
162168
}
163169
} // namespace
164170

Framework/Core/test/test_TableSpawner.cxx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,9 @@ TEST_CASE("TestTableSpawner")
5050
auto t1 = b1.finalize();
5151
Points st1{t1};
5252

53-
std::shared_ptr<gandiva::Projector> projector = nullptr;
54-
5553
auto expoints_a = o2::soa::Extend<o2::aod::Points, test::Rsq, test::Sin>(st1);
56-
auto extension = ExPointsExtension{o2::framework::spawner<o2::aod::Hash<"EXPTSNG/0"_h>>(t1, o2::aod::Hash<"ExPoints"_h>::str, projector)};
54+
Spawns<ExPoints> s;
55+
auto extension = ExPointsExtension{o2::framework::spawner<o2::aod::Hash<"EXPTSNG/0"_h>>(t1, o2::aod::Hash<"ExPoints"_h>::str, s.projectors.data(), s.projector, s.schema)};
5756
auto expoints = ExPoints{{t1, extension.asArrowTable()}, 0};
5857

5958
REQUIRE(expoints_a.size() == 9);
@@ -81,7 +80,7 @@ TEST_CASE("TestTableSpawner")
8180
Defines<ExcPoints> excpts;
8281
excpts.projectors[0] = test::x * test::x + test::y * test::y + test::z * test::z;
8382

84-
auto extension_2 = ExcPointsCfgExtension{o2::framework::spawner<o2::aod::Hash<"EXCFGPTS/0"_h>>({t1}, o2::aod::Hash<"ExcPoints"_h>::str, excpts.projectors.data(), excpts.projector)};
83+
auto extension_2 = ExcPointsCfgExtension{o2::framework::spawner<o2::aod::Hash<"EXCFGPTS/0"_h>>({t1}, o2::aod::Hash<"ExcPoints"_h>::str, excpts.projectors.data(), excpts.projector, excpts.schema)};
8584
auto excpoints = ExcPoints{{t1, extension_2.asArrowTable()}, 0};
8685

8786
rex = extension.begin();

0 commit comments

Comments
 (0)