@@ -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,19 +220,28 @@ 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 return {
244239 binding,
245240 labels,
246241 expressions,
247- nullptr ,
242+ makeProjector () ,
248243 outputSchema,
244+ inputSchema,
249245 origin,
250246 description,
251247 version};
0 commit comments