All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.fluxtion.runtime.dataflow.aggregate.function.TumblingWindow Maven / Gradle / Ivy

package com.fluxtion.runtime.dataflow.aggregate.function;

import com.fluxtion.runtime.annotations.OnParentUpdate;
import com.fluxtion.runtime.annotations.OnTrigger;
import com.fluxtion.runtime.dataflow.DoubleFlowFunction;
import com.fluxtion.runtime.dataflow.FlowFunction;
import com.fluxtion.runtime.dataflow.IntFlowFunction;
import com.fluxtion.runtime.dataflow.LongFlowFunction;
import com.fluxtion.runtime.dataflow.aggregate.AggregateDoubleFlowFunction;
import com.fluxtion.runtime.dataflow.aggregate.AggregateFlowFunction;
import com.fluxtion.runtime.dataflow.aggregate.AggregateIntFlowFunction;
import com.fluxtion.runtime.dataflow.aggregate.AggregateLongFlowFunction;
import com.fluxtion.runtime.dataflow.function.AbstractFlowFunction;
import com.fluxtion.runtime.partition.LambdaReflection.SerializableSupplier;
import com.fluxtion.runtime.time.FixedRateTrigger;

public class TumblingWindow, F extends AggregateFlowFunction>
        extends AbstractFlowFunction {

    private final SerializableSupplier windowFunctionSupplier;
    protected final transient F windowFunction;
    public FixedRateTrigger rollTrigger;
    private R value;


    public TumblingWindow(S inputEventStream, SerializableSupplier windowFunctionSupplier, int windowSizeMillis) {
        this(inputEventStream, windowFunctionSupplier);
        rollTrigger = FixedRateTrigger.atMillis(windowSizeMillis);
    }

    public TumblingWindow(S inputEventStream, SerializableSupplier windowFunctionSupplier) {
        super(inputEventStream, null);
        this.windowFunctionSupplier = windowFunctionSupplier;
        this.windowFunction = windowFunctionSupplier.get();
    }

    @Override
    public R get() {
        return value;
    }

    protected void cacheWindowValue() {
        value = windowFunction.get();
    }

    protected void aggregateInputValue(S inputEventStream) {
        windowFunction.aggregate(inputEventStream.get());
    }

    @OnParentUpdate
    public void timeTriggerFired(FixedRateTrigger rollTrigger) {
        if (rollTrigger.getTriggerCount() == 1) {
            cacheWindowValue();
        }
        publishOverrideTriggered = !overridePublishTrigger & !overrideUpdateTrigger;
        inputStreamTriggered_1 = true;
        inputStreamTriggered = true;
        windowFunction.reset();
        if (rollTrigger.getTriggerCount() != 1) {
            cacheWindowValue();
        }
    }

    @OnParentUpdate
    public void inputUpdated(S inputEventStream) {
        aggregateInputValue(inputEventStream);
        inputStreamTriggered_1 = false;
        inputStreamTriggered = false;
    }

    @OnParentUpdate("updateTriggerNode")
    public void updateTriggerNodeUpdated(Object triggerNode) {
        super.updateTriggerNodeUpdated(triggerNode);
        cacheWindowValue();
    }

    @OnTrigger
    public boolean triggered() {
        return fireEventUpdateNotification();
    }

    @Override
    protected void resetOperation() {
        windowFunction.reset();
        rollTrigger.init();
        value = null;
    }

    @Override
    public boolean isStatefulFunction() {
        return true;
    }

    public static class TumblingIntWindowStream>
            extends TumblingWindow
            implements IntFlowFunction {

        private int value;

        public TumblingIntWindowStream(IntFlowFunction inputEventStream,
                                       SerializableSupplier windowFunctionSupplier,
                                       int windowSizeMillis) {
            super(inputEventStream, windowFunctionSupplier, windowSizeMillis);

        }

        public TumblingIntWindowStream(IntFlowFunction inputEventStream,
                                       SerializableSupplier windowFunctionSupplier) {
            super(inputEventStream, windowFunctionSupplier);
        }

        @Override
        public int getAsInt() {
            return value;
        }

        @Override
        public Integer get() {
            return value;
        }

        protected void cacheWindowValue() {
            value = windowFunction.getAsInt();
        }

        protected void aggregateInputValue(IntFlowFunction inputEventStream) {
            windowFunction.aggregateInt(inputEventStream.getAsInt());
        }
    }


    public static class TumblingDoubleWindowStream>
            extends TumblingWindow
            implements DoubleFlowFunction {

        private double value;

        public TumblingDoubleWindowStream(DoubleFlowFunction inputEventStream,
                                          SerializableSupplier windowFunctionSupplier,
                                          int windowSizeMillis) {
            super(inputEventStream, windowFunctionSupplier, windowSizeMillis);
        }

        public TumblingDoubleWindowStream(DoubleFlowFunction inputEventStream,
                                          SerializableSupplier windowFunctionSupplier) {
            super(inputEventStream, windowFunctionSupplier);
        }

        @Override
        public double getAsDouble() {
            return value;
        }

        @Override
        public Double get() {
            return value;
        }

        protected void cacheWindowValue() {
            value = windowFunction.getAsDouble();
        }

        protected void aggregateInputValue(DoubleFlowFunction inputEventStream) {
            windowFunction.aggregateDouble(inputEventStream.getAsDouble());
        }
    }


    public static class TumblingLongWindowStream>
            extends TumblingWindow
            implements LongFlowFunction {

        private long value;

        public TumblingLongWindowStream(LongFlowFunction inputEventStream,
                                        SerializableSupplier windowFunctionSupplier,
                                        int windowSizeMillis) {
            super(inputEventStream, windowFunctionSupplier, windowSizeMillis);
        }

        public TumblingLongWindowStream(LongFlowFunction inputEventStream,
                                        SerializableSupplier windowFunctionSupplier) {
            super(inputEventStream, windowFunctionSupplier);
        }

        @Override
        public long getAsLong() {
            return value;
        }

        @Override
        public Long get() {
            return value;
        }

        protected void cacheWindowValue() {
            value = windowFunction.getAsLong();
        }

        protected void aggregateInputValue(LongFlowFunction inputEventStream) {
            windowFunction.aggregateLong(inputEventStream.getAsLong());
        }

    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy