You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@nifi.apache.org by "Greene (US), Geoffrey N" <ge...@boeing.com> on 2021/03/03 12:56:10 UTC

RE: [EXTERNAL] Re: Some SimpleRecordSchema questions

I figured it out.  The issue was that I had an array of records.  I couldn't figure out the calls.

For posterity, 
SimpleRecordSchema oneSchema = new SimpleRecordSchema(fieldList)
DataType oneValueType = RecordFieldType.RECORD.getRecordData(oneSchema)
DataType allValues = RecordFieldType.ARRAY.getArrayDataType(oneValueType)
Then you have to create a new schema using the new "allValues" dataType

The trick was realizing that RecordFieldType.RECORD.getRecordData() takes a SCHEMA as its argument, not just a simple datatype. This allows you to build up complex values.

Thanks for your help, Matt.

-- Geoff

-----Original Message-----
From: Matt Burgess [mailto:mattyb149@apache.org] 
Sent: Monday, March 1, 2021 7:56 PM
To: users@nifi.apache.org
Subject: [EXTERNAL] Re: Some SimpleRecordSchema questions

EXT email: be mindful of links/attachments.



Geoffrey,

In general you won't need to create your own DataType objects, instead you can use the RecordFieldType methods such as RecordFieldType.ARRAY.getArrayDataType(DataType elementType, boolean elementsNullable).getDataType(). So for an array of ints:

myRecordFields.add(new RecordField("allMyIntegers", RecordFieldType.ARRAY.getArrayDataType(RecordFieldType.INT.getDataType(),
true)))

If I misunderstood what you're trying to do please let me know and I'll help where I can.

Regards,
Matt


On Fri, Feb 26, 2021 at 7:04 PM Greene (US), Geoffrey N <ge...@boeing.com> wrote:
>
> I’m writing a LookupService<Record> in Groovy for my ScriptedLookupService.  It is, as everyone had suggested, significantly faster than split/merge.
>
>
>
> I’m really very close to having it working.  In fact, it works fine when my <Record> is simple; a few strings.
>
>
>
> My situation, though, is that my service returns an ARRAY of records for a single value.  I can’t figure out how to construct the schema correctly.
>
>
>
> So far, I have
>
> public Optional<Record> lookup(Map<String,Object> coords) throws 
> LookupFailureException {
>
>   oneValueSchemaFields.add(new RecordField("number", new 
> DataType(RecordFieldType.INT,"")))
>
>   oneValueSchema = new SimpleRecordSchema(oneValueSchemaFields)
>
>
>
>   // so far so good. But I need to return an ARRAY of these oneValueSchemas.
>
>   def howDoIConstructThisSchema = new SimpleRecordSchema(??)
>
>
>
>     String valueString =” [ {\“number\” : 1}, {\“number\” : 2},{ \“number\”:3}]”
>
>   def jsonSlurper = new groovy.json.JsonSlurper()
>
>   def values = jsonSlurper.parseText(valueString)
>
>
>
>  return Optional.ofNullable(new MapRecord(howDoIConstructThisSchema, 
> values))
>
> }
>
> How do I construct the outer schema? How do you have one schema containing an array of oneValueSchemas?  There’s something stupid I am missing, I am sure.
>
> I did try just sending in oneValueSchema into the MapRecord constructor, but it doesn’t appear that that worked either.  Suggestions?
>
>
>
> Thanks
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> Geoffrey Greene
>
>