private List<FieldDeclaration> prepareFields() { List<FieldDeclaration> fields = Lists.create(); // shufles for (ShuffleModel.Segment segment : shuffle.getSegments()) { SimpleName shuffleName = names.create("shuffle"); shuffleNames.put(segment, shuffleName); Name shuffleTypeName = segment.getCompiled().getCombineOutputType().getQualifiedName(); fields.add( factory.newFieldDeclaration( null, new AttributeBuilder(factory).Private().toAttributes(), importer.toType(shuffleTypeName), shuffleName, null)); } // rendezvous for (ReduceUnit unit : reduceUnits) { if (unit.canCombine() == false) { continue; } Fragment first = unit.getFragments().get(0); SimpleName rendezvousName = names.create("combine"); rendezvousNames.put(first, rendezvousName); fields.add( factory.newFieldDeclaration( null, new AttributeBuilder(factory).Private().toAttributes(), importer.toType(first.getCompiled().getQualifiedName()), rendezvousName, null)); } return fields; }
private MethodDeclaration createSetup() { Map<FlowElementInput, Segment> segments = Maps.create(); List<Statement> statements = Lists.create(); // shuffle outputs for (Map.Entry<ShuffleModel.Segment, SimpleName> entry : shuffleNames.entrySet()) { ShuffleModel.Segment segment = entry.getKey(); SimpleName name = entry.getValue(); Name shuffleTypeName = segment.getCompiled().getCombineOutputType().getQualifiedName(); statements.add( new ExpressionBuilder(factory, factory.newThis()) .field(name) .assignFrom( new TypeBuilder(factory, importer.toType(shuffleTypeName)) .newObject(context) .toExpression()) .toStatement()); segments.put(segment.getPort(), segment); } // rendezvous for (Map.Entry<Fragment, SimpleName> entry : rendezvousNames.entrySet()) { Fragment fragment = entry.getKey(); Type rendezvousType = importer.toType(fragment.getCompiled().getQualifiedName()); List<Expression> arguments = Lists.create(); for (FlowElementInput input : fragment.getInputPorts()) { Segment segment = segments.get(input); assert segment != null; SimpleName shuffleName = shuffleNames.get(segment); assert shuffleName != null; arguments.add( new ExpressionBuilder(factory, factory.newThis()).field(shuffleName).toExpression()); } SimpleName name = entry.getValue(); statements.add( new ExpressionBuilder(factory, factory.newThis()) .field(name) .assignFrom( new TypeBuilder(factory, rendezvousType).newObject(arguments).toExpression()) .toStatement()); } return factory.newMethodDeclaration( null, new AttributeBuilder(factory).annotation(t(Override.class)).Public().toAttributes(), Collections.<TypeParameterDeclaration>emptyList(), t(void.class), factory.newSimpleName("setup"), Collections.singletonList( factory.newFormalParameterDeclaration( factory.newNamedType(factory.newSimpleName("Context")), context)), 0, Arrays.asList(t(IOException.class), t(InterruptedException.class)), factory.newBlock(statements)); }
private MethodDeclaration createGetRendezvous() { Map<FlowElement, SimpleName> fragments = Maps.create(); for (Map.Entry<Fragment, SimpleName> entry : rendezvousNames.entrySet()) { fragments.put(entry.getKey().getFactors().get(0).getElement(), entry.getValue()); } List<Statement> cases = Lists.create(); for (List<ShuffleModel.Segment> group : ShuffleEmiterUtil.groupByElement(shuffle)) { for (ShuffleModel.Segment segment : group) { cases.add(factory.newSwitchCaseLabel(v(segment.getPortId()))); } FlowElement element = group.get(0).getPort().getOwner(); SimpleName rendezvousName = fragments.get(element); if (rendezvousName == null) { cases.add( new ExpressionBuilder(factory, Models.toNullLiteral(factory)).toReturnStatement()); } else { cases.add( new ExpressionBuilder(factory, factory.newThis()) .field(rendezvousName) .toReturnStatement()); } } cases.add(factory.newSwitchDefaultLabel()); cases.add(new TypeBuilder(factory, t(AssertionError.class)).newObject().toThrowStatement()); SimpleName argument = names.create("nextKey"); List<Statement> statements = Lists.create(); statements.add( factory.newSwitchStatement( new ExpressionBuilder(factory, argument) .method(SegmentedWritable.ID_GETTER) .toExpression(), cases)); return factory.newMethodDeclaration( null, new AttributeBuilder(factory).annotation(t(Override.class)).Protected().toAttributes(), importer.resolve( factory.newParameterizedType( Models.toType(factory, Rendezvous.class), importer.toType(shuffle.getCompiled().getValueTypeName()))), factory.newSimpleName(SegmentedReducer.GET_RENDEZVOUS), Collections.singletonList( factory.newFormalParameterDeclaration( importer.toType(shuffle.getCompiled().getKeyTypeName()), argument)), statements); }