in java/fury-core/src/main/java/org/apache/fury/codegen/Expression.java [2396:2503]
public ExprCode doGenCode(CodegenContext ctx) {
StringBuilder codeBuilder = new StringBuilder();
ExprCode leftExprCode = left.genCode(ctx);
ExprCode rightExprCode = right.genCode(ctx);
Stream.of(leftExprCode, rightExprCode)
.forEach(
exprCode -> {
if (StringUtils.isNotBlank(exprCode.code())) {
codeBuilder.append(exprCode.code()).append('\n');
}
});
String i = ctx.newName("i");
String leftElemValue = ctx.newName("leftElemValue");
String rightElemValue = ctx.newName("rightElemValue");
TypeRef<?> leftElemType;
if (left.type().isArray()) {
leftElemType = left.type().getComponentType();
} else {
leftElemType = getElementType(left.type());
}
leftElemType = ReflectionUtils.getPublicSuperType(leftElemType);
TypeRef<?> rightElemType;
if (right.type().isArray()) {
rightElemType = right.type().getComponentType();
} else {
rightElemType = getElementType(right.type());
}
rightElemType = ReflectionUtils.getPublicSuperType(rightElemType);
Expression elemExpr =
action.apply(
new Reference(i),
new Reference(leftElemValue, leftElemType, true),
// elemValue nullability check use isNullAt inside action, so elemValueRef'nullable is
// false.
new Reference(rightElemValue, rightElemType, false));
ExprCode elementExprCode = elemExpr.genCode(ctx);
if (left.type().isArray()) {
String code =
StringUtils.format(
""
+ "int ${len} = ${leftArr}.length;\n"
+ "int ${i} = 0;\n"
+ "while (${i} < ${len}) {\n"
+ " ${leftElemType} ${leftElemValue} = ${leftArr}[${i}];\n"
+ " ${rightElemType} ${rightElemValue} = ${rightArr}[${i}];\n"
+ " ${elementExprCode}\n"
+ " ${i}++;\n"
+ "}",
"leftArr",
leftExprCode.value(),
"len",
ctx.newName("len"),
"i",
i,
"leftElemType",
ctx.type(leftElemType),
"leftElemValue",
leftElemValue,
"rightElemType",
ctx.type(rightElemType),
"rightElemValue",
rightElemValue,
"rightArr",
rightExprCode.value(),
"elementExprCode",
alignIndent(elementExprCode.code()));
codeBuilder.append(code);
return new ExprCode(codeBuilder.toString(), null, null);
} else {
// CHECKSTYLE.OFF:LineLength
String code =
StringUtils.format(
""
+ "java.util.Iterator ${leftIter} = ${leftInput}.iterator();\n"
+ "java.util.Iterator ${rightIter} = ${rightInput}.iterator();\n"
+ "int ${i} = 0;\n"
+ "while (${leftIter}.hasNext() && ${rightIter}.hasNext()) {\n"
+ " ${leftElemType} ${leftElemValue} = (${leftElemType})${leftIter}.next();\n"
+ " ${rightElemType} ${rightElemValue} = (${rightElemType})${rightIter}.next();\n"
+ " ${elementExprCode}\n"
+ " ${i}++;\n"
+ "}",
"leftIter",
// CHECKSTYLE.ON:LineLength
ctx.newName("leftIter"),
"leftInput",
leftExprCode.value(),
"rightIter",
ctx.newName("rightIter"),
"rightInput",
rightExprCode.value(),
"i",
i,
"leftElemType",
ctx.type(leftElemType),
"leftElemValue",
leftElemValue,
"rightElemType",
ctx.type(rightElemType),
"rightElemValue",
rightElemValue,
"elementExprCode",
alignIndent(elementExprCode.code()));
codeBuilder.append(code);
return new ExprCode(codeBuilder.toString(), null, null);
}
}