/* # Licensed Materials - Property of IBM # Copyright IBM Corp. 2015 */ package com.ibm.streamsx.topology.internal.functional.ops; import static com.ibm.streamsx.topology.internal.functional.FunctionalHelper.getLogicObject; import com.ibm.streams.operator.StreamingInput; import com.ibm.streams.operator.Tuple; import com.ibm.streams.operator.model.Icons; import com.ibm.streams.operator.model.InputPortSet; import com.ibm.streams.operator.model.InputPortSet.WindowMode; import com.ibm.streams.operator.model.InputPorts; import com.ibm.streams.operator.model.Parameter; import com.ibm.streams.operator.model.PrimitiveOperator; import com.ibm.streams.operator.window.StreamWindow; import com.ibm.streamsx.topology.function.Function; import com.ibm.streamsx.topology.internal.functional.window.PartitionedSlidingJoin; import com.ibm.streamsx.topology.internal.functional.window.SlidingJoin; @PrimitiveOperator @InputPorts({ @InputPortSet(cardinality = 1, windowingMode = WindowMode.Windowed), @InputPortSet(cardinality = 1) }) @Icons(location16 = "opt/icons/join_16.gif", location32 = "opt/icons/join_32.gif") public class FunctionJoin extends FunctionWindow { public static final String JOIN_KEY_GETTER_PARAM = "joinKeyGetter"; private SlidingJoin<Object, Object, Object> joiner; private String joinKeyGetter; @Override void createWindowListener(StreamWindow<Tuple> window) throws Exception { if (window.isPartitioned()) { Function<Object,Object> joinKeyGetter = getLogicObject(getJoinKeyGetter()); joiner = new PartitionedSlidingJoin<Object, Object, Object>( this, window, joinKeyGetter); } else { joiner = new SlidingJoin<Object, Object, Object>(this, window); } } /** * Windowed tuples arrive on port 0 and thus handled by the window listener * Lookup tuples arrive on port 1 */ @Override public void process(StreamingInput<Tuple> stream, Tuple splTuple) throws Exception { if (stream.getPortNumber() == 1) joiner.port1Join(splTuple); } public String getJoinKeyGetter() { return joinKeyGetter; } @Parameter(optional=true) public void setJoinKeyGetter(String joinKeyGetter) { this.joinKeyGetter = joinKeyGetter; } }