private Tuple hashJoin() throws TransactionAbortedException, DbException {
	Tuple t;
	Field f;
	if (iterFirst) {
	    // First run-through, Create Hash Relations
	    hashBlock = new HashMap<Field, ArrayList<Tuple>>();
	    while(children[0].hasNext()) {
		blockBlock = new ArrayList<Tuple>();
		t = children[0].next();
		t.setJoinIndex(p.getField1());
		f = t.joinField();
		// If field exists, append
		if (hashBlock.containsKey(f)) {
		    blockBlock = hashBlock.get(f);
		}
		blockBlock.add(t);
		hashBlock.put(f, blockBlock);
	    }
	    iterFirst = false;
	    blockBlock = null;
	}
	
	// If t2 is found, join with all tuples with same field
	if (blockIter != null) {
	    while(blockIter.hasNext()) {
		t = Tuple.merge(blockIter.next(), t2);
		return t;
	    }
	    blockIter = null;
	    return hashJoin();
	}
	// Look through t2
	while(children[1].hasNext()) {
	    t2 = children[1].next();
	    t2.setJoinIndex(p.getField2());
	    f = t2.joinField();
	    if (hashBlock.containsKey(f)) {
		blockIter = hashBlock.get(f).iterator();
		return hashJoin();
	    }
	}
	return null;
    }