private FullOuterTimeJoinNode initFullOuterTimeJoinNodeWithExchangeNode(
      TypeProvider typeProvider, int exchangeNum, int scanNum) throws IllegalPathException {
    FullOuterTimeJoinNode fullOuterTimeJoinNode =
        new FullOuterTimeJoinNode(new PlanNodeId("TimeJoinNode"), Ordering.ASC);
    for (int i = 0; i < exchangeNum; i++) {
      ExchangeNode exchangeNode =
          new ExchangeNode(new PlanNodeId(String.format("FullOuterTimeJoinWithExchangeNode%d", i)));
      exchangeNode.setUpstream(
          new TEndPoint("127.0.0.2", 6667),
          new FragmentInstanceId(new PlanFragmentId("q", i), "ds"),
          new PlanNodeId("test"));
      fullOuterTimeJoinNode.addChild(exchangeNode);
    }
    for (int i = 0; i < scanNum; i++) {
      SeriesScanNode seriesScanNode =
          new SeriesScanNode(
              new PlanNodeId(String.format("SeriesScanNode%d", i)),
              new MeasurementPath(String.format("root.sg.d%d.s1", i), TSDataType.INT32));
      typeProvider.setTreeModelType(seriesScanNode.getSeriesPath().toString(), TSDataType.INT32);
      fullOuterTimeJoinNode.addChild(seriesScanNode);
    }
    return fullOuterTimeJoinNode;
  }
This method will init a timeJoinNode with @childNum seriesScanNode as children.

@param childNum the number of children
@return a timeJoinNode with @childNum seriesScanNode as children
iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/PipelineBuilderTest.java