| 399 | }; |
| 400 | |
| 401 | JitBoltVectorFunction compileExprToJitVectorFunc(const exec::Expr* expr) { |
| 402 | JitBoltVectorFunction result; |
| 403 | ExprConverter converter; |
| 404 | |
| 405 | try { |
| 406 | auto jitExpr = converter.convertExprToJitExpr(expr); |
| 407 | bool compilable = thrust::jit::compilableExpr(jitExpr.get()); |
| 408 | if (!compilable) { |
| 409 | return result; |
| 410 | } |
| 411 | |
| 412 | auto fields = expr->distinctFields(); |
| 413 | std::vector<thrust::jit::ColumnDataMeta> jitMetas; |
| 414 | |
| 415 | for (auto&& f : fields) { |
| 416 | auto jitType = converter.convertType(f->type()); |
| 417 | // TODO complex type |
| 418 | // if (f->inputs().size() > 0) { |
| 419 | // } |
| 420 | |
| 421 | thrust::jit::ColumnDataMeta jitMeta; |
| 422 | jitMeta.type = jitType->kind; |
| 423 | jitMeta.nullable = true; // presto |
| 424 | jitMeta.name = f->name(); |
| 425 | jitMetas.emplace_back(std::move(jitMeta)); |
| 426 | } |
| 427 | |
| 428 | auto jitResourceHolder = |
| 429 | thrust::jit::compileExprForVector(jitExpr.get(), jitMetas); |
| 430 | |
| 431 | result.jitFunc = (JitBoltVectorFunction::JitedFuncAddress) |
| 432 | jitResourceHolder->getFunction(); |
| 433 | |
| 434 | // std::function<void(const std::vector<VectorPtr>& args, VectorPtr* |
| 435 | // result)> func; |
| 436 | FunctionResourceWrapper wrapper; |
| 437 | wrapper.jitHolder = jitResourceHolder; |
| 438 | result.func = std::bind( |
| 439 | bolt_call_function_wrapper, |
| 440 | wrapper, |
| 441 | std::placeholders::_1, |
| 442 | std::placeholders::_2); |
| 443 | |
| 444 | } catch (std::exception& e) { |
| 445 | // log |
| 446 | } |
| 447 | return result; |
| 448 | } |
| 449 | |
| 450 | } // namespace bytedance::bolt::jit |
| 451 | #endif |
no test coverage detected