| 308 | } |
| 309 | |
| 310 | void AggFnEvaluator::Update(const TupleRow* row, Tuple* dst, void* fn) { |
| 311 | if (fn == nullptr) return; |
| 312 | |
| 313 | const SlotDescriptor& slot_desc = intermediate_slot_desc(); |
| 314 | SetAnyVal(slot_desc, dst, staging_intermediate_val_); |
| 315 | |
| 316 | for (int i = 0; i < input_evals_.size(); ++i) { |
| 317 | void* src_slot = input_evals_[i]->GetValue(row); |
| 318 | DCHECK(&input_evals_[i]->root() == agg_fn_.GetChild(i)); |
| 319 | AnyValUtil::SetAnyVal(src_slot, agg_fn_.GetChild(i)->type(), staging_input_vals_[i]); |
| 320 | } |
| 321 | |
| 322 | // TODO: this part is not so good and not scalable. It can be replaced with |
| 323 | // codegen but we can also consider leaving it for the first few cases for |
| 324 | // debugging. |
| 325 | switch (input_evals_.size()) { |
| 326 | case 0: |
| 327 | reinterpret_cast<UpdateFn0>(fn)(agg_fn_ctx_.get(), staging_intermediate_val_); |
| 328 | break; |
| 329 | case 1: |
| 330 | reinterpret_cast<UpdateFn1>(fn)(agg_fn_ctx_.get(), |
| 331 | *staging_input_vals_[0], staging_intermediate_val_); |
| 332 | break; |
| 333 | case 2: |
| 334 | reinterpret_cast<UpdateFn2>(fn)(agg_fn_ctx_.get(), |
| 335 | *staging_input_vals_[0], *staging_input_vals_[1], staging_intermediate_val_); |
| 336 | break; |
| 337 | case 3: |
| 338 | reinterpret_cast<UpdateFn3>(fn)(agg_fn_ctx_.get(), |
| 339 | *staging_input_vals_[0], *staging_input_vals_[1], |
| 340 | *staging_input_vals_[2], staging_intermediate_val_); |
| 341 | break; |
| 342 | case 4: |
| 343 | reinterpret_cast<UpdateFn4>(fn)(agg_fn_ctx_.get(), |
| 344 | *staging_input_vals_[0], *staging_input_vals_[1], |
| 345 | *staging_input_vals_[2], *staging_input_vals_[3], staging_intermediate_val_); |
| 346 | break; |
| 347 | case 5: |
| 348 | reinterpret_cast<UpdateFn5>(fn)(agg_fn_ctx_.get(), |
| 349 | *staging_input_vals_[0], *staging_input_vals_[1], |
| 350 | *staging_input_vals_[2], *staging_input_vals_[3], |
| 351 | *staging_input_vals_[4], staging_intermediate_val_); |
| 352 | break; |
| 353 | case 6: |
| 354 | reinterpret_cast<UpdateFn6>(fn)(agg_fn_ctx_.get(), |
| 355 | *staging_input_vals_[0], *staging_input_vals_[1], |
| 356 | *staging_input_vals_[2], *staging_input_vals_[3], |
| 357 | *staging_input_vals_[4], *staging_input_vals_[5], staging_intermediate_val_); |
| 358 | break; |
| 359 | case 7: |
| 360 | reinterpret_cast<UpdateFn7>(fn)(agg_fn_ctx_.get(), |
| 361 | *staging_input_vals_[0], *staging_input_vals_[1], |
| 362 | *staging_input_vals_[2], *staging_input_vals_[3], |
| 363 | *staging_input_vals_[4], *staging_input_vals_[5], |
| 364 | *staging_input_vals_[6], staging_intermediate_val_); |
| 365 | break; |
| 366 | case 8: |
| 367 | reinterpret_cast<UpdateFn8>(fn)(agg_fn_ctx_.get(), |