/******************************************************************************* * Copyright (c) 2014 Imperial College London * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Raul Castro Fernandez - initial API and implementation ******************************************************************************/ package uk.ac.imperial.lsds.seep.operator.compose; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import uk.ac.imperial.lsds.seep.comm.serialization.DataTuple; import uk.ac.imperial.lsds.seep.operator.Callback; import uk.ac.imperial.lsds.seep.operator.CommunicationPrimitives; public class SubOperator implements SubOperatorAPI, CommunicationPrimitives, Callback{ private static final long serialVersionUID = 1L; private SubOperatorCode code; private MultiOperator multiOp; private boolean mostDownstream; private boolean mostUpstream; private Map<Integer, SubOperator> localDownstream; private Map<Integer, SubOperator> localUpstream; public static SubOperator getSubOperator(SubOperatorCode code){ return new SubOperator(code); } private SubOperator(SubOperatorCode code){ this.code = code; this.mostDownstream = true; this.mostUpstream = true; this.localDownstream = new HashMap<Integer, SubOperator>(); this.localUpstream = new HashMap<Integer, SubOperator>(); //code.api.setCallbackObject(this); } private void addLocalDownstream(int localStreamId, SubOperator so){ this.mostDownstream = false; if(!localDownstream.containsKey(localStreamId)){ localDownstream.put(localStreamId, so); } else{ // TODO: Throw error overwrite? } } private void addLocalUpstream(int localStreamId, SubOperator so){ this.mostUpstream = false; if(!localUpstream.containsKey(localStreamId)){ localUpstream.put(localStreamId, so); } else{ // TODO: Throw error overwrite? } } /** Implementation of CommunicationPrimitives **/ @Override public void send(DataTuple dt) { if(localDownstream.size() == 1){ SubOperator target = localDownstream.entrySet().iterator().next().getValue(); if(!target.isMostLocalDownstream()){ target.processData(dt); } else{ multiOp.send(dt); } } else{ //Throw error, as downstream cannot be scaled out inside the node, (or can they?) there should be only one entry } } @Override public void send_toStreamId(DataTuple dt, int streamId) { SubOperator target = localDownstream.get(streamId); if(!target.isMostLocalDownstream()){ target.processData(dt); } else{ multiOp.send_toStreamId(dt, streamId); } } @Override public void send_all(DataTuple dt) { // TODO Auto-generated method stub } @Override public void send_splitKey(DataTuple dt, int key) { // TODO Auto-generated method stub } @Override public void send_toIndex(DataTuple dt, int idx) { // TODO Auto-generated method stub } @Override public void send_toStreamId_splitKey(DataTuple dt, int streamId, int key) { // TODO Auto-generated method stub } @Override public void send_toStreamId_toAll(DataTuple dt, int streamId) { // TODO Auto-generated method stub } @Override public void send_toStreamId_toAll_threadPool(DataTuple dt, int streamId){ } @Override public void send_all_threadPool(DataTuple dt){ } /** Implementation of SubOperatorAPI **/ @Override public void connectSubOperatorTo(int localStreamId, SubOperator so){ this.addLocalDownstream(localStreamId, so); so.addLocalUpstream(localStreamId, this); } @Override public boolean isMostLocalDownstream() { return mostDownstream; } @Override public boolean isMostLocalUpstream() { return mostUpstream; } @Override public void processData(DataTuple data) { code.processData(data); } @Override public void processData(List<DataTuple> dataList) { code.processData(dataList); } @Override public void setUp() { code.setUp(); } public void setMultiOperator(MultiOperator multiOperator) { this.multiOp = multiOp; } @Override public void send_to_OpId(DataTuple dt, int opId) { } @Override public void send_to_OpIds(DataTuple[] dt, int[] opId) { } @Override public void send_toIndices(DataTuple[] dts, int[] indices) { } }