class_docstr: Applies predicates to filter the frames which satisfy the condition
  Arguments:
      node (AbstractPlan): The SequentialScanPlan
code: def exec(self, *args, **kwargs) -> Iterator[Batch]:
      child_executor = self.children[0]
      for batch in child_executor.exec(**kwargs):
          # apply alias to the batch
          # id, data -> myvideo.id, myvideo.data
          if self.alias:
              batch.modify_column_alias(self.alias)
  
          # We do the predicate first
          batch = apply_predicate(batch, self.predicate)
          # Then do project
          batch = apply_project(batch, self.project_expr)
  
          if not batch.empty():
              yield batch
  
      # instrument required stats
      if self.predicate or self.project_expr:
          catalog = self.catalog()
          instrument_function_expression_cost(self.predicate, catalog)
          instrument_function_expression_cost(
              self.project_expr, catalog
          )
  
file_path: evadb/evadb/executor/seq_scan_executor.py
imports: from typing import Iterator
  from evadb.database import EvaDBDatabase
  from evadb.executor.abstract_executor import AbstractExecutor
  from evadb.executor.executor_utils import apply_predicate, apply_project, instrument_function_expression_cost
  from evadb.models.storage.batch import Batch
  from evadb.plan_nodes.seq_scan_plan import SeqScanPlan
label_desc: Use image node_id 2 for calling the SequentialScanExecutor obj's underlying member method code with example usage: obj.exec() without return types