code: def exec(self, *args, **kwargs) -> Iterator[Batch]:
      child_executor = self.children[0]
      # build in memory hash table and pass to the probe phase
      # Assumption the hash table fits in memory
      # Todo: Implement a partition based hash join (grace hash join)
      cumm_batches = [
          batch for batch in child_executor.exec() if not batch.empty()
      ]
      cumm_batches = Batch.concat(cumm_batches)
      hash_keys = [key.col_alias for key in self.build_keys]
      cumm_batches.reassign_indices_to_hash(hash_keys)
      yield cumm_batches
  
file_path: evadb/evadb/executor/join_build_executor.py
imports: from typing import Iterator
  from evadb.database import EvaDBDatabase
  from evadb.executor.abstract_executor import AbstractExecutor
  from evadb.models.storage.batch import Batch
  from evadb.plan_nodes.hash_join_build_plan import HashJoinBuildPlan
label_desc: Use image node_id 2 for calling the BuildJoinExecutor obj's underlying member method code with example usage: obj.exec() without return types