Search in sources :

Example 1 with EnumerationType

use of org.apache.beam.sdk.schemas.logicaltypes.EnumerationType in project beam by apache.

the class JavaFieldSchemaTest method testEnumFieldFromRow.

@Test
public void testEnumFieldFromRow() throws NoSuchSchemaException {
    SchemaRegistry registry = SchemaRegistry.createDefault();
    Schema schema = registry.getSchema(PojoWithEnum.class);
    SchemaTestUtils.assertSchemaEquivalent(POJO_WITH_ENUM_SCHEMA, schema);
    EnumerationType enumerationType = ENUMERATION;
    List<EnumerationType.Value> allColors = Lists.newArrayList(enumerationType.valueOf("RED"), enumerationType.valueOf("GREEN"), enumerationType.valueOf("BLUE"));
    Row redRow = Row.withSchema(POJO_WITH_ENUM_SCHEMA).addValues(enumerationType.valueOf("RED"), allColors).build();
    Row greenRow = Row.withSchema(POJO_WITH_ENUM_SCHEMA).addValues(enumerationType.valueOf("GREEN"), allColors).build();
    Row blueRow = Row.withSchema(POJO_WITH_ENUM_SCHEMA).addValues(enumerationType.valueOf("BLUE"), allColors).build();
    SerializableFunction<Row, PojoWithEnum> fromRow = registry.getFromRowFunction(PojoWithEnum.class);
    List<Color> allColorsJava = Lists.newArrayList(Color.RED, Color.GREEN, Color.BLUE);
    assertEquals(new PojoWithEnum(Color.RED, allColorsJava), fromRow.apply(redRow));
    assertEquals(new PojoWithEnum(Color.GREEN, allColorsJava), fromRow.apply(greenRow));
    assertEquals(new PojoWithEnum(Color.BLUE, allColorsJava), fromRow.apply(blueRow));
}
Also used : Color(org.apache.beam.sdk.schemas.utils.TestPOJOs.PojoWithEnum.Color) EnumerationType(org.apache.beam.sdk.schemas.logicaltypes.EnumerationType) PojoWithEnum(org.apache.beam.sdk.schemas.utils.TestPOJOs.PojoWithEnum) Row(org.apache.beam.sdk.values.Row) Test(org.junit.Test)

Example 2 with EnumerationType

use of org.apache.beam.sdk.schemas.logicaltypes.EnumerationType in project beam by apache.

the class RowCoderTest method testLogicalTypeInCollection.

@Test
public void testLogicalTypeInCollection() throws Exception {
    EnumerationType enumeration = EnumerationType.create("one", "two", "three");
    Schema schema = Schema.builder().addArrayField("f_enum_array", FieldType.logicalType(enumeration)).build();
    Row row = Row.withSchema(schema).addArray(enumeration.valueOf("two"), enumeration.valueOf("three")).build();
    CoderProperties.coderDecodeEncodeEqual(RowCoder.of(schema), row);
}
Also used : Schema(org.apache.beam.sdk.schemas.Schema) EnumerationType(org.apache.beam.sdk.schemas.logicaltypes.EnumerationType) Row(org.apache.beam.sdk.values.Row) Test(org.junit.Test)

Example 3 with EnumerationType

use of org.apache.beam.sdk.schemas.logicaltypes.EnumerationType in project beam by apache.

the class RowCoderTest method testNestedLogicalTypes.

@Test
public void testNestedLogicalTypes() throws Exception {
    EnumerationType enumeration = EnumerationType.create("one", "two", "three");
    Schema schema = Schema.builder().addLogicalTypeField("f_nested_logical_type", new NestedLogicalType(enumeration)).build();
    Row row = Row.withSchema(schema).addValue("two").build();
    CoderProperties.coderDecodeEncodeEqual(RowCoder.of(schema), row);
}
Also used : Schema(org.apache.beam.sdk.schemas.Schema) EnumerationType(org.apache.beam.sdk.schemas.logicaltypes.EnumerationType) Row(org.apache.beam.sdk.values.Row) Test(org.junit.Test)

