class_docstr: Applies PP to filter out the frames that doesn't satisfy the condition
  Arguments:
      node (AbstractPlan): ...
  
  Note: This look kind of redundant. This logic for now is similar to that
  of sequential scan executor. Will decide to delete it depending on how
  sequential scan evolves.
code: def exec(self, *args, **kwargs) -> Iterator[Batch]:
      child_executor = self.children[0]
      for batch in child_executor.exec():
          outcomes = self.predicate.evaluate(batch)
          required_frame_ids = []
          for i, outcome in enumerate(outcomes):
              if outcome:
                  required_frame_ids.append(i)
  
          yield batch[required_frame_ids]
  
file_path: evadb/evadb/executor/pp_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.pp_plan import PPScanPlan
label_desc: Use image node_id 2 for calling the PPExecutor obj's underlying member method code with example usage: obj.exec() without return types