@@ -79,6 +79,7 @@ auto makeEmptyTable(const char* name)
7979}
8080
8181template <soa::TableRef R>
82+ requires (soa::not_void<typename aod::MetadataTrait<aod::Hash<R.desc_hash>>::metadata>)
8283auto makeEmptyTable ()
8384{
8485 auto schema = std::make_shared<arrow::Schema>(soa::createFieldsFromColumns (typename aod::MetadataTrait<aod::Hash<R.desc_hash >>::metadata::persistent_columns_t {}));
@@ -93,6 +94,7 @@ auto makeEmptyTable(const char* name, framework::pack<Cs...> p)
9394}
9495
9596template <aod::is_aod_hash D>
97+ requires (soa::not_void<typename aod::MetadataTrait<D>::metadata>)
9698auto makeEmptyTable (const char * name)
9799{
98100 auto schema = std::make_shared<arrow::Schema>(soa::createFieldsFromColumns (typename aod::MetadataTrait<D>::metadata::persistent_columns_t {}));
@@ -216,6 +218,26 @@ inline constexpr auto getSourceSchemas()
216218 }.template operator ()<T::sources.size (), T::sources>();
217219}
218220
221+ template <soa::with_sources_generator T, aod::is_origin_hash O = o2::aod::Hash<" AOD" _h>>
222+ inline constexpr auto getSources ()
223+ {
224+ return []<size_t N, std::array<soa::TableRef, N> refs>() {
225+ return []<size_t ... Is>(std::index_sequence<Is...>) {
226+ return std::vector{soa::tableRef2ConfigParamSpec<refs[Is]>()...};
227+ }(std::make_index_sequence<N>());
228+ }.template operator ()<T::N, T::template generateSources<O>()>();
229+ }
230+
231+ template <soa::with_sources_generator T, aod::is_origin_hash O = o2::aod::Hash<" AOD" _h>>
232+ inline constexpr auto getSourceSchemas ()
233+ {
234+ return []<size_t N, std::array<soa::TableRef, N> refs>() {
235+ return []<size_t ... Is>(std::index_sequence<Is...>) {
236+ return std::vector{soa::tableRef2Schema<refs[Is]>()...};
237+ }(std::make_index_sequence<N>());
238+ }.template operator ()<T::N, T::template generateSources<O>()>();
239+ }
240+
219241template <soa::with_ccdb_urls T>
220242inline constexpr auto getCCDBUrls ()
221243{
@@ -257,7 +279,7 @@ inline constexpr auto getIndexMapping()
257279 using indices = T::index_pack_t ;
258280 using Key = T::Key;
259281 [&idx]<size_t ... Is>(std::index_sequence<Is...>) mutable {
260- constexpr auto refs = T::sources ;
282+ constexpr auto refs = T::generateSources () ;
261283 ([&idx]<TableRef ref, typename C>() mutable {
262284 constexpr auto pos = o2::aod::MetadataTrait<o2::aod::Hash<ref.desc_hash >>::metadata::template getIndexPosToKey<Key>();
263285 if constexpr (pos == -1 ) {
@@ -272,6 +294,26 @@ inline constexpr auto getIndexMapping()
272294 return idx;
273295}
274296
297+ template <soa::with_sources_generator T, aod::is_origin_hash O = o2::aod::Hash<" AOD" _h>>
298+ constexpr auto getInputMetadata () -> std::vector<framework::ConfigParamSpec>
299+ {
300+ std::vector<framework::ConfigParamSpec> inputMetadata;
301+
302+ auto inputSources = getSources<T, O>();
303+ std::sort (inputSources.begin (), inputSources.end (), [](framework::ConfigParamSpec const & a, framework::ConfigParamSpec const & b) { return a.name < b.name ; });
304+ auto last = std::unique (inputSources.begin (), inputSources.end (), [](framework::ConfigParamSpec const & a, framework::ConfigParamSpec const & b) { return a.name == b.name ; });
305+ inputSources.erase (last, inputSources.end ());
306+ inputMetadata.insert (inputMetadata.end (), inputSources.begin (), inputSources.end ());
307+
308+ auto inputSchemas = getSourceSchemas<T, O>();
309+ std::sort (inputSchemas.begin (), inputSchemas.end (), [](framework::ConfigParamSpec const & a, framework::ConfigParamSpec const & b) { return a.name < b.name ; });
310+ last = std::unique (inputSchemas.begin (), inputSchemas.end (), [](framework::ConfigParamSpec const & a, framework::ConfigParamSpec const & b) { return a.name == b.name ; });
311+ inputSchemas.erase (last, inputSchemas.end ());
312+ inputMetadata.insert (inputMetadata.end (), inputSchemas.begin (), inputSchemas.end ());
313+
314+ return inputMetadata;
315+ }
316+
275317template <soa::with_sources T>
276318constexpr auto getInputMetadata () -> std::vector<framework::ConfigParamSpec>
277319{
@@ -293,7 +335,7 @@ constexpr auto getInputMetadata() -> std::vector<framework::ConfigParamSpec>
293335}
294336
295337template <typename T>
296- requires (!soa::with_sources<T>)
338+ requires (!( soa::with_sources<T> || soa::with_sources_generator<T>) )
297339constexpr auto getInputMetadata () -> std::vector<framework::ConfigParamSpec>
298340{
299341 return {};
@@ -358,7 +400,12 @@ template <TableRef R>
358400constexpr auto tableRef2InputSpec ()
359401{
360402 std::vector<framework::ConfigParamSpec> metadata;
361- auto sources = getInputMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash >>::metadata>();
403+ std::vector<framework::ConfigParamSpec> sources;
404+ if constexpr (soa::with_sources<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash >>::metadata>) {
405+ sources = getInputMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash >>::metadata>();
406+ } else if constexpr (soa::with_sources_generator<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash >>::metadata>) {
407+ sources = getInputMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash >>::metadata, o2::aod::Hash<R.origin_hash >>();
408+ }
362409 metadata.insert (metadata.end (), sources.begin (), sources.end ());
363410 auto ccdbURLs = getCCDBMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash >>::metadata>();
364411 metadata.insert (metadata.end (), ccdbURLs.begin (), ccdbURLs.end ());
@@ -555,7 +602,7 @@ concept is_produces_group = std::derived_from<T, ProducesGroup>;
555602template <soa::is_metadata M, soa::TableRef Ref>
556603struct TableTransform {
557604 using metadata = M;
558- constexpr static auto sources = M::sources ;
605+ constexpr static auto sources = M::template generateSources<o2::aod::Hash<Ref.origin_hash>>() ;
559606
560607 template <soa::TableRef R>
561608 static auto base_spec ()
@@ -589,23 +636,23 @@ struct TableTransform {
589636// / This helper struct allows you to declare extended tables which should be
590637// / created by the task (as opposed to those pre-defined by data model)
591638template <typename T>
592- concept is_spawnable = soa::has_metadata<aod::MetadataTrait<o2::aod::Hash<T::ref. desc_hash>>> && soa::has_extension<typename aod::MetadataTrait<o2::aod::Hash<T::ref .desc_hash>>::metadata>;
639+ concept is_spawnable = soa::has_metadata<aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1 ]. desc_hash>>> && soa::has_extension<typename aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1 ] .desc_hash>>::metadata>;
593640
594641template <typename T>
595- concept is_dynamically_spawnable = soa::has_metadata<aod::MetadataTrait<o2::aod::Hash<T::ref. desc_hash>>> && soa::has_configurable_extension<typename aod::MetadataTrait<o2::aod::Hash<T::ref .desc_hash>>::metadata>;
642+ concept is_dynamically_spawnable = soa::has_metadata<aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1 ]. desc_hash>>> && soa::has_configurable_extension<typename aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1 ] .desc_hash>>::metadata>;
596643
597644template <is_spawnable T>
598645constexpr auto transformBase ()
599646{
600- using metadata = typename aod::MetadataTrait<o2::aod::Hash<T::ref .desc_hash >>::metadata;
601- return TableTransform<metadata, metadata::extension_table_t ::ref>{};
647+ using metadata = typename aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals. size () - 1 ] .desc_hash >>::metadata;
648+ return TableTransform<metadata, metadata::template extension_table_t_from<o2::aod::Hash<T::originals[T::originals. size () - 1 ]. origin_hash >> ::ref>{};
602649}
603650
604651template <is_spawnable T>
605652struct Spawns : decltype (transformBase<T>()) {
606653 using spawnable_t = T;
607654 using metadata = decltype (transformBase<T>())::metadata;
608- using extension_t = typename metadata::extension_table_t ;
655+ using extension_t = typename metadata::template extension_table_t_from<o2::aod::Hash<T::originals[T::originals. size () - 1 ]. origin_hash >> ;
609656 using expression_pack_t = typename metadata::expression_pack_t ;
610657 static constexpr size_t N = framework::pack_size (expression_pack_t {});
611658
@@ -655,7 +702,7 @@ struct Defines : decltype(transformBase<T>()) {
655702 static constexpr bool delayed = DELAYED;
656703 using spawnable_t = T;
657704 using metadata = decltype (transformBase<T>())::metadata;
658- using extension_t = typename metadata::extension_table_t ;
705+ using extension_t = typename metadata::template extension_table_t_from<o2::aod::Hash<T::originals[T::originals. size () - 1 ]. origin_hash >> ;
659706 using placeholders_pack_t = typename metadata::placeholders_pack_t ;
660707 static constexpr size_t N = framework::pack_size (placeholders_pack_t {});
661708
0 commit comments