You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@avro.apache.org by "Oscar Westra van Holthe - Kind (Jira)" <ji...@apache.org> on 2022/11/03 08:35:00 UTC
[jira] [Updated] (AVRO-3660) SpecificRecord java data generator helper method - should I contribute?
[ https://issues.apache.org/jira/browse/AVRO-3660?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Oscar Westra van Holthe - Kind updated AVRO-3660:
-------------------------------------------------
Attachment: AVRO-3660_Alternative_implementation.patch
> SpecificRecord java data generator helper method - should I contribute?
> -----------------------------------------------------------------------
>
> Key: AVRO-3660
> URL: https://issues.apache.org/jira/browse/AVRO-3660
> Project: Apache Avro
> Issue Type: Improvement
> Components: java
> Affects Versions: 1.11.1
> Reporter: Kristian Rickert
> Priority: Trivial
> Attachments: AVRO-3660_Alternative_implementation.patch
>
>
> I'm not sure if this is useful or if there's already something there for Avro - but I wrote a simple helper method for Java users that allows for RandomData to return a specific data type when given a class.
> So when I'm writing tests for my schema data, I generate the SpecificRecord classes by doing this:
> Given: generated classes with avro in java.
> In this case, imagine there's a generated class called {{Article}}
> What this does:
> {code:java}
> Article randomArticleData = specificAvroRecordGenerator(Article.class){code}
> I'm aware the RandomData class can create GenericData, but I've found this method to be very useful when writing code that goes to a queue to test and end-to-end transport without having to write too much code.
> However, i'm not sure if something is already in the repo that does this.
> So here's my implementation:
> {code:java}
> public static <T extends SpecificRecordBase> T specificAvroRecordGenerator(Class<T> avroClassType) {
> try {
> Field field = avroClassType.getDeclaredField("SCHEMA$");
> return specificAvroRecordGenerator((Schema)field.get(null));
> } catch (IllegalAccessException | NoSuchFieldException e) {
> throw new RuntimeException(e);
> }
> }
> @SuppressWarnings("unchecked")
> public static <T extends SpecificRecordBase> T specificAvroRecordGenerator(Schema schema) {
> GenericRecord test =
> (GenericRecord)new RandomData(schema, 1)
> .iterator().next();
> return (T) SpecificData.get().deepCopy(test.getSchema(), test);
> }{code}
> The good: it works
> The bad: it uses reflection because the current RandomData class outputs generic data classes instead.
> I don't think that is necessarily bad. But I think it's a really useful set of 2 methods. I saw a couple people on stackoverflow inquire about it.
>
> So my two questions:
> 1) is there a simple method that already does this and I can't find it?
> 2) is there an easier way to do this?
> I'd be happy to contribute. Let me know if I should
--
This message was sent by Atlassian Jira
(v8.20.10#820010)