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 <typename T>
497
498template <typename T>
499concept is_enumerated_iterator = requires(T t) { t.globalIndex(); };
500
501template <is_producable T>
503 public:
504 using persistent_table_t = decltype([]() { if constexpr (soa::is_iterator<T>) { return typename T::parent_t{nullptr}; } else { return T{nullptr}; } }());
505 using cursor_t = decltype(std::declval<TableBuilder>().cursor<persistent_table_t>());
506 OutputSpec outputSpec{soa::tableRef2OutputSpec<persistent_table_t::ref>()};
508 {
509 return soa::tableRef2OutputSpec<persistent_table_t::ref>(newOrigin);
510 }
511
512 template <typename... Ts>
513 void operator()(Ts&&... args)
514 requires(sizeof...(Ts) == framework::pack_size(typename persistent_table_t::persistent_columns_t{}))
515 {
516 ++mCount;
517 cursor(0, extract(args)...);
518 }
519
521 int64_t lastIndex()
522 {
523 return mCount;
524 }
525
527 {
528 mBuilder = std::move(builder);
529 cursor = std::move(FFL(mBuilder->cursor<persistent_table_t>()));
530 mCount = -1;
531 // Back to the safe, bounds-checked cursor: no reservation to validate until
532 // reserve() is called again for this timeframe.
533 mReserved = -1;
534 return true;
535 }
536
537 void setLabel(const char* label)
538 {
539 mBuilder->setLabel(label);
540 }
541
546 void reserve(int64_t size)
547 {
548 mBuilder->reserve(typename persistent_table_t::column_types{}, size);
549 mReserved = size;
550 cursor = std::move(FFL(mBuilder->template unsafeCursor<persistent_table_t>()));
551 }
552
553 void release()
554 {
555 // Called once per timeframe, when the table is finalized. If reserve() was
556 // used (switching to UnsafeAppend, which skips per-row bounds checks), make
557 // sure we did not write past what we reserved: mCount + 1 is the number of
558 // rows actually filled, mReserved the capacity we requested. Overrunning it
559 // is silent memory corruption of the arrow buffers, so we fail hard here,
560 // before the (corrupt) table is serialized downstream. mReserved < 0 means
561 // reserve() was not called and the safe cursor was used: nothing to check.
562 if (mReserved >= 0 && mCount + 1 > mReserved) {
563 LOG(fatal) << "Table '" << outputSpec.binding.value << "': filled " << (mCount + 1)
564 << " rows after reserve(" << mReserved
565 << "). UnsafeAppend overran the reserved buffer — reserve() must request "
566 "at least as many rows as are filled.";
567 }
568 mBuilder.release();
569 }
570
571 decltype(FFL(std::declval<cursor_t>())) cursor;
572
573 private:
574 static decltype(auto) extract(is_enumerated_iterator auto const& arg)
575 {
576 return arg.globalIndex();
577 }
578
579 template <typename A>
581 static decltype(auto) extract(A&& arg)
582 {
583 return arg;
584 }
585
589 LifetimeHolder<TableBuilder> mBuilder = nullptr;
590 int64_t mCount = -1;
594 int64_t mReserved = -1;
595};
596
598template <soa::is_table T>
599consteval auto typeWithRef() -> T
600{
601}
602
603template <soa::is_iterator T>
604consteval auto typeWithRef() -> typename T::parent_t
605{
606}
607
608template <typename T>
609 requires soa::is_table<T> || soa::is_iterator<T>
611 using table_t = decltype(typeWithRef<T>());
612 using metadata = aod::MetadataTrait<o2::aod::Hash<table_t::ref.desc_hash>>::metadata;
613
614 static constexpr auto spec()
615 {
616 return soa::tableRef2OutputSpec<table_t::ref>();
617 }
618
619 static constexpr auto ref()
620 {
621 return soa::tableRef2OutputRef<table_t::ref>();
622 }
623};
624
628
633template <is_producable T>
635};
636
637template <typename T>
638concept is_produces = requires(T t) { typename T::cursor_t; typename T::persistent_table_t; &T::cursor; };
639
649};
650
651template <typename T>
652concept is_produces_group = std::derived_from<T, ProducesGroup>;
653
655template <soa::is_metadata M, soa::TableRef Ref>
657 using metadata = M;
658 constexpr static auto sources = M::template generateSources<o2::aod::Hash<Ref.origin_hash>>();
659
660 OutputSpec outputSpec{soa::tableRef2OutputSpec<Ref>()};
662 {
663 return soa::tableRef2OutputSpec<Ref>(newOrigin);
664 }
665
667 static constexpr auto getRequiredInputs(header::DataOrigin const& newOrigin = header::DataOrigin{"AOD"})
668 {
669 return [&newOrigin]<size_t... Is>(std::index_sequence<Is...>) {
670 return std::array{soa::tableRef2InputSpec<sources[Is]>(newOrigin)...};
671 }(std::make_index_sequence<sources.size()>());
672 }
673};
674
677template <typename T>
678concept is_spawnable = soa::has_metadata<aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>> && soa::has_extension<typename aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>::metadata>;
679
680template <typename T>
681concept is_dynamically_spawnable = soa::has_metadata<aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>> && soa::has_configurable_extension<typename aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>::metadata>;
682
683template <is_spawnable T>
684consteval auto transformBase()
685{
686 using metadata = typename aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>::metadata;
687 return TableTransform<metadata, metadata::template extension_table_t_from<o2::aod::Hash<T::originals[T::originals.size() - 1].origin_hash>>::ref>{};
688}
689
694template <is_spawnable T>
695struct Spawns : decltype(transformBase<T>()) {
696 using spawnable_t = T;
697 using metadata = decltype(transformBase<T>())::metadata;
698 using extension_t = typename metadata::template extension_table_t_from<o2::aod::Hash<T::originals[T::originals.size() - 1].origin_hash>>;
699 using expression_pack_t = typename metadata::expression_pack_t;
700 static constexpr size_t N = framework::pack_size(expression_pack_t{});
701
702 typename T::table_t* operator->()
703 {
704 return table.get();
705 }
706 typename T::table_t const& operator*() const
707 {
708 return *table;
709 }
710
712 {
713 return extension->asArrowTable();
714 }
715
716 std::shared_ptr<typename T::table_t> table = nullptr;
717 std::shared_ptr<extension_t> extension = nullptr;
718 std::array<o2::framework::expressions::Projector, N> projectors = []<typename... C>(framework::pack<C...>)->std::array<expressions::Projector, sizeof...(C)>
719 {
720 return {{std::move(C::Projector())...}};
721 }
723 std::shared_ptr<gandiva::Projector> projector = nullptr;
724 std::shared_ptr<arrow::Schema> schema = []() {
725 auto s = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(expression_pack_t{}));
726 s->WithMetadata(std::make_shared<arrow::KeyValueMetadata>(std::vector{std::string{"label"}}, std::vector{std::string{o2::aod::label<T::ref>()}}));
727 return s;
728 }();
729};
730
731template <typename T>
732concept is_spawns = requires(T t) {
733 typename T::metadata;
734 typename T::expression_pack_t;
735 requires std::same_as<decltype(t.projector), std::shared_ptr<gandiva::Projector>>;
736};
737
742template <is_dynamically_spawnable T, bool DELAYED = false>
743struct Defines : decltype(transformBase<T>()) {
744 static constexpr bool delayed = DELAYED;
745 using spawnable_t = T;
746 using metadata = decltype(transformBase<T>())::metadata;
747 using extension_t = typename metadata::template extension_table_t_from<o2::aod::Hash<T::originals[T::originals.size() - 1].origin_hash>>;
748 using placeholders_pack_t = typename metadata::placeholders_pack_t;
749 static constexpr size_t N = framework::pack_size(placeholders_pack_t{});
750
751 typename T::table_t* operator->()
752 {
753 return table.get();
754 }
755 typename T::table_t const& operator*() const
756 {
757 return *table;
758 }
759
761 {
762 return extension->asArrowTable();
763 }
764 std::shared_ptr<typename T::table_t> table = nullptr;
765 std::shared_ptr<extension_t> extension = nullptr;
766
767 std::array<o2::framework::expressions::Projector, N> projectors;
768 std::shared_ptr<gandiva::Projector> projector = nullptr;
769 std::shared_ptr<arrow::Schema> schema = []() {
770 auto s = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(placeholders_pack_t{}));
771 s->WithMetadata(std::make_shared<arrow::KeyValueMetadata>(std::vector{std::string{"label"}}, std::vector{std::string{o2::aod::label<T::ref>()}}));
772 return s;
773 }();
774 std::shared_ptr<arrow::Schema> inputSchema = nullptr;
775
776 bool needRecompilation = false;
777
782};
783
784template <is_dynamically_spawnable T>
786
787template <typename T>
788concept is_defines = requires(T t) {
789 typename T::metadata;
790 typename T::placeholders_pack_t;
791 requires std::same_as<decltype(t.projector), std::shared_ptr<gandiva::Projector>>;
792 requires std::same_as<decltype(t.needRecompilation), bool>;
793 &T::recompile;
794};
795
799struct Exclusive {
800};
801struct Sparse {
802};
803
805template <soa::is_index_table T>
806consteval auto transformBase()
807{
808 using metadata = typename aod::MetadataTrait<o2::aod::Hash<T::ref.desc_hash>>::metadata;
810}
811
812template <soa::is_index_table T>
813struct Builds : decltype(transformBase<T>()) {
814 using buildable_t = T;
815 using metadata = decltype(transformBase<T>())::metadata;
816 using Key = metadata::Key;
817 using H = typename T::first_t;
818 using Ts = typename T::rest_t;
819 using index_pack_t = metadata::index_pack_t;
820
821 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>()}})); }();
822
823 std::vector<soa::IndexRecord> map = soa::getIndexMapping<metadata>();
824
825 std::vector<framework::IndexColumnBuilder> builders;
826
828 {
829 return table.get();
830 }
831 T const& operator*() const
832 {
833 return *table;
834 }
835
837 {
838 return table->asArrowTable();
839 }
840 std::shared_ptr<T> table = nullptr;
841
842 static consteval auto pack()
843 {
844 return index_pack_t{};
845 }
846
847 auto build(std::vector<std::shared_ptr<arrow::Table>>&& tables)
848 {
849 this->table = std::make_shared<T>(soa::IndexBuilder::materialize(builders, std::forward<std::vector<std::shared_ptr<arrow::Table>>>(tables), map, outputSchema, metadata::exclusive));
850 return (this->table != nullptr);
851 }
852};
853
854template <typename T>
855concept is_builds = requires(T t) {
856 typename T::metadata;
857 typename T::Key;
858 requires std::same_as<decltype(t.map), std::vector<soa::IndexRecord>>;
859};
860
863
871template <typename T>
872struct OutputObj {
873 using obj_t = T;
874
876 : object(std::make_shared<T>(t)),
877 label(t.GetName()),
878 policy{policy_},
879 sourceType{sourceType_},
880 mTaskHash{0}
881 {
882 }
883
885 : object(nullptr),
886 label(label_),
887 policy{policy_},
888 sourceType{sourceType_},
889 mTaskHash{0}
890 {
891 }
892
893 void setObject(T const& t)
894 {
895 object = std::make_shared<T>(t);
896 object->SetName(label.c_str());
897 }
898
899 void setObject(T&& t)
900 {
901 object = std::make_shared<T>(t);
902 object->SetName(label.c_str());
903 }
904
905 void setObject(T* t)
906 {
907 object.reset(t);
908 object->SetName(label.c_str());
909 }
910
911 void setObject(std::shared_ptr<T> t)
912 {
913 object = t;
914 object->SetName(label.c_str());
915 }
916
917 void setHash(uint32_t hash)
918 {
919 mTaskHash = hash;
920 }
921
924 {
926 auto lhash = runtime_hash(label.c_str());
927 std::memset(desc.str, '_', 16);
928 std::stringstream s;
929 s << std::hex << lhash;
930 s << std::hex << mTaskHash;
931 s << std::hex << reinterpret_cast<uint64_t>(this);
932 std::memcpy(desc.str, s.str().c_str(), 12);
933 return OutputSpec{OutputLabel{label}, "ATSK", desc, 0, Lifetime::QA};
934 }
935
937 {
938 return object.get();
939 }
940
942 {
943 return *object.get();
944 }
945
946 OutputRef ref(uint16_t index, uint16_t max)
947 {
948 return OutputRef{std::string{label}, 0,
950 }
951
952 std::shared_ptr<T> object;
953 std::string label;
956 uint32_t mTaskHash;
957};
958
959template <typename T>
960concept is_outputobj = requires(T t) {
961 &T::setHash;
962 &T::spec;
963 &T::ref;
964 requires std::same_as<decltype(t.operator->()), typename T::obj_t*>;
965 requires std::same_as<decltype(t.object), std::shared_ptr<typename T::obj_t>>;
966};
967
971template <typename T>
972struct Service {
973 using service_t = T;
975
976 decltype(auto) operator->() const
977 {
979 return service->get();
980 } else {
981 return service;
982 }
983 }
984};
985
986template <typename T>
987concept is_service = requires(T t) {
988 requires std::same_as<decltype(t.service), typename T::service_t*>;
989 &T::operator->;
990};
991
993{
994 return std::make_unique<o2::soa::Filtered<std::decay_t<decltype(table)>>>(std::vector{table}, std::forward<soa::SelectionVector>(selection));
995}
996
998{
999 return std::make_unique<o2::soa::Filtered<std::decay_t<decltype(table)>>>(std::vector{table.asArrowTable()}, std::forward<soa::SelectionVector>(selection));
1000}
1001
1002void initializePartitionCaches(std::set<uint32_t> const& hashes, std::shared_ptr<arrow::Schema> const& schema, expressions::Filter const& filter, gandiva::NodePtr& tree, gandiva::FilterPtr& gfilter);
1003
1011template <typename T>
1013 using content_t = T;
1014 Partition(expressions::Node&& filter_) : filter{std::forward<expressions::Node>(filter_)}
1015 {
1016 }
1017
1018 Partition(expressions::Node&& filter_, T const& table)
1019 : filter{std::forward<expressions::Node>(filter_)}
1020 {
1021 setTable(table);
1022 }
1023
1024 void intializeCaches(std::set<uint32_t> const& hashes, std::shared_ptr<arrow::Schema> const& schema)
1025 {
1027 }
1028
1029 void bindTable(T const& table)
1030 {
1031 intializeCaches(T::table_t::hashes(), table.asArrowTable()->schema());
1032 if (dataframeChanged) {
1034 dataframeChanged = false;
1035 }
1036 }
1037
1038 template <typename... Ts>
1039 void bindExternalIndices(Ts*... tables)
1040 {
1041 if (mFiltered != nullptr) {
1042 mFiltered->bindExternalIndices(tables...);
1043 }
1044 }
1045
1046 template <typename E>
1048 {
1049 if (mFiltered != nullptr) {
1050 mFiltered->bindInternalIndicesTo(ptr);
1051 }
1052 }
1053
1055 {
1057 }
1058
1059 [[nodiscard]] std::shared_ptr<arrow::Table> asArrowTable() const
1060 {
1061 return mFiltered->asArrowTable();
1062 }
1063
1065 {
1066 return mFiltered.get();
1067 }
1068
1069 template <typename T1>
1070 [[nodiscard]] auto rawSliceBy(o2::framework::Preslice<T1> const& container, int value) const
1071 {
1072 return mFiltered->rawSliceBy(container, value);
1073 }
1074
1076 {
1077 return mFiltered->sliceByCached(node, value, cache);
1078 }
1079
1081 {
1082 return mFiltered->sliceByCachedUnsorted(node, value, cache);
1083 }
1084
1085 template <typename T1, typename Policy, bool OPT>
1086 [[nodiscard]] auto sliceBy(o2::framework::PresliceBase<T1, Policy, OPT> const& container, int value) const
1087 {
1088 return mFiltered->sliceBy(container, value);
1089 }
1090
1092 std::unique_ptr<o2::soa::Filtered<T>> mFiltered = nullptr;
1093 gandiva::NodePtr tree = nullptr;
1095 bool dataframeChanged = true;
1096
1102 {
1103 return mFiltered->begin();
1104 }
1106 {
1107 return mFiltered->end();
1108 }
1110 {
1111 return mFiltered->begin();
1112 }
1114 {
1115 return mFiltered->end();
1116 }
1117
1118 int64_t size() const
1119 {
1120 return mFiltered->size();
1121 }
1122};
1123
1124template <typename T>
1125concept is_partition = requires(T t) {
1126 &T::updatePlaceholders;
1127 requires std::same_as<decltype(t.filter), expressions::Filter>;
1128 requires std::same_as<decltype(t.mFiltered), std::unique_ptr<o2::soa::Filtered<typename T::content_t>>>;
1129};
1130} // namespace o2::framework
1131
1132namespace o2::soa
1133{
1135template <soa::is_table T, soa::is_spawnable_column... Cs>
1136auto Extend(T const& table)
1137{
1138 using output_t = Join<T, soa::Table<o2::aod::Hash<"JOIN"_h>, o2::aod::Hash<"JOIN/0"_h>, o2::aod::Hash<"JOIN"_h>, Cs...>>;
1139 static std::array<framework::expressions::Projector, sizeof...(Cs)> projectors{{std::move(Cs::Projector())...}};
1140 static std::shared_ptr<gandiva::Projector> projector = nullptr;
1141 static auto schema = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(framework::pack<Cs...>{}));
1142 return output_t{{o2::framework::spawner(framework::pack<Cs...>{}, {table.asArrowTable()}, "dynamicExtension", projectors.data(), projector, schema), table.asArrowTable()}, 0};
1143}
1144
1147template <soa::is_table T, soa::is_dynamic_column... Cs>
1148auto Attach(T const& table)
1149{
1150 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...>>;
1151 return output_t{{table.asArrowTable()}, table.offset()};
1152}
1153} // namespace o2::soa
1154
1155#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:3875
T::template iterator_template_o< FilteredIndexPolicy, self_t > iterator
Definition ASoA.h:3873
Helper to check if a type T is an iterator.
Definition ASoA.h:1313
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:380
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:58
SelectionVector selectionToVector(gandiva::Selection const &sel)
Definition ASoA.cxx:48
std::vector< int64_t > SelectionVector
Definition ASoA.h:443
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()
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()))