in adapter/avro/src/main/java/org/apache/arrow/adapter/avro/AvroToArrowUtils.java [425:510]
private static Consumer createSkipConsumer(Schema schema) {
SkipFunction skipFunction;
Schema.Type type = schema.getType();
switch (type) {
case UNION:
List<Consumer> unionDelegates =
schema.getTypes().stream().map(s -> createSkipConsumer(s)).collect(Collectors.toList());
skipFunction = decoder -> unionDelegates.get(decoder.readInt()).consume(decoder);
break;
case ARRAY:
Consumer elementDelegate = createSkipConsumer(schema.getElementType());
skipFunction =
decoder -> {
for (long i = decoder.skipArray(); i != 0; i = decoder.skipArray()) {
for (long j = 0; j < i; j++) {
elementDelegate.consume(decoder);
}
}
};
break;
case MAP:
Consumer valueDelegate = createSkipConsumer(schema.getValueType());
skipFunction =
decoder -> {
for (long i = decoder.skipMap(); i != 0; i = decoder.skipMap()) {
for (long j = 0; j < i; j++) {
decoder.skipString(); // Discard key
valueDelegate.consume(decoder);
}
}
};
break;
case RECORD:
List<Consumer> delegates =
schema.getFields().stream()
.map(field -> createSkipConsumer(field.schema()))
.collect(Collectors.toList());
skipFunction =
decoder -> {
for (Consumer consumer : delegates) {
consumer.consume(decoder);
}
};
break;
case ENUM:
skipFunction = decoder -> decoder.readEnum();
break;
case STRING:
skipFunction = decoder -> decoder.skipString();
break;
case FIXED:
skipFunction = decoder -> decoder.skipFixed(schema.getFixedSize());
break;
case INT:
skipFunction = decoder -> decoder.readInt();
break;
case BOOLEAN:
skipFunction = decoder -> decoder.skipFixed(1);
break;
case LONG:
skipFunction = decoder -> decoder.readLong();
break;
case FLOAT:
skipFunction = decoder -> decoder.readFloat();
break;
case DOUBLE:
skipFunction = decoder -> decoder.readDouble();
break;
case BYTES:
skipFunction = decoder -> decoder.skipBytes();
break;
case NULL:
skipFunction = decoder -> {};
break;
default:
// no-op, shouldn't get here
throw new UnsupportedOperationException("Invalid avro type: " + type.getName());
}
return new SkipConsumer(skipFunction);
}