com.fluxtion.runtime.dataflow.function.MergeMapFlowFunction Maven / Gradle / Ivy
The newest version!
package com.fluxtion.runtime.dataflow.function;
import com.fluxtion.runtime.annotations.Initialise;
import com.fluxtion.runtime.annotations.NoTriggerReference;
import com.fluxtion.runtime.annotations.OnParentUpdate;
import com.fluxtion.runtime.annotations.OnTrigger;
import com.fluxtion.runtime.annotations.builder.Inject;
import com.fluxtion.runtime.callback.DirtyStateMonitor;
import com.fluxtion.runtime.dataflow.FlowFunction;
import com.fluxtion.runtime.dataflow.TriggeredFlowFunction;
import com.fluxtion.runtime.partition.LambdaReflection;
import lombok.ToString;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Supplier;
/**
* Merges multiple event streams into a single transformed output
*/
@ToString
public class MergeMapFlowFunction implements TriggeredFlowFunction {
private final Supplier factory;
private T result;
private final List> mergeProperties;
@SuppressWarnings("rawtypes")
private List triggerList = new ArrayList<>();
@NoTriggerReference
@SuppressWarnings("rawtypes")
private final transient List nonTriggeringSources = new ArrayList<>();
private final transient Set> requiredSet = new HashSet<>();
private transient boolean allTriggersUpdated = false;
@Inject
public DirtyStateMonitor dirtyStateMonitor;
public MergeMapFlowFunction(LambdaReflection.SerializableSupplier factory) {
this(factory, new ArrayList<>());
}
public MergeMapFlowFunction(LambdaReflection.SerializableSupplier factory, List> mergeProperties) {
this.factory = factory;
this.mergeProperties = mergeProperties;
}
@OnParentUpdate("triggerList")
public void inputUpdated(FlowFunction> trigger) {
if (!allTriggersUpdated) {
requiredSet.remove(trigger);
allTriggersUpdated = requiredSet.isEmpty();
}
}
@OnParentUpdate("nonTriggeringSources")
public void inputNonTriggeringUpdated(FlowFunction> trigger) {
if (!allTriggersUpdated) {
requiredSet.remove(trigger);
allTriggersUpdated = requiredSet.isEmpty();
}
}
@OnTrigger
public boolean triggered() {
if (allTriggersUpdated) {
result = factory.get();
for (int i = 0; i < mergeProperties.size(); i++) {
mergeProperties.get(i).push(result);
}
}
return allTriggersUpdated;
}
@Override
public void parallel() {
}
@Override
public boolean parallelCandidate() {
return false;
}
@Override
public boolean hasChanged() {
return dirtyStateMonitor.isDirty(this);
}
public void registerTrigger(MergeProperty mergeProperty) {
if (mergeProperty.isTriggering()) {
triggerList.add(mergeProperty.getTrigger());
} else {
nonTriggeringSources.add(mergeProperty.getTrigger());
}
mergeProperties.add(mergeProperty);
}
@Override
public T get() {
return result;
}
@Initialise
public void init() {
allTriggersUpdated = false;
triggerList.clear();
mergeProperties.stream()
.map(MergeProperty::getTrigger)
.forEach(requiredSet::add);
}
@Override
public void setUpdateTriggerNode(Object updateTriggerNode) {
//do nothing
}
@Override
public void setPublishTriggerNode(Object publishTriggerNode) {
//do nothing
}
@Override
public void setResetTriggerNode(Object resetTriggerNode) {
//do nothing
}
@Override
public void setPublishTriggerOverrideNode(Object publishTriggerOverrideNode) {
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy