@Override
public Scope outgoingScopeFor( Set<Scope> incomingScopes )
{
Scope incomingScope = getFirst( incomingScopes );
if( !isBuffer() && incomingScope.getOutValuesFields().isNone() )
throw new OperatorException( this, "only a Buffer may be preceded by a CoGroup declaring Fields.NONE as the join fields" );
Fields argumentFields = resolveArgumentSelector( incomingScopes );
verifyArguments( argumentFields );
verifyAggregatorArguments( argumentFields, incomingScope );
Fields declaredFields = resolveDeclared( incomingScopes, argumentFields );
verifyDeclaredFields( declaredFields );
Fields outgoingGroupingFields = resolveOutgoingGroupingSelector( incomingScopes, argumentFields, declaredFields );
verifyOutputSelector( outgoingGroupingFields );
Fields outgoingValuesFields = incomingScope.getOutValuesFields();
Fields passThroughFields = resolveIncomingOperationPassThroughFields( incomingScope );
Fields remainderFields = resolveRemainderFields( incomingScopes, argumentFields );
return new Scope( getName(), Scope.Kind.EVERY, passThroughFields, remainderFields, argumentFields, declaredFields, outgoingGroupingFields, outgoingValuesFields );
}