/*
# 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.Tuple;
import com.ibm.streams.operator.metrics.Metric;
import com.ibm.streams.operator.metrics.Metric.Kind;
import com.ibm.streams.operator.model.CustomMetric;
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.OutputPortSet;
import com.ibm.streams.operator.model.OutputPorts;
import com.ibm.streams.operator.model.Parameter;
import com.ibm.streams.operator.window.StreamWindow;
import com.ibm.streamsx.topology.function.Function;
import com.ibm.streamsx.topology.internal.functional.window.KeyPartitioner;
import com.ibm.streamsx.topology.internal.spljava.SPLMapping;
@InputPorts(@InputPortSet(cardinality = 1, windowingMode = WindowMode.Windowed))
@OutputPorts(@OutputPortSet(cardinality = 1))
public abstract class FunctionWindow extends FunctionFunctor {
public static final String WINDOW_KEY_GETTER_PARAM = "keyGetter";
private String keyGetter;
private Metric nPartitions;
@Override
public void initialize(OperatorContext context) throws Exception {
super.initialize(context);
StreamWindow<Tuple> window = getInput(0).getStreamWindow();
createWindowListener(window);
if (window.isPartitioned()) {
if (getKeyGetter() == null)
throw new IllegalStateException("Missing keyGetter function");
SPLMapping<Object> input0Mapping = getInputMapping(
this, 0);
Function<Object,Object> functionKeyGetter = getLogicObject(getKeyGetter());
window.registerPartitioner(new KeyPartitioner(input0Mapping,
functionKeyGetter));
}
}
public Metric getnPartitions() {
return nPartitions;
}
@CustomMetric(kind = Kind.GAUGE)
public void setnPartitions(Metric nPartitions) {
this.nPartitions = nPartitions;
}
abstract void createWindowListener(StreamWindow<Tuple> window)
throws Exception;
public String getKeyGetter() {
return keyGetter;
}
/**
* Key getter for the window.
*/
@Parameter(optional=true)
public void setKeyGetter(String keyGetter) {
this.keyGetter = keyGetter;
}
}