Skip to content

Commit 45f97cf

Browse files
committed
fixes
1 parent 39d4be5 commit 45f97cf

File tree

4 files changed

+44
-13
lines changed

4 files changed

+44
-13
lines changed

Framework/Core/include/Framework/ASoA.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1293,10 +1293,14 @@ concept with_ccdb_urls = requires {
12931293
};
12941294

12951295
template <typename T>
1296-
concept with_base_table = not_void<typename aod::MetadataTrait<o2::aod::Hash<T::ref.desc_hash>>::metadata::base_table_t>;
1296+
concept with_base_table = requires {
1297+
typename aod::MetadataTrait<o2::aod::Hash<T::ref.desc_hash>>::metadata::base_table_t;
1298+
};
12971299

12981300
template <typename T>
1299-
concept with_expression_pack = not_void<typename aod::MetadataTrait<o2::aod::Hash<T::ref.desc_hash>>::metadata::expression_pack_t>;
1301+
concept with_expression_pack = requires {
1302+
typename T::expression_pack_t{};
1303+
};
13001304

13011305
template <size_t N1, std::array<TableRef, N1> os1, size_t N2, std::array<TableRef, N2> os2>
13021306
consteval bool is_compatible()

Framework/Core/include/Framework/AnalysisHelpers.h

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@
2626
#include "Framework/Traits.h"
2727

2828
#include <string>
29+
namespace o2::framework {
30+
std::string serializeProjectors(std::vector<framework::expressions::Projector>& projectors);
31+
}
32+
2933
namespace o2::soa
3034
{
3135
template <TableRef R>
@@ -38,8 +42,6 @@ constexpr auto tableRef2ConfigParamSpec()
3842
{"\"\""}};
3943
}
4044

41-
std::string serializeProjectors(std::vector<framework::expressions::Projector>& projectors);
42-
4345
namespace
4446
{
4547
template <soa::with_sources T>
@@ -101,20 +103,23 @@ constexpr auto getCCDBMetadata() -> std::vector<framework::ConfigParamSpec>
101103
}
102104

103105
template <soa::with_expression_pack T>
104-
constexpr auto getExpressionMetadata() -> std::optional<framework::ConfigParamSpec>
106+
constexpr auto getExpressionMetadata() -> std::vector<framework::ConfigParamSpec>
105107
{
106108
using expression_pack_t = T::expression_pack_t;
107109

108110
auto projectors = []<typename... C>(framework::pack<C...>) -> std::vector<framework::expressions::Projector> {
109-
return {C::Projector()...};
111+
std::vector<framework::expressions::Projector> result;
112+
(result.emplace_back(std::move(C::Projector())), ...);
113+
return result;
110114
}(expression_pack_t{});
111115

112-
auto json = serializeProjectors(projectors);
113-
return framework::ConfigParamSpec{"projectors", framework::VariantType::String, json, {"\"\""}};
116+
auto json = framework::serializeProjectors(projectors);
117+
return {framework::ConfigParamSpec{"projectors", framework::VariantType::String, json, {"\"\""}}};
114118
}
115119

116120
template <typename T>
117-
constexpr auto getExpressionMetadata() -> std::optional<framework::ConfigParamSpec>
121+
requires(!soa::with_expression_pack<T>)
122+
constexpr auto getExpressionMetadata() -> std::vector<framework::ConfigParamSpec>
118123
{
119124
return {};
120125
}
@@ -130,9 +135,7 @@ constexpr auto tableRef2InputSpec()
130135
auto ccdbMetadata = getCCDBMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>();
131136
metadata.insert(metadata.end(), ccdbMetadata.begin(), ccdbMetadata.end());
132137
auto p = getExpressionMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>();
133-
if (p) {
134-
metadata.insert(metadata.end(), p.value());
135-
}
138+
metadata.insert(metadata.end(), p.begin(), p.end());
136139

137140
return framework::InputSpec{
138141
o2::aod::label<R>(),

Framework/Core/src/AODReaderHelpers.cxx

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "Framework/CallbackService.h"
2020
#include "Framework/EndOfStreamContext.h"
2121
#include "Framework/DataSpecUtils.h"
22+
#include "Framework/ExpressionJSONHelpers.h"
2223

2324
#include <Monitoring/Monitoring.h>
2425

@@ -134,12 +135,32 @@ auto make_spawn(InputSpec const& input, ProcessingContext& pc)
134135
(typename metadata_t::expression_pack_t{});
135136
return o2::framework::spawner<D>(extractOriginals<sources.size(), sources>(pc), input.binding.c_str(), projectors.data(), projector, schema);
136137
}
138+
139+
struct Spawnable {
140+
std::vector<expressions::Projector> projectors;
141+
std::vector<std::string> labels;
142+
std::shared_ptr<arrow::Schema> schema;
143+
144+
Spawnable(InputSpec const& spec)
145+
{
146+
auto loc = std::find_if(spec.metadata.begin(), spec.metadata.end(), [](ConfigParamSpec const& spc){ return spc.name.compare("projectors") == 0; });
147+
std::stringstream iws(loc->defaultValue.get<std::string>());
148+
projectors = ExpressionJSONHelpers::read(iws);
149+
for (auto& i : spec.metadata) {
150+
if (i.name.starts_with("input:")) {
151+
labels.emplace_back(i.name.substr(6));
152+
}
153+
}
154+
}
155+
};
137156
} // namespace
138157

139158
AlgorithmSpec AODReaderHelpers::aodSpawnerCallback(std::vector<InputSpec>& requested)
140159
{
141160
return AlgorithmSpec::InitCallback{[requested](InitContext& /*ic*/) {
142-
return [requested](ProcessingContext& pc) {
161+
std::vector<Spawnable> spawnables;
162+
163+
return [requested, spawnables](ProcessingContext& pc) {
143164
auto outputs = pc.outputs();
144165
// spawn tables
145166
for (auto& input : requested) {

Framework/Core/test/test_Expressions.cxx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,4 +422,7 @@ TEST_CASE("TestExpressionSerialization")
422422
auto t12 = createExpressionTree(s12, schemap);
423423
auto t22 = createExpressionTree(s22, schemap);
424424
REQUIRE(t12->ToString() == t22->ToString());
425+
426+
std::cout << schemaf->ToString() << std::endl;
427+
std::cout << schemap->ToString() << std::endl;
425428
}

0 commit comments

Comments
 (0)