@Override public ValueReader<?> array(Schema array, ValueReader<?> elementReader) { if (array.getLogicalType() instanceof LogicalMap) { ValueReaders.StructReader<?> keyValueReader = (ValueReaders.StructReader) elementReader; ValueReader<?> keyReader = keyValueReader.reader(0); ValueReader<?> valueReader = keyValueReader.reader(1); if (keyReader == ValueReaders.utf8s()) { return ValueReaders.arrayMap(ValueReaders.strings(), valueReader); } return ValueReaders.arrayMap(keyReader, valueReader); } return ValueReaders.array(elementReader); }
@Override public S read(Decoder decoder, Object reuse) throws IOException { S struct = reuseOrCreate(reuse); if (decoder instanceof ResolvingDecoder) { // this may not set all of the fields. nulls are set by default. for (org.apache.avro.Schema.Field field : ((ResolvingDecoder) decoder).readFieldOrder()) { Object reusedValue = get(struct, field.pos()); set(struct, field.pos(), readers[field.pos()].read(decoder, reusedValue)); } } else { for (int i = 0; i < readers.length; i += 1) { Object reusedValue = get(struct, i); set(struct, i, readers[i].read(decoder, reusedValue)); } } return struct; } }
@Override public ValueReader<?> array(Schema array, ValueReader<?> elementReader) { if (array.getLogicalType() instanceof LogicalMap) { ValueReaders.StructReader<?> keyValueReader = (ValueReaders.StructReader) elementReader; ValueReader<?> keyReader = keyValueReader.reader(0); ValueReader<?> valueReader = keyValueReader.reader(1); return ValueReaders.arrayMap(keyReader, valueReader); } return ValueReaders.array(elementReader); }