Skip to content

Commit 0f169a9

Browse files
committed
DPL Analysis: move spawner caches outside of the spawner function
1 parent a850e9e commit 0f169a9

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}));
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}));
315325
return true;
316326
}

Framework/Core/include/Framework/TableBuilder.h

Lines changed: 12 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -866,79 +866,50 @@ std::shared_ptr<arrow::Table> spawnerHelper(std::shared_ptr<arrow::Table> const&
866866
/// Expression-based column generator to materialize columns
867867
template <aod::is_aod_hash D>
868868
requires(soa::has_configurable_extension<typename o2::aod::MetadataTrait<D>::metadata>)
869-
auto spawner(std::vector<std::shared_ptr<arrow::Table>>&& tables, const char* name, o2::framework::expressions::Projector* projectors, std::shared_ptr<gandiva::Projector>& projector)
869+
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)
870870
{
871871
using placeholders_pack_t = typename o2::aod::MetadataTrait<D>::metadata::placeholders_pack_t;
872-
auto fullTable = soa::ArrowHelpers::joinTables(std::move(tables));
873872
if (fullTable->num_rows() == 0) {
874873
return makeEmptyTable(name, placeholders_pack_t{});
875874
}
876-
static auto new_schema = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(placeholders_pack_t{}));
877-
878-
return spawnerHelper(fullTable, new_schema, framework::pack_size(placeholders_pack_t{}), projectors, name, projector);
875+
return spawnerHelper(fullTable, schema, framework::pack_size(placeholders_pack_t{}), projectors, name, projector);
879876
}
880877

881878
template <aod::is_aod_hash D>
882879
requires(soa::has_configurable_extension<typename o2::aod::MetadataTrait<D>::metadata>)
883-
auto spawner(std::shared_ptr<arrow::Table> const& fullTable, const char* name, o2::framework::expressions::Projector* projectors, std::shared_ptr<gandiva::Projector>& projector)
880+
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)
884881
{
885-
using placeholders_pack_t = typename o2::aod::MetadataTrait<D>::metadata::placeholders_pack_t;
886-
if (fullTable->num_rows() == 0) {
887-
return makeEmptyTable(name, placeholders_pack_t{});
888-
}
889-
static auto new_schema = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(placeholders_pack_t{}));
890-
891-
return spawnerHelper(fullTable, new_schema, framework::pack_size(placeholders_pack_t{}), projectors, name, projector);
882+
auto fullTable = soa::ArrowHelpers::joinTables(std::move(tables));
883+
return spawner<D>(fullTable, name, projectors, projector, schema);
892884
}
893885

894886
template <aod::is_aod_hash D>
895887
requires(soa::has_extension<typename o2::aod::MetadataTrait<D>::metadata> && !soa::has_configurable_extension<typename o2::aod::MetadataTrait<D>::metadata>)
896-
auto spawner(std::vector<std::shared_ptr<arrow::Table>>&& tables, const char* name, std::shared_ptr<gandiva::Projector>& projector)
888+
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)
897889
{
898890
using expression_pack_t = typename o2::aod::MetadataTrait<D>::metadata::expression_pack_t;
899-
auto fullTable = soa::ArrowHelpers::joinTables(std::move(tables));
900891
if (fullTable->num_rows() == 0) {
901892
return makeEmptyTable(name, expression_pack_t{});
902893
}
903-
static auto new_schema = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(expression_pack_t{}));
904-
905-
auto projectors = []<typename... C>(framework::pack<C...>) -> std::array<expressions::Projector, sizeof...(C)>
906-
{
907-
return {{std::move(C::Projector())...}};
908-
}
909-
(expression_pack_t{});
910-
911-
return spawnerHelper(fullTable, new_schema, framework::pack_size(expression_pack_t{}), projectors.data(), name, projector);
894+
return spawnerHelper(fullTable, schema, framework::pack_size(expression_pack_t{}), projectors, name, projector);
912895
}
913896

914897
template <aod::is_aod_hash D>
915898
requires(soa::has_extension<typename o2::aod::MetadataTrait<D>::metadata> && !soa::has_configurable_extension<typename o2::aod::MetadataTrait<D>::metadata>)
916-
auto spawner(std::shared_ptr<arrow::Table> const& fullTable, const char* name, std::shared_ptr<gandiva::Projector>& projector)
899+
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)
917900
{
918-
using expression_pack_t = typename o2::aod::MetadataTrait<D>::metadata::expression_pack_t;
919-
if (fullTable->num_rows() == 0) {
920-
return makeEmptyTable(name, expression_pack_t{});
921-
}
922-
static auto new_schema = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(expression_pack_t{}));
923-
auto projectors = []<typename... C>(framework::pack<C...>) -> std::array<expressions::Projector, sizeof...(C)>
924-
{
925-
return {{std::move(C::Projector())...}};
926-
}
927-
(expression_pack_t{});
928-
929-
return spawnerHelper(fullTable, new_schema, framework::pack_size(expression_pack_t{}), projectors.data(), name, projector);
901+
auto fullTable = soa::ArrowHelpers::joinTables(std::move(tables));
902+
return spawner<D>(fullTable, name, projectors, projector, schema);
930903
}
931904

932905
template <typename... C>
933-
auto spawner(framework::pack<C...> columns, std::vector<std::shared_ptr<arrow::Table>>&& tables, const char* name, std::shared_ptr<gandiva::Projector>& projector)
906+
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)
934907
{
935908
auto fullTable = soa::ArrowHelpers::joinTables(std::move(tables));
936909
if (fullTable->num_rows() == 0) {
937910
return makeEmptyTable(name, framework::pack<C...>{});
938911
}
939-
static auto new_schema = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(columns));
940-
std::array<expressions::Projector, sizeof...(C)> projectors{{std::move(C::Projector())...}};
941-
return spawnerHelper(fullTable, new_schema, sizeof...(C), projectors.data(), name, projector);
912+
return spawnerHelper(fullTable, schema, sizeof...(C), projectors, name, projector);
942913
}
943914

944915
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)