code: def _binder(expr: GroupExpression, pattern: Pattern, memo: Memo):
      assert isinstance(expr, GroupExpression)
      curr_iterator = iter(())
      child_binders = []
      if pattern.opr_type is not OperatorType.DUMMY:
          curr_iterator = iter([expr.opr])
          if expr.opr.opr_type != pattern.opr_type:
              return
  
          if len(pattern.children) != len(expr.children):
              return
  
          for child_grp, pattern_child in zip(
              expr.children, pattern.children
          ):
              child_binders.append(
                  Binder._grp_binder(child_grp, pattern_child, memo)
              )
      else:
          # record the group id in a Dummy Operator
          curr_iterator = iter([Dummy(expr.group_id, expr.opr)])
  
      yield from itertools.product(curr_iterator, *child_binders)
  
file_path: evadb/evadb/optimizer/binder.py
imports: import copy
  import itertools
  from evadb.optimizer.group_expression import GroupExpression
  from evadb.optimizer.memo import Memo
  from evadb.optimizer.operators import Dummy, Operator, OperatorType
  from evadb.optimizer.rules.pattern import Pattern
label_desc: Use image node_id 3 for calling the Binder obj's underlying member method code with example usage: obj._binder(expr, pattern, memo) without return types