private static void writeTypes(OrcProto.Footer.Builder builder, TypeDescription schema) { OrcProto.Type.Builder type = OrcProto.Type.CreateBuilder(); IList<TypeDescription> children = schema.getChildren(); switch (schema.getCategory()) { case Category.BOOLEAN: type.Kind = OrcProto.Type.Types.Kind.BOOLEAN; break; case Category.BYTE: type.Kind = OrcProto.Type.Types.Kind.BYTE; break; case Category.SHORT: type.Kind = OrcProto.Type.Types.Kind.SHORT; break; case Category.INT: type.Kind = OrcProto.Type.Types.Kind.INT; break; case Category.LONG: type.Kind = OrcProto.Type.Types.Kind.LONG; break; case Category.FLOAT: type.Kind = OrcProto.Type.Types.Kind.FLOAT; break; case Category.DOUBLE: type.Kind = OrcProto.Type.Types.Kind.DOUBLE; break; case Category.STRING: type.Kind = OrcProto.Type.Types.Kind.STRING; break; case Category.CHAR: type.Kind = OrcProto.Type.Types.Kind.CHAR; type.MaximumLength = (uint)schema.getMaxLength(); break; case Category.VARCHAR: type.Kind = OrcProto.Type.Types.Kind.VARCHAR; type.MaximumLength = (uint)schema.getMaxLength(); break; case Category.BINARY: type.Kind = OrcProto.Type.Types.Kind.BINARY; break; case Category.TIMESTAMP: type.Kind = OrcProto.Type.Types.Kind.TIMESTAMP; break; case Category.DATE: type.Kind = OrcProto.Type.Types.Kind.DATE; break; case Category.DECIMAL: type.Kind = OrcProto.Type.Types.Kind.DECIMAL; type.Precision = (uint)schema.getPrecision(); type.Scale = (uint)schema.getScale(); break; case Category.LIST: type.Kind = OrcProto.Type.Types.Kind.LIST; type.AddSubtypes((uint)children[0].getId()); break; case Category.MAP: type.Kind = OrcProto.Type.Types.Kind.MAP; foreach (TypeDescription t in children) { type.AddSubtypes((uint)t.getId()); } break; case Category.STRUCT: type.Kind = OrcProto.Type.Types.Kind.STRUCT; foreach (TypeDescription t in children) { type.AddSubtypes((uint)t.getId()); } foreach (string field in schema.getFieldNames()) { type.AddFieldNames(field); } break; case Category.UNION: type.Kind = OrcProto.Type.Types.Kind.UNION; foreach (TypeDescription t in children) { type.AddSubtypes((uint)t.getId()); } break; default: throw new ArgumentException("Unknown category: " + schema.getCategory()); } builder.AddTypes(type); if (children != null) { foreach (TypeDescription child in children) { writeTypes(builder, child); } } }