| 539 | } |
| 540 | |
| 541 | Status NestedLoopJoinNode::ProcessUnmatchedProbeRow(RuntimeState* state, |
| 542 | RowBatch* output_batch) { |
| 543 | DCHECK(!matched_probe_); |
| 544 | DCHECK(current_probe_row_ != NULL); |
| 545 | ScalarExprEvaluator* const* conjunct_evals = conjunct_evals_.data(); |
| 546 | size_t num_conjuncts = conjuncts_.size(); |
| 547 | DCHECK_EQ(num_conjuncts, conjunct_evals_.size()); |
| 548 | TupleRow* output_row = output_batch->GetRow(output_batch->AddRow()); |
| 549 | if (join_op_ == TJoinOp::LEFT_OUTER_JOIN || join_op_ == TJoinOp::FULL_OUTER_JOIN) { |
| 550 | CreateOutputRow(output_row, current_probe_row_, NULL); |
| 551 | } else { |
| 552 | DCHECK(join_op_ == TJoinOp::LEFT_ANTI_JOIN) << "Unsupported join operator: " << |
| 553 | join_op_; |
| 554 | output_batch->CopyRow(current_probe_row_, output_row); |
| 555 | } |
| 556 | // Evaluate all the other (non-join) conjuncts. |
| 557 | if (EvalConjuncts(conjunct_evals, num_conjuncts, output_row)) { |
| 558 | VLOG_ROW << "match row:" << PrintRow(output_row, *row_desc()); |
| 559 | output_batch->CommitLastRow(); |
| 560 | IncrementNumRowsReturned(1); |
| 561 | if (ReachedLimit()) eos_ = true; |
| 562 | } |
| 563 | return Status::OK(); |
| 564 | } |
| 565 | |
| 566 | Status NestedLoopJoinNode::ProcessUnmatchedBuildRows( |
| 567 | RuntimeState* state, RowBatch* output_batch) { |