You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@flink.apache.org by "hehuiyuan (Jira)" <ji...@apache.org> on 2020/04/26 05:33:00 UTC
[jira] [Comment Edited] (FLINK-17117) There are an useless cast
operation for sql on blink when generate code
[ https://issues.apache.org/jira/browse/FLINK-17117?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17092504#comment-17092504 ]
hehuiyuan edited comment on FLINK-17117 at 4/26/20, 5:32 AM:
-------------------------------------------------------------
This method is also called elsewhere.
For the following code example : ([地址|[https://travis-ci.com/github/flink-ci/flink/jobs/322393094]])
{code:java}
result$224 = javaResult$225 == null ? null : (converter$226.toInternal((java.lang.String) javaResult$225));
{code}
The origin code:
{code:java}
def genToInternal(ctx: CodeGeneratorContext, t: DataType): String => String = {
if (isConverterIdentity(t)) {
term => s"$term"
} else {
val iTerm = boxedTypeTermForType(fromDataTypeToLogicalType(t))
val eTerm = typeTerm(t.getConversionClass)
val converter = ctx.addReusableObject(
DataFormatConverters.getConverterForDataType(t),
"converter")
term => s"($iTerm) $converter.toInternal(($eTerm) $term)"
}
}
{code}
if *` term => s"($iTerm) $converter.toInternal(($eTerm) $term)"`* is changed to
*` term => s"$converter.toInternal(($eTerm) $term)"`* , the above example is wrong.
The wrong log is :
{code:java}
Caused by: org.codehaus.commons.compiler.CompileException: Line 99, Column 23: Assignment conversion not possible from type "java.lang.Object" to type "org.apache.flink.table.dataformat.BinaryString"
{code}
When it call `genToInternal` mehtod , there is no cast code.
So , i have some changes.
I change the code
{code:java}
$inputTypeTerm $inputTerm = ($inputTypeTerm) ${converter(s"$ELEMENT.getValue()")};
{code}
to
{code:java}
$inputTypeTerm $inputTerm = ${converter(s"$ELEMENT.getValue()")};
{code}
in the methond `generateOneInputStreamOperator` of OperatorCodeGenerator,
and add cast code for internal data type
{code:java}
def genToInternal(ctx: CodeGeneratorContext, t: DataType): String => String = {
val iTerm = boxedTypeTermForType(fromDataTypeToLogicalType(t))
if (isConverterIdentity(t)) {
term => s"($iTerm) $term"
} else {
val eTerm = typeTerm(t.getConversionClass)
val converter = ctx.addReusableObject(
DataFormatConverters.getConverterForDataType(t),
"converter")
term => s"($iTerm) $converter.toInternal(($eTerm) $term)"
}
}
{code}
was (Author: hehuiyuan):
This method is also called elsewhere.
For the following code example : ([地址|[https://travis-ci.com/github/flink-ci/flink/jobs/322393094]])
{code:java}
result$224 = javaResult$225 == null ? null : (converter$226.toInternal((java.lang.String) javaResult$225));
{code}
The origin code:
{code:java}
def genToInternal(ctx: CodeGeneratorContext, t: DataType): String => String = {
if (isConverterIdentity(t)) {
term => s"$term"
} else {
val iTerm = boxedTypeTermForType(fromDataTypeToLogicalType(t))
val eTerm = typeTerm(t.getConversionClass)
val converter = ctx.addReusableObject(
DataFormatConverters.getConverterForDataType(t),
"converter")
term => s"($iTerm) $converter.toInternal(($eTerm) $term)"
}
}
{code}
if *` term => s"($iTerm) $converter.toInternal(($eTerm) $term)"`* is changed to
*` term => s"$converter.toInternal(($eTerm) $term)"`* , the above example is wrong.
The wrong log is :
{code:java}
Caused by: org.codehaus.commons.compiler.CompileException: Line 99, Column 23: Assignment conversion not possible from type "java.lang.Object" to type "org.apache.flink.table.dataformat.BinaryString"
{code}
> There are an useless cast operation for sql on blink when generate code
> ------------------------------------------------------------------------
>
> Key: FLINK-17117
> URL: https://issues.apache.org/jira/browse/FLINK-17117
> Project: Flink
> Issue Type: Wish
> Components: Table SQL / Planner
> Reporter: hehuiyuan
> Assignee: hehuiyuan
> Priority: Minor
> Labels: pull-request-available
> Attachments: image-2020-04-13-19-44-19-174.png
>
>
> !image-2020-04-13-19-44-19-174.png|width=641,height=305!
>
> This mehthod `generateOneInputStreamOperator` when OperatorCodeGenerator generates SourceConversion:
> {code:java}
> @Override
> public void processElement($STREAM_RECORD $ELEMENT) throws Exception {
> $inputTypeTerm $inputTerm = ($inputTypeTerm) ${converter(s"$ELEMENT.getValue()")};
> ${ctx.reusePerRecordCode()}
> ${ctx.reuseLocalVariableCode()}
> ${if (lazyInputUnboxingCode) "" else ctx.reuseInputUnboxingCode()}
> $processCode
> }
> {code}
>
> {code:java}
> $inputTypeTerm $inputTerm = ($inputTypeTerm) ${converter(s"$ELEMENT.getValue()")};
> {code}
> ScanUtil calls generateOneInputStreamOperator
> {code:java}
> val generatedOperator = OperatorCodeGenerator.generateOneInputStreamOperator[Any, BaseRow](
> ctx,
> convertName,
> processCode,
> outputRowType,
> converter = inputTermConverter)
> //inputTermConverter
> val (inputTermConverter, inputRowType) = {
> val convertFunc = CodeGenUtils.genToInternal(ctx, inputType)
> internalInType match {
> case rt: RowType => (convertFunc, rt)
> case _ => ((record: String) => s"$GENERIC_ROW.of(${convertFunc(record)})",
> RowType.of(internalInType))
> }
> }
> {code}
> CodeGenUtils.scala : genToInternal
> {code:java}
> def genToInternal(ctx: CodeGeneratorContext, t: DataType): String => String = {
> val iTerm = boxedTypeTermForType(fromDataTypeToLogicalType(t))
> if (isConverterIdentity(t)) {
> term => s"($iTerm) $term"
> } else {
> val eTerm = boxedTypeTermForExternalType(t)
> val converter = ctx.addReusableObject(
> DataFormatConverters.getConverterForDataType(t),
> "converter")
> term => s"($iTerm) $converter.toInternal(($eTerm) $term)"
> }
> }
> {code}
>
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)