class_docstr: A lazy execution plan for a Dataset.
class_docstr_tok: ["A","lazy","execution","plan","for","a","Dataset","."]
docstr: Create a plan with no transformation stages.
  
  Args:
      in_blocks: Base list of blocks.
      stats: Stats for the base blocks.
      dataset_uuid: Dataset's UUID.
      run_by_consumer: Whether this plan is invoked to run by the consumption
      APIs (e.g. .iter_batches()).
docstr_tok: ["Create","a","plan","with","no","transformation","stages",".","Args",":","in_blocks",":","Base","list","of","blocks",".","stats",":","Stats","for","the","base","blocks",".","dataset_uuid",":","Dataset","'s","UUID",".","run_by_consumer",":","Whether","this","plan","is","invoked","to","run","by","the","consumption","APIs","(","e.g",".",".iter_batches","(",")",")","."]
code: def __init__(
      self,
      in_blocks: BlockList,
      stats: DatasetStats,
      *,
      run_by_consumer: bool,
      data_context: Optional[DataContext] = None,
  ):
      """Create a plan with no transformation stages.
  
      Args:
          in_blocks: Base list of blocks.
          stats: Stats for the base blocks.
          dataset_uuid: Dataset's UUID.
          run_by_consumer: Whether this plan is invoked to run by the consumption
          APIs (e.g. .iter_batches()).
      """
      self._in_blocks = in_blocks
      self._in_stats = stats
      # A computed snapshot of some prefix of stages.
      self._snapshot_blocks = None
      self._snapshot_operator: Optional[LogicalOperator] = None
      self._snapshot_stats = None
      # Cache of optimized stages.
      self._last_optimized_stages = None
      # Cached schema.
      self._schema = None
      # Set when a Dataset is constructed with this plan
      self._dataset_uuid = None
  
      self._run_by_consumer = run_by_consumer
      self._dataset_name = None
  
      if data_context is None:
          # Snapshot the current context, so that the config of Datasets is always
          # determined by the config at the time it was created.
          self._context = copy.deepcopy(DataContext.get_current())
      else:
          self._context = data_context
  
imports: import copy
  import itertools
  from typing import TYPE_CHECKING, Any, Callable, Dict, Iterable, Iterator, List, Optional, Tuple, Union
  import ray
  from ray._private.internal_api import get_memory_info_reply, get_state_from_address
  from ray.data._internal.block_list import BlockList
  from ray.data._internal.compute import ActorPoolStrategy, BlockTransform, CallableClass, ComputeStrategy, TaskPoolStrategy, UserDefinedFunction, get_compute, is_task_compute
  from ray.data._internal.dataset_logger import DatasetLogger
  from ray.data._internal.execution.interfaces import TaskContext
  from ray.data._internal.lazy_block_list import LazyBlockList
  from ray.data._internal.logical.interfaces.logical_operator import LogicalOperator
  from ray.data._internal.logical.operators.from_operators import AbstractFrom
  from ray.data._internal.logical.operators.input_data_operator import InputData
  from ray.data._internal.logical.operators.read_operator import Read
  from ray.data._internal.logical.rules.operator_fusion import _are_remote_args_compatible
  from ray.data._internal.stats import DatasetStats, DatasetStatsSummary
  from ray.data._internal.util import create_dataset_tag, unify_block_metadata_schema
  from ray.data.block import Block, BlockMetadata
  from ray.data.context import DataContext
  from ray.types import ObjectRef
  from ray.util.debug import log_once
label_desc: Use image node_id 1 to create a new ExecutionPlan object  with example: obj = ExecutionPlan(in_blocks, stats)