
net.intelie.liverig.plugin.widgets.SwingingDoorCompression Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of plugin-assets Show documentation
Show all versions of plugin-assets Show documentation
Asset framework for industries solutions
The newest version!
package net.intelie.liverig.plugin.widgets;
import net.intelie.pipes.ArrayRawEvent;
import net.intelie.pipes.ArrayRowList;
import net.intelie.pipes.Row;
import net.intelie.pipes.Sink;
import net.intelie.pipes.types.RowFields;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class SwingingDoorCompression {
@NotNull
private final Sink listener;
@NotNull
private final RowFields fields;
@NotNull
private final Double maxDeviation;
@NotNull
private final Double maxOutputPeriod;
@NotNull
private double[] snapshot = new double[2]; // most up to date value that has passed exception
private boolean dirtySnapshot = true;
@NotNull
private double[] archive = new double[2];
private boolean dirtyArchive = true;
@NotNull
private double[] slope = new double[2];
private boolean dirtySlope = true;
@Nullable
private Object acrhiveObj = null;
@Nullable
private Object snapshotObj = null;
@Nullable
private Object lastFlowed = null;
public SwingingDoorCompression(Sink listener, RowFields fields, @NotNull Double maxDeviation, @NotNull Double maxOutputPeriod) {
this.listener = listener;
this.fields = fields;
this.maxDeviation = maxDeviation;
this.maxOutputPeriod = maxOutputPeriod;
}
public void flow(@NotNull Double x, @NotNull Double y, Object obj) {
if (dirtyArchive) {
setArchive(x, y, obj);
flow(obj);
return;
}
if (dirtySnapshot || dirtySlope) {
setSnapshot(x, y, obj);
setSlopes(x, y);
return;
}
if (inSlope(x, y) && (x.longValue() - maxOutputPeriod) < archive[0]) {
setSnapshot(x, y, obj);
setSlopes(x, y);
return;
}
setArchive(snapshot[0], snapshot[1], snapshotObj);
dirtySnapshot = true;
if (acrhiveObj != null && acrhiveObj != lastFlowed)
flow(acrhiveObj);
flow(obj);
}
private void flow(@NotNull Object obj) {
lastFlowed = obj;
if (fields != null) {
if (obj instanceof Row) {
listener.onEvent(fields, new ArrayRowList((Row) obj));
}
} else {
listener.onRaw(ArrayRawEvent.fromArray(obj));
}
}
@Nullable
public double[] getSlope() {
return slope;
}
private void setSlopes(@NotNull Double x, @NotNull Double y) {
dirtySlope = false;
slope[0] = calculateSlope(x, y + maxDeviation);
slope[1] = calculateSlope(x, y - maxDeviation);
}
private void setArchive(@NotNull Double x, @NotNull Double y, Object obj) {
dirtyArchive = false;
archive[0] = x;
archive[1] = y;
acrhiveObj = obj;
}
private void setSnapshot(@NotNull Double x, @NotNull Double y, Object obj) {
dirtySnapshot = false;
snapshot[0] = x;
snapshot[1] = y;
snapshotObj = obj;
}
private boolean inSlope(@NotNull Double x, @NotNull Double y) {
return ((slope[0] * x) >= y && (slope[1] * x) <= y);
}
@NotNull
private Double calculateSlope(@NotNull Double x, @NotNull Double y) {
return (y - archive[1]) / (x - archive[0]);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy