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 if (mReserved >= 0 && mCount >= mReserved) [[unlikely]] {
518 // reserve() switched this cursor to UnsafeAppend, which does not grow its
519 // buffers. Writing row mCount (>= the reserved count) would overrun them and
520 // silently corrupt the heap, so fail here, naming the offending table and
521 // row, rather than crashing later somewhere unrelated.
522 LOG(fatal) << "Table '" << outputSpec.binding.value << "': writing row " << mCount
523 << " exceeds reserve(" << mReserved << ").";
524 }
525 cursor(0, extract(args)...);
526 }
527
529 int64_t lastIndex()
530 {
531 return mCount;
532 }
533
535 {
536 mBuilder = std::move(builder);
537 cursor = std::move(FFL(mBuilder->cursor<persistent_table_t>()));
538 mCount = -1;
539 // Back to the safe, bounds-checked cursor: no reservation to validate until
540 // reserve() is called again for this timeframe.
541 mReserved = -1;
542 return true;
543 }
544
545 void setLabel(const char* label)
546 {
547 mBuilder->setLabel(label);
548 }
549
554 void reserve(int64_t size)
555 {
556 mBuilder->reserve(typename persistent_table_t::column_types{}, size);
557 mReserved = size;
558 cursor = std::move(FFL(mBuilder->template unsafeCursor<persistent_table_t>()));
559 }
560
561 void release()
562 {
563 // Called once per timeframe, when the table is finalized. If reserve() was
564 // used (switching to UnsafeAppend, which skips per-row bounds checks), make
565 // sure we did not write past what we reserved: mCount + 1 is the number of
566 // rows actually filled, mReserved the capacity we requested. Overrunning it
567 // is silent memory corruption of the arrow buffers, so we fail hard here,
568 // before the (corrupt) table is serialized downstream. mReserved < 0 means
569 // reserve() was not called and the safe cursor was used: nothing to check.
570 if (mReserved >= 0 && mCount + 1 > mReserved) {
571 LOG(fatal) << "Table '" << outputSpec.binding.value << "': filled " << (mCount + 1)
572 << " rows after reserve(" << mReserved
573 << "). UnsafeAppend overran the reserved buffer — reserve() must request "
574 "at least as many rows as are filled.";
575 }
576 mBuilder.release();
577 }
578
579 decltype(FFL(std::declval<cursor_t>())) cursor;
580
581 private:
582 static decltype(auto) extract(is_enumerated_iterator auto const& arg)
583 {
584 return arg.globalIndex();
585 }
586
587 template <typename A>
589 static decltype(auto) extract(A&& arg)
590 {
591 return arg;
592 }
593
597 LifetimeHolder<TableBuilder> mBuilder = nullptr;
598 int64_t mCount = -1;
602 int64_t mReserved = -1;
603};
604
606template <soa::is_table T>
607consteval auto typeWithRef() -> T
608{
609}
610
611template <soa::is_iterator T>
612consteval auto typeWithRef() -> typename T::parent_t
613{
614}
615
616template <typename T>
617 requires soa::is_table<T> || soa::is_iterator<T>
619 using table_t = decltype(typeWithRef<T>());
620 using metadata = aod::MetadataTrait<o2::aod::Hash<table_t::ref.desc_hash>>::metadata;
621
622 static constexpr auto spec()
623 {
624 return soa::tableRef2OutputSpec<table_t::ref>();
625 }
626
627 static constexpr auto ref()
628 {
629 return soa::tableRef2OutputRef<table_t::ref>();
630 }
631};
632
636
641template <is_producable T>
643};
644
645template <typename T>
646concept is_produces = requires(T t) { typename T::cursor_t; typename T::persistent_table_t; &T::cursor; };
647
657};
658
659template <typename T>
660concept is_produces_group = std::derived_from<T, ProducesGroup>;
661
663template <soa::is_metadata M, soa::TableRef Ref>
665 using metadata = M;
666 constexpr static auto sources = M::template generateSources<o2::aod::Hash<Ref.origin_hash>>();
667
668 OutputSpec outputSpec{soa::tableRef2OutputSpec<Ref>()};
670 {
671 return soa::tableRef2OutputSpec<Ref>(newOrigin);
672 }
673
675 static constexpr auto getRequiredInputs(header::DataOrigin const& newOrigin = header::DataOrigin{"AOD"})
676 {
677 return [&newOrigin]<size_t... Is>(std::index_sequence<Is...>) {
678 return std::array{soa::tableRef2InputSpec<sources[Is]>(newOrigin)...};
679 }(std::make_index_sequence<sources.size()>());
680 }
681};
682
685template <typename T>
686concept 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>;
687
688template <typename T>
689concept 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>;
690
691template <is_spawnable T>
692consteval auto transformBase()
693{
694 using metadata = typename aod::MetadataTrait<o2::aod::Hash<T::originals[T::originals.size() - 1].desc_hash>>::metadata;
695 return TableTransform<metadata, metadata::template extension_table_t_from<o2::aod::Hash<T::originals[T::originals.size() - 1].origin_hash>>::ref>{};
696}
697
702template <is_spawnable T>
703struct Spawns : decltype(transformBase<T>()) {
704 using spawnable_t = T;
705 using metadata = decltype(transformBase<T>())::metadata;
706 using extension_t = typename metadata::template extension_table_t_from<o2::aod::Hash<T::originals[T::originals.size() - 1].origin_hash>>;
707 using expression_pack_t = typename metadata::expression_pack_t;
708 static constexpr size_t N = framework::pack_size(expression_pack_t{});
709
710 typename T::table_t* operator->()
711 {
712 return table.get();
713 }
714 typename T::table_t const& operator*() const
715 {
716 return *table;
717 }
718
720 {
721 return extension->asArrowTable();
722 }
723
724 std::shared_ptr<typename T::table_t> table = nullptr;
725 std::shared_ptr<extension_t> extension = nullptr;
726 std::array<o2::framework::expressions::Projector, N> projectors = []<typename... C>(framework::pack<C...>)->std::array<expressions::Projector, sizeof...(C)>
727 {
728 return {{std::move(C::Projector())...}};
729 }
731 std::shared_ptr<gandiva::Projector> projector = nullptr;
732 std::shared_ptr<arrow::Schema> schema = []() {
733 auto s = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(expression_pack_t{}));
734 s->WithMetadata(std::make_shared<arrow::KeyValueMetadata>(std::vector{std::string{"label"}}, std::vector{std::string{o2::aod::label<T::ref>()}}));
735 return s;
736 }();
737};
738
739template <typename T>
740concept is_spawns = requires(T t) {
741 typename T::metadata;
742 typename T::expression_pack_t;
743 requires std::same_as<decltype(t.projector), std::shared_ptr<gandiva::Projector>>;
744};
745
750template <is_dynamically_spawnable T, bool DELAYED = false>
751struct Defines : decltype(transformBase<T>()) {
752 static constexpr bool delayed = DELAYED;
753 using spawnable_t = T;
754 using metadata = decltype(transformBase<T>())::metadata;
755 using extension_t = typename metadata::template extension_table_t_from<o2::aod::Hash<T::originals[T::originals.size() - 1].origin_hash>>;
756 using placeholders_pack_t = typename metadata::placeholders_pack_t;
757 static constexpr size_t N = framework::pack_size(placeholders_pack_t{});
758
759 typename T::table_t* operator->()
760 {
761 return table.get();
762 }
763 typename T::table_t const& operator*() const
764 {
765 return *table;
766 }
767
769 {
770 return extension->asArrowTable();
771 }
772 std::shared_ptr<typename T::table_t> table = nullptr;
773 std::shared_ptr<extension_t> extension = nullptr;
774
775 std::array<o2::framework::expressions::Projector, N> projectors;
776 std::shared_ptr<gandiva::Projector> projector = nullptr;
777 std::shared_ptr<arrow::Schema> schema = []() {
778 auto s = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(placeholders_pack_t{}));
779 s->WithMetadata(std::make_shared<arrow::KeyValueMetadata>(std::vector{std::string{"label"}}, std::vector{std::string{o2::aod::label<T::ref>()}}));
780 return s;
781 }();
782 std::shared_ptr<arrow::Schema> inputSchema = nullptr;
783
784 bool needRecompilation = false;
785
790};
791
792template <is_dynamically_spawnable T>
794
795template <typename T>
796concept is_defines = requires(T t) {
797 typename T::metadata;
798 typename T::placeholders_pack_t;
799 requires std::same_as<decltype(t.projector), std::shared_ptr<gandiva::Projector>>;
800 requires std::same_as<decltype(t.needRecompilation), bool>;
801 &T::recompile;
802};
803
807struct Exclusive {
808};
809struct Sparse {
810};
811
813template <soa::is_index_table T>
814consteval auto transformBase()
815{
816 using metadata = typename aod::MetadataTrait<o2::aod::Hash<T::ref.desc_hash>>::metadata;
818}
819
820template <soa::is_index_table T>
821struct Builds : decltype(transformBase<T>()) {
822 using buildable_t = T;
823 using metadata = decltype(transformBase<T>())::metadata;
824 using Key = metadata::Key;
825 using H = typename T::first_t;
826 using Ts = typename T::rest_t;
827 using index_pack_t = metadata::index_pack_t;
828
829 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>()}})); }();
830
831 std::vector<soa::IndexRecord> map = soa::getIndexMapping<metadata>();
832
833 std::vector<framework::IndexColumnBuilder> builders;
834
836 {
837 return table.get();
838 }
839 T const& operator*() const
840 {
841 return *table;
842 }
843
845 {
846 return table->asArrowTable();
847 }
848 std::shared_ptr<T> table = nullptr;
849
850 static consteval auto pack()
851 {
852 return index_pack_t{};
853 }
854
855 auto build(std::vector<std::shared_ptr<arrow::Table>>&& tables)
856 {
857 this->table = std::make_shared<T>(soa::IndexBuilder::materialize(builders, std::forward<std::vector<std::shared_ptr<arrow::Table>>>(tables), map, outputSchema, metadata::exclusive));
858 return (this->table != nullptr);
859 }
860};
861
862template <typename T>
863concept is_builds = requires(T t) {
864 typename T::metadata;
865 typename T::Key;
866 requires std::same_as<decltype(t.map), std::vector<soa::IndexRecord>>;
867};
868
871
879template <typename T>
880struct OutputObj {
881 using obj_t = T;
882
884 : object(std::make_shared<T>(t)),
885 label(t.GetName()),
886 policy{policy_},
887 sourceType{sourceType_},
888 mTaskHash{0}
889 {
890 }
891
893 : object(nullptr),
894 label(label_),
895 policy{policy_},
896 sourceType{sourceType_},
897 mTaskHash{0}
898 {
899 }
900
901 void setObject(T const& t)
902 {
903 object = std::make_shared<T>(t);
904 object->SetName(label.c_str());
905 }
906
907 void setObject(T&& t)
908 {
909 object = std::make_shared<T>(t);
910 object->SetName(label.c_str());
911 }
912
913 void setObject(T* t)
914 {
915 object.reset(t);
916 object->SetName(label.c_str());
917 }
918
919 void setObject(std::shared_ptr<T> t)
920 {
921 object = t;
922 object->SetName(label.c_str());
923 }
924
925 void setHash(uint32_t hash)
926 {
927 mTaskHash = hash;
928 }
929
932 {
934 auto lhash = runtime_hash(label.c_str());
935 std::memset(desc.str, '_', 16);
936 std::stringstream s;
937 s << std::hex << lhash;
938 s << std::hex << mTaskHash;
939 s << std::hex << reinterpret_cast<uint64_t>(this);
940 std::memcpy(desc.str, s.str().c_str(), 12);
941 return OutputSpec{OutputLabel{label}, "ATSK", desc, 0, Lifetime::QA};
942 }
943
945 {
946 return object.get();
947 }
948
950 {
951 return *object.get();
952 }
953
954 OutputRef ref(uint16_t index, uint16_t max)
955 {
956 return OutputRef{std::string{label}, 0,
958 }
959
960 std::shared_ptr<T> object;
961 std::string label;
964 uint32_t mTaskHash;
965};
966
967template <typename T>
968concept is_outputobj = requires(T t) {
969 &T::setHash;
970 &T::spec;
971 &T::ref;
972 requires std::same_as<decltype(t.operator->()), typename T::obj_t*>;
973 requires std::same_as<decltype(t.object), std::shared_ptr<typename T::obj_t>>;
974};
975
979template <typename T>
980struct Service {
981 using service_t = T;
983
984 decltype(auto) operator->() const
985 {
987 return service->get();
988 } else {
989 return service;
990 }
991 }
992};
993
994template <typename T>
995concept is_service = requires(T t) {
996 requires std::same_as<decltype(t.service), typename T::service_t*>;
997 &T::operator->;
998};
999
1001{
1002 return std::make_unique<o2::soa::Filtered<std::decay_t<decltype(table)>>>(std::vector{table}, std::forward<soa::SelectionVector>(selection));
1003}
1004
1006{
1007 return std::make_unique<o2::soa::Filtered<std::decay_t<decltype(table)>>>(std::vector{table.asArrowTable()}, std::forward<soa::SelectionVector>(selection));
1008}
1009
1010void initializePartitionCaches(std::set<uint32_t> const& hashes, std::shared_ptr<arrow::Schema> const& schema, expressions::Filter const& filter, gandiva::NodePtr& tree, gandiva::FilterPtr& gfilter);
1011
1019template <typename T>
1021 using content_t = T;
1022 Partition(expressions::Node&& filter_) : filter{std::forward<expressions::Node>(filter_)}
1023 {
1024 }
1025
1026 Partition(expressions::Node&& filter_, T const& table)
1027 : filter{std::forward<expressions::Node>(filter_)}
1028 {
1029 setTable(table);
1030 }
1031
1032 void intializeCaches(std::set<uint32_t> const& hashes, std::shared_ptr<arrow::Schema> const& schema)
1033 {
1035 }
1036
1037 void bindTable(T const& table)
1038 {
1039 intializeCaches(T::table_t::hashes(), table.asArrowTable()->schema());
1040 if (dataframeChanged) {
1042 dataframeChanged = false;
1043 }
1044 }
1045
1046 template <typename... Ts>
1047 void bindExternalIndices(Ts*... tables)
1048 {
1049 if (mFiltered != nullptr) {
1050 mFiltered->bindExternalIndices(tables...);
1051 }
1052 }
1053
1054 template <typename E>
1056 {
1057 if (mFiltered != nullptr) {
1058 mFiltered->bindInternalIndicesTo(ptr);
1059 }
1060 }
1061
1063 {
1065 }
1066
1067 [[nodiscard]] std::shared_ptr<arrow::Table> asArrowTable() const
1068 {
1069 return mFiltered->asArrowTable();
1070 }
1071
1073 {
1074 return mFiltered.get();
1075 }
1076
1077 template <typename T1>
1078 [[nodiscard]] auto rawSliceBy(o2::framework::Preslice<T1> const& container, int value) const
1079 {
1080 return mFiltered->rawSliceBy(container, value);
1081 }
1082
1084 {
1085 return mFiltered->sliceByCached(node, value, cache);
1086 }
1087
1089 {
1090 return mFiltered->sliceByCachedUnsorted(node, value, cache);
1091 }
1092
1093 template <typename T1, typename Policy, bool OPT>
1094 [[nodiscard]] auto sliceBy(o2::framework::PresliceBase<T1, Policy, OPT> const& container, int value) const
1095 {
1096 return mFiltered->sliceBy(container, value);
1097 }
1098
1100 std::unique_ptr<o2::soa::Filtered<T>> mFiltered = nullptr;
1101 gandiva::NodePtr tree = nullptr;
1103 bool dataframeChanged = true;
1104
1110 {
1111 return mFiltered->begin();
1112 }
1114 {
1115 return mFiltered->end();
1116 }
1118 {
1119 return mFiltered->begin();
1120 }
1122 {
1123 return mFiltered->end();
1124 }
1125
1126 int64_t size() const
1127 {
1128 return mFiltered->size();
1129 }
1130};
1131
1132template <typename T>
1133concept is_partition = requires(T t) {
1134 &T::updatePlaceholders;
1135 requires std::same_as<decltype(t.filter), expressions::Filter>;
1136 requires std::same_as<decltype(t.mFiltered), std::unique_ptr<o2::soa::Filtered<typename T::content_t>>>;
1137};
1138} // namespace o2::framework
1139
1140namespace o2::soa
1141{
1143template <soa::is_table T, soa::is_spawnable_column... Cs>
1144auto Extend(T const& table)
1145{
1146 using output_t = Join<T, soa::Table<o2::aod::Hash<"JOIN"_h>, o2::aod::Hash<"JOIN/0"_h>, o2::aod::Hash<"JOIN"_h>, Cs...>>;
1147 static std::array<framework::expressions::Projector, sizeof...(Cs)> projectors{{std::move(Cs::Projector())...}};
1148 static std::shared_ptr<gandiva::Projector> projector = nullptr;
1149 static auto schema = std::make_shared<arrow::Schema>(o2::soa::createFieldsFromColumns(framework::pack<Cs...>{}));
1150 return output_t{{o2::framework::spawner(framework::pack<Cs...>{}, {table.asArrowTable()}, "dynamicExtension", projectors.data(), projector, schema), table.asArrowTable()}, 0};
1151}
1152
1155template <soa::is_table T, soa::is_dynamic_column... Cs>
1156auto Attach(T const& table)
1157{
1158 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...>>;
1159 return output_t{{table.asArrowTable()}, table.offset()};
1160}
1161} // namespace o2::soa
1162
1163#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:3885
T::template iterator_template_o< FilteredIndexPolicy, self_t > iterator
Definition ASoA.h:3883
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()))