class_docstr: Abstract class for all the join based planners
  
  Arguments:
      join_type: JoinType
          type of join, INNER, OUTER , LATERAL etc
      join_predicate: AbstractExpression
          An expression used for joining
code: def __init__(
      self,
      node_type: PlanOprType,
      join_type: JoinType,
      join_predicate: AbstractExpression,
  ):
      super().__init__(node_type)
      self._join_type = join_type
      self._join_predicate = join_predicate
  
file_path: evadb/evadb/plan_nodes/abstract_join_plan.py
imports: from evadb.expression.abstract_expression import AbstractExpression
  from evadb.parser.types import JoinType
  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 AbstractJoin object from inherited base classes: AbstractPlan with example: obj = AbstractJoin(node_type, join_type, join_predicate)