protected AbstractIterHashJoin(
      JoinKey joinKey,
      QueryIterator probeIter,
      QueryIterator streamIter,
      ExecutionContext execCxt) {
    super(probeIter, streamIter, execCxt);

    if (joinKey == null) {
      QueryIterPeek pProbe = QueryIterPeek.create(probeIter, execCxt);
      QueryIterPeek pStream = QueryIterPeek.create(streamIter, execCxt);

      Binding bLeft = pProbe.peek();
      Binding bRight = pStream.peek();

      List<Var> varsLeft = Iter.toList(bLeft.vars());
      List<Var> varsRight = Iter.toList(bRight.vars());
      joinKey = JoinKey.createVarKey(varsLeft, varsRight);
      probeIter = pProbe;
      streamIter = pStream;
    }

    this.joinKey = joinKey;
    this.iterStream = streamIter;
    this.hashTable = new HashProbeTable(joinKey);
    this.iterCurrent = null;
    buildHashTable(probeIter);
  }