class_docstr: This plan is used for storing information required for union operations.
  
  Arguments:
      all: Bool
          UNION (deduplication) vs UNION ALL (non-deduplication)
code: def __init__(
      self,
      inner_plan: AbstractPlan,
      parallelism: int = 1,
      ray_pull_env_conf_dict: Dict[str, Any] = {},
      ray_parallel_env_conf_dict: List[Dict[str, Any]] = [{}],
  ):
      self.inner_plan = inner_plan
      self.parallelism = parallelism
      # Environment variables to configure in the remote process. The problem of Ray remote function
      # is that we cannot control which GPU to spawn the job. Second, Ray does not offer anything
      # extra when specify GPU job. Just by giving environment variables like CUDA_VISIBLE_DEVICES,
      # our system can have more control over the behavior of Ray.
      self.ray_parallel_env_conf_dict = ray_parallel_env_conf_dict
      self.ray_pull_env_conf_dict = ray_pull_env_conf_dict
      super().__init__(PlanOprType.EXCHANGE)
  
imports: from typing import Any, Dict, List
  from evadb.plan_nodes.abstract_plan import AbstractPlan
  from evadb.plan_nodes.types import PlanOprType
label_desc: Use image node_id 1 to create a new ExchangePlan object from inherited base classes: AbstractPlan with example: obj = ExchangePlan(inner_plan, parallelism, ray_pull_env_conf_dict, ray_parallel_env_conf_dict)