Project
Loading...
Searching...
No Matches
AnalysisHelpers.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11#ifndef o2_framework_AnalysisHelpers_H_DEFINED
12#define o2_framework_AnalysisHelpers_H_DEFINED
13
14#include "ConfigParamSpec.h"
15#include "Framework/ASoA.h"
18#include "Framework/InputSpec.h"
19#include "Framework/Logger.h"
21#include "Framework/OutputRef.h"
23#include "Framework/Plugins.h"
26#include "Framework/Traits.h"
27
28#include <fmt/format.h>
29#include <string>
30namespace o2::framework
31{
36struct InputInfo {
37 uint32_t hash;
38 std::vector<std::pair<int, ConcreteDataMatcher>> matchers;
39};
40} // namespace o2::framework
41
42namespace o2::soa
43{
45 std::string label;
47 std::string columnLabel;
49 int pos;
50 std::shared_ptr<arrow::DataType> type = [](IndexKind kind) -> std::shared_ptr<arrow::DataType> {
51 switch (kind) {
54 return arrow::int32();
56 return arrow::fixed_size_list(arrow::int32(), 2);
58 return arrow::list(arrow::int32());
59 default:
60 return {nullptr};
61 }
62 }(kind);
63
64 auto operator==(IndexRecord const& other) const
65 {
66 return (this->label == other.label) && (this->columnLabel == other.columnLabel) && (this->kind == other.kind) && (this->pos == other.pos);
67 }
68
69 std::shared_ptr<arrow::Field> field() const
70 {
71 return std::make_shared<arrow::Field>(columnLabel, type);
72 }
73};
74
76 static std::vector<framework::IndexColumnBuilder> makeBuilders(std::vector<std::shared_ptr<arrow::Table>>&& tables, std::vector<soa::IndexRecord> const& records);
77 static void resetBuilders(std::vector<framework::IndexColumnBuilder>& builders, std::vector<std::shared_ptr<arrow::Table>>&& tables);
78
79 static std::shared_ptr<arrow::Table> materialize(std::vector<framework::IndexColumnBuilder>& builders, std::vector<std::shared_ptr<arrow::Table>>&& tables, std::vector<soa::IndexRecord> const& records, std::shared_ptr<arrow::Schema> const& schema, bool exclusive);
80};
81} // namespace o2::soa
82
83namespace o2::framework
84{
85void wrongOriginReplacement(std::string_view replacement);
86std::shared_ptr<arrow::Table> makeEmptyTableImpl(const char* name, std::shared_ptr<arrow::Schema>& schema);
87
88template <soa::is_table T>
89auto makeEmptyTable(const char* name)
90{
91 auto schema = std::make_shared<arrow::Schema>(soa::createFieldsFromColumns(typename T::table_t::persistent_columns_t{}));
93}
94
95template <soa::TableRef R>
96 requires(soa::not_void<typename aod::MetadataTrait<aod::Hash<R.desc_hash>>::metadata>)
98{
99 auto schema = std::make_shared<arrow::Schema>(soa::createFieldsFromColumns(typename aod::MetadataTrait<aod::Hash<R.desc_hash>>::metadata::persistent_columns_t{}));
100 return makeEmptyTableImpl(o2::aod::label<R>(), schema);
101}
102
103template <typename... Cs>
105{
106 auto schema = std::make_shared<arrow::Schema>(soa::createFieldsFromColumns(p));
108}
109
110template <aod::is_aod_hash D>
112auto makeEmptyTable(const char* name)
113{
114 auto schema = std::make_shared<arrow::Schema>(soa::createFieldsFromColumns(typename aod::MetadataTrait<D>::metadata::persistent_columns_t{}));
116}
117
118std::shared_ptr<arrow::Table> spawnerHelper(std::shared_ptr<arrow::Table> const& fullTable, std::shared_ptr<arrow::Schema> newSchema, size_t nColumns,
119 expressions::Projector* projectors, const char* name, std::shared_ptr<gandiva::Projector>& projector);
120
121std::shared_ptr<arrow::Table> spawnerHelper(std::shared_ptr<arrow::Table> const& fullTable, std::shared_ptr<arrow::Schema> newSchema,
122 const char* name, size_t nColumns,
123 const std::shared_ptr<gandiva::Projector>& projector);
124
126template <aod::is_aod_hash D>
128auto spawner(std::shared_ptr<arrow::Table> const& fullTable, const char* name, o2::framework::expressions::Projector* projectors, std::shared_ptr<gandiva::Projector>& projector, std::shared_ptr<arrow::Schema> const& schema)
129{
130 if (fullTable->num_rows() == 0) {
131 return makeEmptyTable<D>(name);
132 }
133 constexpr auto Ncol = []<typename M>() {
135 return framework::pack_size(typename M::placeholders_pack_t{});
136 } else {
137 return framework::pack_size(typename M::expression_pack_t{});
138 }
139 }.template operator()<typename o2::aod::MetadataTrait<D>::metadata>();
140 return spawnerHelper(fullTable, schema, Ncol, projectors, name, projector);
141}
142
143template <typename... C>
144auto spawner(framework::pack<C...>, std::vector<std::shared_ptr<arrow::Table>>&& tables, const char* name, expressions::Projector* projectors, std::shared_ptr<gandiva::Projector>& projector, std::shared_ptr<arrow::Schema> const& schema)
145{
146 std::array<const char*, 1> labels{"original"};
147 auto fullTable = soa::ArrowHelpers::joinTables(std::move(tables), std::span<const char* const>{labels});
148 if (fullTable->num_rows() == 0) {
150 }
151 return spawnerHelper(fullTable.tablePtr, schema, sizeof...(C), projectors, name, projector);
152}
153
154std::string serializeProjectors(std::vector<framework::expressions::Projector>& projectors);
155std::string serializeSchema(std::shared_ptr<arrow::Schema> schema);
156std::string serializeIndexRecords(std::vector<o2::soa::IndexRecord>& irs);
157std::vector<std::shared_ptr<arrow::Table>> extractSources(ProcessingContext& pc, std::vector<std::string> const& labels);
158
159struct Spawner {
160 std::string binding;
161 std::vector<std::string> labels;
162 std::vector<framework::ConcreteDataMatcher> matchers;
163 std::vector<std::shared_ptr<gandiva::Expression>> expressions;
164 std::shared_ptr<gandiva::Projector> projector = nullptr;
165 std::shared_ptr<arrow::Schema> schema = nullptr;
166 std::shared_ptr<arrow::Schema> inputSchema = nullptr;
167
171
172 std::shared_ptr<arrow::Table> materialize(ProcessingContext& pc) const;
173};
174
175struct Builder {
177 std::vector<std::string> labels;
178 std::vector<framework::ConcreteDataMatcher> matchers;
179 std::vector<o2::soa::IndexRecord> records;
180 std::shared_ptr<arrow::Schema> outputSchema;
184
185 std::shared_ptr<std::vector<framework::IndexColumnBuilder>> builders = nullptr;
186
187 std::shared_ptr<arrow::Table> materialize(ProcessingContext& pc);
188};
189
190ConfigParamSpec replaceOrigin(ConfigParamSpec& source, std::string const& originStr);
192} // namespace o2::framework
193
194namespace o2::soa
195{
196// fmt::format, not std::string + const char*: GCC 14 turns the latter into a
197// spurious -Werror=array-bounds= on the temporary's SSO buffer.
198template <TableRef R>
200{
202 fmt::format("input:{}", o2::aod::label<R>()),
204 aod::sourceSpec<R>(),
205 {"\"\""}};
206}
207
208template <TableRef R>
209constexpr auto tableRef2Schema()
210{
212 fmt::format("input-schema:{}", o2::aod::label<R>()),
215 {"\"\""}};
216}
217
218namespace
219{
220template <soa::with_sources T>
221inline constexpr auto getSources()
222{
223 return []<size_t N, std::array<soa::TableRef, N> refs>() {
224 return []<size_t... Is>(std::index_sequence<Is...>) {
225 return std::vector{soa::tableRef2ConfigParamSpec<refs[Is]>()...};
226 }(std::make_index_sequence<N>());
227 }.template operator()<T::sources.size(), T::sources>();
228}
229
230template <soa::with_sources T>
231inline constexpr auto getSourceSchemas()
232{
233 return []<size_t N, std::array<soa::TableRef, N> refs>() {
234 return []<size_t... Is>(std::index_sequence<Is...>) {
235 return std::vector{soa::tableRef2Schema<refs[Is]>()...};
236 }(std::make_index_sequence<N>());
237 }.template operator()<T::sources.size(), T::sources>();
238}
239
240template <soa::with_sources_generator T, aod::is_origin_hash O = o2::aod::Hash<"AOD"_h>>
241inline constexpr auto getSources()
242{
243 return []<size_t N, std::array<soa::TableRef, N> refs>() {
244 return []<size_t... Is>(std::index_sequence<Is...>) {
245 return std::vector{soa::tableRef2ConfigParamSpec<refs[Is]>()...};
246 }(std::make_index_sequence<N>());
247 }.template operator()<T::N, T::template generateSources<O>()>();
248}
249
250template <soa::with_sources_generator T, aod::is_origin_hash O = o2::aod::Hash<"AOD"_h>>
251inline constexpr auto getSourceSchemas()
252{
253 return []<size_t N, std::array<soa::TableRef, N> refs>() {
254 return []<size_t... Is>(std::index_sequence<Is...>) {
255 return std::vector{soa::tableRef2Schema<refs[Is]>()...};
256 }(std::make_index_sequence<N>());
257 }.template operator()<T::N, T::template generateSources<O>()>();
258}
259
260template <soa::with_ccdb_urls T>
261inline constexpr auto getCCDBUrls()
262{
263 std::vector<framework::ConfigParamSpec> result;
264 for (size_t i = 0; i < T::ccdb_urls.size(); ++i) {
265 result.push_back({std::string{"ccdb:"} + std::string{T::ccdb_bindings[i]},
267 T::ccdb_urls[i],
268 {"\"\""}});
269 // How this object is keyed in CCDB; the fetcher turns a non-zero value into a
270 // run-number-qualified query rather than a plain timestamp one.
271 result.push_back({std::string{"ccdb-run-dependent:"} + std::string{T::ccdb_bindings[i]},
273 T::ccdb_run_dependent[i],
274 {"\"\""}});
275 }
276 return result;
277}
278
279template <typename T>
280 requires(std::same_as<T, int>)
281consteval IndexKind getIndexKind()
282{
284}
285
286template <typename T>
287 requires(std::is_bounded_array_v<T>)
288consteval IndexKind getIndexKind()
289{
290 return IndexKind::IdxSlice;
291}
292
293template <typename T>
294 requires(framework::is_specialization_v<T, std::vector>)
295consteval IndexKind getIndexKind()
296{
297 return IndexKind::IdxArray;
298}
299
300template <soa::with_index_pack T>
301inline constexpr auto getIndexMapping(header::DataOrigin newOrigin = header::DataOrigin{"AOD"})
302{
303 std::vector<IndexRecord> idx;
304 using indices = T::index_pack_t;
305 using Key = T::Key;
306 [&idx, &newOrigin]<size_t... Is>(std::index_sequence<Is...>) mutable {
307 constexpr auto refs = T::generateSources();
308 ([&idx, &newOrigin]<TableRef ref, typename C>() mutable {
309 constexpr auto pos = o2::aod::MetadataTrait<o2::aod::Hash<ref.desc_hash>>::metadata::template getIndexPosToKey<Key>();
310 auto matcher = o2::aod::matcher<ref>();
311 if ((ref.origin_hash == "AOD"_h) && (newOrigin != header::DataOrigin{"AOD"})) {
312 matcher = replaceOrigin(matcher, newOrigin);
313 }
314 if constexpr (pos == -1) {
315 idx.emplace_back(o2::aod::label<ref>(), matcher, C::columnLabel(), IndexKind::IdxSelf, pos);
316 } else {
317 idx.emplace_back(o2::aod::label<ref>(), matcher, C::columnLabel(), getIndexKind<typename C::type>(), pos);
318 }
319 }.template operator()<refs[Is], typename framework::pack_element_t<Is, indices>>(),
320 ...);
321 }(std::make_index_sequence<framework::pack_size(indices{})>());
322 ;
323 return idx;
324}
325
326template <soa::with_sources_generator T, aod::is_origin_hash O = o2::aod::Hash<"AOD"_h>>
327constexpr auto getInputMetadata() -> std::vector<framework::ConfigParamSpec>
328{
329 std::vector<framework::ConfigParamSpec> inputMetadata;
330
331 auto inputSources = getSources<T, O>();
332 std::sort(inputSources.begin(), inputSources.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name < b.name; });
333 auto last = std::unique(inputSources.begin(), inputSources.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name == b.name; });
334 inputSources.erase(last, inputSources.end());
335 inputMetadata.insert(inputMetadata.end(), inputSources.begin(), inputSources.end());
336
337 auto inputSchemas = getSourceSchemas<T, O>();
338 std::sort(inputSchemas.begin(), inputSchemas.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name < b.name; });
339 last = std::unique(inputSchemas.begin(), inputSchemas.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name == b.name; });
340 inputSchemas.erase(last, inputSchemas.end());
341 inputMetadata.insert(inputMetadata.end(), inputSchemas.begin(), inputSchemas.end());
342
343 return inputMetadata;
344}
345
346template <soa::with_sources T>
347constexpr auto getInputMetadata() -> std::vector<framework::ConfigParamSpec>
348{
349 std::vector<framework::ConfigParamSpec> inputMetadata;
350
351 auto inputSources = getSources<T>();
352 std::sort(inputSources.begin(), inputSources.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name < b.name; });
353 auto last = std::unique(inputSources.begin(), inputSources.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name == b.name; });
354 inputSources.erase(last, inputSources.end());
355 inputMetadata.insert(inputMetadata.end(), inputSources.begin(), inputSources.end());
356
357 auto inputSchemas = getSourceSchemas<T>();
358 std::sort(inputSchemas.begin(), inputSchemas.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name < b.name; });
359 last = std::unique(inputSchemas.begin(), inputSchemas.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name == b.name; });
360 inputSchemas.erase(last, inputSchemas.end());
361 inputMetadata.insert(inputMetadata.end(), inputSchemas.begin(), inputSchemas.end());
362
363 return inputMetadata;
364}
365
366template <typename T>
367 requires(!(soa::with_sources<T> || soa::with_sources_generator<T>))
368constexpr auto getInputMetadata() -> std::vector<framework::ConfigParamSpec>
369{
370 return {};
371}
372
373template <soa::with_ccdb_urls T>
374constexpr auto getCCDBMetadata() -> std::vector<framework::ConfigParamSpec>
375{
376 std::vector<framework::ConfigParamSpec> results = getCCDBUrls<T>();
377 std::sort(results.begin(), results.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name < b.name; });
378 auto last = std::unique(results.begin(), results.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name == b.name; });
379 results.erase(last, results.end());
380 // Tell the fetcher which column carries the timestamp to query at, and which column
381 // it may group by (rows sharing a uniformity value resolve to the same object, so one
382 // query per distinct value suffices). Both default to the timestamp column.
383 results.push_back({std::string{"timestamp-column"}, framework::VariantType::String, std::string{T::timestamp_column_label}, {"\"\""}});
384 results.push_back({std::string{"uniformity-column"}, framework::VariantType::String, std::string{T::uniformity_column_label}, {"\"\""}});
385 return results;
386}
387
388template <typename T>
389constexpr auto getCCDBMetadata() -> std::vector<framework::ConfigParamSpec>
390{
391 return {};
392}
393
394template <soa::with_expression_pack T>
395constexpr auto getExpressionMetadata() -> std::vector<framework::ConfigParamSpec>
396{
397 using expression_pack_t = T::expression_pack_t;
398
399 auto projectors = []<typename... C>(framework::pack<C...>) -> std::vector<framework::expressions::Projector> {
400 std::vector<framework::expressions::Projector> result;
401 (result.emplace_back(std::move(C::Projector())), ...);
402 return result;
403 }(expression_pack_t{});
404
406 return {framework::ConfigParamSpec{"projectors", framework::VariantType::String, json, {"\"\""}}};
407}
408
409template <typename T>
410 requires(!soa::with_expression_pack<T>)
411constexpr auto getExpressionMetadata() -> std::vector<framework::ConfigParamSpec>
412{
413 return {};
414}
415
416template <soa::with_index_pack T>
417constexpr auto getIndexMetadata(header::DataOrigin newOrigin = header::DataOrigin{"AOD"}) -> std::vector<framework::ConfigParamSpec>
418{
419 auto map = getIndexMapping<T>(newOrigin);
420 return {framework::ConfigParamSpec{"index-records", framework::VariantType::String, framework::serializeIndexRecords(map), {"\"\""}},
421 {framework::ConfigParamSpec{"index-exclusive", framework::VariantType::Bool, T::exclusive, {"\"\""}}}};
422}
423
424template <typename T>
425 requires(!soa::with_index_pack<T>)
426constexpr auto getIndexMetadata(header::DataOrigin) -> std::vector<framework::ConfigParamSpec>
427{
428 return {};
429}
430
431} // namespace
432
433template <TableRef R>
435{
436 std::vector<framework::ConfigParamSpec> metadata;
437 std::vector<framework::ConfigParamSpec> sources;
438 if constexpr (soa::with_sources<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>) {
439 sources = getInputMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>();
440 } else if constexpr (soa::with_sources_generator<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>) {
441 sources = getInputMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata, o2::aod::Hash<R.origin_hash>>();
442 }
443 if ((R.origin_hash == "AOD"_h) && (newOrigin != header::DataOrigin{"AOD"})) {
444 std::ranges::transform(sources, sources.begin(), [originStr = newOrigin.as<std::string>()](framework::ConfigParamSpec& source) {
445 return replaceOrigin(source, originStr);
446 });
447 metadata.emplace_back(framework::ConfigParamSpec{"aod-origin-replaced", framework::VariantType::Bool, true, {"\"\""}});
448 }
449 metadata.insert(metadata.end(), sources.begin(), sources.end());
450 auto ccdbURLs = getCCDBMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>();
451 metadata.insert(metadata.end(), ccdbURLs.begin(), ccdbURLs.end());
452 auto expressions = getExpressionMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>();
453 metadata.insert(metadata.end(), expressions.begin(), expressions.end());
454 auto indices = getIndexMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>(newOrigin);
455 metadata.insert(metadata.end(), indices.begin(), indices.end());
456 if constexpr (!soa::with_ccdb_urls<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>) {
457 metadata.emplace_back(framework::ConfigParamSpec{"schema", framework::VariantType::String, framework::serializeSchema(o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata::getSchema()), {"\"\""}});
458 }
459
460 return framework::InputSpec{
461 o2::aod::label<R>(),
462 ((R.origin_hash == "AOD"_h) && (newOrigin != header::DataOrigin{"AOD"})) ? newOrigin : o2::aod::origin<R>(),
463 o2::aod::description(o2::aod::signature<R>()),
464 R.version,
465 framework::Lifetime::Timeframe,
466 metadata};
467}
468
469template <TableRef R>
471{
472 std::vector<framework::ConfigParamSpec> metadata;
473 using md = typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata;
474 if constexpr (soa::with_ccdb_urls<md>) {
475 metadata.emplace_back("ccdb:", framework::VariantType::Bool, true, framework::ConfigParamSpec::HelpString{"\"\""});
476 } else if constexpr (soa::with_expression_pack<md>) {
477 metadata.emplace_back("projectors", framework::VariantType::Bool, true, framework::ConfigParamSpec::HelpString{"\"\""});
478 } else if constexpr (soa::with_index_pack<md>) {
479 metadata.emplace_back("index-records", framework::VariantType::Bool, true, framework::ConfigParamSpec::HelpString{"\"\""});
480 }
481 if ((R.origin_hash == "AOD"_h) && (newOrigin != header::DataOrigin{"AOD"})) {
482 metadata.push_back(framework::ConfigParamSpec{"aod-origin-replaced", framework::VariantType::Bool, true, {"\"\""}});
483 }
484 return framework::OutputSpec{
485 framework::OutputLabel{o2::aod::label<R>()},
486 ((R.origin_hash == "AOD"_h) && (newOrigin != header::DataOrigin{"AOD"})) ? newOrigin : o2::aod::origin<R>(),
487 o2::aod::description(o2::aod::signature<R>()),
488 R.version,
489 framework::Lifetime::Timeframe,
490 metadata};
491}
492
493template <TableRef R>
494constexpr auto tableRef2OutputRef()
495{
497 o2::aod::label<R>(),
498 R.version};
499}
500} // namespace o2::soa
501
502namespace o2::framework
503{
504class TableConsumer;
505
509template <is_producable T>
511 public:
512 using persistent_table_t = decltype([]() { if constexpr (soa::is_iterator<T>) { return typename T::parent_t{nullptr}; } else { return T{nullptr}; } }());
513 using cursor_t = decltype(std::declval<TableBuilder>().cursor<persistent_table_t>());
514 OutputSpec outputSpec{soa::tableRef2OutputSpec<persistent_table_t::ref>()};
516 {
517 return soa::tableRef2OutputSpec<persistent_table_t::ref>(newOrigin);
518 }
519
520 template <typename... Ts>
521 void operator()(Ts&&... args)
522 requires(sizeof...(Ts) == framework::pack_size(typename persistent_table_t::persistent_columns_t{}))
523 {
524 ++mCount;
525 if (mReserved >= 0 && mCount >= mReserved) [[unlikely]] {
526 // reserve() switched this cursor to UnsafeAppend, which does not grow its
527 // buffers. Writing row mCount (>= the reserved count) would overrun them and
528 // silently corrupt the heap, so fail here, naming the offending table and
529 // row, rather than crashing later somewhere unrelated.
530 LOG(fatal) << "Table '" << outputSpec.binding.value << "': writing row " << mCount
531 << " exceeds reserve(" << mReserved << ").";
532 }
533 cursor(0, extract(args)...);
534 }
535
537 int64_t lastIndex()
538 {
539 return mCount;
540 }
541
543 {
544 mBuilder = std::move(builder);
545 cursor = std::move(FFL(mBuilder->cursor<persistent_table_t>()));
546 mCount = -1;
547 // Back to the safe, bounds-checked cursor: no reservation to validate until
548 // reserve() is called again for this timeframe.
549 mReserved = -1;
550 return true;
551 }
552
553 void setLabel(const char* label)
554 {
555 mBuilder->setLabel(label);
556 }
557
562 void reserve(int64_t size)
563 {
564 mBuilder->reserve(typename persistent_table_t::column_types{}, size);
565 mReserved = size;
566 cursor = std::move(FFL(mBuilder->template unsafeCursor<persistent_table_t>()));
567 }
568
569 void release()
570 {
571 // Called once per timeframe, when the table is finalized. If reserve() was
572 // used (switching to UnsafeAppend, which skips per-row bounds checks), make
573 // sure we did not write past what we reserved: mCount + 1 is the number of
574 // rows actually filled, mReserved the capacity we requested. Overrunning it
575 // is silent memory corruption of the arrow buffers, so we fail hard here,
576 // before the (corrupt) table is serialized downstream. mReserved < 0 means
577 // reserve() was not called and the safe cursor was used: nothing to check.
578 if (mReserved >= 0 && mCount + 1 > mReserved) {
579 LOG(fatal) << "Table '" << outputSpec.binding.value << "': filled " << (mCount + 1)
580 << " rows after reserve(" << mReserved
581 << "). UnsafeAppend overran the reserved buffer — reserve() must request "
582 "at least as many rows as are filled.";
583 }
584 mBuilder.release();
585 }
586
587 decltype(FFL(std::declval<cursor_t>())) cursor;
588
589 private:
590 static decltype(auto) extract(soa::is_enumerated_iterator auto const& arg)
591 {
592 return arg.globalIndex();
593 }
594
595 template <typename A>
597 static decltype(auto) extract(A&& arg)
598 {
599 return arg;
600 }
601
605 LifetimeHolder<TableBuilder> mBuilder = nullptr;
606 int64_t mCount = -1;
610 int64_t mReserved = -1;
611};
612
614template <soa::is_table T>
615consteval auto typeWithRef() -> T
616{
617}
618
619template <soa::is_iterator T>
620consteval auto typeWithRef() -> typename T::parent_t
621{
622}
623
624template <typename T>
625 requires soa::is_table<T> || soa::is_iterator<T>
627 using table_t = decltype(typeWithRef<T>());
628 using metadata = aod::MetadataTrait<o2::aod::Hash<table_t::ref.desc_hash>>::metadata;
629
630 static constexpr auto spec()
631 {
632 return soa::tableRef2OutputSpec<table_t::ref>();
633 }
634
635 static constexpr auto ref()
636 {
637 return soa::tableRef2OutputRef<table_t::ref>();
638 }
639};
640
644
649template <is_producable T>
651};
652
662 static constexpr void isProducesGroup() {};
663};
664
666template <soa::is_metadata M, soa::TableRef Ref>
668 using metadata = M;
669 constexpr static auto sources = M::template generateSources<o2::aod::Hash<Ref.origin_hash>>();
670
671 OutputSpec outputSpec{soa::tableRef2OutputSpec<Ref>()};
673 {
674 return soa::tableRef2OutputSpec<Ref>(newOrigin);
675 }
676
678 static constexpr auto getRequiredInputs(header::DataOrigin const& newOrigin = header::DataOrigin{"AOD"})
679 {
680 return [&newOrigin]<size_t... Is>(std::index_sequence<Is...>) {
681 return std::array{soa::tableRef2InputSpec<sources[Is]>(newOrigin)...};
682 }(std::make_index_sequence<sources.size()>());
683 }
684};
685
688template <is_spawnable T>
689consteval auto transformBase()
690{
691 using metadata = typename aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>::metadata;
692 return TableTransform<metadata, metadata::template extension_table_t_from<o2::aod::Hash<T::originals[T::originals.size() - 1].origin_hash>>::ref>{};
693}
694
699template <is_spawnable T>
700struct Spawns : decltype(transformBase<T>()) {
701 using spawnable_t = T;
702 using metadata = decltype(transformBase<T>())::metadata;
703 using extension_t = typename metadata::template extension_table_t_from<o2::aod::Hash<T::originals[T::originals.size() - 1].origin_hash>>;
704 using expression_pack_t = typename metadata::expression_pack_t;
705 static constexpr size_t N = framework::pack_size(expression_pack_t{});
706
707 typename T::table_t* operator->()
708 {
709 return table.get();
710 }
711 typename T::table_t const& operator*() const
712 {
713 return *table;
714 }
715
717 {
718 return extension->asArrowTable();
719 }
720
721 std::shared_ptr<typename T::table_t> table = nullptr;
722 std::shared_ptr<extension_t> extension = nullptr;
723 std::array<o2::framework::expressions::Projector, N> projectors = []<typename... C>(framework::pack<C...>)->std::array<expressions::Projector, sizeof...(C)>
724 {
725 return {{std::move(C::Projector())...}};
726 }
728 std::shared_ptr<gandiva::Projector> projector = nullptr;
729 std::shared_ptr<arrow::Schema> schema = []() {
730 auto s = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(expression_pack_t{}));
731 s->WithMetadata(std::make_shared<arrow::KeyValueMetadata>(std::vector{std::string{"label"}}, std::vector{std::string{o2::aod::label<T::ref>()}}));
732 return s;
733 }();
734};
735
740template <is_dynamically_spawnable T, bool DELAYED = false>
741struct Defines : decltype(transformBase<T>()) {
742 static constexpr bool delayed = DELAYED;
743 using spawnable_t = T;
744 using metadata = decltype(transformBase<T>())::metadata;
745 using extension_t = typename metadata::template extension_table_t_from<o2::aod::Hash<T::originals[T::originals.size() - 1].origin_hash>>;
746 using placeholders_pack_t = typename metadata::placeholders_pack_t;
747 static constexpr size_t N = framework::pack_size(placeholders_pack_t{});
748
749 typename T::table_t* operator->()
750 {
751 return table.get();
752 }
753 typename T::table_t const& operator*() const
754 {
755 return *table;
756 }
757
759 {
760 return extension->asArrowTable();
761 }
762 std::shared_ptr<typename T::table_t> table = nullptr;
763 std::shared_ptr<extension_t> extension = nullptr;
764
765 std::array<o2::framework::expressions::Projector, N> projectors;
766 std::shared_ptr<gandiva::Projector> projector = nullptr;
767 std::shared_ptr<arrow::Schema> schema = []() {
768 auto s = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(placeholders_pack_t{}));
769 s->WithMetadata(std::make_shared<arrow::KeyValueMetadata>(std::vector{std::string{"label"}}, std::vector{std::string{o2::aod::label<T::ref>()}}));
770 return s;
771 }();
772 std::shared_ptr<arrow::Schema> inputSchema = nullptr;
773
774 bool needRecompilation = false;
775
780};
781
782template <is_dynamically_spawnable T>
784
788struct Exclusive {
789};
790struct Sparse {
791};
792
794template <soa::is_index_table T>
795consteval auto transformBase()
796{
797 using metadata = typename aod::MetadataTrait<o2::aod::Hash<T::ref.desc_hash>>::metadata;
799}
800
801template <soa::is_index_table T>
802struct Builds : decltype(transformBase<T>()) {
803 using buildable_t = T;
804 using metadata = decltype(transformBase<T>())::metadata;
805 using Key = metadata::Key;
806 using H = typename T::first_t;
807 using Ts = typename T::rest_t;
808 using index_pack_t = metadata::index_pack_t;
809
810 std::shared_ptr<arrow::Schema> outputSchema = []() { return std::make_shared<arrow::Schema>(soa::createFieldsFromColumns(index_pack_t{}))->WithMetadata(std::make_shared<arrow::KeyValueMetadata>(std::vector{std::string{"label"}}, std::vector{std::string{o2::aod::label<T::ref>()}})); }();
811
812 std::vector<soa::IndexRecord> map = soa::getIndexMapping<metadata>();
813
814 std::vector<framework::IndexColumnBuilder> builders;
815
817 {
818 return table.get();
819 }
820 T const& operator*() const
821 {
822 return *table;
823 }
824
826 {
827 return table->asArrowTable();
828 }
829 std::shared_ptr<T> table = nullptr;
830
831 static consteval auto pack()
832 {
833 return index_pack_t{};
834 }
835
836 auto build(std::vector<std::shared_ptr<arrow::Table>>&& tables)
837 {
838 this->table = std::make_shared<T>(soa::IndexBuilder::materialize(builders, std::forward<std::vector<std::shared_ptr<arrow::Table>>>(tables), map, outputSchema, metadata::exclusive));
839 return (this->table != nullptr);
840 }
841};
842
845
853template <typename T>
854 requires(std::derived_from<T, TObject>)
855struct OutputObj {
856 using obj_t = T;
857
859 : object(std::make_shared<T>(t)),
860 label(t.GetName()),
861 policy{policy_},
862 sourceType{sourceType_},
863 mTaskHash{0}
864 {
865 }
866
868 : object(nullptr),
869 label(label_),
870 policy{policy_},
871 sourceType{sourceType_},
872 mTaskHash{0}
873 {
874 }
875
876 void setObject(T const& t)
877 {
878 object = std::make_shared<T>(t);
879 object->SetName(label.c_str());
880 }
881
882 void setObject(T&& t)
883 {
884 object = std::make_shared<T>(t);
885 object->SetName(label.c_str());
886 }
887
888 void setObject(T* t)
889 {
890 object.reset(t);
891 object->SetName(label.c_str());
892 }
893
894 void setObject(std::shared_ptr<T> t)
895 {
896 object = t;
897 object->SetName(label.c_str());
898 }
899
900 void setHash(uint32_t hash)
901 {
902 mTaskHash = hash;
903 }
904
907 {
909 auto lhash = runtime_hash(label.c_str());
910 std::memset(desc.str, '_', 16);
911 std::stringstream s;
912 s << std::hex << lhash;
913 s << std::hex << mTaskHash;
914 s << std::hex << reinterpret_cast<uint64_t>(this);
915 std::memcpy(desc.str, s.str().c_str(), 12);
916 return OutputSpec{OutputLabel{label}, "ATSK", desc, 0, Lifetime::QA};
917 }
918
920 {
921 return object.get();
922 }
923
925 {
926 return *object.get();
927 }
928
929 OutputRef ref(uint16_t index, uint16_t max)
930 {
931 return OutputRef{std::string{label}, 0,
932 o2::header::Stack{OutputObjHeader{policy, sourceType, mTaskHash, index, max}}};
933 }
934
935 std::shared_ptr<T> object;
936 std::string label;
939 uint32_t mTaskHash;
940};
941
945template <typename T>
946struct Service {
947 using service_t = T;
949
950 decltype(auto) operator->() const
951 {
953 return service->get();
954 } else {
955 return service;
956 }
957 }
958};
959
961{
962 return std::make_unique<o2::soa::Filtered<std::decay_t<decltype(table)>>>(std::vector{table}, std::forward<soa::SelectionVector>(selection));
963}
964
966{
967 return std::make_unique<o2::soa::Filtered<std::decay_t<decltype(table)>>>(std::vector{table.asArrowTableRef()}, std::forward<soa::SelectionVector>(selection));
968}
969
970void initializePartitionCaches(std::span<const uint32_t> hashes, std::shared_ptr<arrow::Schema> const& schema, expressions::Filter const& filter, gandiva::NodePtr& tree, gandiva::FilterPtr& gfilter);
971
979template <soa::is_table T>
980struct Partition {
981 using content_t = T;
982 Partition(expressions::Node&& filter_) : filter{std::forward<expressions::Node>(filter_)}
983 {
984 }
985
986 Partition(expressions::Node&& filter_, T const& table)
987 : filter{std::forward<expressions::Node>(filter_)}
988 {
989 setTable(table);
990 }
991
992 void intializeCaches(std::span<const uint32_t> hashes, std::shared_ptr<arrow::Schema> const& schema)
993 {
995 }
996
997 void bindTable(T const& table)
998 {
999 intializeCaches(T::table_t::column_hashes, table.asArrowTableRef()->schema());
1000 if (dataframeChanged) {
1002 dataframeChanged = false;
1003 }
1004 }
1005
1006 template <typename... Ts>
1007 void bindExternalIndices(Ts*... tables)
1008 {
1009 if (mFiltered != nullptr) {
1010 mFiltered->bindExternalIndices(tables...);
1011 }
1012 }
1013
1014 template <typename E>
1016 {
1017 if (mFiltered != nullptr) {
1018 mFiltered->bindInternalIndicesTo(ptr);
1019 }
1020 }
1021
1023 {
1025 }
1026
1027 [[nodiscard]] std::shared_ptr<arrow::Table> asArrowTable() const
1028 {
1029 return mFiltered->asArrowTable();
1030 }
1031
1033 {
1034 return mFiltered.get();
1035 }
1036
1037 template <typename T1>
1038 [[nodiscard]] auto rawSliceBy(o2::framework::Preslice<T1> const& container, int value) const
1039 {
1040 return mFiltered->rawSliceBy(container, value);
1041 }
1042
1044 {
1045 return mFiltered->sliceByCached(node, value, cache);
1046 }
1047
1049 {
1050 return mFiltered->sliceByCachedUnsorted(node, value, cache);
1051 }
1052
1053 template <typename T1, typename Policy, bool OPT>
1054 [[nodiscard]] auto sliceBy(o2::framework::PresliceBase<T1, Policy, OPT> const& container, int value) const
1055 {
1056 return mFiltered->sliceBy(container, value);
1057 }
1058
1060 std::unique_ptr<o2::soa::Filtered<T>> mFiltered = nullptr;
1061 gandiva::NodePtr tree = nullptr;
1063 bool dataframeChanged = true;
1064
1070 {
1071 return mFiltered->begin();
1072 }
1074 {
1075 return mFiltered->end();
1076 }
1078 {
1079 return mFiltered->begin();
1080 }
1082 {
1083 return mFiltered->end();
1084 }
1085
1086 int64_t size() const
1087 {
1088 return mFiltered->size();
1089 }
1090};
1091} // namespace o2::framework
1092
1093namespace o2::soa
1094{
1096template <soa::is_table T, soa::is_spawnable_column... Cs>
1097auto Extend(T const& table)
1098{
1099 using output_t = Join<T, soa::Table<o2::aod::Hash<"JOIN"_h>, o2::aod::Hash<"JOIN/0"_h>, o2::aod::Hash<"JOIN"_h>, Cs...>>;
1100 static std::array<framework::expressions::Projector, sizeof...(Cs)> projectors{{std::move(Cs::Projector())...}};
1101 static std::shared_ptr<gandiva::Projector> projector = nullptr;
1102 static auto schema = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(framework::pack<Cs...>{}));
1103 return output_t{{o2::framework::spawner(framework::pack<Cs...>{}, {table.asArrowTable()}, "dynamicExtension", projectors.data(), projector, schema), table.asArrowTable()}};
1104}
1105
1108template <soa::is_table T, soa::is_dynamic_column... Cs>
1109auto Attach(T const& table)
1110{
1111 using output_t = Join<T, o2::soa::Table<o2::aod::Hash<"JOIN"_h>, o2::aod::Hash<"JOIN/0"_h>, o2::aod::Hash<"JOIN"_h>, Cs...>>;
1112 return output_t{{table.asArrowTableRef()}};
1113}
1114} // namespace o2::soa
1115
1116#endif // o2_framework_AnalysisHelpers_H_DEFINED
bool exclusive
std::vector< o2::soa::IndexRecord > records
std::vector< expressions::Projector > projectors
std::vector< std::shared_ptr< gandiva::Expression > > expressions
std::vector< std::string > labels
o2::monitoring::tags::Key Key
uint32_t hash
std::shared_ptr< arrow::Schema > schema
std::unique_ptr< expressions::Node > node
int32_t i
uint16_t pos
Definition RawData.h:3
uint32_t gfilter
Definition RawData.h:6
constexpr uint32_t runtime_hash(char const *str)
nlohmann::json json
TBranch * ptr
Definition A.h:16
iterator const_iterator
Definition ASoA.h:3852
T::template iterator_template_o< FilteredIndexPolicy, self_t > iterator
Definition ASoA.h:3850
GLuint64EXT * result
Definition glcorearb.h:5662
GLsizeiptr size
Definition glcorearb.h:659
GLuint index
Definition glcorearb.h:781
GLuint const GLchar * name
Definition glcorearb.h:781
GLboolean GLboolean GLboolean b
Definition glcorearb.h:1233
GLsizei GLsizei GLchar * source
Definition glcorearb.h:798
GLsizei const GLfloat * value
Definition glcorearb.h:819
GLint GLint GLsizei GLint GLenum GLenum type
Definition glcorearb.h:275
GLuint GLsizei const GLchar * label
Definition glcorearb.h:2519
GLsizei GLenum const void * indices
Definition glcorearb.h:400
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
Definition glcorearb.h:1308
GLuint object
Definition glcorearb.h:4041
GLboolean GLboolean GLboolean GLboolean a
Definition glcorearb.h:1233
GLint ref
Definition glcorearb.h:291
GLsizei GLenum * sources
Definition glcorearb.h:2516
std::shared_ptr< gandiva::Filter > FilterPtr
Definition Expressions.h:46
constexpr framework::ConcreteDataMatcher matcher()
Definition ASoA.h:388
std::variant< OriginValueMatcher, DescriptionValueMatcher, SubSpecificationTypeValueMatcher, std::unique_ptr< DataDescriptorMatcher >, ConstantValueMatcher, StartTimeValueMatcher > Node
std::shared_ptr< gandiva::Projector > createProjectorHelper(size_t nColumns, expressions::Projector *projectors, std::shared_ptr< arrow::Schema > schema, std::vector< std::shared_ptr< arrow::Field > > const &fields)
gandiva::Selection createSelection(std::shared_ptr< arrow::Table > const &table, Filter const &expression)
Function for creating gandiva selection from our internal filter tree.
void updatePlaceholders(Filter &filter, InitContext &context)
Update placeholder nodes from context.
Defining ITS Vertex explicitly as messageable.
Definition Cartesian.h:288
auto spawner(std::shared_ptr< arrow::Table > const &fullTable, const char *name, o2::framework::expressions::Projector *projectors, std::shared_ptr< gandiva::Projector > &projector, std::shared_ptr< arrow::Schema > const &schema)
Expression-based column generator to materialize columns.
std::string serializeSchema(std::shared_ptr< arrow::Schema > schema)
consteval auto transformBase()
This helper struct allows you to declare index tables to be created in a task.
void initializePartitionCaches(std::span< const uint32_t > hashes, std::shared_ptr< arrow::Schema > const &schema, expressions::Filter const &filter, gandiva::NodePtr &tree, gandiva::FilterPtr &gfilter)
std::string serializeProjectors(std::vector< framework::expressions::Projector > &projectors)
std::shared_ptr< arrow::Table > spawnerHelper(std::shared_ptr< arrow::Table > const &fullTable, std::shared_ptr< arrow::Schema > newSchema, size_t nColumns, expressions::Projector *projectors, const char *name, std::shared_ptr< gandiva::Projector > &projector)
constexpr std::size_t pack_size(pack< Ts... > const &)
template function to determine number of types in a pack
Definition Pack.h:28
std::string serializeIndexRecords(std::vector< o2::soa::IndexRecord > &irs)
ConfigParamSpec replaceOrigin(ConfigParamSpec &source, std::string const &originStr)
void wrongOriginReplacement(std::string_view replacement)
memfun_type< decltype(&F::operator())>::type FFL(F const &func)
auto getTableFromFilter(soa::is_filtered_table auto const &table, soa::SelectionVector &&selection)
std::vector< std::shared_ptr< arrow::Table > > extractSources(ProcessingContext &pc, std::vector< std::string > const &labels)
consteval auto typeWithRef() -> T
Helper to define output for a Table.
OutputObjHandlingPolicy
Policy enum to determine OutputObj handling when writing.
std::shared_ptr< arrow::Table > makeEmptyTableImpl(const char *name, std::shared_ptr< arrow::Schema > &schema)
Descriptor< gSizeDataOriginString > DataOrigin
Definition DataHeader.h:550
auto createFieldsFromColumns(framework::pack< C... >)
Definition ASoA.h:77
SelectionVector selectionToVector(gandiva::Selection const &sel)
Definition ASoA.cxx:48
std::vector< int64_t > SelectionVector
Definition ASoA.h:444
auto Attach(T const &table)
constexpr auto tableRef2OutputSpec(header::DataOrigin newOrigin=header::DataOrigin{"AOD"})
constexpr auto tableRef2Schema()
constexpr auto tableRef2InputSpec(header::DataOrigin newOrigin=header::DataOrigin{"AOD"})
constexpr auto tableRef2ConfigParamSpec()
auto Extend(T const &table)
On-the-fly adding of expression columns.
constexpr auto tableRef2OutputRef()
@ C
Definition Defs.h:36
header::DataDescription description
std::vector< o2::soa::IndexRecord > records
std::vector< std::string > labels
std::vector< framework::ConcreteDataMatcher > matchers
header::DataOrigin origin
std::shared_ptr< std::vector< framework::IndexColumnBuilder > > builders
header::DataHeader::SubSpecificationType version
std::shared_ptr< arrow::Schema > outputSchema
std::shared_ptr< arrow::Table > materialize(ProcessingContext &pc)
std::shared_ptr< T > table
auto build(std::vector< std::shared_ptr< arrow::Table > > &&tables)
std::vector< soa::IndexRecord > map
std::vector< framework::IndexColumnBuilder > builders
std::shared_ptr< arrow::Schema > outputSchema
typename T::first_t H
T const & operator*() const
static consteval auto pack()
metadata::index_pack_t index_pack_t
typename T::rest_t Ts
decltype(transformBase< T >())::metadata metadata
std::shared_ptr< typename T::table_t > table
T::table_t const & operator*() const
typename metadata::template extension_table_t_from< o2::aod::Hash< T::originals[T::originals.size() - 1].origin_hash > > extension_t
decltype(transformBase< T >())::metadata metadata
std::array< o2::framework::expressions::Projector, N > projectors
std::shared_ptr< extension_t > extension
std::shared_ptr< arrow::Schema > inputSchema
std::shared_ptr< arrow::Schema > schema
static constexpr bool delayed
static constexpr size_t N
typename metadata::placeholders_pack_t placeholders_pack_t
std::shared_ptr< gandiva::Projector > projector
std::vector< std::pair< int, ConcreteDataMatcher > > matchers
static constexpr auto spec()
static constexpr auto ref()
aod::MetadataTrait< o2::aod::Hash< table_t::ref.desc_hash > >::metadata metadata
decltype(typeWithRef< T >()) table_t
O2 header for OutputObj metadata.
OutputObj(T &&t, OutputObjHandlingPolicy policy_=OutputObjHandlingPolicy::AnalysisObject, OutputObjSourceType sourceType_=OutputObjSourceType::OutputObjSource)
void setObject(std::shared_ptr< T > t)
OutputObjSourceType sourceType
OutputRef ref(uint16_t index, uint16_t max)
std::shared_ptr< T > object
OutputObj(std::string const &label_, OutputObjHandlingPolicy policy_=OutputObjHandlingPolicy::AnalysisObject, OutputObjSourceType sourceType_=OutputObjSourceType::OutputObjSource)
OutputSpec const spec()
OutputObjHandlingPolicy policy
void setHash(uint32_t hash)
Partition(expressions::Node &&filter_, T const &table)
typename o2::soa::Filtered< T >::const_iterator filtered_const_iterator
void bindTable(T const &table)
filtered_const_iterator begin() const
auto rawSliceBy(o2::framework::Preslice< T1 > const &container, int value) const
auto sliceByCached(framework::expressions::BindingNode const &node, int value, o2::framework::SliceCache &cache) const
Partition(expressions::Node &&filter_)
void intializeCaches(std::span< const uint32_t > hashes, std::shared_ptr< arrow::Schema > const &schema)
typename o2::soa::Filtered< T >::iterator filtered_iterator
o2::soa::Filtered< T > * operator->()
typename o2::soa::Filtered< T >::iterator iterator
auto sliceBy(o2::framework::PresliceBase< T1, Policy, OPT > const &container, int value) const
std::shared_ptr< arrow::Table > asArrowTable() const
o2::soa::RowViewSentinel end() const
void updatePlaceholders(InitContext &context)
std::unique_ptr< o2::soa::Filtered< T > > mFiltered
expressions::Filter filter
o2::soa::RowViewSentinel end()
auto sliceByCachedUnsorted(framework::expressions::BindingNode const &node, int value, o2::framework::SliceCache &cache) const
typename o2::soa::Filtered< T >::const_iterator const_iterator
gandiva::FilterPtr gfilter
void bindExternalIndices(Ts *... tables)
filtered_iterator begin()
static constexpr void isProducesGroup()
header::DataDescription description
std::vector< std::string > labels
std::vector< std::shared_ptr< gandiva::Expression > > expressions
std::shared_ptr< gandiva::Projector > projector
header::DataOrigin origin
std::vector< framework::ConcreteDataMatcher > matchers
header::DataHeader::SubSpecificationType version
std::shared_ptr< arrow::Schema > schema
std::shared_ptr< arrow::Table > materialize(ProcessingContext &pc) const
std::shared_ptr< arrow::Schema > inputSchema
T::table_t * operator->()
std::shared_ptr< gandiva::Projector > projector
std::shared_ptr< extension_t > extension
T::table_t const & operator*() const
static constexpr size_t N
std::shared_ptr< arrow::Schema > schema
typename metadata::expression_pack_t expression_pack_t
std::array< o2::framework::expressions::Projector, N > projectors
decltype(transformBase< T >())::metadata metadata
std::shared_ptr< typename T::table_t > table
typename metadata::template extension_table_t_from< o2::aod::Hash< T::originals[T::originals.size() - 1].origin_hash > > extension_t
Helper template for table transformations.
std::array< InputSpec, sources.size()> requiredInputs
static constexpr auto getRequiredInputs(header::DataOrigin const &newOrigin=header::DataOrigin{"AOD"})
static OutputSpec updateOutputSpec(header::DataOrigin const &newOrigin=header::DataOrigin{"AOD"})
int64_t lastIndex()
Last index inserted in the table.
decltype(FFL(std::declval< cursor_t >())) cursor
static OutputSpec updateOutputSpec(header::DataOrigin const &newOrigin=header::DataOrigin{"AOD"})
bool resetCursor(LifetimeHolder< TableBuilder > builder)
void setLabel(const char *label)
void operator()(Ts &&... args)
decltype([]() { if constexpr(soa::is_iterator< T >) { return typename T::parent_t{nullptr} persistent_table_t
decltype(std::declval< TableBuilder >().cursor< persistent_table_t >()) cursor_t
An expression tree node corresponding to a column binding.
A struct, containing the root of the expression tree.
uint32_t SubSpecificationType
Definition DataHeader.h:622
a move-only header stack with serialized headers This is the flat buffer where all the headers in a m...
Definition Stack.h:33
static o2::soa::ArrowTableRef joinTables(std::vector< std::shared_ptr< arrow::Table > > &&tables)
Definition ASoA.cxx:140
static void resetBuilders(std::vector< framework::IndexColumnBuilder > &builders, std::vector< std::shared_ptr< arrow::Table > > &&tables)
static std::vector< framework::IndexColumnBuilder > makeBuilders(std::vector< std::shared_ptr< arrow::Table > > &&tables, std::vector< soa::IndexRecord > const &records)
static std::shared_ptr< arrow::Table > materialize(std::vector< framework::IndexColumnBuilder > &builders, std::vector< std::shared_ptr< arrow::Table > > &&tables, std::vector< soa::IndexRecord > const &records, std::shared_ptr< arrow::Schema > const &schema, bool exclusive)
std::shared_ptr< arrow::Field > field() const
auto operator==(IndexRecord const &other) const
framework::ConcreteDataMatcher matcher
constexpr size_t max
VectorOfTObjectPtrs other
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::unique_ptr< TTree > tree((TTree *) flIn.Get(std::string(o2::base::NameConf::CTFTREENAME).c_str()))