@Override
  public RelWriter explainTerms(RelWriter pw) {
    List<String> joinsString = new ArrayList<String>();
    for (int i = 0; i < joinInputs.size(); i++) {
      final StringBuilder sb = new StringBuilder();
      sb.append(joinInputs.get(i).left).append(" - ").append(joinInputs.get(i).right)
          .append(" : ").append(joinTypes.get(i).name());
      joinsString.add(sb.toString());
    }

    super.explainTerms(pw);
    for (Ord<RelNode> ord : Ord.zip(inputs)) {
      pw.input("input#" + ord.i, ord.e);
    }
    return pw.item("condition", condition)
        .item("joinsDescription", joinsString);
  }
Constructs a MultiJoin.

@param cluster               cluster that join belongs to
@param inputs                inputs into this multi-join
@param condition             join filter applicable to this join node
@param rowType               row type of the join result of this node
@param joinInputs
@param joinTypes             the join type corresponding to each input; if
                             an input is null-generating in a left or right
                             outer join, the entry indicates the type of
                             outer join; otherwise, the entry is set to
                             INNER
@param filters               filters associated with each join
                             input
@param joinPredicateInfo     join predicate information
ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveMultiJoin.java