Prepares query plan for a join statement with three fragments. F02:PLAN FRAGMENT | PLAN-ROOT SINK | 04:EXCHANGE | F00:PLAN FRAGMENT 02:HASH JOIN | |--03:EXCHANGE | | | F01:PLAN FRAGMENT | 00:SCAN HDFS | 01:SCAN HDFS Expected JSON output for the plan: { "plan_nodes": [ { "label": "04:EXCHANGE", "label_detail": "UNPARTITIONED", "output_card": 6, "num_instances": 2, "is_broadcast": true, "max_t
| 495 | // ] |
| 496 | // } |
| 497 | static void prepareJoinStatement(const vector<string>& labels, |
| 498 | const vector<string>& label_details, vector<TPlanFragment>* fragments, |
| 499 | TExecSummary* summary) { |
| 500 | ASSERT_EQ(labels.size(), 5); |
| 501 | ASSERT_EQ(label_details.size(), 5); |
| 502 | |
| 503 | // F02:PLAN FRAGMENT |
| 504 | TPlanFragment fragment02 = ImpalaHttpHandlerTest::createTPlanFragment(2); |
| 505 | // 04:EXCHANGE |
| 506 | ImpalaHttpHandlerTest::addNodeToFragment( |
| 507 | labels.at(0), label_details.at(0), 0, &fragment02, summary); |
| 508 | TDataSink plan_root_sink = ImpalaHttpHandlerTest::createPlanRootSink(); |
| 509 | ImpalaHttpHandlerTest::addSinkToFragment(plan_root_sink, &fragment02, summary); |
| 510 | fragments->push_back(fragment02); |
| 511 | |
| 512 | // F00:PLAN FRAGMENT |
| 513 | TPlanFragment fragment00 = ImpalaHttpHandlerTest::createTPlanFragment(0); |
| 514 | TDataSink stream_sink1 = |
| 515 | ImpalaHttpHandlerTest::createStreamSink(fragment02.plan.nodes[0].node_id); |
| 516 | ImpalaHttpHandlerTest::addSinkToFragment(stream_sink1, &fragment00, summary); |
| 517 | // 02:HASH_JOIN |
| 518 | ImpalaHttpHandlerTest::addNodeToFragment( |
| 519 | labels.at(1), label_details.at(1), 2, &fragment00, summary); |
| 520 | // 01:SCAN HDFS |
| 521 | ImpalaHttpHandlerTest::addNodeToFragment( |
| 522 | labels.at(2), label_details.at(2), 0, &fragment00, summary); |
| 523 | // 03:EXCHANGE |
| 524 | ImpalaHttpHandlerTest::addNodeToFragment( |
| 525 | labels.at(3), label_details.at(3), 0, &fragment00, summary); |
| 526 | fragments->push_back(fragment00); |
| 527 | |
| 528 | // F01:PLAN FRAGMENT |
| 529 | TPlanFragment fragment01 = ImpalaHttpHandlerTest::createTPlanFragment(1); |
| 530 | // data stream sink pointing to the 03:EXCHANGE node |
| 531 | TDataSink stream_sink2 = |
| 532 | ImpalaHttpHandlerTest::createStreamSink(fragment00.plan.nodes[2].node_id); |
| 533 | ImpalaHttpHandlerTest::addSinkToFragment(stream_sink2, &fragment01, summary); |
| 534 | // 00:SCAN HDFS |
| 535 | ImpalaHttpHandlerTest::addNodeToFragment( |
| 536 | labels.at(4), label_details.at(4), 0, &fragment01, summary); |
| 537 | fragments->push_back(fragment01); |
| 538 | } |
| 539 | |
| 540 | // Prepares query plan for an Iceberg update statement. Root sink will be a multi data |
| 541 | // sink, consisting of an HDFS table sink and an Iceberg delete table sink. |