@@ -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,14 +400,19 @@ template <TableRef R>
358400constexpr auto tableRef2InputSpec ()
359401{
360402 std::vector<framework::ConfigParamSpec> metadata;
361- auto m = getInputMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash >>::metadata>();
362- metadata.insert (metadata.end (), m.begin (), m.end ());
363- auto ccdbMetadata = getCCDBMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash >>::metadata>();
364- metadata.insert (metadata.end (), ccdbMetadata.begin (), ccdbMetadata.end ());
365- auto p = getExpressionMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash >>::metadata>();
366- metadata.insert (metadata.end (), p.begin (), p.end ());
367- auto idx = getIndexMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash >>::metadata>();
368- metadata.insert (metadata.end (), idx.begin (), idx.end ());
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+ }
409+ metadata.insert (metadata.end (), sources.begin (), sources.end ());
410+ auto ccdbURLs = getCCDBMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash >>::metadata>();
411+ metadata.insert (metadata.end (), ccdbURLs.begin (), ccdbURLs.end ());
412+ auto expressions = getExpressionMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash >>::metadata>();
413+ metadata.insert (metadata.end (), expressions.begin (), expressions.end ());
414+ auto indices = getIndexMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash >>::metadata>();
415+ metadata.insert (metadata.end (), indices.begin (), indices.end ());
369416 if constexpr (!soa::with_ccdb_urls<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash >>::metadata>) {
370417 metadata.emplace_back (framework::ConfigParamSpec{" schema" , framework::VariantType::String, framework::serializeSchema (o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash >>::metadata::getSchema ()), {" \"\" " }});
371418 }
@@ -382,11 +429,22 @@ constexpr auto tableRef2InputSpec()
382429template <TableRef R>
383430constexpr auto tableRef2OutputSpec ()
384431{
432+ std::vector<framework::ConfigParamSpec> metadata;
433+ using md = typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash >>::metadata;
434+ if constexpr (soa::with_ccdb_urls<md>) {
435+ metadata.emplace_back (" ccdb:" , framework::VariantType::Bool, true , framework::ConfigParamSpec::HelpString{" \"\" " });
436+ } else if constexpr (soa::with_expression_pack<md>) {
437+ metadata.emplace_back (" projectors" , framework::VariantType::Bool, true , framework::ConfigParamSpec::HelpString{" \"\" " });
438+ } else if constexpr (soa::with_index_pack<md>) {
439+ metadata.emplace_back (" index-records" , framework::VariantType::Bool, true , framework::ConfigParamSpec::HelpString{" \"\" " });
440+ }
385441 return framework::OutputSpec{
386442 framework::OutputLabel{o2::aod::label<R>()},
387443 o2::aod::origin<R>(),
388444 o2::aod::description (o2::aod::signature<R>()),
389- R.version };
445+ R.version ,
446+ framework::Lifetime::Timeframe,
447+ metadata};
390448}
391449
392450template <TableRef R>
@@ -504,14 +562,14 @@ struct OutputForTable {
504562 using table_t = decltype (typeWithRef<T>());
505563 using metadata = aod::MetadataTrait<o2::aod::Hash<table_t ::ref.desc_hash>>::metadata;
506564
507- static OutputSpec const spec ()
565+ static constexpr auto spec ()
508566 {
509- return OutputSpec{OutputLabel{aod::label <table_t ::ref>()}, o2::aod::origin< table_t ::ref>(), o2::aod::description (o2::aod::signature< table_t ::ref>()), table_t ::ref. version } ;
567+ return soa::tableRef2OutputSpec <table_t ::ref>();
510568 }
511569
512- static OutputRef ref ()
570+ static constexpr auto ref ()
513571 {
514- return OutputRef{aod::label <table_t ::ref>(), table_t ::ref. version } ;
572+ return soa::tableRef2OutputRef <table_t ::ref>();
515573 }
516574};
517575
@@ -544,7 +602,7 @@ concept is_produces_group = std::derived_from<T, ProducesGroup>;
544602template <soa::is_metadata M, soa::TableRef Ref>
545603struct TableTransform {
546604 using metadata = M;
547- constexpr static auto sources = M::sources ;
605+ constexpr static auto sources = M::template generateSources<o2::aod::Hash<Ref.origin_hash>>() ;
548606
549607 template <soa::TableRef R>
550608 static auto base_spec ()
@@ -578,23 +636,23 @@ struct TableTransform {
578636// / This helper struct allows you to declare extended tables which should be
579637// / created by the task (as opposed to those pre-defined by data model)
580638template <typename T>
581- 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>;
582640
583641template <typename T>
584- 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>;
585643
586644template <is_spawnable T>
587645constexpr auto transformBase ()
588646{
589- using metadata = typename aod::MetadataTrait<o2::aod::Hash<T::ref .desc_hash >>::metadata;
590- 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>{};
591649}
592650
593651template <is_spawnable T>
594652struct Spawns : decltype (transformBase<T>()) {
595653 using spawnable_t = T;
596654 using metadata = decltype (transformBase<T>())::metadata;
597- 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 >> ;
598656 using expression_pack_t = typename metadata::expression_pack_t ;
599657 static constexpr size_t N = framework::pack_size (expression_pack_t {});
600658
@@ -644,7 +702,7 @@ struct Defines : decltype(transformBase<T>()) {
644702 static constexpr bool delayed = DELAYED;
645703 using spawnable_t = T;
646704 using metadata = decltype (transformBase<T>())::metadata;
647- 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 >> ;
648706 using placeholders_pack_t = typename metadata::placeholders_pack_t ;
649707 static constexpr size_t N = framework::pack_size (placeholders_pack_t {});
650708
0 commit comments