/** Returns true if two Schemas have the same fields, but possibly in different orders. */ public boolean equivalent(Schema other) { return equivalent(other, EquivalenceNullablePolicy.SAME); }
/** Returns true if this Schema can be assigned to another Schema, igmoring nullable. * */ public boolean assignableToIgnoreNullable(Schema other) { return equivalent(other, EquivalenceNullablePolicy.IGNORE); }
/** Returns true if this Schema can be assigned to another Schema. * */ public boolean assignableTo(Schema other) { return equivalent(other, EquivalenceNullablePolicy.WEAKEN); }
public static void assertSchemaEquivalent(Schema expected, Schema actual) { assertTrue(actual.equivalent(expected)); } }
@Test public void testRegisterJavaBean() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); registry.registerJavaBean(SimpleBean.class); Schema schema = registry.getSchema(SimpleBean.class); assertTrue(SIMPLE_BEAN_SCHEMA.equivalent(schema)); } }
@Test public void testRegisterPojo() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); registry.registerPOJO(SimplePOJO.class); Schema schema = registry.getSchema(SimplePOJO.class); assertTrue(SIMPLE_POJO_SCHEMA.equivalent(schema)); }
@Test public void testMapNotEquivalent() { Schema schema1 = Schema.builder().addMapField("foo", FieldType.STRING, FieldType.BOOLEAN).build(); Schema schema2 = Schema.builder().addMapField("foo", FieldType.DATETIME, FieldType.BOOLEAN).build(); assertNotEquals(schema1, schema2); assertFalse(schema1.equivalent(schema2)); schema1 = Schema.builder().addMapField("foo", FieldType.STRING, FieldType.BOOLEAN).build(); schema2 = Schema.builder().addMapField("foo", FieldType.STRING, FieldType.STRING).build(); assertNotEquals(schema1, schema2); assertFalse(schema1.equivalent(schema2)); }
@Test public void testArrayNotEquivalent() { Schema schema1 = Schema.builder().addArrayField("foo", FieldType.BOOLEAN).build(); Schema schema2 = Schema.builder().addArrayField("foo", FieldType.DATETIME).build(); assertNotEquals(schema1, schema2); assertFalse(schema1.equivalent(schema2)); }
@Test public void testPrimitiveNotEquivalent() { Schema schema1 = Schema.builder().addInt64Field("foo").build(); Schema schema2 = Schema.builder().addStringField("foo").build(); assertNotEquals(schema1, schema2); assertFalse(schema1.equivalent(schema2)); schema1 = Schema.builder().addInt64Field("foo").build(); schema2 = Schema.builder().addInt64Field("bar").build(); assertNotEquals(schema1, schema2); assertFalse(schema1.equivalent(schema2)); schema1 = Schema.builder().addInt64Field("foo").build(); schema2 = Schema.builder().addNullableField("foo", FieldType.INT64).build(); assertNotEquals(schema1, schema2); assertFalse(schema1.equivalent(schema2)); }
private boolean equivalent(FieldType other) { if (!other.getTypeName().equals(getTypeName())) { return false; } switch (getTypeName()) { case ROW: if (!other.getRowSchema().equivalent(getRowSchema())) { return false; } break; case ARRAY: if (!other.getCollectionElementType().equivalent(getCollectionElementType())) { return false; } break; case MAP: if (!other.getMapKeyType().equivalent(getMapKeyType()) || !other.getMapValueType().equivalent(getMapValueType())) { return false; } break; default: return other.equals(this); } return true; }
@Test @Category(NeedsRunner.class) public void testOutputCoders() { Schema keySchema = Schema.builder().addStringField("field1").build(); PCollection<KV<Row, Iterable<POJO>>> grouped = pipeline .apply(Create.of(new POJO("key1", 1, "value1"))) .apply(Group.byFieldNames("field1")); // Make sure that the key has the right schema. PCollection<Row> keys = grouped.apply(Keys.create()); assertTrue(keys.getSchema().equivalent(keySchema)); // Make sure that the value has the right schema. PCollection<POJO> values = grouped.apply(Values.create()).apply(Flatten.iterables()); assertTrue(values.getSchema().equivalent(POJO_SCHEMA)); pipeline.run(); }
@Test public void testNestedNotEquivalent() { Schema nestedSchema1 = Schema.builder().addInt64Field("foo").build(); Schema nestedSchema2 = Schema.builder().addStringField("foo").build(); Schema schema1 = Schema.builder().addRowField("foo", nestedSchema1).build(); Schema schema2 = Schema.builder().addRowField("foo", nestedSchema2).build(); assertNotEquals(schema1, schema2); assertFalse(schema1.equivalent(schema2)); }
@Test public void testNestedArraysNotEquivalent() { Schema nestedSchema1 = Schema.builder().addInt64Field("foo").build(); Schema nestedSchema2 = Schema.builder().addStringField("foo").build(); Schema schema1 = Schema.builder().addArrayField("foo", FieldType.row(nestedSchema1)).build(); Schema schema2 = Schema.builder().addArrayField("foo", FieldType.row(nestedSchema2)).build(); assertNotEquals(schema1, schema2); assertFalse(schema1.equivalent(schema2)); }
@Test public void testNestedMapsNotEquivalent() { Schema nestedSchema1 = Schema.builder().addInt64Field("foo").build(); Schema nestedSchema2 = Schema.builder().addStringField("foo").build(); Schema schema1 = Schema.builder().addMapField("foo", FieldType.STRING, FieldType.row(nestedSchema1)).build(); Schema schema2 = Schema.builder().addMapField("foo", FieldType.STRING, FieldType.row(nestedSchema2)).build(); assertNotEquals(schema1, schema2); assertFalse(schema1.equivalent(schema2)); } }
@Test public void testEquivalent() { final Schema expectedNested1 = Schema.builder().addStringField("yard1").addInt64Field("yard2").build(); final Schema expectedSchema1 = Schema.builder() .addStringField("field1") .addInt64Field("field2") .addRowField("field3", expectedNested1) .addArrayField("field4", FieldType.row(expectedNested1)) .addMapField("field5", FieldType.STRING, FieldType.row(expectedNested1)) .build(); final Schema expectedNested2 = Schema.builder().addInt64Field("yard2").addStringField("yard1").build(); final Schema expectedSchema2 = Schema.builder() .addMapField("field5", FieldType.STRING, FieldType.row(expectedNested2)) .addArrayField("field4", FieldType.row(expectedNested2)) .addRowField("field3", expectedNested2) .addInt64Field("field2") .addStringField("field1") .build(); assertNotEquals(expectedSchema1, expectedSchema2); assertTrue(expectedSchema1.equivalent(expectedSchema2)); }