1#include "duckdb/execution/operator/set/physical_union.hpp"
2
3#include "duckdb/common/vector_operations/vector_operations.hpp"
4
5using namespace duckdb;
6using namespace std;
7
8class PhysicalUnionOperatorState : public PhysicalOperatorState {
9public:
10 PhysicalUnionOperatorState() : PhysicalOperatorState(nullptr), top_done(false) {
11 }
12 unique_ptr<PhysicalOperatorState> top_state;
13 unique_ptr<PhysicalOperatorState> bottom_state;
14 bool top_done = false;
15};
16
17PhysicalUnion::PhysicalUnion(LogicalOperator &op, unique_ptr<PhysicalOperator> top, unique_ptr<PhysicalOperator> bottom)
18 : PhysicalOperator(PhysicalOperatorType::UNION, op.types) {
19 children.push_back(move(top));
20 children.push_back(move(bottom));
21}
22
23// first exhaust top, then exhaust bottom. state to remember which.
24void PhysicalUnion::GetChunkInternal(ClientContext &context, DataChunk &chunk, PhysicalOperatorState *state_) {
25 auto state = reinterpret_cast<PhysicalUnionOperatorState *>(state_);
26 if (!state->top_done) {
27 children[0]->GetChunk(context, chunk, state->top_state.get());
28 if (chunk.size() == 0) {
29 state->top_done = true;
30 }
31 }
32 if (state->top_done) {
33 children[1]->GetChunk(context, chunk, state->bottom_state.get());
34 }
35 if (chunk.size() == 0) {
36 state->finished = true;
37 }
38}
39
40unique_ptr<PhysicalOperatorState> PhysicalUnion::GetOperatorState() {
41 auto state = make_unique<PhysicalUnionOperatorState>();
42 state->top_state = children[0]->GetOperatorState();
43 state->bottom_state = children[1]->GetOperatorState();
44 return (move(state));
45}
46