use of org.apache.avro.generic.GenericData.Array in project nifi by apache.
the class AvroTypeUtil method normalizeValue.
/**
* Convert an Avro object to a normal Java objects for further processing.
* The counter-part method which convert a raw value to an Avro object is {@link #convertToAvroObject(Object, Schema, String)}
*/
private static Object normalizeValue(final Object value, final Schema avroSchema, final String fieldName) {
if (value == null) {
return null;
}
switch(avroSchema.getType()) {
case INT:
{
final LogicalType logicalType = avroSchema.getLogicalType();
if (logicalType == null) {
return value;
}
final String logicalName = logicalType.getName();
if (LOGICAL_TYPE_DATE.equals(logicalName)) {
// date logical name means that the value is number of days since Jan 1, 1970
return new java.sql.Date(TimeUnit.DAYS.toMillis((int) value));
} else if (LOGICAL_TYPE_TIME_MILLIS.equals(logicalName)) {
// time-millis logical name means that the value is number of milliseconds since midnight.
return new java.sql.Time((int) value);
}
break;
}
case LONG:
{
final LogicalType logicalType = avroSchema.getLogicalType();
if (logicalType == null) {
return value;
}
final String logicalName = logicalType.getName();
if (LOGICAL_TYPE_TIME_MICROS.equals(logicalName)) {
return new java.sql.Time(TimeUnit.MICROSECONDS.toMillis((long) value));
} else if (LOGICAL_TYPE_TIMESTAMP_MILLIS.equals(logicalName)) {
return new java.sql.Timestamp((long) value);
} else if (LOGICAL_TYPE_TIMESTAMP_MICROS.equals(logicalName)) {
return new java.sql.Timestamp(TimeUnit.MICROSECONDS.toMillis((long) value));
}
break;
}
case UNION:
if (value instanceof GenericData.Record) {
final GenericData.Record avroRecord = (GenericData.Record) value;
return normalizeValue(value, avroRecord.getSchema(), fieldName);
}
return convertUnionFieldValue(value, avroSchema, schema -> normalizeValue(value, schema, fieldName), fieldName);
case RECORD:
final GenericData.Record record = (GenericData.Record) value;
final Schema recordSchema = record.getSchema();
final List<Field> recordFields = recordSchema.getFields();
final Map<String, Object> values = new HashMap<>(recordFields.size());
for (final Field field : recordFields) {
final Object avroFieldValue = record.get(field.name());
final Object fieldValue = normalizeValue(avroFieldValue, field.schema(), fieldName + "/" + field.name());
values.put(field.name(), fieldValue);
}
final RecordSchema childSchema = AvroTypeUtil.createSchema(recordSchema);
return new MapRecord(childSchema, values);
case BYTES:
final ByteBuffer bb = (ByteBuffer) value;
final LogicalType logicalType = avroSchema.getLogicalType();
if (logicalType != null && LOGICAL_TYPE_DECIMAL.equals(logicalType.getName())) {
return new Conversions.DecimalConversion().fromBytes(bb, avroSchema, logicalType);
}
return AvroTypeUtil.convertByteArray(bb.array());
case FIXED:
final GenericFixed fixed = (GenericFixed) value;
return AvroTypeUtil.convertByteArray(fixed.bytes());
case ENUM:
return value.toString();
case NULL:
return null;
case STRING:
return value.toString();
case ARRAY:
final GenericData.Array<?> array = (GenericData.Array<?>) value;
final Object[] valueArray = new Object[array.size()];
for (int i = 0; i < array.size(); i++) {
final Schema elementSchema = avroSchema.getElementType();
valueArray[i] = normalizeValue(array.get(i), elementSchema, fieldName + "[" + i + "]");
}
return valueArray;
case MAP:
final Map<?, ?> avroMap = (Map<?, ?>) value;
final Map<String, Object> map = new HashMap<>(avroMap.size());
for (final Map.Entry<?, ?> entry : avroMap.entrySet()) {
Object obj = entry.getValue();
if (obj instanceof Utf8 || obj instanceof CharSequence) {
obj = obj.toString();
}
final String key = entry.getKey().toString();
obj = normalizeValue(obj, avroSchema.getValueType(), fieldName + "[" + key + "]");
map.put(key, obj);
}
return map;
}
return value;
}
use of org.apache.avro.generic.GenericData.Array in project nifi by apache.
the class TestWriteAvroResult method assertMatch.
protected void assertMatch(final Record record, final GenericRecord avroRecord) {
for (final String fieldName : record.getSchema().getFieldNames()) {
Object avroValue = avroRecord.get(fieldName);
final Object recordValue = record.getValue(fieldName);
if (recordValue instanceof String) {
assertNotNull(fieldName + " should not have been null", avroValue);
avroValue = avroValue.toString();
}
if (recordValue instanceof Object[] && avroValue instanceof ByteBuffer) {
final ByteBuffer bb = (ByteBuffer) avroValue;
final Object[] objectArray = (Object[]) recordValue;
assertEquals("For field " + fieldName + ", byte buffer remaining should have been " + objectArray.length + " but was " + bb.remaining(), objectArray.length, bb.remaining());
for (int i = 0; i < objectArray.length; i++) {
assertEquals(objectArray[i], bb.get());
}
} else if (recordValue instanceof Object[]) {
assertTrue(fieldName + " should have been instanceof Array", avroValue instanceof Array);
final Array<?> avroArray = (Array<?>) avroValue;
final Object[] recordArray = (Object[]) recordValue;
assertEquals(fieldName + " not equal", recordArray.length, avroArray.size());
for (int i = 0; i < recordArray.length; i++) {
assertEquals(fieldName + "[" + i + "] not equal", recordArray[i], avroArray.get(i));
}
} else if (recordValue instanceof byte[]) {
final ByteBuffer bb = ByteBuffer.wrap((byte[]) recordValue);
assertEquals(fieldName + " not equal", bb, avroValue);
} else if (recordValue instanceof Map) {
assertTrue(fieldName + " should have been instanceof Map", avroValue instanceof Map);
final Map<?, ?> avroMap = (Map<?, ?>) avroValue;
final Map<?, ?> recordMap = (Map<?, ?>) recordValue;
assertEquals(fieldName + " not equal", recordMap.size(), avroMap.size());
for (Object s : avroMap.keySet()) {
assertMatch((Record) recordMap.get(s.toString()), (GenericRecord) avroMap.get(s));
}
} else if (recordValue instanceof Record) {
assertMatch((Record) recordValue, (GenericRecord) avroValue);
} else {
assertEquals(fieldName + " not equal", recordValue, avroValue);
}
}
}
use of org.apache.avro.generic.GenericData.Array in project ksql by confluentinc.
the class KsqlAvroSerializerTest method buildConnectMapEntries.
private static GenericArray<GenericRecord> buildConnectMapEntries(final Map<Utf8, Object> data, final org.apache.avro.Schema valueSchema) {
final org.apache.avro.Schema entrySchema = AvroTestUtil.connectOptionalKeyMapEntrySchema("KsqlDataSourceSchema", valueSchema);
final org.apache.avro.Schema arraySchema = AvroTestUtil.connectOptionalKeyMapSchema(entrySchema);
final Array<GenericRecord> entries = new Array<>(data.size(), arraySchema);
data.entrySet().stream().map(e -> new GenericRecordBuilder(entrySchema).set("key", e.getKey()).set("value", e.getValue()).build()).forEach(entries::add);
return entries;
}
Aggregations