| 182 | } |
| 183 | |
| 184 | Status BlockingJoinNode::LookupSeparateJoinBuilder(RuntimeState* state, |
| 185 | JoinBuilder** separate_builder) { |
| 186 | // This can only be called when there is a separate join build |
| 187 | DCHECK(UseSeparateBuild(state->query_options())); |
| 188 | |
| 189 | // Find the input fragment's build sink. GetFInstanceState() waits for the Prepare() |
| 190 | // phase to complete for all the fragments on this executor, so it is unsuitable to |
| 191 | // call during Prepare() itself. Typically, this is used during the Open() phase. |
| 192 | const google::protobuf::RepeatedPtrField<JoinBuildInputPB>& build_inputs = |
| 193 | state->instance_ctx_pb().join_build_inputs(); |
| 194 | auto it = std::find_if(build_inputs.begin(), build_inputs.end(), |
| 195 | [this](const JoinBuildInputPB& bi) { return bi.join_node_id() == id_; }); |
| 196 | DCHECK(it != build_inputs.end()); |
| 197 | FragmentInstanceState* build_finstance; |
| 198 | TUniqueId input_finstance_id; |
| 199 | UniqueIdPBToTUniqueId(it->input_finstance_id(), &input_finstance_id); |
| 200 | RETURN_IF_ERROR( |
| 201 | state->query_state()->GetFInstanceState(input_finstance_id, &build_finstance)); |
| 202 | TDataSinkType::type build_sink_type = build_finstance->fragment().output_sink.type; |
| 203 | DCHECK(IsJoinBuildSink(build_sink_type)); |
| 204 | *separate_builder = build_finstance->GetJoinBuildSink(); |
| 205 | DCHECK(*separate_builder != nullptr); |
| 206 | return Status::OK(); |
| 207 | } |
| 208 | |
| 209 | Status BlockingJoinNode::OpenImpl(RuntimeState* state, JoinBuilder** separate_builder) { |
| 210 | RETURN_IF_ERROR(ExecNode::Open(state)); |
nothing calls this directly
no test coverage detected