protected GenericSchema(SchemaInfo schemaInfo) { this.schemaInfo = schemaInfo; this.schema = new org.apache.avro.Schema.Parser().parse( new String(schemaInfo.getSchema(), UTF_8) ); this.fields = schema.getFields() .stream() .map(f -> new Field(f.name(), f.pos())) .collect(Collectors.toList()); }
private FieldAccessor[] createAccessorsFor(Schema schema) { List<Schema.Field> avroFields = schema.getFields(); FieldAccessor[] result = new FieldAccessor[avroFields.size()]; for(Schema.Field avroField : schema.getFields()) { result[avroField.pos()] = byName.get(avroField.name()); } return result; }
@Override protected Object getRecordState(Object r, Schema s) { Descriptor d = ((MessageOrBuilder)r).getDescriptorForType(); FieldDescriptor[] fields = fieldCache.get(d); if (fields == null) { // cache miss fields = new FieldDescriptor[s.getFields().size()]; for (Field f : s.getFields()) fields[f.pos()] = d.findFieldByName(f.name()); fieldCache.put(d, fields); // update cache } return fields; }
@Override public void put(String key, Object value) { Schema.Field field = schema.getField(key); if (field == null) throw new AvroRuntimeException("Not a valid schema field: "+key); values[field.pos()] = value; } @Override public void put(int i, Object v) { values[i] = v; }
/** Called to read a single field of a record. May be overridden for more * efficient or alternate implementations.*/ protected void readField(Object r, Field f, Object oldDatum, ResolvingDecoder in, Object state) throws IOException { data.setField(r, f.name(), f.pos(), read(oldDatum, f.schema(), in), state); }
/** * Sets the value of a field. * @param field the field to set. * @param value the value to set. * @return a reference to the RecordBuilder. */ public GenericRecordBuilder set(Field field, Object value) { return set(field, field.pos(), value); }
@Override public void set(Object referenceable) { record.put(refField.pos(), referenceable); } });
/** * Clears the value of the given field. * @param field the field to clear. * @return a reference to the RecordBuilder. */ public GenericRecordBuilder clear(Field field) { return clear(field.pos()); }
/** * Sets the value of a field. * @param field the field to set. * @param value the value to set. * @return a reference to the RecordBuilder. */ public GenericRecordBuilder set(Field field, Object value) { return set(field, field.pos(), value); }
/** * Checks whether a field has been set. * @param field the field to check. * @return true if the given field is non-null; false otherwise. */ public boolean has(Field field) { return has(field.pos()); }
/** Called to write a single field of a record. May be overridden for more * efficient or alternate implementations.*/ protected void writeField(Object datum, Field f, Encoder out, Object state) throws IOException { Object value = data.getField(datum, f.name(), f.pos(), state); try { write(f.schema(), value, out); } catch (NullPointerException e) { throw npe(e, " in field " + f.name()); } }
@Deprecated public FieldOrderAction(Schema.Field[] fields) { this.fields = fields; boolean noReorder = true; for (int i = 0; noReorder && i < fields.length; i++) noReorder &= (i == fields[i].pos()); this.noReorder = noReorder; } }
@Override public IndexedRecord toRecord(IndexedRecord record, Schema schema, LogicalType type) { // write side: replace a referenced field with its id Schema.Field refField = schema.getField(((Reference) type).getRefFieldName()); IndexedRecord referenced = (IndexedRecord) record.get(refField.pos()); if (referenced == null) { return record; } // hijack the field to return the id instead of the ref return new HijackingIndexedRecord(record, refField.pos(), ids.get(referenced)); } }
/** Called to write a single field of a record. May be overridden for more * efficient or alternate implementations.*/ protected void writeField(Object datum, Field f, Encoder out, Object state) throws IOException { Object value = data.getField(datum, f.name(), f.pos(), state); try { write(f.schema(), value, out); } catch (NullPointerException e) { throw npe(e, " in field " + f.name()); } }
@Override public void put(String key, Object value) { Schema.Field field = schema.getField(key); if (field == null) throw new AvroRuntimeException("Not a valid schema field: "+key); values[field.pos()] = value; } @Override public void put(int i, Object v) { values[i] = v; }
/** * Gets the value of a field. * @param field the field to get. * @return the value of the given field, or null if not set. */ public Object get(Field field) { return get(field.pos()); }
/** Called to read a single field of a record. May be overridden for more * efficient or alternate implementations.*/ protected void readField(Object r, Field f, Object oldDatum, ResolvingDecoder in, Object state) throws IOException { data.setField(r, f.name(), f.pos(), read(oldDatum, f.schema(), in), state); }
private long getId(IndexedRecord referenceable, Schema schema) { Referenceable info = (Referenceable) schema.getLogicalType(); int idField = schema.getField(info.getIdFieldName()).pos(); return (Long) referenceable.get(idField); } }
@Override public Object get(String key) { Field field = schema.getField(key); if (field == null) return null; return values[field.pos()]; } @Override public Object get(int i) { return values[i]; }
/** * Checks whether a field has been set. * @param field the field to check. * @return true if the given field is non-null; false otherwise. */ public boolean has(Field field) { return has(field.pos()); }