Skip to content

Commit faf2a4a

Browse files
committed
use runtime matchers for spawns/builds
1 parent dfd8af1 commit faf2a4a

3 files changed

Lines changed: 22 additions & 16 deletions

File tree

Framework/Core/include/Framework/AnalysisHelpers.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,10 @@ template <soa::is_metadata M, soa::TableRef Ref>
609609
struct TableTransform {
610610
using metadata = M;
611611
constexpr static auto sources = M::template generateSources<o2::aod::Hash<Ref.origin_hash>>();
612+
std::vector<InputSpec> requiredInputs = []<size_t... Is>(std::index_sequence<Is...>){
613+
return std::vector{soa::tableRef2InputSpec<sources[Is]>()...};
614+
}(std::make_index_sequence<sources.size()>());
615+
OutputSpec outputSpec = soa::tableRef2OutputSpec<Ref>();
612616

613617
template <soa::TableRef R>
614618
static auto base_spec()

Framework/Core/include/Framework/AnalysisManagers.h

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,17 @@ static inline auto extractOriginals(ProcessingContext& pc)
4141
return {pc.inputs().get<TableConsumer>(o2::aod::matcher<refs[Is]>())->asArrowTable()...};
4242
}(std::make_index_sequence<refs.size()>());
4343
}
44+
45+
template <std::ranges::input_range R>
46+
static auto extractTablesFromRecord(InputRecord& record, R matchers)
47+
{
48+
std::vector<std::shared_ptr<arrow::Table>> tables;
49+
std::ranges::transform(matchers, std::back_inserter(tables), [&record](auto const& m) {
50+
return record.get<TableConsumer>(m)->asArrowTable();
51+
});
52+
return tables;
53+
}
54+
4455
} // namespace
4556

4657
namespace analysis_task_parsers
@@ -222,7 +233,7 @@ template <typename T>
222233
requires(is_spawns<T> || is_builds<T> || is_defines<T>)
223234
bool appendOutput(std::vector<OutputSpec>& outputs, T& entity, uint32_t)
224235
{
225-
outputs.emplace_back(entity.spec());
236+
outputs.emplace_back(entity.outputSpec);
226237
return true;
227238
}
228239

@@ -277,7 +288,7 @@ template <is_spawns T>
277288
bool prepareOutput(ProcessingContext& context, T& spawns)
278289
{
279290
using metadata = o2::aod::MetadataTrait<o2::aod::Hash<T::spawnable_t::originals[T::spawnable_t::originals.size() - 1].desc_hash>>::metadata;
280-
auto originalTable = soa::ArrowHelpers::joinTables(extractOriginals<metadata::N, metadata::template generateSources<o2::aod::Hash<T::spawnable_t::originals[T::spawnable_t::originals.size() - 1].origin_hash>>()>(context), std::span{metadata::base_table_t::originalLabels});
291+
auto originalTable = soa::ArrowHelpers::joinTables( framework::extractTablesFromRecord(context.inputs(), spawns.requiredInputs | std::views::transform([](auto const& input){ return DataSpecUtils::asConcreteDataMatcher(input); }) ) );
281292
if (originalTable->num_rows() == 0) {
282293
originalTable = makeEmptyTable("EMPTY", typename metadata::base_table_t::persistent_columns_t{});
283294
}
@@ -296,15 +307,15 @@ template <is_builds T>
296307
bool prepareOutput(ProcessingContext& context, T& builds)
297308
{
298309
using metadata = o2::aod::MetadataTrait<o2::aod::Hash<T::buildable_t::ref.desc_hash>>::metadata;
299-
return builds.build(extractOriginals<metadata::N, metadata::template generateSources<o2::aod::Hash<T::buildable_t::ref.origin_hash>>()>(context));
310+
return builds.build(framework::extractTablesFromRecord(context.inputs(), builds.requiredInputs | std::views::transform([](auto const& input){ return DataSpecUtils::asConcreteDataMatcher(input); }) ));
300311
}
301312

302313
template <is_defines T>
303314
bool prepareOutput(ProcessingContext& context, T& defines)
304315
requires(T::delayed == false)
305316
{
306317
using metadata = o2::aod::MetadataTrait<o2::aod::Hash<T::spawnable_t::originals[T::spawnable_t::originals.size() - 1].desc_hash>>::metadata;
307-
auto originalTable = soa::ArrowHelpers::joinTables(extractOriginals<metadata::N, metadata::template generateSources<o2::aod::Hash<T::spawnable_t::originals[T::spawnable_t::originals.size() - 1].origin_hash>>()>(context), std::span{metadata::base_table_t::originalLabels});
318+
auto originalTable = soa::ArrowHelpers::joinTables( framework::extractTablesFromRecord(context.inputs(), defines.requiredInputs | std::views::transform([](auto const& input){ return DataSpecUtils::asConcreteDataMatcher(input); }) ) );
308319
if (originalTable->num_rows() == 0) {
309320
originalTable = makeEmptyTable("EMPTY", typename metadata::base_table_t::persistent_columns_t{});
310321
}
@@ -336,7 +347,7 @@ bool prepareDelayedOutput(ProcessingContext& context, T& defines)
336347
defines.recompile();
337348
}
338349
using metadata = o2::aod::MetadataTrait<o2::aod::Hash<T::spawnable_t::ref.desc_hash>>::metadata;
339-
auto originalTable = soa::ArrowHelpers::joinTables(extractOriginals<metadata::sources.size(), metadata::sources>(context), std::span{metadata::base_table_t::originalLabels});
350+
auto originalTable = soa::ArrowHelpers::joinTables( framework::extractTablesFromRecord(context.inputs(), defines.requiredInputs | std::views::transform([](auto const& input){ return DataSpecUtils::asConcreteDataMatcher(input); }) ) );
340351
if (originalTable->num_rows() == 0) {
341352
originalTable = makeEmptyTable<metadata::base_table_t::ref>();
342353
}

Framework/Core/include/Framework/AnalysisTask.h

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -234,16 +234,6 @@ struct AnalysisDataProcessorBuilder {
234234
{
235235
}
236236

237-
template <soa::TableRef R>
238-
static auto extractTableFromRecord(InputRecord& record)
239-
{
240-
auto table = record.get<TableConsumer>(o2::aod::matcher<R>())->asArrowTable();
241-
if (table->num_rows() == 0) {
242-
table = makeEmptyTable<R>();
243-
}
244-
return table;
245-
}
246-
247237
template <std::ranges::input_range R>
248238
static auto extractTablesFromRecord(InputRecord& record, R matchers)
249239
{
@@ -292,7 +282,8 @@ struct AnalysisDataProcessorBuilder {
292282
template <soa::is_table_or_iterator T, int AI>
293283
static auto extract(InputRecord& record, std::vector<InputInfo> iInfos, std::vector<ExpressionInfo>& infos, size_t phash)
294284
{
295-
auto matchers = std::ranges::find_if(iInfos, [&phash](auto const& info) { return info.hash == phash; })->matchers | std::views::filter([](auto const& pair) { return pair.first == AI; });
285+
auto matchers = std::ranges::find_if(iInfos, [&phash](auto const& info) { return info.hash == phash; })->matchers
286+
| std::views::filter([](auto const& pair) { return pair.first == AI; });
296287
if constexpr (soa::is_filtered<T>) {
297288
return extractFilteredFromRecord<T>(record, matchers, *std::ranges::find_if(infos, [&phash](ExpressionInfo const& i) { return (i.processHash == phash && i.argumentIndex == AI); }));
298289
} else {

0 commit comments

Comments
 (0)