Example 4 with EnumerationType

use of org.apache.beam.sdk.schemas.logicaltypes.EnumerationType in project beam by apache.

the class AvroUtils method getFieldSchema.

private static org.apache.avro.Schema getFieldSchema(Schema.FieldType fieldType, String fieldName, String namespace) {
    org.apache.avro.Schema baseType;
    switch(fieldType.getTypeName()) {
        case BYTE:
        case INT16:
        case INT32:
            baseType = org.apache.avro.Schema.create(Type.INT);
            break;
        case INT64:
            baseType = org.apache.avro.Schema.create(Type.LONG);
            break;
        case DECIMAL:
            baseType = LogicalTypes.decimal(Integer.MAX_VALUE).addToSchema(org.apache.avro.Schema.create(Type.BYTES));
            break;
        case FLOAT:
            baseType = org.apache.avro.Schema.create(Type.FLOAT);
            break;
        case DOUBLE:
            baseType = org.apache.avro.Schema.create(Type.DOUBLE);
            break;
        case STRING:
            baseType = org.apache.avro.Schema.create(Type.STRING);
            break;
        case DATETIME:
            // TODO: There is a desire to move Beam schema DATETIME to a micros representation. When
            // this is done, this logical type needs to be changed.
            baseType = LogicalTypes.timestampMillis().addToSchema(org.apache.avro.Schema.create(Type.LONG));
            break;
        case BOOLEAN:
            baseType = org.apache.avro.Schema.create(Type.BOOLEAN);
            break;
        case BYTES:
            baseType = org.apache.avro.Schema.create(Type.BYTES);
            break;
        case LOGICAL_TYPE:
            switch(fieldType.getLogicalType().getIdentifier()) {
                case FixedBytes.IDENTIFIER:
                    FixedBytesField fixedBytesField = checkNotNull(FixedBytesField.fromBeamFieldType(fieldType));
                    baseType = fixedBytesField.toAvroType("fixed", namespace + "." + fieldName);
                    break;
                case EnumerationType.IDENTIFIER:
                    EnumerationType enumerationType = fieldType.getLogicalType(EnumerationType.class);
                    baseType = org.apache.avro.Schema.createEnum(fieldName, "", "", enumerationType.getValues());
                    break;
                case OneOfType.IDENTIFIER:
                    OneOfType oneOfType = fieldType.getLogicalType(OneOfType.class);
                    baseType = org.apache.avro.Schema.createUnion(oneOfType.getOneOfSchema().getFields().stream().map(x -> getFieldSchema(x.getType(), x.getName(), namespace)).collect(Collectors.toList()));
                    break;
                case "CHAR":
                case "NCHAR":
                    baseType = buildHiveLogicalTypeSchema("char", (int) fieldType.getLogicalType().getArgument());
                    break;
                case "NVARCHAR":
                case "VARCHAR":
                case "LONGNVARCHAR":
                case "LONGVARCHAR":
                    baseType = buildHiveLogicalTypeSchema("varchar", (int) fieldType.getLogicalType().getArgument());
                    break;
                case "DATE":
                    baseType = LogicalTypes.date().addToSchema(org.apache.avro.Schema.create(Type.INT));
                    break;
                case "TIME":
                    baseType = LogicalTypes.timeMillis().addToSchema(org.apache.avro.Schema.create(Type.INT));
                    break;
                default:
                    throw new RuntimeException("Unhandled logical type " + fieldType.getLogicalType().getIdentifier());
            }
            break;
        case ARRAY:
        case ITERABLE:
            baseType = org.apache.avro.Schema.createArray(getFieldSchema(fieldType.getCollectionElementType(), fieldName, namespace));
            break;
        case MAP:
            if (fieldType.getMapKeyType().getTypeName().isStringType()) {
                // Avro only supports string keys in maps.
                baseType = org.apache.avro.Schema.createMap(getFieldSchema(fieldType.getMapValueType(), fieldName, namespace));
            } else {
                throw new IllegalArgumentException("Avro only supports maps with string keys");
            }
            break;
        case ROW:
            baseType = toAvroSchema(fieldType.getRowSchema(), fieldName, namespace);
            break;
        default:
            throw new IllegalArgumentException("Unexpected type " + fieldType);
    }
    return fieldType.getNullable() ? ReflectData.makeNullable(baseType) : baseType;
}
Also used : OneOfType(org.apache.beam.sdk.schemas.logicaltypes.OneOfType) TypeCasting(org.apache.beam.vendor.bytebuddy.v1_11_0.net.bytebuddy.implementation.bytecode.assign.TypeCasting) ObjectInputStream(java.io.ObjectInputStream) SerializableFunction(org.apache.beam.sdk.transforms.SerializableFunction) SimpleFunction(org.apache.beam.sdk.transforms.SimpleFunction) ByteBuffer(java.nio.ByteBuffer) AvroName(org.apache.avro.reflect.AvroName) BigDecimal(java.math.BigDecimal) ByteArrayInputStream(java.io.ByteArrayInputStream) Strings(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Strings) FixedBytes(org.apache.beam.sdk.schemas.logicaltypes.FixedBytes) JodaTimestampConversion(org.apache.beam.sdk.coders.AvroCoder.JodaTimestampConversion) Map(java.util.Map) Iterables(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Iterables) EnumerationType(org.apache.beam.sdk.schemas.logicaltypes.EnumerationType) Days(org.joda.time.Days) Method(java.lang.reflect.Method) SpecificData(org.apache.avro.specific.SpecificData) Conversions(org.apache.avro.Conversions) Utf8(org.apache.avro.util.Utf8) TypeCreation(org.apache.beam.vendor.bytebuddy.v1_11_0.net.bytebuddy.implementation.bytecode.TypeCreation) SchemaCoder(org.apache.beam.sdk.schemas.SchemaCoder) ReadableInstant(org.joda.time.ReadableInstant) FieldType(org.apache.beam.sdk.schemas.Schema.FieldType) Collectors(java.util.stream.Collectors) AvroRecordSchema(org.apache.beam.sdk.schemas.AvroRecordSchema) TypeConversion(org.apache.beam.sdk.schemas.utils.ByteBuddyUtils.TypeConversion) StandardCharsets(java.nio.charset.StandardCharsets) Objects(java.util.Objects) List(java.util.List) GenericRecordBuilder(org.apache.avro.generic.GenericRecordBuilder) Preconditions.checkNotNull(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull) TypeDescriptor(org.apache.beam.sdk.values.TypeDescriptor) ByteArrayOutputStream(java.io.ByteArrayOutputStream) ConvertType(org.apache.beam.sdk.schemas.utils.ByteBuddyUtils.ConvertType) Experimental(org.apache.beam.sdk.annotations.Experimental) CaseFormat(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.CaseFormat) Duration(org.joda.time.Duration) HashMap(java.util.HashMap) SpecificRecord(org.apache.avro.specific.SpecificRecord) ArrayList(java.util.ArrayList) GenericData(org.apache.avro.generic.GenericData) ReflectData(org.apache.avro.reflect.ReflectData) LogicalTypes(org.apache.avro.LogicalTypes) Kind(org.apache.beam.sdk.annotations.Experimental.Kind) SchemaUserTypeCreator(org.apache.beam.sdk.schemas.SchemaUserTypeCreator) Preconditions.checkArgument(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument) Maps(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Maps) AvroIgnore(org.apache.avro.reflect.AvroIgnore) ObjectOutputStream(java.io.ObjectOutputStream) FieldValueTypeInformation(org.apache.beam.sdk.schemas.FieldValueTypeInformation) ForLoadedType(org.apache.beam.vendor.bytebuddy.v1_11_0.net.bytebuddy.description.type.TypeDescription.ForLoadedType) Row(org.apache.beam.sdk.values.Row) Nonnull(javax.annotation.Nonnull) Type(org.apache.avro.Schema.Type) Nullable(org.checkerframework.checker.nullness.qual.Nullable) Field(org.apache.beam.sdk.schemas.Schema.Field) GenericRecord(org.apache.avro.generic.GenericRecord) Duplication(org.apache.beam.vendor.bytebuddy.v1_11_0.net.bytebuddy.implementation.bytecode.Duplication) GenericFixed(org.apache.avro.generic.GenericFixed) LogicalType(org.apache.avro.LogicalType) Compound(org.apache.beam.vendor.bytebuddy.v1_11_0.net.bytebuddy.implementation.bytecode.StackManipulation.Compound) ConvertValueForGetter(org.apache.beam.sdk.schemas.utils.ByteBuddyUtils.ConvertValueForGetter) ElementMatchers(org.apache.beam.vendor.bytebuddy.v1_11_0.net.bytebuddy.matcher.ElementMatchers) Lists(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Lists) IOException(java.io.IOException) AvroCoder(org.apache.beam.sdk.coders.AvroCoder) Schema(org.apache.beam.sdk.schemas.Schema) TypeName(org.apache.beam.sdk.schemas.Schema.TypeName) StackManipulation(org.apache.beam.vendor.bytebuddy.v1_11_0.net.bytebuddy.implementation.bytecode.StackManipulation) MethodInvocation(org.apache.beam.vendor.bytebuddy.v1_11_0.net.bytebuddy.implementation.bytecode.member.MethodInvocation) ConvertValueForSetter(org.apache.beam.sdk.schemas.utils.ByteBuddyUtils.ConvertValueForSetter) Instant(org.joda.time.Instant) TypeConversionsFactory(org.apache.beam.sdk.schemas.utils.ByteBuddyUtils.TypeConversionsFactory) AvroRuntimeException(org.apache.avro.AvroRuntimeException) FieldValueGetter(org.apache.beam.sdk.schemas.FieldValueGetter) AvroRuntimeException(org.apache.avro.AvroRuntimeException) EnumerationType(org.apache.beam.sdk.schemas.logicaltypes.EnumerationType) OneOfType(org.apache.beam.sdk.schemas.logicaltypes.OneOfType)

