/*
# 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.getInputMapping;
import static com.ibm.streamsx.topology.internal.functional.FunctionalHelper.getLogicObject;
import com.ibm.streams.operator.OperatorContext;
import com.ibm.streams.operator.OutputTuple;
import com.ibm.streams.operator.StreamingInput;
import com.ibm.streams.operator.StreamingOutput;
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.InputPorts;
import com.ibm.streams.operator.model.OutputPortSet;
import com.ibm.streams.operator.model.OutputPorts;
import com.ibm.streams.operator.model.PrimitiveOperator;
import com.ibm.streamsx.topology.function.ToIntFunction;
import com.ibm.streamsx.topology.internal.spljava.SPLMapping;
/**
* Generically adds an int32 hash value as the second
* attribute to a stream.
*/
@PrimitiveOperator
@Icons(location16 = "opt/icons/functor_16.gif", location32 = "opt/icons/functor_32.gif")
@InputPorts({@InputPortSet(cardinality = 1)})
@OutputPorts({@OutputPortSet(cardinality = 1)})
public class HashAdder extends FunctionFunctor {
private ToIntFunction<Object> hasher;
protected SPLMapping<Object> mapping;
protected StreamingOutput<OutputTuple> output;
@Override
public void initialize(OperatorContext context)
throws Exception {
super.initialize(context);
hasher = getLogicObject(getFunctionalLogic());
output = getOutput(0);
mapping = getInputMapping(this, 0);
}
@Override
public void process(StreamingInput<Tuple> stream, Tuple tuple)
throws Exception {
// Take the hash code, add it to the tuple, and submit.
Object value = mapping.convertFrom(tuple);
OutputTuple ot = output.newTuple();
ot.setObject(0, tuple.getObject(0));
ot.setInt(1, hasher.applyAsInt(value));
output.submit(ot);
}
}