/**
   * Pipeline joins
   *
   * @return
   */
  public Operator pipeline() {
    EqualJoin firstJoin = joinList.get(0);
    TimeCalc.begin(firstJoin.toString());
    OperatorHashJoin hashJoin = decideWhichToCreate(firstJoin, operMap);
    TimeCalc.end(firstJoin.toString() + " Finish create the first hash join.");
    joinedHistory.add(firstJoin.getLeftTableName());
    joinedHistory.add(firstJoin.getRightTableName());

    for (int i = 1; i < joinList.size(); i++) {
      EqualJoin ej = joinList.get(i);
      Operator leftOper = operMap.get(ej.getLeftTableName());
      Operator rightOper = operMap.get(ej.getRightTableName());

      Operator neverJoinedOper;
      if (joinedHistory.contains(ej.getLeftTableName())) neverJoinedOper = rightOper;
      else neverJoinedOper = leftOper;

      TimeCalc.begin(ej.toString());
      hashJoin = decideWhichToCreate(ej, hashJoin, neverJoinedOper);
      TimeCalc.end(ej.toString() + " Finish pipeline one hash join " + ej);

      joinedHistory.add(ej.getLeftTableName());
      joinedHistory.add(ej.getRightTableName());
    }

    return hashJoin;
  }