Example 5 with EnumerationType

use of org.apache.beam.sdk.schemas.logicaltypes.EnumerationType in project beam by apache.

the class AvroUtils method convertEnumStrict.

private static Object convertEnumStrict(Object value, Schema.FieldType fieldType) {
    checkTypeName(fieldType.getTypeName(), TypeName.LOGICAL_TYPE, "enum");
    checkArgument(fieldType.getLogicalType().getIdentifier().equals(EnumerationType.IDENTIFIER));
    EnumerationType enumerationType = fieldType.getLogicalType(EnumerationType.class);
    return enumerationType.valueOf(value.toString());
}
Also used : EnumerationType(org.apache.beam.sdk.schemas.logicaltypes.EnumerationType)

Aggregations

EnumerationType (org.apache.beam.sdk.schemas.logicaltypes.EnumerationType)13 Test (org.junit.Test)9 Schema (org.apache.beam.sdk.schemas.Schema)8 Row (org.apache.beam.sdk.values.Row)7 Schema.toSchema (org.apache.beam.sdk.schemas.Schema.toSchema)4 Row.toRow (org.apache.beam.sdk.values.Row.toRow)4 Map (java.util.Map)3 OneOfType (org.apache.beam.sdk.schemas.logicaltypes.OneOfType)3 Nullable (org.checkerframework.checker.nullness.qual.Nullable)3 BigDecimal (java.math.BigDecimal)2 HashMap (java.util.HashMap)2 AvroRuntimeException (org.apache.avro.AvroRuntimeException)2 Conversions (org.apache.avro.Conversions)2 LogicalType (org.apache.avro.LogicalType)2 Utf8 (org.apache.avro.util.Utf8)2 ByteArrayInputStream (java.io.ByteArrayInputStream)1 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 IOException (java.io.IOException)1 ObjectInputStream (java.io.ObjectInputStream)1 ObjectOutputStream (java.io.ObjectOutputStream)1