class_docstr: This plan is used for storing information required for
  hash join probe side. It scans over the preferably larger relation
  and uses build side hash table to join.
  Arguments:
      join_type: JoinType
      probe_keys (List[ColumnCatalogEntry]) : list of equi-key columns.
                      Must be equal to build side keys.
      predicate (AbstractExpression)
class_docstr_tok: ["This","plan","is","used","for","storing","information","required","for","hash","join","probe","side",".","It","scans","over","the","preferably","larger","relation","and","uses","build","side","hash","table","to","join",".","Arguments",":","join_type",":","JoinType","probe_keys","(","List","[","ColumnCatalogEntry","]",")",":","list","of","equi-key","columns",".","Must","be","equal","to","build","side","keys",".","predicate","(","AbstractExpression",")"]
code: def __hash__(self) -> int:
      return hash(
          (
              super().__hash__(),
              tuple(self.probe_keys or []),
              tuple(self.join_project or []),
          )
      )
  
file_path: evadb/evadb/plan_nodes/hash_join_probe_plan.py
imports: from typing import List
  from evadb.catalog.models.column_catalog import ColumnCatalogEntry
  from evadb.expression.abstract_expression import AbstractExpression
  from evadb.parser.types import JoinType
  from evadb.plan_nodes.abstract_join_plan import AbstractJoin
  from evadb.plan_nodes.types import PlanOprType
label_desc: Use image node_id 3 for calling the HashJoinProbePlan obj's underlying member method code with example usage: obj.__hash__() and returns: hash