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 <string>
29namespace o2::framework
30{
35struct InputInfo {
36 uint32_t hash;
37 std::vector<std::pair<int, ConcreteDataMatcher>> matchers;
38};
39} // namespace o2::framework
40
41namespace o2::soa
42{
44 std::string label;
46 std::string columnLabel;
48 int pos;
49 std::shared_ptr<arrow::DataType> type = [](IndexKind kind) -> std::shared_ptr<arrow::DataType> {
50 switch (kind) {
53 return arrow::int32();
55 return arrow::fixed_size_list(arrow::int32(), 2);
57 return arrow::list(arrow::int32());
58 default:
59 return {nullptr};
60 }
61 }(kind);
62
63 auto operator==(IndexRecord const& other) const
64 {
65 return (this->label == other.label) && (this->columnLabel == other.columnLabel) && (this->kind == other.kind) && (this->pos == other.pos);
66 }
67
68 std::shared_ptr<arrow::Field> field() const
69 {
70 return std::make_shared<arrow::Field>(columnLabel, type);
71 }
72};
73
75 static std::vector<framework::IndexColumnBuilder> makeBuilders(std::vector<std::shared_ptr<arrow::Table>>&& tables, std::vector<soa::IndexRecord> const& records);
76 static void resetBuilders(std::vector<framework::IndexColumnBuilder>& builders, std::vector<std::shared_ptr<arrow::Table>>&& tables);
77
78 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);
79};
80} // namespace o2::soa
81
82namespace o2::framework
83{
84void wrongOriginReplacement(std::string_view replacement);
85std::shared_ptr<arrow::Table> makeEmptyTableImpl(const char* name, std::shared_ptr<arrow::Schema>& schema);
86
87template <soa::is_table T>
88auto makeEmptyTable(const char* name)
89{
90 auto schema = std::make_shared<arrow::Schema>(soa::createFieldsFromColumns(typename T::table_t::persistent_columns_t{}));
92}
93
94template <soa::TableRef R>
95 requires(soa::not_void<typename aod::MetadataTrait<aod::Hash<R.desc_hash>>::metadata>)
97{
98 auto schema = std::make_shared<arrow::Schema>(soa::createFieldsFromColumns(typename aod::MetadataTrait<aod::Hash<R.desc_hash>>::metadata::persistent_columns_t{}));
99 return makeEmptyTableImpl(o2::aod::label<R>(), schema);
100}
101
102template <typename... Cs>
104{
105 auto schema = std::make_shared<arrow::Schema>(soa::createFieldsFromColumns(p));
107}
108
109template <aod::is_aod_hash D>
111auto makeEmptyTable(const char* name)
112{
113 auto schema = std::make_shared<arrow::Schema>(soa::createFieldsFromColumns(typename aod::MetadataTrait<D>::metadata::persistent_columns_t{}));
115}
116
117std::shared_ptr<arrow::Table> spawnerHelper(std::shared_ptr<arrow::Table> const& fullTable, std::shared_ptr<arrow::Schema> newSchema, size_t nColumns,
118 expressions::Projector* projectors, const char* name, std::shared_ptr<gandiva::Projector>& projector);
119
120std::shared_ptr<arrow::Table> spawnerHelper(std::shared_ptr<arrow::Table> const& fullTable, std::shared_ptr<arrow::Schema> newSchema,
121 const char* name, size_t nColumns,
122 const std::shared_ptr<gandiva::Projector>& projector);
123
125template <aod::is_aod_hash D>
127auto 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)
128{
129 if (fullTable->num_rows() == 0) {
130 return makeEmptyTable<D>(name);
131 }
132 constexpr auto Ncol = []<typename M>() {
134 return framework::pack_size(typename M::placeholders_pack_t{});
135 } else {
136 return framework::pack_size(typename M::expression_pack_t{});
137 }
138 }.template operator()<typename o2::aod::MetadataTrait<D>::metadata>();
139 return spawnerHelper(fullTable, schema, Ncol, projectors, name, projector);
140}
141
142template <typename... C>
143auto 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)
144{
145 std::array<const char*, 1> labels{"original"};
146 auto fullTable = soa::ArrowHelpers::joinTables(std::move(tables), std::span<const char* const>{labels});
147 if (fullTable->num_rows() == 0) {
149 }
150 return spawnerHelper(fullTable, schema, sizeof...(C), projectors, name, projector);
151}
152
153std::string serializeProjectors(std::vector<framework::expressions::Projector>& projectors);
154std::string serializeSchema(std::shared_ptr<arrow::Schema> schema);
155std::string serializeIndexRecords(std::vector<o2::soa::IndexRecord>& irs);
156std::vector<std::shared_ptr<arrow::Table>> extractSources(ProcessingContext& pc, std::vector<std::string> const& labels);
157
158struct Spawner {
159 std::string binding;
160 std::vector<std::string> labels;
161 std::vector<framework::ConcreteDataMatcher> matchers;
162 std::vector<std::shared_ptr<gandiva::Expression>> expressions;
163 std::shared_ptr<gandiva::Projector> projector = nullptr;
164 std::shared_ptr<arrow::Schema> schema = nullptr;
165 std::shared_ptr<arrow::Schema> inputSchema = nullptr;
166
170
171 std::shared_ptr<arrow::Table> materialize(ProcessingContext& pc) const;
172};
173
174struct Builder {
176 std::vector<std::string> labels;
177 std::vector<framework::ConcreteDataMatcher> matchers;
178 std::vector<o2::soa::IndexRecord> records;
179 std::shared_ptr<arrow::Schema> outputSchema;
183
184 std::shared_ptr<std::vector<framework::IndexColumnBuilder>> builders = nullptr;
185
186 std::shared_ptr<arrow::Table> materialize(ProcessingContext& pc);
187};
188
189ConfigParamSpec replaceOrigin(ConfigParamSpec& source, std::string const& originStr);
191} // namespace o2::framework
192
193namespace o2::soa
194{
195template <TableRef R>
197{
199 std::string{"input:"} + o2::aod::label<R>(),
201 aod::sourceSpec<R>(),
202 {"\"\""}};
203}
204
205template <TableRef R>
206constexpr auto tableRef2Schema()
207{
209 std::string{"input-schema:"} + o2::aod::label<R>(),
212 {"\"\""}};
213}
214
215namespace
216{
217template <soa::with_sources T>
218inline constexpr auto getSources()
219{
220 return []<size_t N, std::array<soa::TableRef, N> refs>() {
221 return []<size_t... Is>(std::index_sequence<Is...>) {
222 return std::vector{soa::tableRef2ConfigParamSpec<refs[Is]>()...};
223 }(std::make_index_sequence<N>());
224 }.template operator()<T::sources.size(), T::sources>();
225}
226
227template <soa::with_sources T>
228inline constexpr auto getSourceSchemas()
229{
230 return []<size_t N, std::array<soa::TableRef, N> refs>() {
231 return []<size_t... Is>(std::index_sequence<Is...>) {
232 return std::vector{soa::tableRef2Schema<refs[Is]>()...};
233 }(std::make_index_sequence<N>());
234 }.template operator()<T::sources.size(), T::sources>();
235}
236
237template <soa::with_sources_generator T, aod::is_origin_hash O = o2::aod::Hash<"AOD"_h>>
238inline constexpr auto getSources()
239{
240 return []<size_t N, std::array<soa::TableRef, N> refs>() {
241 return []<size_t... Is>(std::index_sequence<Is...>) {
242 return std::vector{soa::tableRef2ConfigParamSpec<refs[Is]>()...};
243 }(std::make_index_sequence<N>());
244 }.template operator()<T::N, T::template generateSources<O>()>();
245}
246
247template <soa::with_sources_generator T, aod::is_origin_hash O = o2::aod::Hash<"AOD"_h>>
248inline constexpr auto getSourceSchemas()
249{
250 return []<size_t N, std::array<soa::TableRef, N> refs>() {
251 return []<size_t... Is>(std::index_sequence<Is...>) {
252 return std::vector{soa::tableRef2Schema<refs[Is]>()...};
253 }(std::make_index_sequence<N>());
254 }.template operator()<T::N, T::template generateSources<O>()>();
255}
256
257template <soa::with_ccdb_urls T>
258inline constexpr auto getCCDBUrls()
259{
260 std::vector<framework::ConfigParamSpec> result;
261 for (size_t i = 0; i < T::ccdb_urls.size(); ++i) {
262 result.push_back({std::string{"ccdb:"} + std::string{T::ccdb_bindings[i]},
264 T::ccdb_urls[i],
265 {"\"\""}});
266 }
267 return result;
268}
269
270template <typename T>
271 requires(std::same_as<T, int>)
272consteval IndexKind getIndexKind()
273{
275}
276
277template <typename T>
278 requires(std::is_bounded_array_v<T>)
279consteval IndexKind getIndexKind()
280{
281 return IndexKind::IdxSlice;
282}
283
284template <typename T>
285 requires(framework::is_specialization_v<T, std::vector>)
286consteval IndexKind getIndexKind()
287{
288 return IndexKind::IdxArray;
289}
290
291template <soa::with_index_pack T>
292inline constexpr auto getIndexMapping(header::DataOrigin newOrigin = header::DataOrigin{"AOD"})
293{
294 std::vector<IndexRecord> idx;
295 using indices = T::index_pack_t;
296 using Key = T::Key;
297 [&idx, &newOrigin]<size_t... Is>(std::index_sequence<Is...>) mutable {
298 constexpr auto refs = T::generateSources();
299 ([&idx, &newOrigin]<TableRef ref, typename C>() mutable {
300 constexpr auto pos = o2::aod::MetadataTrait<o2::aod::Hash<ref.desc_hash>>::metadata::template getIndexPosToKey<Key>();
301 auto matcher = o2::aod::matcher<ref>();
302 if ((ref.origin_hash == "AOD"_h) && (newOrigin != header::DataOrigin{"AOD"})) {
303 matcher = replaceOrigin(matcher, newOrigin);
304 }
305 if constexpr (pos == -1) {
306 idx.emplace_back(o2::aod::label<ref>(), matcher, C::columnLabel(), IndexKind::IdxSelf, pos);
307 } else {
308 idx.emplace_back(o2::aod::label<ref>(), matcher, C::columnLabel(), getIndexKind<typename C::type>(), pos);
309 }
310 }.template operator()<refs[Is], typename framework::pack_element_t<Is, indices>>(),
311 ...);
312 }(std::make_index_sequence<framework::pack_size(indices{})>());
313 ;
314 return idx;
315}
316
317template <soa::with_sources_generator T, aod::is_origin_hash O = o2::aod::Hash<"AOD"_h>>
318constexpr auto getInputMetadata() -> std::vector<framework::ConfigParamSpec>
319{
320 std::vector<framework::ConfigParamSpec> inputMetadata;
321
322 auto inputSources = getSources<T, O>();
323 std::sort(inputSources.begin(), inputSources.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name < b.name; });
324 auto last = std::unique(inputSources.begin(), inputSources.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name == b.name; });
325 inputSources.erase(last, inputSources.end());
326 inputMetadata.insert(inputMetadata.end(), inputSources.begin(), inputSources.end());
327
328 auto inputSchemas = getSourceSchemas<T, O>();
329 std::sort(inputSchemas.begin(), inputSchemas.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name < b.name; });
330 last = std::unique(inputSchemas.begin(), inputSchemas.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name == b.name; });
331 inputSchemas.erase(last, inputSchemas.end());
332 inputMetadata.insert(inputMetadata.end(), inputSchemas.begin(), inputSchemas.end());
333
334 return inputMetadata;
335}
336
337template <soa::with_sources T>
338constexpr auto getInputMetadata() -> std::vector<framework::ConfigParamSpec>
339{
340 std::vector<framework::ConfigParamSpec> inputMetadata;
341
342 auto inputSources = getSources<T>();
343 std::sort(inputSources.begin(), inputSources.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name < b.name; });
344 auto last = std::unique(inputSources.begin(), inputSources.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name == b.name; });
345 inputSources.erase(last, inputSources.end());
346 inputMetadata.insert(inputMetadata.end(), inputSources.begin(), inputSources.end());
347
348 auto inputSchemas = getSourceSchemas<T>();
349 std::sort(inputSchemas.begin(), inputSchemas.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name < b.name; });
350 last = std::unique(inputSchemas.begin(), inputSchemas.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name == b.name; });
351 inputSchemas.erase(last, inputSchemas.end());
352 inputMetadata.insert(inputMetadata.end(), inputSchemas.begin(), inputSchemas.end());
353
354 return inputMetadata;
355}
356
357template <typename T>
358 requires(!(soa::with_sources<T> || soa::with_sources_generator<T>))
359constexpr auto getInputMetadata() -> std::vector<framework::ConfigParamSpec>
360{
361 return {};
362}
363
364template <soa::with_ccdb_urls T>
365constexpr auto getCCDBMetadata() -> std::vector<framework::ConfigParamSpec>
366{
367 std::vector<framework::ConfigParamSpec> results = getCCDBUrls<T>();
368 std::sort(results.begin(), results.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name < b.name; });
369 auto last = std::unique(results.begin(), results.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name == b.name; });
370 results.erase(last, results.end());
371 return results;
372}
373
374template <typename T>
375constexpr auto getCCDBMetadata() -> std::vector<framework::ConfigParamSpec>
376{
377 return {};
378}
379
380template <soa::with_expression_pack T>
381constexpr auto getExpressionMetadata() -> std::vector<framework::ConfigParamSpec>
382{
383 using expression_pack_t = T::expression_pack_t;
384
385 auto projectors = []<typename... C>(framework::pack<C...>) -> std::vector<framework::expressions::Projector> {
386 std::vector<framework::expressions::Projector> result;
387 (result.emplace_back(std::move(C::Projector())), ...);
388 return result;
389 }(expression_pack_t{});
390
392 return {framework::ConfigParamSpec{"projectors", framework::VariantType::String, json, {"\"\""}}};
393}
394
395template <typename T>
396 requires(!soa::with_expression_pack<T>)
397constexpr auto getExpressionMetadata() -> std::vector<framework::ConfigParamSpec>
398{
399 return {};
400}
401
402template <soa::with_index_pack T>
403constexpr auto getIndexMetadata(header::DataOrigin newOrigin = header::DataOrigin{"AOD"}) -> std::vector<framework::ConfigParamSpec>
404{
405 auto map = getIndexMapping<T>(newOrigin);
406 return {framework::ConfigParamSpec{"index-records", framework::VariantType::String, framework::serializeIndexRecords(map), {"\"\""}},
407 {framework::ConfigParamSpec{"index-exclusive", framework::VariantType::Bool, T::exclusive, {"\"\""}}}};
408}
409
410template <typename T>
411 requires(!soa::with_index_pack<T>)
412constexpr auto getIndexMetadata(header::DataOrigin) -> std::vector<framework::ConfigParamSpec>
413{
414 return {};
415}
416
417} // namespace
418
419template <TableRef R>
421{
422 std::vector<framework::ConfigParamSpec> metadata;
423 std::vector<framework::ConfigParamSpec> sources;
424 if constexpr (soa::with_sources<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>) {
425 sources = getInputMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>();
426 } else if constexpr (soa::with_sources_generator<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>) {
427 sources = getInputMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata, o2::aod::Hash<R.origin_hash>>();
428 }
429 if ((R.origin_hash == "AOD"_h) && (newOrigin != header::DataOrigin{"AOD"})) {
430 std::ranges::transform(sources, sources.begin(), [originStr = newOrigin.as<std::string>()](framework::ConfigParamSpec& source) {
431 return replaceOrigin(source, originStr);
432 });
433 metadata.emplace_back(framework::ConfigParamSpec{"aod-origin-replaced", framework::VariantType::Bool, true, {"\"\""}});
434 }
435 metadata.insert(metadata.end(), sources.begin(), sources.end());
436 auto ccdbURLs = getCCDBMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>();
437 metadata.insert(metadata.end(), ccdbURLs.begin(), ccdbURLs.end());
438 auto expressions = getExpressionMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>();
439 metadata.insert(metadata.end(), expressions.begin(), expressions.end());
440 auto indices = getIndexMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>(newOrigin);
441 metadata.insert(metadata.end(), indices.begin(), indices.end());
442 if constexpr (!soa::with_ccdb_urls<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>) {
443 metadata.emplace_back(framework::ConfigParamSpec{"schema", framework::VariantType::String, framework::serializeSchema(o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata::getSchema()), {"\"\""}});
444 }
445
446 return framework::InputSpec{
447 o2::aod::label<R>(),
448 ((R.origin_hash == "AOD"_h) && (newOrigin != header::DataOrigin{"AOD"})) ? newOrigin : o2::aod::origin<R>(),
449 o2::aod::description(o2::aod::signature<R>()),
450 R.version,
451 framework::Lifetime::Timeframe,
452 metadata};
453}
454
455template <TableRef R>
457{
458 std::vector<framework::ConfigParamSpec> metadata;
459 using md = typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata;
460 if constexpr (soa::with_ccdb_urls<md>) {
461 metadata.emplace_back("ccdb:", framework::VariantType::Bool, true, framework::ConfigParamSpec::HelpString{"\"\""});
462 } else if constexpr (soa::with_expression_pack<md>) {
463 metadata.emplace_back("projectors", framework::VariantType::Bool, true, framework::ConfigParamSpec::HelpString{"\"\""});
464 } else if constexpr (soa::with_index_pack<md>) {
465 metadata.emplace_back("index-records", framework::VariantType::Bool, true, framework::ConfigParamSpec::HelpString{"\"\""});
466 }
467 if ((R.origin_hash == "AOD"_h) && (newOrigin != header::DataOrigin{"AOD"})) {
468 metadata.push_back(framework::ConfigParamSpec{"aod-origin-replaced", framework::VariantType::Bool, true, {"\"\""}});
469 }
470 return framework::OutputSpec{
471 framework::OutputLabel{o2::aod::label<R>()},
472 ((R.origin_hash == "AOD"_h) && (newOrigin != header::DataOrigin{"AOD"})) ? newOrigin : o2::aod::origin<R>(),
473 o2::aod::description(o2::aod::signature<R>()),
474 R.version,
475 framework::Lifetime::Timeframe,
476 metadata};
477}
478
479template <TableRef R>
480constexpr auto tableRef2OutputRef()
481{
483 o2::aod::label<R>(),
484 R.version};
485}
486} // namespace o2::soa
487
488namespace o2::framework
489{
490class TableConsumer;
491
495template <is_producable T>
497 public:
498 using persistent_table_t = decltype([]() { if constexpr (soa::is_iterator<T>) { return typename T::parent_t{nullptr}; } else { return T{nullptr}; } }());
499 using cursor_t = decltype(std::declval<TableBuilder>().cursor<persistent_table_t>());
500 OutputSpec outputSpec{soa::tableRef2OutputSpec<persistent_table_t::ref>()};
502 {
503 return soa::tableRef2OutputSpec<persistent_table_t::ref>(newOrigin);
504 }
505
506 template <typename... Ts>
507 void operator()(Ts&&... args)
508 requires(sizeof...(Ts) == framework::pack_size(typename persistent_table_t::persistent_columns_t{}))
509 {
510 ++mCount;
511 if (mReserved >= 0 && mCount >= mReserved) [[unlikely]] {
512 // reserve() switched this cursor to UnsafeAppend, which does not grow its
513 // buffers. Writing row mCount (>= the reserved count) would overrun them and
514 // silently corrupt the heap, so fail here, naming the offending table and
515 // row, rather than crashing later somewhere unrelated.
516 LOG(fatal) << "Table '" << outputSpec.binding.value << "': writing row " << mCount
517 << " exceeds reserve(" << mReserved << ").";
518 }
519 cursor(0, extract(args)...);
520 }
521
523 int64_t lastIndex()
524 {
525 return mCount;
526 }
527
529 {
530 mBuilder = std::move(builder);
531 cursor = std::move(FFL(mBuilder->cursor<persistent_table_t>()));
532 mCount = -1;
533 // Back to the safe, bounds-checked cursor: no reservation to validate until
534 // reserve() is called again for this timeframe.
535 mReserved = -1;
536 return true;
537 }
538
539 void setLabel(const char* label)
540 {
541 mBuilder->setLabel(label);
542 }
543
548 void reserve(int64_t size)
549 {
550 mBuilder->reserve(typename persistent_table_t::column_types{}, size);
551 mReserved = size;
552 cursor = std::move(FFL(mBuilder->template unsafeCursor<persistent_table_t>()));
553 }
554
555 void release()
556 {
557 // Called once per timeframe, when the table is finalized. If reserve() was
558 // used (switching to UnsafeAppend, which skips per-row bounds checks), make
559 // sure we did not write past what we reserved: mCount + 1 is the number of
560 // rows actually filled, mReserved the capacity we requested. Overrunning it
561 // is silent memory corruption of the arrow buffers, so we fail hard here,
562 // before the (corrupt) table is serialized downstream. mReserved < 0 means
563 // reserve() was not called and the safe cursor was used: nothing to check.
564 if (mReserved >= 0 && mCount + 1 > mReserved) {
565 LOG(fatal) << "Table '" << outputSpec.binding.value << "': filled " << (mCount + 1)
566 << " rows after reserve(" << mReserved
567 << "). UnsafeAppend overran the reserved buffer — reserve() must request "
568 "at least as many rows as are filled.";
569 }
570 mBuilder.release();
571 }
572
573 decltype(FFL(std::declval<cursor_t>())) cursor;
574
575 private:
576 static decltype(auto) extract(soa::is_enumerated_iterator auto const& arg)
577 {
578 return arg.globalIndex();
579 }
580
581 template <typename A>
583 static decltype(auto) extract(A&& arg)
584 {
585 return arg;
586 }
587
591 LifetimeHolder<TableBuilder> mBuilder = nullptr;
592 int64_t mCount = -1;
596 int64_t mReserved = -1;
597};
598
600template <soa::is_table T>
601consteval auto typeWithRef() -> T
602{
603}
604
605template <soa::is_iterator T>
606consteval auto typeWithRef() -> typename T::parent_t
607{
608}
609
610template <typename T>
611 requires soa::is_table<T> || soa::is_iterator<T>
613 using table_t = decltype(typeWithRef<T>());
614 using metadata = aod::MetadataTrait<o2::aod::Hash<table_t::ref.desc_hash>>::metadata;
615
616 static constexpr auto spec()
617 {
618 return soa::tableRef2OutputSpec<table_t::ref>();
619 }
620
621 static constexpr auto ref()
622 {
623 return soa::tableRef2OutputRef<table_t::ref>();
624 }
625};
626
630
635template <is_producable T>
637};
638
648 static constexpr void isProducesGroup() {};
649};
650
652template <soa::is_metadata M, soa::TableRef Ref>
654 using metadata = M;
655 constexpr static auto sources = M::template generateSources<o2::aod::Hash<Ref.origin_hash>>();
656
657 OutputSpec outputSpec{soa::tableRef2OutputSpec<Ref>()};
659 {
660 return soa::tableRef2OutputSpec<Ref>(newOrigin);
661 }
662
664 static constexpr auto getRequiredInputs(header::DataOrigin const& newOrigin = header::DataOrigin{"AOD"})
665 {
666 return [&newOrigin]<size_t... Is>(std::index_sequence<Is...>) {
667 return std::array{soa::tableRef2InputSpec<sources[Is]>(newOrigin)...};
668 }(std::make_index_sequence<sources.size()>());
669 }
670};
671
674template <is_spawnable T>
675consteval auto transformBase()
676{
677 using metadata = typename aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>::metadata;
678 return TableTransform<metadata, metadata::template extension_table_t_from<o2::aod::Hash<T::originals[T::originals.size() - 1].origin_hash>>::ref>{};
679}
680
685template <is_spawnable T>
686struct Spawns : decltype(transformBase<T>()) {
687 using spawnable_t = T;
688 using metadata = decltype(transformBase<T>())::metadata;
689 using extension_t = typename metadata::template extension_table_t_from<o2::aod::Hash<T::originals[T::originals.size() - 1].origin_hash>>;
690 using expression_pack_t = typename metadata::expression_pack_t;
691 static constexpr size_t N = framework::pack_size(expression_pack_t{});
692
693 typename T::table_t* operator->()
694 {
695 return table.get();
696 }
697 typename T::table_t const& operator*() const
698 {
699 return *table;
700 }
701
703 {
704 return extension->asArrowTable();
705 }
706
707 std::shared_ptr<typename T::table_t> table = nullptr;
708 std::shared_ptr<extension_t> extension = nullptr;
709 std::array<o2::framework::expressions::Projector, N> projectors = []<typename... C>(framework::pack<C...>)->std::array<expressions::Projector, sizeof...(C)>
710 {
711 return {{std::move(C::Projector())...}};
712 }
714 std::shared_ptr<gandiva::Projector> projector = nullptr;
715 std::shared_ptr<arrow::Schema> schema = []() {
716 auto s = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(expression_pack_t{}));
717 s->WithMetadata(std::make_shared<arrow::KeyValueMetadata>(std::vector{std::string{"label"}}, std::vector{std::string{o2::aod::label<T::ref>()}}));
718 return s;
719 }();
720};
721
726template <is_dynamically_spawnable T, bool DELAYED = false>
727struct Defines : decltype(transformBase<T>()) {
728 static constexpr bool delayed = DELAYED;
729 using spawnable_t = T;
730 using metadata = decltype(transformBase<T>())::metadata;
731 using extension_t = typename metadata::template extension_table_t_from<o2::aod::Hash<T::originals[T::originals.size() - 1].origin_hash>>;
732 using placeholders_pack_t = typename metadata::placeholders_pack_t;
733 static constexpr size_t N = framework::pack_size(placeholders_pack_t{});
734
735 typename T::table_t* operator->()
736 {
737 return table.get();
738 }
739 typename T::table_t const& operator*() const
740 {
741 return *table;
742 }
743
745 {
746 return extension->asArrowTable();
747 }
748 std::shared_ptr<typename T::table_t> table = nullptr;
749 std::shared_ptr<extension_t> extension = nullptr;
750
751 std::array<o2::framework::expressions::Projector, N> projectors;
752 std::shared_ptr<gandiva::Projector> projector = nullptr;
753 std::shared_ptr<arrow::Schema> schema = []() {
754 auto s = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(placeholders_pack_t{}));
755 s->WithMetadata(std::make_shared<arrow::KeyValueMetadata>(std::vector{std::string{"label"}}, std::vector{std::string{o2::aod::label<T::ref>()}}));
756 return s;
757 }();
758 std::shared_ptr<arrow::Schema> inputSchema = nullptr;
759
760 bool needRecompilation = false;
761
766};
767
768template <is_dynamically_spawnable T>
770
774struct Exclusive {
775};
776struct Sparse {
777};
778
780template <soa::is_index_table T>
781consteval auto transformBase()
782{
783 using metadata = typename aod::MetadataTrait<o2::aod::Hash<T::ref.desc_hash>>::metadata;
785}
786
787template <soa::is_index_table T>
788struct Builds : decltype(transformBase<T>()) {
789 using buildable_t = T;
790 using metadata = decltype(transformBase<T>())::metadata;
791 using Key = metadata::Key;
792 using H = typename T::first_t;
793 using Ts = typename T::rest_t;
794 using index_pack_t = metadata::index_pack_t;
795
796 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>()}})); }();
797
798 std::vector<soa::IndexRecord> map = soa::getIndexMapping<metadata>();
799
800 std::vector<framework::IndexColumnBuilder> builders;
801
803 {
804 return table.get();
805 }
806 T const& operator*() const
807 {
808 return *table;
809 }
810
812 {
813 return table->asArrowTable();
814 }
815 std::shared_ptr<T> table = nullptr;
816
817 static consteval auto pack()
818 {
819 return index_pack_t{};
820 }
821
822 auto build(std::vector<std::shared_ptr<arrow::Table>>&& tables)
823 {
824 this->table = std::make_shared<T>(soa::IndexBuilder::materialize(builders, std::forward<std::vector<std::shared_ptr<arrow::Table>>>(tables), map, outputSchema, metadata::exclusive));
825 return (this->table != nullptr);
826 }
827};
828
831
839template <typename T>
840 requires(std::derived_from<T, TObject>)
841struct OutputObj {
842 using obj_t = T;
843
845 : object(std::make_shared<T>(t)),
846 label(t.GetName()),
847 policy{policy_},
848 sourceType{sourceType_},
849 mTaskHash{0}
850 {
851 }
852
854 : object(nullptr),
855 label(label_),
856 policy{policy_},
857 sourceType{sourceType_},
858 mTaskHash{0}
859 {
860 }
861
862 void setObject(T const& t)
863 {
864 object = std::make_shared<T>(t);
865 object->SetName(label.c_str());
866 }
867
868 void setObject(T&& t)
869 {
870 object = std::make_shared<T>(t);
871 object->SetName(label.c_str());
872 }
873
874 void setObject(T* t)
875 {
876 object.reset(t);
877 object->SetName(label.c_str());
878 }
879
880 void setObject(std::shared_ptr<T> t)
881 {
882 object = t;
883 object->SetName(label.c_str());
884 }
885
886 void setHash(uint32_t hash)
887 {
888 mTaskHash = hash;
889 }
890
893 {
895 auto lhash = runtime_hash(label.c_str());
896 std::memset(desc.str, '_', 16);
897 std::stringstream s;
898 s << std::hex << lhash;
899 s << std::hex << mTaskHash;
900 s << std::hex << reinterpret_cast<uint64_t>(this);
901 std::memcpy(desc.str, s.str().c_str(), 12);
902 return OutputSpec{OutputLabel{label}, "ATSK", desc, 0, Lifetime::QA};
903 }
904
906 {
907 return object.get();
908 }
909
911 {
912 return *object.get();
913 }
914
915 OutputRef ref(uint16_t index, uint16_t max)
916 {
917 return OutputRef{std::string{label}, 0,
918 o2::header::Stack{OutputObjHeader{policy, sourceType, mTaskHash, index, max}}};
919 }
920
921 std::shared_ptr<T> object;
922 std::string label;
925 uint32_t mTaskHash;
926};
927
931template <typename T>
932struct Service {
933 using service_t = T;
935
936 decltype(auto) operator->() const
937 {
939 return service->get();
940 } else {
941 return service;
942 }
943 }
944};
945
947{
948 return std::make_unique<o2::soa::Filtered<std::decay_t<decltype(table)>>>(std::vector{table}, std::forward<soa::SelectionVector>(selection));
949}
950
952{
953 return std::make_unique<o2::soa::Filtered<std::decay_t<decltype(table)>>>(std::vector{table.asArrowTable()}, std::forward<soa::SelectionVector>(selection));
954}
955
956void initializePartitionCaches(std::set<uint32_t> const& hashes, std::shared_ptr<arrow::Schema> const& schema, expressions::Filter const& filter, gandiva::NodePtr& tree, gandiva::FilterPtr& gfilter);
957
965template <soa::is_table T>
966struct Partition {
967 using content_t = T;
968 Partition(expressions::Node&& filter_) : filter{std::forward<expressions::Node>(filter_)}
969 {
970 }
971
972 Partition(expressions::Node&& filter_, T const& table)
973 : filter{std::forward<expressions::Node>(filter_)}
974 {
975 setTable(table);
976 }
977
978 void intializeCaches(std::set<uint32_t> const& hashes, std::shared_ptr<arrow::Schema> const& schema)
979 {
981 }
982
983 void bindTable(T const& table)
984 {
985 intializeCaches(T::table_t::hashes(), table.asArrowTable()->schema());
986 if (dataframeChanged) {
988 dataframeChanged = false;
989 }
990 }
991
992 template <typename... Ts>
993 void bindExternalIndices(Ts*... tables)
994 {
995 if (mFiltered != nullptr) {
996 mFiltered->bindExternalIndices(tables...);
997 }
998 }
999
1000 template <typename E>
1002 {
1003 if (mFiltered != nullptr) {
1004 mFiltered->bindInternalIndicesTo(ptr);
1005 }
1006 }
1007
1009 {
1011 }
1012
1013 [[nodiscard]] std::shared_ptr<arrow::Table> asArrowTable() const
1014 {
1015 return mFiltered->asArrowTable();
1016 }
1017
1019 {
1020 return mFiltered.get();
1021 }
1022
1023 template <typename T1>
1024 [[nodiscard]] auto rawSliceBy(o2::framework::Preslice<T1> const& container, int value) const
1025 {
1026 return mFiltered->rawSliceBy(container, value);
1027 }
1028
1030 {
1031 return mFiltered->sliceByCached(node, value, cache);
1032 }
1033
1035 {
1036 return mFiltered->sliceByCachedUnsorted(node, value, cache);
1037 }
1038
1039 template <typename T1, typename Policy, bool OPT>
1040 [[nodiscard]] auto sliceBy(o2::framework::PresliceBase<T1, Policy, OPT> const& container, int value) const
1041 {
1042 return mFiltered->sliceBy(container, value);
1043 }
1044
1046 std::unique_ptr<o2::soa::Filtered<T>> mFiltered = nullptr;
1047 gandiva::NodePtr tree = nullptr;
1049 bool dataframeChanged = true;
1050
1056 {
1057 return mFiltered->begin();
1058 }
1060 {
1061 return mFiltered->end();
1062 }
1064 {
1065 return mFiltered->begin();
1066 }
1068 {
1069 return mFiltered->end();
1070 }
1071
1072 int64_t size() const
1073 {
1074 return mFiltered->size();
1075 }
1076};
1077} // namespace o2::framework
1078
1079namespace o2::soa
1080{
1082template <soa::is_table T, soa::is_spawnable_column... Cs>
1083auto Extend(T const& table)
1084{
1085 using output_t = Join<T, soa::Table<o2::aod::Hash<"JOIN"_h>, o2::aod::Hash<"JOIN/0"_h>, o2::aod::Hash<"JOIN"_h>, Cs...>>;
1086 static std::array<framework::expressions::Projector, sizeof...(Cs)> projectors{{std::move(Cs::Projector())...}};
1087 static std::shared_ptr<gandiva::Projector> projector = nullptr;
1088 static auto schema = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(framework::pack<Cs...>{}));
1089 return output_t{{o2::framework::spawner(framework::pack<Cs...>{}, {table.asArrowTable()}, "dynamicExtension", projectors.data(), projector, schema), table.asArrowTable()}, 0};
1090}
1091
1094template <soa::is_table T, soa::is_dynamic_column... Cs>
1095auto Attach(T const& table)
1096{
1097 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...>>;
1098 return output_t{{table.asArrowTable()}, table.offset()};
1099}
1100} // namespace o2::soa
1101
1102#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:3751
T::template iterator_template_o< FilteredIndexPolicy, self_t > iterator
Definition ASoA.h:3749
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:47
constexpr framework::ConcreteDataMatcher matcher()
Definition ASoA.h:373
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.
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.
void initializePartitionCaches(std::set< uint32_t > const &hashes, std::shared_ptr< arrow::Schema > const &schema, expressions::Filter const &filter, gandiva::NodePtr &tree, gandiva::FilterPtr &gfilter)
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:62
SelectionVector selectionToVector(gandiva::Selection const &sel)
Definition ASoA.cxx:48
std::vector< int64_t > SelectionVector
Definition ASoA.h:429
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
void intializeCaches(std::set< uint32_t > const &hashes, std::shared_ptr< arrow::Schema > const &schema)
Partition(expressions::Node &&filter_)
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 std::shared_ptr< arrow::Table > joinTables(std::vector< std::shared_ptr< arrow::Table > > &&tables)
Definition ASoA.cxx:72
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()))