@Override public Object getFieldValue(final RecordField field) { return values.get(field.getFieldName()); }
@Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (!(obj instanceof RecordField)) { return false; } final RecordField other = (RecordField) obj; return fieldName.equals(other.getFieldName()); } }
@Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (!(obj instanceof RecordField)) { return false; } final RecordField other = (RecordField) obj; return fieldName.equals(other.getFieldName()); }
public RecordField getField(final String fieldName) { return fields.stream() .filter(field -> field.getFieldName().equals(fieldName)) .findFirst() .orElse(null); }
private static Map<String, Object> convertFieldToName(final Map<RecordField, Object> map) { final Map<String, Object> nameMap = new HashMap<>(map.size()); for (final Map.Entry<RecordField, Object> entry : map.entrySet()) { nameMap.put(entry.getKey().getFieldName(), entry.getValue()); } return nameMap; }
default Object getFieldValue(RecordField field) { return getFieldValue(field.getFieldName()); }
private void writeRecordFields(final Record record, final RecordSchema schema, final OutputStream out, final byte[] buffer) throws IOException { final DataOutputStream dos = out instanceof DataOutputStream ? (DataOutputStream) out : new DataOutputStream(out); for (final RecordField field : schema.getFields()) { final Object value = record.getFieldValue(field); try { writeFieldRepetitionAndValue(field, value, dos, buffer); } catch (final Exception e) { throw new IOException("Failed to write field '" + field.getFieldName() + "'", e); } } }
private void writeField(final RecordField field, final DataOutputStream dos) throws IOException { dos.writeInt(4); // A field is made up of 4 "elements": Field Name, Field Type, Field Repetition, Sub-Fields. // For each of the elements, we write a String indicating the Element Name, a String indicating the Element Type, and // finally the Element data itself. dos.writeUTF(FIELD_NAME); dos.writeUTF(STRING_TYPE); dos.writeUTF(field.getFieldName()); dos.writeUTF(FIELD_TYPE); dos.writeUTF(STRING_TYPE); dos.writeUTF(field.getFieldType().name()); dos.writeUTF(REPETITION); dos.writeUTF(STRING_TYPE); dos.writeUTF(field.getRepetition().name()); dos.writeUTF(SUBFIELDS); dos.writeUTF(SUBFIELD_TYPE); final List<RecordField> subFields = field.getSubFields(); dos.writeInt(subFields.size()); // SubField is encoded as number of Sub-Fields followed by the fields themselves. for (final RecordField subField : subFields) { writeField(subField, dos); } }
value.add(readFieldValue(in, field.getFieldType(), field.getFieldName(), field.getSubFields())); throw new EOFException("Unexpected End-of-File when attempting to read Repetition value for field '" + field.getFieldName() + "'"); throw new IOException("Invalid Boolean value found when reading 'Repetition' of field '" + field.getFieldName() + "'. Expected 0 or 1 but got " + (nextByte & 0xFF)); return readFieldValue(in, field.getFieldType(), field.getFieldName(), field.getSubFields()); } catch (final EOFException eof) { final EOFException exception = new EOFException("Failed to read field '" + field.getFieldName() + "'"); exception.addSuppressed(eof); throw exception; } catch (final IOException ioe) { throw new IOException("Failed to read field '" + field.getFieldName() + "'", ioe);
case EXACTLY_ONE: { if (value == null) { throw new IllegalArgumentException("Record does not have a value for the '" + field.getFieldName() + "' but the field is required"); "' for the '" + field.getFieldName() + "' but expected a Collection because the Repetition for the field is " + field.getRepetition());
private NamedValue createExplicitSameOrNoneValue(final Record newValue, final Record oldValue, final Supplier<Record> recordSupplier) { if (newValue == null || EventFieldNames.NO_VALUE.equals(newValue.getSchema().getFields().get(0).getFieldName())) { final Map<RecordField, Object> lookupValues = Collections.singletonMap(LookupTableEventRecordFields.NO_VALUE, EventFieldNames.NO_VALUE); final Record record = new FieldMapRecord(lookupValues, LookupTableEventSchema.NO_VALUE_SCHEMA); final NamedValue namedValue = new NamedValue(EventFieldNames.NO_VALUE, record); return namedValue; } else if (newValue.equals(oldValue)) { final Map<RecordField, Object> lookupValues = Collections.singletonMap(LookupTableEventRecordFields.UNCHANGED_VALUE, EventFieldNames.UNCHANGED_VALUE); final Record record = new FieldMapRecord(lookupValues, LookupTableEventSchema.UNCHANGED_VALUE_SCHEMA); final NamedValue namedValue = new NamedValue(EventFieldNames.UNCHANGED_VALUE, record); return namedValue; } final Record record = recordSupplier.get(); final NamedValue namedValue = new NamedValue(EventFieldNames.EXPLICIT_VALUE, record); return namedValue; }
break; case STRING: writeUTFLimited(out, (String) value, field.getFieldName()); break; case LONG_STRING: case UNION: final NamedValue namedValue = (NamedValue) value; writeUTFLimited(out, namedValue.getName(), field.getFieldName()); final Record childRecord = (Record) namedValue.getValue(); writeRecordFields(childRecord, out, buffer);
final DataInputStream dis = new DataInputStream(in); final String childFieldType = dis.readUTF(); final Optional<RecordField> fieldOption = subFields.stream().filter(field -> field.getFieldName().equals(childFieldType)).findFirst(); if (!fieldOption.isPresent()) { throw new IOException("Found a field of type '" + childFieldType + "' but that was not in the expected list of types");