@@ -1274,6 +1274,11 @@ concept with_sources = requires {
12741274 T::sources.size ();
12751275};
12761276
1277+ template <typename T>
1278+ concept with_ccdb_urls = requires {
1279+ T::ccdb_urls.size ();
1280+ };
1281+
12771282template <typename T>
12781283concept with_base_table = not_void<typename aod::MetadataTrait<o2::aod::Hash<T::ref.desc_hash>>::metadata::base_table_t >;
12791284
@@ -2248,11 +2253,14 @@ ColumnGetterFunction<R, typename T::iterator> getColumnGetterByLabel(const std::
22482253
22492254namespace o2 ::aod
22502255{
2256+ // If you get an error about not satisfying is_origin_hash, you need to add
2257+ // an entry here.
22512258O2ORIGIN (" AOD" );
22522259O2ORIGIN (" AOD1" );
22532260O2ORIGIN (" AOD2" );
22542261O2ORIGIN (" DYN" );
22552262O2ORIGIN (" IDX" );
2263+ O2ORIGIN (" TIM" );
22562264O2ORIGIN (" JOIN" );
22572265O2HASH (" JOIN/0" );
22582266O2ORIGIN (" CONC" );
@@ -2313,6 +2321,46 @@ consteval static std::string_view namespace_prefix()
23132321 }; \
23142322 [[maybe_unused]] static constexpr o2::framework::expressions::BindingNode _Getter_ { _Label_, _Name_::hash, o2::framework::expressions::selectArrowType<_Type_>() }
23152323
2324+ #define DECLARE_SOA_CCDB_COLUMN_FULL (_Name_, _Label_, _Getter_, _ConcreteType_, _CCDBQuery_ ) \
2325+ struct _Name_ : o2::soa::Column<std::span<std::byte>, _Name_> { \
2326+ static constexpr const char * mLabel = _Label_; \
2327+ static constexpr const char * query = _CCDBQuery_; \
2328+ static constexpr const uint32_t hash = crc32(namespace_prefix<_Name_>(), std::string_view{#_Getter_}); \
2329+ using base = o2::soa::Column<std::span<std::byte>, _Name_>; \
2330+ using type = std::span<std::byte>; \
2331+ using column_t = _Name_; \
2332+ _Name_ (arrow::ChunkedArray const * column) \
2333+ : o2::soa::Column<std::span<std::byte>, _Name_>(o2::soa::ColumnIterator<std::span<std::byte>>(column)) \
2334+ { \
2335+ } \
2336+ \
2337+ _Name_ () = default ; \
2338+ _Name_ (_Name_ const & other) = default ; \
2339+ _Name_& operator =(_Name_ const & other) = default ; \
2340+ \
2341+ decltype (auto ) _Getter_() const \
2342+ { \
2343+ static std::byte* payload = nullptr ; \
2344+ static _ConcreteType_* deserialised = nullptr ; \
2345+ auto span = *mColumnIterator ; \
2346+ if (payload != (std::byte*)span.data ()) { \
2347+ payload = (std::byte*)span.data (); \
2348+ TBufferFile f (TBufferFile::EMode::kRead , span.size (), (char *)span.data (), kFALSE ); \
2349+ deserialised = (_ConcreteType_*)f.ReadObjectAny (TClass::GetClass (#_ConcreteType_)); \
2350+ } \
2351+ return *deserialised; \
2352+ } \
2353+ \
2354+ decltype (auto ) \
2355+ get () const \
2356+ { \
2357+ return _Getter_ (); \
2358+ } \
2359+ };
2360+
2361+ #define DECLARE_SOA_CCDB_COLUMN (_Name_, _Getter_, _ConcreteType_, _CCDBQuery_ ) \
2362+ DECLARE_SOA_CCDB_COLUMN_FULL (_Name_, " f" #_Name_, _Getter_, _ConcreteType_, _CCDBQuery_)
2363+
23162364#define DECLARE_SOA_COLUMN (_Name_, _Getter_, _Type_ ) \
23172365 DECLARE_SOA_COLUMN_FULL (_Name_, _Getter_, _Type_, " f" #_Name_)
23182366
@@ -3188,6 +3236,43 @@ consteval auto getIndexTargets()
31883236 using metadata = _Name_##Metadata; \
31893237 };
31903238
3239+ // Declare were each row is associated to a timestamp column of an _TimestampSource_
3240+ // table.
3241+ //
3242+ // The columns of this table have to be CCDB_COLUMNS so that for each timestamp, we get a row
3243+ // which points to the specified CCDB objectes described by those columns.
3244+ #define DECLARE_SOA_TIMESTAMPED_TABLE_FULL (_Name_, _Label_, _TimestampSource_, _TimestampColumn_, _Origin_, _Version_, _Desc_, ...) \
3245+ O2HASH (_Desc_ " /" #_Version_); \
3246+ template <typename O> \
3247+ using _Name_##TimestampFrom = soa::Table<o2::aod::Hash<_Label_ " " _h>, o2::aod::Hash<_Desc_ " /" #_Version_ " " _h>, O>; \
3248+ using _Name_##Timestamp = _Name_##TimestampFrom<o2::aod::Hash<_Origin_ " " _h>>; \
3249+ template <typename O = o2::aod::Hash<_Origin_ " " _h>> \
3250+ struct _Name_ ##TimestampMetadataFrom : TableMetadata<o2::aod::Hash<_Desc_ " /" #_Version_ " " _h>, __VA_ARGS__> { \
3251+ using base_table_t = _TimestampSource_; \
3252+ using extension_table_t = _Name_##TimestampFrom<O>; \
3253+ static constexpr const auto ccdb_urls = []<typename ... Cs>(framework::pack<Cs...>) { \
3254+ return std::array<std::string_view, sizeof ...(Cs)>{Cs::query...}; \
3255+ }(framework::pack<__VA_ARGS__>{}); \
3256+ static constexpr const auto ccdb_bindings = []<typename ... Cs>(framework::pack<Cs...>) { \
3257+ return std::array<std::string_view, sizeof ...(Cs)>{Cs::mLabel ...}; \
3258+ }(framework::pack<__VA_ARGS__>{}); \
3259+ static constexpr auto sources = _TimestampSource_::originals; \
3260+ static constexpr auto timestamp_column_label = _TimestampColumn_::mLabel ; \
3261+ /* static constexpr auto timestampColumn = _TimestampColumn_;*/ \
3262+ }; \
3263+ using _Name_##TimestampMetadata = _Name_##TimestampMetadataFrom<o2::aod::Hash<_Origin_ " " _h>>; \
3264+ template <> \
3265+ struct MetadataTrait <o2::aod::Hash<_Desc_ " /" #_Version_ " " _h>> { \
3266+ using metadata = _Name_##TimestampMetadata; \
3267+ }; \
3268+ template <typename O> \
3269+ using _Name_##From = o2::soa::JoinFull<o2::aod::Hash<_Desc_ " /" #_Version_ " " _h>, _TimestampSource_, _Name_##TimestampFrom<O>>; \
3270+ using _Name_ = _Name_##From<o2::aod::Hash<_Origin_ " " _h>>;
3271+
3272+ #define DECLARE_SOA_TIMESTAMPED_TABLE (_Name_, _TimestampSource_, _TimestampColumn_, _Version_, _Desc_, ...) \
3273+ O2HASH (#_Name_ " Timestamped" ); \
3274+ DECLARE_SOA_TIMESTAMPED_TABLE_FULL (_Name_, #_Name_ " Timestamped" , _TimestampSource_, _TimestampColumn_, " TIM" , _Version_, _Desc_, __VA_ARGS__)
3275+
31913276#define DECLARE_SOA_INDEX_TABLE (_Name_, _Key_, _Description_, ...) \
31923277 DECLARE_SOA_INDEX_TABLE_FULL (_Name_, _Key_, " IDX" , 0 , _Description_, false , __VA_ARGS__)
31933278
0 commit comments