Hi Jacques,
I'm still struggling with this. The function you seem to be pointing me to
is protected and I can not call it directly from my code.
I created the same function in a local utility class:
package com.activitystream.drill;
public class ASDrillUtils {
public static String decodeString(java.nio.ByteBuffer src,
java.nio.charset.Charset charset) {
java.nio.charset.CharsetDecoder decoder =
io.netty.util.CharsetUtil.getDecoder(charset);
java.nio.CharBuffer dst =
java.nio.CharBuffer.allocate((int)((double)src.remaining() *
(double)decoder.maxCharsPerByte()));
try {
java.nio.charset.CoderResult x = decoder.decode(src, dst, true);
if(!x.isUnderflow()) {
x.throwException();
}
x = decoder.flush(dst);
if(!x.isUnderflow()) {
x.throwException();
}
} catch (java.nio.charset.CharacterCodingException var5) {
throw new IllegalStateException(var5);
}
return dst.flip().toString();
}
}
But when I try to call it I get the strangest error:
Error: SYSTEM ERROR: CompileException: Line 146, Column 140: No applicable
constructor/method found for actual parameters "java.nio.ByteBuffer,
java.nio.charset.Charset"; candidates are: "/*default*/ static
java.lang.String
com.activitystream.drill.ASDrillUtils.decodeString(java.nio.ByteBuffer,
java.nio.charset.Charset)"
Fragment 4:1
[Error Id: f544f3fd-c1fa-4a45-84e7-ae31ae095427 on Lightning:31010]
Please note that the construct parameters and the expected classes match
100%
Regards,
-Stefan
On Tue, Jan 12, 2016 at 3:35 PM, Stefán Baxter <[email protected]>
wrote:
>
> OK, I came across this in some UDF sample code and welcome the "best
> practices" update. :)
>
> Thank you,
> -Stefan
>
> On Tue, Jan 12, 2016 at 3:16 PM, Jacques Nadeau <[email protected]>
> wrote:
>
>> Inside Drill we generally don't use that method for anything but
>> debugging.
>> I'm working on some other fixes and will roll in a change to correct this
>> as well. You should be able to track it via DRILL-4246. In the meantime, a
>> workaround is using the ByteBufUtil that Drill uses internally for this
>> kind of thing:
>>
>> DrillBuf myBuf = ...
>> String bufAsString = ByteBufUtil.decodeString(myBuf.nioBuffer(),
>> Charsets.UTF_8);
>>
>>
>>
>> --
>> Jacques Nadeau
>> CTO and Co-Founder, Dremio
>>
>> On Fri, Jan 8, 2016 at 12:04 PM, Stefán Baxter <[email protected]
>> >
>> wrote:
>>
>> > So,
>> >
>> > This is happening due to changes made to DrillBuffer as a part of
>> > Drill-4134 (53dcabeb83f53c8e29aff9c9282eaaa20a8b27ee)
>> >
>> > @Override
>> >
>> > public String toString(int index, int length, Charset charset) {
>> > final String basics =
>> > String.format("{DrillBuf[%d], udle identityHashCode == %d,
>> > identityHashCode == %d}",
>> > id, System.identityHashCode(byteBuf),
>> > System.identityHashCode(refCnt));
>> >
>> > if (length == 0) {
>> > return basics;
>> > }
>> >
>> > final ByteBuffer nioBuffer;
>> > if (nioBufferCount() == 1) {
>> > nioBuffer = nioBuffer(index, length);
>> > } else {
>> > nioBuffer = ByteBuffer.allocate(length);
>> > getBytes(index, nioBuffer);
>> > nioBuffer.flip();
>> > }
>> >
>> > return basics + '\n' + ByteBufUtil.decodeString(nioBuffer, charset);
>> > }
>> >
>> > Now the returned value is prefixed with the *basics* part.
>> >
>> > I have no idea what the intention is here but it must be breaking more
>> > code than just mine.
>> >
>> > Its also interesting that this signature is formatted/created every
>> > time a value is fetched.
>> >
>> > Regards,
>> > -Stefán
>> >
>> >
>> >
>> >
>> > On Fri, Jan 8, 2016 at 7:48 PM, Stefán Baxter <
>> [email protected]>
>> > wrote:
>> >
>> > > Hi again,
>> > >
>> > > This code can be used to reproduce this behavior:
>> > >
>> > > @FunctionTemplate(name = "asEcho", scope =
>> > FunctionTemplate.FunctionScope.SIMPLE, nulls =
>> > FunctionTemplate.NullHandling.NULL_IF_NULL)
>> > > public static class asEcho implements DrillSimpleFunc {
>> > >
>> > > @Param
>> > > VarCharHolder input1;
>> > >
>> > > @Output
>> > > VarCharHolder output;
>> > >
>> > > @Inject
>> > > DrillBuf buffer;
>> > >
>> > > public void setup() { }
>> > >
>> > > public void eval() {
>> > > String someValue = input1.buffer.toString(input1.start,
>> > input1.end-input1.start, java.nio.charset.Charset.defaultCharset());
>> > > output.buffer = buffer.reallocIfNeeded(someValue.length());
>> > > for (Byte aByte : someValue.toString().getBytes())
>> > output.buffer.setByte(output.end ++, aByte);
>> > > }
>> > > }
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > On Fri, Jan 8, 2016 at 7:43 PM, Stefán Baxter <
>> [email protected]
>> > >
>> > > wrote:
>> > >
>> > >> Hi,
>> > >>
>> > >> This seems to have something to do with reading string values from a
>> > >> VarCharHolder.
>> > >>
>> > >> Here is the code that has stopped working:
>> > >>
>> > >> String someValue = input2.buffer.toString(input2.start,
>> > input2.end-input2
>> > >> .start, java.nio.charset.Charset.defaultCharset())
>> > >>
>> > >>
>> > >> It used to return only the string value but now it returns:
>> > >>
>> > >> {DrillBuf[77], udle identityHashCode == 1660956802, identityHashCode
>> ==
>> > >> 343154168}
>> > >> PT1H
>> > >>
>> > >>
>> > >> The value is there in the second line (Seems to include a newline
>> > >> character)
>> > >>
>> > >> Any ideas?
>> > >>
>> > >> Regards,
>> > >> -Stefan
>> > >>
>> > >>
>> > >> On Fri, Jan 8, 2016 at 7:24 PM, Stefán Baxter <
>> > [email protected]>
>> > >> wrote:
>> > >>
>> > >>> Hi,
>> > >>>
>> > >>> My UDFs have stopped working with the latest version of 1.5-SNAPSHOT
>> > >>> (pulled just now).
>> > >>>
>> > >>> The error is:
>> > >>> SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for
>> > >>> further details.
>> > >>> Error: SYSTEM ERROR: IllegalArgumentException: Invalid format:
>> > >>> "{DrillBuf[74], udle identityHash..."
>> > >>>
>> > >>> Fragment 1:5
>> > >>>
>> > >>> [Error Id: 17b0165d-8ff3-4101-961a-0e40fdff0392 on Lightning:31010]
>> > >>> (state=,code=0)
>> > >>>
>> > >>>
>> > >>> Does anyone know what might be causing this?
>> > >>>
>> > >>> (The UDFs are compiled using the same target)
>> > >>>
>> > >>> Regards,
>> > >>> -Stefán
>> > >>>
>> > >>
>> > >>
>> > >
>> >
>>
>
>