private static Object projectArray(Schema source, Object record, Schema target) throws SchemaProjectorException { List<?> array = (List<?>) record; List<Object> retArray = new ArrayList<>(); for (Object entry : array) { retArray.add(project(source.valueSchema(), entry, target.valueSchema())); } return retArray; }
private static Object projectMap(Schema source, Object record, Schema target) throws SchemaProjectorException { Map<?, ?> map = (Map<?, ?>) record; Map<Object, Object> retMap = new HashMap<>(); for (Map.Entry<?, ?> entry : map.entrySet()) { Object key = entry.getKey(); Object value = entry.getValue(); Object retKey = project(source.keySchema(), key, target.keySchema()); Object retValue = project(source.valueSchema(), value, target.valueSchema()); retMap.put(retKey, retValue); } return retMap; }
public static SinkRecord project(SinkRecord record, Schema currentSchema, Compatibility compatibility) { switch (compatibility) { case BACKWARD: case FULL: case FORWARD: Schema sourceSchema = record.valueSchema(); Object value = record.value(); if (sourceSchema == currentSchema || sourceSchema.equals(currentSchema)) { return record; } Object projected = SchemaProjector.project(sourceSchema, value, currentSchema); return new SinkRecord(record.topic(), record.kafkaPartition(), record.keySchema(), record.key(), currentSchema, projected, record.kafkaOffset()); default: return record; } } }
private static Object projectStruct(Schema source, Struct sourceStruct, Schema target) throws SchemaProjectorException { Struct targetStruct = new Struct(target); for (Field targetField : target.fields()) { String fieldName = targetField.name(); Field sourceField = source.field(fieldName); if (sourceField != null) { Object sourceFieldValue = sourceStruct.get(fieldName); try { Object targetFieldValue = project(sourceField.schema(), sourceFieldValue, targetField.schema()); targetStruct.put(fieldName, targetFieldValue); } catch (SchemaProjectorException e) { throw new SchemaProjectorException("Error projecting " + sourceField.name(), e); } } else if (targetField.schema().isOptional()) { // Ignore missing field } else if (targetField.schema().defaultValue() != null) { targetStruct.put(fieldName, targetField.schema().defaultValue()); } else { throw new SchemaProjectorException("Required field `" + fieldName + "` is missing from source schema: " + source); } } return targetStruct; }