blob: 8b0cd18bff0509255856943e2d3718f79aca9e0b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.beam.sdk.io.common;
import com.google.auto.value.AutoValue;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
import org.apache.beam.sdk.schemas.AutoValueSchema;
import org.apache.beam.sdk.schemas.Schema;
import org.apache.beam.sdk.schemas.annotations.DefaultSchema;
import org.apache.beam.sdk.schemas.annotations.DefaultSchema.DefaultSchemaProvider;
import org.apache.beam.sdk.transforms.SerializableFunction;
import org.apache.beam.sdk.values.Row;
import org.apache.beam.sdk.values.TypeDescriptor;
import org.joda.time.Instant;
/** Various Java Beans and associated schemas used in tests. */
public class SchemaAwareJavaBeans {
private static final DefaultSchemaProvider DEFAULT_SCHEMA_PROVIDER = new DefaultSchemaProvider();
/** Convenience method for {@link AllPrimitiveDataTypes} instantiation. */
public static AllPrimitiveDataTypes allPrimitiveDataTypes(
Boolean aBoolean,
BigDecimal aDecimal,
Double aDouble,
Float aFloat,
Integer anInteger,
Long aLong,
String aString) {
return new AutoValue_SchemaAwareJavaBeans_AllPrimitiveDataTypes.Builder()
.setABoolean(aBoolean)
.setADecimal(aDecimal)
.setADouble(aDouble)
.setAFloat(aFloat)
.setAnInteger(anInteger)
.setALong(aLong)
.setAString(aString)
.build();
}
/** Convenience method for {@link NullableAllPrimitiveDataTypes} instantiation. */
public static NullableAllPrimitiveDataTypes nullableAllPrimitiveDataTypes(
@Nullable Boolean aBoolean,
@Nullable Double aDouble,
@Nullable Float aFloat,
@Nullable Integer anInteger,
@Nullable Long aLong,
@Nullable String aString) {
return new AutoValue_SchemaAwareJavaBeans_NullableAllPrimitiveDataTypes.Builder()
.setABoolean(aBoolean)
.setADouble(aDouble)
.setAFloat(aFloat)
.setAnInteger(anInteger)
.setALong(aLong)
.setAString(aString)
.build();
}
/** Convenience method for {@link TimeContaining} instantiation. */
public static TimeContaining timeContaining(Instant instant, List<Instant> instantList) {
return new AutoValue_SchemaAwareJavaBeans_TimeContaining.Builder()
.setInstant(instant)
.setInstantList(instantList)
.build();
}
/** Convenience method for {@link ByteType} instantiation. */
public static ByteType byteType(Byte aByte, List<Byte> byteList) {
return new AutoValue_SchemaAwareJavaBeans_ByteType.Builder()
.setByte(aByte)
.setByteList(byteList)
.build();
}
/** Convenience method for {@link ByteSequenceType} instantiation. */
public static ByteSequenceType byteSequenceType(
byte[] byteSequence, List<byte[]> byteSequenceList) {
return new AutoValue_SchemaAwareJavaBeans_ByteSequenceType.Builder()
.setByteSequence(byteSequence)
.setByteSequenceList(byteSequenceList)
.build();
}
/** Convenience method for {@link ArrayPrimitiveDataTypes} instantiation. */
public static ArrayPrimitiveDataTypes arrayPrimitiveDataTypes(
List<Boolean> booleans,
List<Double> doubles,
List<Float> floats,
List<Integer> integers,
List<Long> longs,
List<String> strings) {
return new AutoValue_SchemaAwareJavaBeans_ArrayPrimitiveDataTypes.Builder()
.setBooleanList(booleans)
.setDoubleList(doubles)
.setFloatList(floats)
.setIntegerList(integers)
.setLongList(longs)
.setStringList(strings)
.build();
}
/** Convenience method for {@link SinglyNestedDataTypes} instantiation. */
public static SinglyNestedDataTypes singlyNestedDataTypes(
AllPrimitiveDataTypes allPrimitiveDataTypes, AllPrimitiveDataTypes... repeated) {
return new AutoValue_SchemaAwareJavaBeans_SinglyNestedDataTypes.Builder()
.setAllPrimitiveDataTypes(allPrimitiveDataTypes)
.setAllPrimitiveDataTypesList(Arrays.stream(repeated).collect(Collectors.toList()))
.build();
}
/** Convenience method for {@link DoublyNestedDataTypes} instantiation. */
public static DoublyNestedDataTypes doublyNestedDataTypes(
SinglyNestedDataTypes singlyNestedDataTypes, SinglyNestedDataTypes... repeated) {
return new AutoValue_SchemaAwareJavaBeans_DoublyNestedDataTypes.Builder()
.setSinglyNestedDataTypes(singlyNestedDataTypes)
.setSinglyNestedDataTypesList(Arrays.stream(repeated).collect(Collectors.toList()))
.build();
}
private static final TypeDescriptor<AllPrimitiveDataTypes>
ALL_PRIMITIVE_DATA_TYPES_TYPE_DESCRIPTOR = TypeDescriptor.of(AllPrimitiveDataTypes.class);
/** The schema for {@link AllPrimitiveDataTypes}. */
public static final Schema ALL_PRIMITIVE_DATA_TYPES_SCHEMA =
DEFAULT_SCHEMA_PROVIDER.schemaFor(ALL_PRIMITIVE_DATA_TYPES_TYPE_DESCRIPTOR);
/**
* Returns a {@link SerializableFunction} to convert from a {@link AllPrimitiveDataTypes} to a
* {@link Row}.
*/
public static SerializableFunction<AllPrimitiveDataTypes, Row> allPrimitiveDataTypesToRowFn() {
return DEFAULT_SCHEMA_PROVIDER.toRowFunction(ALL_PRIMITIVE_DATA_TYPES_TYPE_DESCRIPTOR);
}
/**
* Returns a {@link SerializableFunction} to convert from a {@link Row} to a {@link
* AllPrimitiveDataTypes}.
*/
public static SerializableFunction<Row, AllPrimitiveDataTypes> allPrimitiveDataTypesFromRowFn() {
return DEFAULT_SCHEMA_PROVIDER.fromRowFunction(ALL_PRIMITIVE_DATA_TYPES_TYPE_DESCRIPTOR);
}
private static final TypeDescriptor<NullableAllPrimitiveDataTypes>
NULLABLE_ALL_PRIMITIVE_DATA_TYPES_TYPE_DESCRIPTOR =
TypeDescriptor.of(NullableAllPrimitiveDataTypes.class);
/** The schema for {@link NullableAllPrimitiveDataTypes}. */
public static final Schema NULLABLE_ALL_PRIMITIVE_DATA_TYPES_SCHEMA =
DEFAULT_SCHEMA_PROVIDER.schemaFor(NULLABLE_ALL_PRIMITIVE_DATA_TYPES_TYPE_DESCRIPTOR);
/**
* Returns a {@link SerializableFunction} to convert from a {@link NullableAllPrimitiveDataTypes}
* to a {@link Row}.
*/
public static SerializableFunction<NullableAllPrimitiveDataTypes, Row>
nullableAllPrimitiveDataTypesToRowFn() {
return DEFAULT_SCHEMA_PROVIDER.toRowFunction(NULLABLE_ALL_PRIMITIVE_DATA_TYPES_TYPE_DESCRIPTOR);
}
/**
* Returns a {@link SerializableFunction} to convert from a {@link Row} to a {@link
* NullableAllPrimitiveDataTypes}.
*/
public static SerializableFunction<Row, NullableAllPrimitiveDataTypes>
nullableAllPrimitiveDataTypesFromRowFn() {
return DEFAULT_SCHEMA_PROVIDER.fromRowFunction(
NULLABLE_ALL_PRIMITIVE_DATA_TYPES_TYPE_DESCRIPTOR);
}
private static final TypeDescriptor<TimeContaining> TIME_CONTAINING_TYPE_DESCRIPTOR =
TypeDescriptor.of(TimeContaining.class);
/** The schema for {@link TimeContaining}. */
public static final Schema TIME_CONTAINING_SCHEMA =
DEFAULT_SCHEMA_PROVIDER.schemaFor(TIME_CONTAINING_TYPE_DESCRIPTOR);
/**
* Returns a {@link SerializableFunction} to convert from a {@link TimeContaining} to a {@link
* Row}.
*/
public static SerializableFunction<TimeContaining, Row> timeContainingToRowFn() {
return DEFAULT_SCHEMA_PROVIDER.toRowFunction(TIME_CONTAINING_TYPE_DESCRIPTOR);
}
/**
* Returns a {@link SerializableFunction} to convert from a {@link Row} to a {@link
* TimeContaining}.
*/
public static SerializableFunction<Row, TimeContaining> timeContainingFromRowFn() {
return DEFAULT_SCHEMA_PROVIDER.fromRowFunction(TIME_CONTAINING_TYPE_DESCRIPTOR);
}
private static final TypeDescriptor<ByteType> BYTE_TYPE_TYPE_DESCRIPTOR =
TypeDescriptor.of(ByteType.class);
/** The schema for {@link ByteType}. */
public static final Schema BYTE_TYPE_SCHEMA =
DEFAULT_SCHEMA_PROVIDER.schemaFor(BYTE_TYPE_TYPE_DESCRIPTOR);
/** Returns a {@link SerializableFunction} to convert from a {@link ByteType} to a {@link Row}. */
public static SerializableFunction<ByteType, Row> byteTypeToRowFn() {
return DEFAULT_SCHEMA_PROVIDER.toRowFunction(BYTE_TYPE_TYPE_DESCRIPTOR);
}
/** Returns a {@link SerializableFunction} to convert from a {@link Row} to a {@link ByteType}. */
public static SerializableFunction<Row, ByteType> byteTypeFromRowFn() {
return DEFAULT_SCHEMA_PROVIDER.fromRowFunction(BYTE_TYPE_TYPE_DESCRIPTOR);
}
private static final TypeDescriptor<ByteSequenceType> BYTE_SEQUENCE_TYPE_TYPE_DESCRIPTOR =
TypeDescriptor.of(ByteSequenceType.class);
/** The schema for {@link ByteSequenceType}. */
public static final Schema BYTE_SEQUENCE_TYPE_SCHEMA =
DEFAULT_SCHEMA_PROVIDER.schemaFor(BYTE_SEQUENCE_TYPE_TYPE_DESCRIPTOR);
/**
* Returns a {@link SerializableFunction} to convert from a {@link ByteSequenceType} to a {@link
* Row}.
*/
public static SerializableFunction<ByteSequenceType, Row> byteSequenceTypeToRowFn() {
return DEFAULT_SCHEMA_PROVIDER.toRowFunction(BYTE_SEQUENCE_TYPE_TYPE_DESCRIPTOR);
}
/**
* Returns a {@link SerializableFunction} to convert from a {@link Row} to a {@link
* ByteSequenceType}.
*/
public static SerializableFunction<Row, ByteSequenceType> byteSequenceTypeFromRowFn() {
return DEFAULT_SCHEMA_PROVIDER.fromRowFunction(BYTE_SEQUENCE_TYPE_TYPE_DESCRIPTOR);
}
private static final TypeDescriptor<ArrayPrimitiveDataTypes>
ARRAY_PRIMITIVE_DATA_TYPES_TYPE_DESCRIPTOR = TypeDescriptor.of(ArrayPrimitiveDataTypes.class);
/** The schema for {@link ArrayPrimitiveDataTypes}. */
public static final Schema ARRAY_PRIMITIVE_DATA_TYPES_SCHEMA =
DEFAULT_SCHEMA_PROVIDER.schemaFor(ARRAY_PRIMITIVE_DATA_TYPES_TYPE_DESCRIPTOR);
/**
* Returns a {@link SerializableFunction} to convert from a {@link ArrayPrimitiveDataTypes} to a
* {@link Row}.
*/
public static SerializableFunction<ArrayPrimitiveDataTypes, Row>
arrayPrimitiveDataTypesToRowFn() {
return DEFAULT_SCHEMA_PROVIDER.toRowFunction(ARRAY_PRIMITIVE_DATA_TYPES_TYPE_DESCRIPTOR);
}
/**
* Returns a {@link SerializableFunction} to convert from a {@link Row} to a {@link
* ArrayPrimitiveDataTypes}.
*/
public static SerializableFunction<Row, ArrayPrimitiveDataTypes>
arrayPrimitiveDataTypesFromRowFn() {
return DEFAULT_SCHEMA_PROVIDER.fromRowFunction(ARRAY_PRIMITIVE_DATA_TYPES_TYPE_DESCRIPTOR);
}
private static final TypeDescriptor<SinglyNestedDataTypes>
SINGLY_NESTED_DATA_TYPES_TYPE_DESCRIPTOR = TypeDescriptor.of(SinglyNestedDataTypes.class);
/** The schema for {@link SinglyNestedDataTypes}. */
public static final Schema SINGLY_NESTED_DATA_TYPES_SCHEMA =
DEFAULT_SCHEMA_PROVIDER.schemaFor(SINGLY_NESTED_DATA_TYPES_TYPE_DESCRIPTOR);
/**
* Returns a {@link SerializableFunction} to convert from a {@link SinglyNestedDataTypes} to a
* {@link Row}.
*/
public static SerializableFunction<SinglyNestedDataTypes, Row> singlyNestedDataTypesToRowFn() {
return DEFAULT_SCHEMA_PROVIDER.toRowFunction(SINGLY_NESTED_DATA_TYPES_TYPE_DESCRIPTOR);
}
/**
* Returns a {@link SerializableFunction} to convert from a {@link Row} to a {@link
* SinglyNestedDataTypes}.
*/
public static SerializableFunction<Row, SinglyNestedDataTypes> singlyNestedDataTypesFromRowFn() {
return DEFAULT_SCHEMA_PROVIDER.fromRowFunction(SINGLY_NESTED_DATA_TYPES_TYPE_DESCRIPTOR);
}
private static final TypeDescriptor<DoublyNestedDataTypes>
DOUBLY_NESTED_DATA_TYPES_TYPE_DESCRIPTOR = TypeDescriptor.of(DoublyNestedDataTypes.class);
/** The schema for {@link DoublyNestedDataTypes}. */
public static final Schema DOUBLY_NESTED_DATA_TYPES_SCHEMA =
DEFAULT_SCHEMA_PROVIDER.schemaFor(DOUBLY_NESTED_DATA_TYPES_TYPE_DESCRIPTOR);
/**
* Returns a {@link SerializableFunction} to convert from a {@link DoublyNestedDataTypes} to a
* {@link Row}.
*/
public static SerializableFunction<DoublyNestedDataTypes, Row> doublyNestedDataTypesToRowFn() {
return DEFAULT_SCHEMA_PROVIDER.toRowFunction(DOUBLY_NESTED_DATA_TYPES_TYPE_DESCRIPTOR);
}
/**
* Returns a {@link SerializableFunction} to convert from a {@link Row} to a {@link
* DoublyNestedDataTypes}.
*/
public static SerializableFunction<Row, DoublyNestedDataTypes> doublyNestedDataTypesFromRowFn() {
return DEFAULT_SCHEMA_PROVIDER.fromRowFunction(DOUBLY_NESTED_DATA_TYPES_TYPE_DESCRIPTOR);
}
/**
* Contains all primitive Java types i.e. String, Integer, etc and {@link BigDecimal}. The purpose
* of this class is to test schema-aware PTransforms with flat {@link Schema} {@link Row}s.
*/
@DefaultSchema(AutoValueSchema.class)
@AutoValue
public abstract static class AllPrimitiveDataTypes implements Serializable {
public abstract Boolean getABoolean();
public abstract BigDecimal getADecimal();
public abstract Double getADouble();
public abstract Float getAFloat();
public abstract Integer getAnInteger();
public abstract Long getALong();
public abstract String getAString();
public abstract Builder toBuilder();
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setABoolean(Boolean value);
public abstract Builder setADecimal(BigDecimal value);
public abstract Builder setADouble(Double value);
public abstract Builder setAFloat(Float value);
public abstract Builder setAnInteger(Integer value);
public abstract Builder setALong(Long value);
public abstract Builder setAString(String value);
public abstract AllPrimitiveDataTypes build();
}
}
/**
* Contains all nullable primitive Java types i.e. String, Integer, etc and {@link BigDecimal}.
* The purpose of this class is to test schema-aware PTransforms with flat {@link Schema} {@link
* Row}s.
*/
@DefaultSchema(AutoValueSchema.class)
@AutoValue
public abstract static class NullableAllPrimitiveDataTypes implements Serializable {
@Nullable
public abstract Boolean getABoolean();
@Nullable
public abstract Double getADouble();
@Nullable
public abstract Float getAFloat();
@Nullable
public abstract Integer getAnInteger();
@Nullable
public abstract Long getALong();
@Nullable
public abstract String getAString();
public abstract Builder toBuilder();
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setABoolean(Boolean value);
public abstract Builder setADouble(Double value);
public abstract Builder setAFloat(Float value);
public abstract Builder setAnInteger(Integer value);
public abstract Builder setALong(Long value);
public abstract Builder setAString(String value);
public abstract NullableAllPrimitiveDataTypes build();
}
}
/**
* Contains time-related types. The purpose of this class is to test schema-aware PTransforms with
* time-related {@link Schema.FieldType} containing {@link Row}s.
*/
@DefaultSchema(AutoValueSchema.class)
@AutoValue
public abstract static class TimeContaining {
public abstract Instant getInstant();
public abstract List<Instant> getInstantList();
public abstract Builder toBuilder();
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setInstant(Instant value);
public abstract Builder setInstantList(List<Instant> value);
public abstract TimeContaining build();
}
}
/**
* Contains {@link Byte} type. The purpose of this class is to test schema-aware PTransforms with
* {@link Row}s containing this type. It is isolated because not all file formats support a single
* byte data type (e.g. Avro, Parquet).
*/
@DefaultSchema(AutoValueSchema.class)
@AutoValue
public abstract static class ByteType {
public abstract Byte getByte();
public abstract List<Byte> getByteList();
public abstract Builder toBuilder();
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setByte(Byte value);
public abstract Builder setByteList(List<Byte> value);
public abstract ByteType build();
}
}
/**
* Contains {@link byte} type. The purpose of this class is to test schema-aware PTransforms with
* {@link Row}s containing a sequence of bytes. It is isolated because not all file formats
* support byte sequences (e.g. JSON, CSV, XML).
*/
@DefaultSchema(AutoValueSchema.class)
@AutoValue
public abstract static class ByteSequenceType {
@SuppressWarnings("mutable")
public abstract byte[] getByteSequence();
@SuppressWarnings("mutable")
public abstract List<byte[]> getByteSequenceList();
public abstract Builder toBuilder();
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setByteSequence(byte[] value);
public abstract Builder setByteSequenceList(List<byte[]> value);
public abstract ByteSequenceType build();
}
}
/**
* Contains arrays of all primitive Java types i.e. String, Integer, etc and {@link BigDecimal}.
* The purpose of this class is to test schema-aware PTransforms with {@link Row}s containing
* repeated primitive Java types.
*/
@DefaultSchema(AutoValueSchema.class)
@AutoValue
public abstract static class ArrayPrimitiveDataTypes {
public abstract List<Boolean> getBooleanList();
public abstract List<Double> getDoubleList();
public abstract List<Float> getFloatList();
public abstract List<Integer> getIntegerList();
public abstract List<Long> getLongList();
public abstract List<String> getStringList();
public abstract Builder toBuilder();
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setBooleanList(List<Boolean> value);
public abstract Builder setDoubleList(List<Double> value);
public abstract Builder setFloatList(List<Float> value);
public abstract Builder setIntegerList(List<Integer> value);
public abstract Builder setLongList(List<Long> value);
public abstract Builder setStringList(List<String> value);
public abstract ArrayPrimitiveDataTypes build();
}
}
/**
* Contains a singly nested and repeated {@link AllPrimitiveDataTypes}. The purpose of this class
* is to test schema-aware PTransforms with {@link Row}s containing nested and repeated complex
* Java types.
*/
@DefaultSchema(AutoValueSchema.class)
@AutoValue
public abstract static class SinglyNestedDataTypes {
public abstract AllPrimitiveDataTypes getAllPrimitiveDataTypes();
public abstract List<AllPrimitiveDataTypes> getAllPrimitiveDataTypesList();
public abstract Builder toBuilder();
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setAllPrimitiveDataTypes(AllPrimitiveDataTypes value);
public abstract Builder setAllPrimitiveDataTypesList(List<AllPrimitiveDataTypes> value);
public abstract SinglyNestedDataTypes build();
}
}
/**
* Contains a nested and repeated {@link SinglyNestedDataTypes}. The purpose of this class is to
* test schema-aware PTransforms with {@link Row}s containing deeper nested and repeated complex
* Java types.
*/
@DefaultSchema(AutoValueSchema.class)
@AutoValue
public abstract static class DoublyNestedDataTypes {
public abstract SinglyNestedDataTypes getSinglyNestedDataTypes();
public abstract List<SinglyNestedDataTypes> getSinglyNestedDataTypesList();
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setSinglyNestedDataTypes(SinglyNestedDataTypes value);
public abstract Builder setSinglyNestedDataTypesList(List<SinglyNestedDataTypes> value);
public abstract DoublyNestedDataTypes build();
}
}
}