Skip to content

Commit 2a44a1e

Browse files
committed
DPL Analysis: protect aod-spawner from empty tables
1 parent 159cf6a commit 2a44a1e

File tree

2 files changed

+33
-33
lines changed

2 files changed

+33
-33
lines changed

Framework/Core/include/Framework/ASoA.h

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
#include <concepts>
3535
#include <cstring>
3636
#include <gsl/span> // IWYU pragma: export
37-
#include <limits>
3837

3938
namespace o2::framework
4039
{
@@ -53,6 +52,12 @@ void dereferenceWithWrongType(const char* getter, const char* target);
5352
void missingFilterDeclaration(int hash, int ai);
5453
void notBoundTable(const char* tableName);
5554
void* extractCCDBPayload(char* payload, size_t size, TClass const* cl, const char* what);
55+
56+
template <typename... C>
57+
auto createFieldsFromColumns(framework::pack<C...>)
58+
{
59+
return std::vector<std::shared_ptr<arrow::Field>>{C::asArrowField()...};
60+
}
5661
} // namespace o2::soa
5762

5863
namespace o2::soa
@@ -248,6 +253,11 @@ struct TableMetadata {
248253
return -1;
249254
}
250255
}
256+
257+
static std::shared_ptr<arrow::Schema> getSchema()
258+
{
259+
return std::make_shared<arrow::Schema>([]<typename... C>(framework::pack<C...>&& p){ return o2::soa::createFieldsFromColumns(p); }(columns{}));
260+
}
251261
};
252262

253263
template <typename D>
@@ -406,12 +416,6 @@ struct Binding {
406416
}
407417
};
408418

409-
template <typename... C>
410-
auto createFieldsFromColumns(framework::pack<C...>)
411-
{
412-
return std::vector<std::shared_ptr<arrow::Field>>{C::asArrowField()...};
413-
}
414-
415419
using SelectionVector = std::vector<int64_t>;
416420

417421
template <typename T>

Framework/Core/src/AODReaderHelpers.cxx

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -143,13 +143,14 @@ struct Maker {
143143
std::vector<std::string> labels;
144144
std::vector<std::shared_ptr<gandiva::Expression>> expressions;
145145
std::shared_ptr<gandiva::Projector> projector = nullptr;
146-
std::shared_ptr<arrow::Schema> schema;
146+
std::shared_ptr<arrow::Schema> schema = nullptr;
147+
std::shared_ptr<arrow::Schema> inputSchema = nullptr;
147148

148149
header::DataOrigin origin;
149150
header::DataDescription description;
150151
header::DataHeader::SubSpecificationType version;
151152

152-
std::shared_ptr<arrow::Table> make(ProcessingContext& pc)
153+
std::shared_ptr<arrow::Table> make(ProcessingContext& pc) const
153154
{
154155
std::vector<std::shared_ptr<arrow::Table>> originals;
155156
for (auto const& label : labels) {
@@ -159,15 +160,6 @@ struct Maker {
159160
if (fullTable->num_rows() == 0) {
160161
return arrow::Table::MakeEmpty(schema).ValueOrDie();
161162
}
162-
if (projector == nullptr) {
163-
auto s = gandiva::Projector::Make(
164-
fullTable->schema(),
165-
expressions,
166-
&projector);
167-
if (!s.ok()) {
168-
throw o2::framework::runtime_error_f("Failed to create projector: %s", s.ToString().c_str());
169-
}
170-
}
171163

172164
return spawnerHelper(fullTable, schema, binding.c_str(), schema->num_fields(), projector);
173165
}
@@ -201,23 +193,18 @@ struct Spawnable {
201193
iws.str(loc->defaultValue.get<std::string>());
202194
outputSchema = ArrowJSONHelpers::read(iws);
203195

196+
std::vector<std::shared_ptr<arrow::Schema>> schemas;
204197
for (auto& i : spec.metadata) {
205198
if (i.name.starts_with("input:")) {
206199
labels.emplace_back(i.name.substr(6));
200+
iws.clear();
201+
iws.str(i.defaultValue.get<std::string>());
202+
schemas.emplace_back(ArrowJSONHelpers::read(iws));
207203
}
208204
}
209-
210205
std::vector<std::shared_ptr<arrow::Field>> fields;
211-
for (auto& p : projectors) {
212-
expressions::walk(p.node.get(),
213-
[&fields](expressions::Node* n) mutable {
214-
if (n->self.index() == 1) {
215-
auto& b = std::get<expressions::BindingNode>(n->self);
216-
if (std::find_if(fields.begin(), fields.end(), [&b](std::shared_ptr<arrow::Field> const& field) { return field->name() == b.name; }) == fields.end()) {
217-
fields.emplace_back(std::make_shared<arrow::Field>(b.name, expressions::concreteArrowType(b.type)));
218-
}
219-
}
220-
});
206+
for (auto& s : schemas) {
207+
std::copy(s->fields().begin(), s->fields().end(), std::back_inserter(fields));
221208
}
222209
inputSchema = std::make_shared<arrow::Schema>(fields);
223210

@@ -233,20 +220,29 @@ struct Spawnable {
233220
}
234221
}
235222

236-
std::shared_ptr<gandiva::Projector> makeProjector()
223+
std::shared_ptr<gandiva::Projector> makeProjector() const
237224
{
238-
return expressions::createProjectorHelper(projectors.size(), projectors.data(), inputSchema, outputSchema->fields());
225+
std::shared_ptr<gandiva::Projector> p = nullptr;
226+
auto s = gandiva::Projector::Make(
227+
inputSchema,
228+
expressions,
229+
&p);
230+
if (!s.ok()) {
231+
throw o2::framework::runtime_error_f("Failed to create projector: %s", s.ToString().c_str());
232+
}
233+
return p;
239234
}
240235

241-
Maker createMaker()
236+
Maker createMaker() const
242237
{
243238
o2::framework::addLabelToSchema(outputSchema, binding.c_str());
244239
return {
245240
binding,
246241
labels,
247242
expressions,
248-
nullptr,
243+
makeProjector(),
249244
outputSchema,
245+
inputSchema,
250246
origin,
251247
description,
252248
version};

0 commit comments

Comments
 (0)