| 1292 | } |
| 1293 | |
| 1294 | Result<std::vector<std::unique_ptr<substrait::Expression>>> DatumToLiterals( |
| 1295 | const Datum& datum, ExtensionSet* ext_set, |
| 1296 | const ConversionOptions& conversion_options) { |
| 1297 | std::vector<std::unique_ptr<substrait::Expression>> literals; |
| 1298 | |
| 1299 | auto ScalarToLiteralExpr = [&](const std::shared_ptr<Scalar>& scalar) |
| 1300 | -> Result<std::unique_ptr<substrait::Expression>> { |
| 1301 | ARROW_ASSIGN_OR_RAISE(std::unique_ptr<substrait::Expression::Literal> literal, |
| 1302 | ToProto(scalar, ext_set, conversion_options)); |
| 1303 | auto literal_expr = std::make_unique<substrait::Expression>(); |
| 1304 | literal_expr->set_allocated_literal(literal.release()); |
| 1305 | return literal_expr; |
| 1306 | }; |
| 1307 | |
| 1308 | switch (datum.kind()) { |
| 1309 | case Datum::Kind::SCALAR: { |
| 1310 | ARROW_ASSIGN_OR_RAISE(auto literal_expr, ScalarToLiteralExpr(datum.scalar())); |
| 1311 | literals.push_back(std::move(literal_expr)); |
| 1312 | break; |
| 1313 | } |
| 1314 | case Datum::Kind::ARRAY: { |
| 1315 | std::shared_ptr<Array> values = datum.make_array(); |
| 1316 | for (int64_t i = 0; i < values->length(); i++) { |
| 1317 | ARROW_ASSIGN_OR_RAISE(std::shared_ptr<Scalar> scalar, values->GetScalar(i)); |
| 1318 | ARROW_ASSIGN_OR_RAISE(auto literal_expr, ScalarToLiteralExpr(scalar)); |
| 1319 | literals.push_back(std::move(literal_expr)); |
| 1320 | } |
| 1321 | break; |
| 1322 | } |
| 1323 | case Datum::Kind::CHUNKED_ARRAY: { |
| 1324 | std::shared_ptr<ChunkedArray> values = datum.chunked_array(); |
| 1325 | for (const auto& chunk : values->chunks()) { |
| 1326 | for (int64_t i = 0; i < chunk->length(); i++) { |
| 1327 | ARROW_ASSIGN_OR_RAISE(std::shared_ptr<Scalar> scalar, chunk->GetScalar(i)); |
| 1328 | ARROW_ASSIGN_OR_RAISE(auto literal_expr, ScalarToLiteralExpr(scalar)); |
| 1329 | literals.push_back(std::move(literal_expr)); |
| 1330 | } |
| 1331 | } |
| 1332 | break; |
| 1333 | } |
| 1334 | case Datum::Kind::RECORD_BATCH: |
| 1335 | case Datum::Kind::TABLE: |
| 1336 | case Datum::Kind::NONE: |
| 1337 | return Status::Invalid("Expected a literal or an array of literals, got ", |
| 1338 | datum.ToString()); |
| 1339 | } |
| 1340 | return literals; |
| 1341 | } |
| 1342 | |
| 1343 | } // namespace |
| 1344 |
no test coverage detected