Prepares query plan for a select statement with two fragments, each with one node. The first fragment has an exchange node and the second fragment has a scan node. F01:PLAN FRAGMENT | PLAN-ROOT SINK | 01:EXCHANGE | F00:PLAN FRAGMENT 00:SCAN HDFS Expected JSON output for the plan will look like this: { "plan_nodes": [ { "label": "01:EXCHANGE", "label_detail": "UNPARTITIONED", "output_card": 6, "n
| 313 | // ] |
| 314 | // } |
| 315 | static void prepareSelectStatement(const vector<string>& labels, |
| 316 | const vector<string>& label_details, vector<TPlanFragment>* fragments, |
| 317 | TExecSummary* summary) { |
| 318 | ASSERT_EQ(labels.size(), 2); |
| 319 | ASSERT_EQ(label_details.size(), 2); |
| 320 | |
| 321 | // F01:PLAN FRAGMENT |
| 322 | TPlanFragment fragment01 = ImpalaHttpHandlerTest::createTPlanFragment(0); |
| 323 | TDataSink plan_root_sink = ImpalaHttpHandlerTest::createPlanRootSink(); |
| 324 | ImpalaHttpHandlerTest::addSinkToFragment(plan_root_sink, &fragment01, summary); |
| 325 | // 01:EXCHANGE |
| 326 | ImpalaHttpHandlerTest::addNodeToFragment( |
| 327 | labels.at(0), label_details.at(0), 0, &fragment01, summary); |
| 328 | fragments->push_back(fragment01); |
| 329 | |
| 330 | // F00:PLAN FRAGMENT |
| 331 | TPlanFragment fragment00 = ImpalaHttpHandlerTest::createTPlanFragment(1); |
| 332 | TDataSink stream_sink = |
| 333 | ImpalaHttpHandlerTest::createStreamSink(fragment01.plan.nodes[0].node_id); |
| 334 | ImpalaHttpHandlerTest::addSinkToFragment(stream_sink, &fragment00, summary); |
| 335 | // 00:SCAN HDFS |
| 336 | ImpalaHttpHandlerTest::addNodeToFragment( |
| 337 | labels.at(1), label_details.at(1), 0, &fragment00, summary); |
| 338 | fragments->push_back(fragment00); |
| 339 | } |
| 340 | |
| 341 | // Prepares query plan for a CTAS statement with two fragments, each with one node. |
| 342 | // Very similar to prepareSelectStatement(), but the first fragment has a table sink. |