Skip to content

Commit 9b8c0e2

Browse files
[FLINK-35334][flink-table] Split constructor of generated code if it is too large
1 parent 76ba829 commit 9b8c0e2

File tree

4 files changed

+243
-110
lines changed

4 files changed

+243
-110
lines changed

flink-table/flink-table-code-splitter/src/main/java/org/apache/flink/table/codesplit/DeclarationRewriter.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,11 @@ public Void visitFieldDeclaration(JavaParser.FieldDeclarationContext ctx) {
132132
return visitChildren(ctx);
133133
}
134134

135+
@Override
136+
public Void visitConstructorDeclaration(JavaParser.ConstructorDeclarationContext ctx) {
137+
return visitFunctionBody(ctx.constructorBody);
138+
}
139+
135140
@Override
136141
public Void visitMethodDeclaration(JavaParser.MethodDeclarationContext ctx) {
137142
if ("void".equals(ctx.typeTypeOrVoid().getText())) {
@@ -142,17 +147,21 @@ public Void visitMethodDeclaration(JavaParser.MethodDeclarationContext ctx) {
142147

143148
@Override
144149
public Void visitMethodBody(JavaParser.MethodBodyContext ctx) {
150+
return visitFunctionBody(ctx.block());
151+
}
152+
153+
public Void visitFunctionBody(JavaParser.BlockContext blockContext) {
145154
// this condition must be the same with the condition in
146155
// FunctionSplitter::visitMethodDeclaration
147-
if (CodeSplitUtil.getContextTextLength(ctx.block()) <= maxMethodLength) {
156+
if (CodeSplitUtil.getContextTextLength(blockContext) <= maxMethodLength) {
148157
return null;
149158
}
150159

151160
hasRewrite = true;
152161
InnerBlockStatementExtractor extractor = new InnerBlockStatementExtractor();
153-
if (ctx.block() != null && ctx.block().blockStatement() != null) {
162+
if (blockContext != null && blockContext.blockStatement() != null) {
154163
for (JavaParser.BlockStatementContext blockStatementContext :
155-
ctx.block().blockStatement()) {
164+
blockContext.blockStatement()) {
156165
extractor.visitBlockStatement(blockStatementContext);
157166
}
158167
newFields.peek().append(extractor.getNewLocalVariables());

flink-table/flink-table-code-splitter/src/main/java/org/apache/flink/table/codesplit/FunctionSplitter.java

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.antlr.v4.runtime.CharStreams;
2323
import org.antlr.v4.runtime.CommonTokenStream;
24+
import org.antlr.v4.runtime.ParserRuleContext;
2425
import org.antlr.v4.runtime.TokenStreamRewriter;
2526
import org.antlr.v4.runtime.atn.PredictionMode;
2627

@@ -142,21 +143,51 @@ public Void visitClassBody(JavaParser.ClassBodyContext ctx) {
142143
return visitChildren(ctx);
143144
}
144145

146+
@Override
147+
public Void visitConstructorDeclaration(JavaParser.ConstructorDeclarationContext ctx) {
148+
return doFunctionSplit(
149+
ctx,
150+
ctx.constructorBody,
151+
"void",
152+
ctx.IDENTIFIER().getText(),
153+
CodeSplitUtil.getContextString(ctx.formalParameters()),
154+
ctx.THROWS() != null,
155+
CodeSplitUtil.getContextString(ctx.qualifiedNameList()));
156+
}
157+
145158
@Override
146159
public Void visitMethodDeclaration(JavaParser.MethodDeclarationContext ctx) {
147160

148161
if (!"void".equals(ctx.typeTypeOrVoid().getText())) {
149162
return null;
150163
}
151164

152-
long methodBodyLength = CodeSplitUtil.getContextTextLength(ctx.methodBody().block());
165+
return doFunctionSplit(
166+
ctx,
167+
ctx.methodBody().block(),
168+
CodeSplitUtil.getContextString(ctx.typeTypeOrVoid()),
169+
ctx.IDENTIFIER().getText(),
170+
CodeSplitUtil.getContextString(ctx.formalParameters()),
171+
ctx.THROWS() != null,
172+
CodeSplitUtil.getContextString(ctx.qualifiedNameList()));
173+
}
174+
175+
private Void doFunctionSplit(
176+
ParserRuleContext ctx,
177+
JavaParser.BlockContext blockContext,
178+
String returnType,
179+
String functionName,
180+
String parameters,
181+
boolean hasThrowable,
182+
String throwables) {
183+
long methodBodyLength = CodeSplitUtil.getContextTextLength(blockContext);
153184

154185
if (methodBodyLength < maxMethodLength) {
155186
return null;
156187
}
157188

158-
if (ctx.methodBody().block().blockStatement() == null
159-
|| ctx.methodBody().block().blockStatement().size() <= 1) {
189+
if (blockContext.blockStatement() == null
190+
|| blockContext.blockStatement().size() <= 1) {
160191
return null;
161192
}
162193

@@ -173,13 +204,8 @@ public Void visitFormalParameter(JavaParser.FormalParameterContext ctx) {
173204
}
174205
}.visit(ctx);
175206

176-
// function definition
177-
String type = CodeSplitUtil.getContextString(ctx.typeTypeOrVoid());
178-
String functionName = ctx.IDENTIFIER().getText();
179-
String parameters = CodeSplitUtil.getContextString(ctx.formalParameters());
180-
181207
for (JavaParser.BlockStatementContext blockStatementContext :
182-
ctx.methodBody().block().blockStatement()) {
208+
blockContext.blockStatement()) {
183209
blockStatementContexts.add(blockStatementContext);
184210
splitFuncBodies.add(CodeSplitUtil.getContextString(blockStatementContext));
185211
}
@@ -189,24 +215,22 @@ public Void visitFormalParameter(JavaParser.FormalParameterContext ctx) {
189215
List<String> newSplitMethodCalls = new ArrayList<>();
190216

191217
String methodQualifier = "";
192-
if (ctx.THROWS() != null) {
193-
methodQualifier =
194-
" throws " + CodeSplitUtil.getContextString(ctx.qualifiedNameList());
218+
if (hasThrowable) {
219+
methodQualifier = " throws " + throwables;
195220
}
196221

197222
String hasReturnedVarName = boolVarNames.get(classCount).get(functionName + parameters);
198223
if (hasReturnedVarName != null) {
199224
rewriter.insertAfter(
200-
ctx.methodBody().block().start,
201-
String.format("\n%s = false;", hasReturnedVarName));
225+
blockContext.start, String.format("\n%s = false;", hasReturnedVarName));
202226
}
203227

204228
for (String methodBody : mergedCodeBlocks) {
205229
long counter = CodeSplitUtil.getCounter().getAndIncrement();
206230

207231
// void f_splitXX(int x, String y)
208232
String splitMethodDef =
209-
type
233+
returnType
210234
+ " "
211235
+ functionName
212236
+ "_split"

flink-table/flink-table-code-splitter/src/test/resources/splitter/code/TestSplitJavaCode.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,26 @@ public class TestSplitJavaCode {
44

55
public TestSplitJavaCode(int[] b) {
66
this.b = b;
7+
int b0 = this.b[0] + b[0];
8+
System.out.println("b0 = " + b0);
9+
int b1 = this.b[1] + b[1];
10+
System.out.println("b1 = " + b1);
11+
int b2 = this.b[2] + b[2];
12+
System.out.println("b2 = " + b2);
13+
int b3 = this.b[3] + b[3];
14+
System.out.println("b3 = " + b3);
15+
int b4 = this.b[4] + b[4];
16+
System.out.println("b4 = " + b4);
17+
int b5 = this.b[5] + b[5];
18+
System.out.println("b5 = " + b5);
19+
int b6 = this.b[6] + b[6];
20+
System.out.println("b6 = " + b6);
21+
int b7 = this.b[7] + b[7];
22+
System.out.println("b7 = " + b7);
23+
int b8 = this.b[8] + b[8];
24+
System.out.println("b8 = " + b8);
25+
int b9 = this.b[9] + b[9];
26+
System.out.println("b9 = " + b9);
727
}
828

929
public void myFun1(int a) {

0 commit comments

Comments
 (0)