parquet-cli/src/main/java/org/apache/parquet/cli/util/Schemas.java
private static Schema union(Schema left, Schema right) {
    if (left.getType() == Schema.Type.UNION) {
      if (right.getType() == Schema.Type.UNION) {
        // combine the unions by adding each type in right individually
        Schema combined = left;
        for (Schema type : right.getTypes()) {
          combined = union(combined, type);
        }
        return combined;

      } else {
        boolean notMerged = true;
        // combine a union with a non-union by checking if each type will merge
        List<Schema> types = Lists.newArrayList();
        Iterator<Schema> schemas = left.getTypes().iterator();
        // try to merge each type and stop when one succeeds
        while (schemas.hasNext()) {
          Schema next = schemas.next();
          Schema merged = mergeOnly(next, right);
          if (merged != null) {
            types.add(merged);
            notMerged = false;
            break;
          } else {
            // merge didn't work, add the type
            types.add(next);
          }
        }
        // add the remaining types from the left union
        while (schemas.hasNext()) {
          types.add(schemas.next());
        }

        if (notMerged) {
          types.add(right);
        }

        return Schema.createUnion(types);
      }
    } else if (right.getType() == Schema.Type.UNION) {
      return union(right, left);
    }

    return Schema.createUnion(ImmutableList.of(left, right));
  }
private static Schema union(Schema left, Schema right) {
    if (left.getType() == Schema.Type.UNION) {
      if (right.getType() == Schema.Type.UNION) {
        // combine the unions by adding each type in right individually
        Schema combined = left;
        for (Schema type : right.getTypes()) {
          combined = union(combined, type);
        }
        return combined;

      } else {
        boolean notMerged = true;
        // combine a union with a non-union by checking if each type will merge
        List<Schema> types = Lists.newArrayList();
        Iterator<Schema> schemas = left.getTypes().iterator();
        // try to merge each type and stop when one succeeds
        while (schemas.hasNext()) {
          Schema next = schemas.next();
          Schema merged = mergeOnly(next, right);
          if (merged != null) {
            types.add(merged);
            notMerged = false;
            break;
          } else {
            // merge didn't work, add the type
            types.add(next);
          }
        }
        // add the remaining types from the left union
        while (schemas.hasNext()) {
          types.add(schemas.next());
        }

        if (notMerged) {
          types.add(right);
        }

        return Schema.createUnion(types);
      }
    } else if (right.getType() == Schema.Type.UNION) {
      return union(right, left);
    }

    return Schema.createUnion(ImmutableList.of(left, right));
  }
private static Schema union ( Schema left , Schema right ) { if ( left . getType ( ) == Schema . Type . UNION ) { if ( right . getType ( ) == Schema . Type . UNION ) { // combine the unions by adding each type in right individually Schema combined = left ; for ( Schema type : right . getTypes ( ) ) { combined = union ( combined , type ) ; } return combined ; } else { boolean notMerged = true ; // combine a union with a non-union by checking if each type will merge List < Schema > types = Lists . newArrayList ( ) ; Iterator < Schema > schemas = left . getTypes ( ) . iterator ( ) ; // try to merge each type and stop when one succeeds while ( schemas . hasNext ( ) ) { Schema next = schemas . next ( ) ; Schema merged = mergeOnly ( next , right ) ; if ( merged != null ) { types . add ( merged ) ; notMerged = false ; break ; } else { // merge didn't work, add the type types . add ( next ) ; } } // add the remaining types from the left union while ( schemas . hasNext ( ) ) { types . add ( schemas . next ( ) ) ; } if ( notMerged ) { types . add ( right ) ; } return Schema . createUnion ( types ) ; } } else if ( right . getType ( ) == Schema . Type . UNION ) { return union ( right , left ) ; } return Schema . createUnion ( ImmutableList . of ( left , right ) ) ; }
Creates a union of two {@link Schema} instances.
<p>
If either {@code Schema} is a union, this will attempt to merge the other
schema with the types contained in that union before adding more types to
the union that is produced.
<p>
If both schemas are not unions, no merge is attempted.

@param left a {@code Schema}
@param right a {@code Schema}
@return a UNION schema of the to {@code Schema} instances
Creates a union of two { @link Schema } instances . <p > If either { @code Schema } is a union this will attempt to merge the other schema with the types contained in that union before adding more types to the union that is produced . <p > If both schemas are not unions no merge is attempted .