statements.add(new TypeBuilder(factory, t(WritableComparator.class))
.method("readInt", b2, s2)
.toLocalVariableDeclaration(t(int.class), segmentId2));
SimpleName diff = factory.newSimpleName("diff");
statements.add(new ExpressionBuilder(factory, factory.newThis())
.method(ShuffleEmiterUtil.COMPARE_INT,
new ExpressionBuilder(factory, factory.newThis())
.method(ShuffleEmiterUtil.PORT_TO_ELEMENT, segmentId1)
.toExpression(),
new ExpressionBuilder(factory, factory.newThis())
.method(ShuffleEmiterUtil.PORT_TO_ELEMENT, segmentId2)
.toExpression())
.toLocalVariableDeclaration(t(int.class), diff));
statements.add(createDiff(diff));
SimpleName o1 = factory.newSimpleName("o1");
SimpleName o2 = factory.newSimpleName("o2");
SimpleName lim1 = factory.newSimpleName("lim1");
SimpleName lim2 = factory.newSimpleName("lim2");
statements.add(new ExpressionBuilder(factory, v(4)).toLocalVariableDeclaration(t(int.class), o1));
statements.add(new ExpressionBuilder(factory, v(4)).toLocalVariableDeclaration(t(int.class), o2));
statements.add(new ExpressionBuilder(factory, v(-1)).toLocalVariableDeclaration(t(int.class), lim1));
statements.add(new ExpressionBuilder(factory, v(-1)).toLocalVariableDeclaration(t(int.class), lim2));
List<Statement> cases = Lists.create();
for (List<Segment> segments : ShuffleEmiterUtil.groupByElement(model)) {
for (Segment segment : segments) {
cases.add(factory.newSwitchCaseLabel(v(segment.getPortId())));
}
for (Term term : segments.get(0).getTerms()) {
if (term.getArrangement() != Arrangement.GROUPING) {
continue;
}
cases.add(new ExpressionBuilder(factory, lim1)
.assignFrom(term.getSource().createBytesSize(
b1,
factory.newInfixExpression(s1, InfixOperator.PLUS, o1),
factory.newInfixExpression(l1, InfixOperator.MINUS, o1)))
.toStatement());
cases.add(new ExpressionBuilder(factory, lim2)
.assignFrom(term.getSource().createBytesSize(
b2,
factory.newInfixExpression(s2, InfixOperator.PLUS, o2),
factory.newInfixExpression(l2, InfixOperator.MINUS, o2)))
.toStatement());
cases.add(new ExpressionBuilder(factory, diff)
.assignFrom(
term.getSource().createBytesDiff(
b1, factory.newInfixExpression(s1, InfixOperator.PLUS, o1), lim1,
b2, factory.newInfixExpression(s2, InfixOperator.PLUS, o2), lim2))
.toStatement());
cases.add(createDiff(diff));
cases.add(new ExpressionBuilder(factory, o1)
.assignFrom(InfixOperator.PLUS, lim1)
.toStatement());
cases.add(new ExpressionBuilder(factory, o2)
.assignFrom(InfixOperator.PLUS, lim2)
.toStatement());
}
cases.add(factory.newBreakStatement());
}
cases.add(factory.newSwitchDefaultLabel());
cases.add(createAssertionError());
statements.add(factory.newSwitchStatement(segmentId1, cases));
statements.add(new ExpressionBuilder(factory, diff)
.assignFrom(new ExpressionBuilder(factory, factory.newThis())
.method(ShuffleEmiterUtil.COMPARE_INT, segmentId1, segmentId2)
.toExpression())
.toStatement());
statements.add(createDiff(diff));
cases = Lists.create();
for (Segment segment : model.getSegments()) {
cases.add(factory.newSwitchCaseLabel(v(segment.getPortId())));
for (Term term : segment.getTerms()) {
if (term.getArrangement() == Arrangement.GROUPING) {
continue;
}
cases.add(new ExpressionBuilder(factory, lim1)
.assignFrom(term.getSource().createBytesSize(
b1,
factory.newInfixExpression(s1, InfixOperator.PLUS, o1),
factory.newInfixExpression(l1, InfixOperator.MINUS, o1)))
.toStatement());
cases.add(new ExpressionBuilder(factory, lim2)
.assignFrom(term.getSource().createBytesSize(
b2,
factory.newInfixExpression(s2, InfixOperator.PLUS, o2),
factory.newInfixExpression(l2, InfixOperator.MINUS, o2)))
.toStatement());
cases.add(new ExpressionBuilder(factory, diff)
.assignFrom(
term.getSource().createBytesDiff(
b1, factory.newInfixExpression(s1, InfixOperator.PLUS, o1), lim1,
b2, factory.newInfixExpression(s2, InfixOperator.PLUS, o2), lim2))
.toStatement());
cases.add(createDiff(diff, term.getArrangement() == Arrangement.DESCENDING));
cases.add(new ExpressionBuilder(factory, o1)
.assignFrom(InfixOperator.PLUS, lim1)
.toStatement());
cases.add(new ExpressionBuilder(factory, o2)
.assignFrom(InfixOperator.PLUS, lim2)
.toStatement());
}
cases.add(factory.newBreakStatement());
}
cases.add(factory.newSwitchDefaultLabel());
cases.add(createAssertionError());
statements.add(factory.newSwitchStatement(segmentId1, cases));
statements.add(new ExpressionBuilder(factory, v(0))
.toReturnStatement());
return factory.newMethodDeclaration(
null,
new AttributeBuilder(factory)