if (keyValue.getField("value").schema() != element.getField("value").schema()) { return AvroSchemaUtil.createMap( keyId, keyValue.getField("key").schema(), valueId, element.getField("value").schema());
@Override public Schema map(Types.MapType map, Schema keySchema, Schema valueSchema) { Schema mapSchema = results.get(map); if (mapSchema != null) { return mapSchema; } if (keySchema.getType() == Schema.Type.STRING) { // if the map has string keys, use Avro's map type mapSchema = Schema.createMap( map.isValueOptional() ? toOption(valueSchema) : valueSchema); mapSchema.addProp(AvroSchemaUtil.KEY_ID_PROP, map.keyId()); mapSchema.addProp(AvroSchemaUtil.VALUE_ID_PROP, map.valueId()); } else { mapSchema = AvroSchemaUtil.createMap(map.keyId(), keySchema, map.valueId(), map.isValueOptional() ? toOption(valueSchema) : valueSchema); } results.put(map, mapSchema); return mapSchema; }
@Test public void testMapOfLongToBytes() { Type map = Types.MapType.ofRequired(33, 34, Types.LongType.get(), Types.BinaryType.get()); Schema schema = AvroSchemaUtil.createMap( 33, Schema.create(Schema.Type.LONG), 34, Schema.create(Schema.Type.BYTES)); Assert.assertEquals("Avro schema to map", map, AvroSchemaUtil.convert(schema)); Assert.assertEquals("Map to Avro schema", schema, AvroSchemaUtil.convert(map)); }
@Test public void testMapOfListToStructs() { Type map = Types.MapType.ofRequired(33, 34, Types.ListType.ofRequired(35, Types.IntegerType.get()), Types.StructType.of( required(36, "a", Types.IntegerType.get()), optional(37, "b", Types.IntegerType.get()) )); Schema schema = AvroSchemaUtil.createMap( 33, addElementId(35, Schema.createArray(Schema.create(Schema.Type.INT))), 34, record("r34", requiredField(36, "a", Schema.create(Schema.Type.INT)), optionalField(37, "b", Schema.create(Schema.Type.INT)))); Assert.assertEquals("Avro schema to map", map, AvroSchemaUtil.convert(schema)); Assert.assertEquals("Map to Avro schema", schema, AvroSchemaUtil.convert(map)); }