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

com.espertech.esper.client.soda.OutputLimitClause Maven / Gradle / Ivy

/*
 ***************************************************************************************
 *  Copyright (C) 2006 EsperTech, Inc. All rights reserved.                            *
 *  http://www.espertech.com/esper                                                     *
 *  http://www.espertech.com                                                           *
 *  ---------------------------------------------------------------------------------- *
 *  The software in this package is published under the terms of the GPL license       *
 *  a copy of which has been included with this distribution in the license.txt file.  *
 ***************************************************************************************
 */
package com.espertech.esper.client.soda;

import java.io.Serializable;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

/**
 * An output limit clause defines how to limit output of statements and consists of
 * a selector specifiying which events to select to output, a frequency and a unit.
 */
public class OutputLimitClause implements Serializable {
    private static final long serialVersionUID = 0L;

    private OutputLimitSelector selector;
    private Double frequency;
    private String frequencyVariable;
    private OutputLimitUnit unit;
    private Expression whenExpression;
    private List thenAssignments;
    private Expression[] crontabAtParameters;
    private Expression timePeriodExpression;
    private Expression afterTimePeriodExpression;
    private Integer afterNumberOfEvents;
    private boolean andAfterTerminate;
    private Expression andAfterTerminateAndExpr;
    private List andAfterTerminateThenAssignments;

    /**
     * Ctor.
     */
    public OutputLimitClause() {
    }

    /**
     * Ctor.
     *
     * @param selector selector
     * @param unit     unit
     */
    public OutputLimitClause(OutputLimitSelector selector, OutputLimitUnit unit) {
        this.selector = selector;
        this.unit = unit;
    }

    /**
     * Creates an output limit clause.
     *
     * @param timePeriodExpression a frequency to output at
     * @return clause
     */
    public static OutputLimitClause create(TimePeriodExpression timePeriodExpression) {
        return new OutputLimitClause(OutputLimitSelector.DEFAULT, timePeriodExpression);
    }

    /**
     * Create with after-only time period.
     *
     * @param afterTimePeriodExpression time period
     * @return clause
     */
    public static OutputLimitClause createAfter(TimePeriodExpression afterTimePeriodExpression) {
        return new OutputLimitClause(OutputLimitSelector.DEFAULT, OutputLimitUnit.AFTER, afterTimePeriodExpression, null);
    }

    /**
     * Create with after-only and number of events.
     *
     * @param afterNumEvents num events
     * @return clause
     */
    public static OutputLimitClause createAfter(int afterNumEvents) {
        return new OutputLimitClause(OutputLimitSelector.DEFAULT, OutputLimitUnit.AFTER, null, afterNumEvents);
    }

    /**
     * Creates an output limit clause.
     *
     * @param selector             is the events to select
     * @param timePeriodExpression a frequency to output at
     * @return clause
     */
    public static OutputLimitClause create(OutputLimitSelector selector, TimePeriodExpression timePeriodExpression) {
        return new OutputLimitClause(selector, timePeriodExpression);
    }

    /**
     * Creates an output limit clause.
     *
     * @param selector  is the events to select
     * @param frequency a frequency to output at
     * @return clause
     */
    public static OutputLimitClause create(OutputLimitSelector selector, double frequency) {
        return new OutputLimitClause(selector, frequency);
    }

    /**
     * Creates an output limit clause.
     *
     * @param selector          is the events to select
     * @param frequencyVariable is the variable providing the output limit frequency
     * @return clause
     */
    public static OutputLimitClause create(OutputLimitSelector selector, String frequencyVariable) {
        return new OutputLimitClause(selector, frequencyVariable);
    }

    /**
     * Creates an output limit clause.
     *
     * @param frequency a frequency to output at
     * @return clause
     */
    public static OutputLimitClause create(double frequency) {
        return new OutputLimitClause(OutputLimitSelector.DEFAULT, frequency);
    }

    /**
     * Creates an output limit clause.
     *
     * @param frequencyVariable is the variable name providing output rate frequency values
     * @return clause
     */
    public static OutputLimitClause create(String frequencyVariable) {
        return new OutputLimitClause(OutputLimitSelector.DEFAULT, frequencyVariable);
    }

    /**
     * Creates an output limit clause with a when-expression and optional then-assignment expressions to be added.
     *
     * @param whenExpression the expression that returns true to trigger output
     * @return clause
     */
    public static OutputLimitClause create(Expression whenExpression) {
        return new OutputLimitClause(OutputLimitSelector.DEFAULT, whenExpression, new ArrayList());
    }

    /**
     * Creates an output limit clause with a crontab 'at' schedule parameters, see {@link com.espertech.esper.type.FrequencyParameter} and related.
     *
     * @param scheduleParameters the crontab schedule parameters
     * @return clause
     */
    public static OutputLimitClause createSchedule(Expression[] scheduleParameters) {
        return new OutputLimitClause(OutputLimitSelector.DEFAULT, scheduleParameters);
    }

    /**
     * Ctor.
     *
     * @param selector  is the events to select
     * @param frequency a frequency to output at
     */
    public OutputLimitClause(OutputLimitSelector selector, Double frequency) {
        this.selector = selector;
        this.frequency = frequency;
        this.unit = OutputLimitUnit.EVENTS;
    }

    /**
     * Ctor.
     *
     * @param selector             is the events to select
     * @param timePeriodExpression the unit for the frequency
     */
    public OutputLimitClause(OutputLimitSelector selector, TimePeriodExpression timePeriodExpression) {
        this.selector = selector;
        this.timePeriodExpression = timePeriodExpression;
        this.unit = OutputLimitUnit.TIME_PERIOD;
    }

    /**
     * Ctor.
     *
     * @param afterTimePeriodExpression timer period for after.
     */
    public OutputLimitClause(TimePeriodExpression afterTimePeriodExpression) {
        this.unit = OutputLimitUnit.AFTER;
        this.afterTimePeriodExpression = afterTimePeriodExpression;
    }

    /**
     * Ctor.
     *
     * @param selector          is the events to select
     * @param frequencyVariable is the variable name providing output rate frequency values
     */
    public OutputLimitClause(OutputLimitSelector selector, String frequencyVariable) {
        this.selector = selector;
        this.frequencyVariable = frequencyVariable;
        this.unit = OutputLimitUnit.EVENTS;
    }

    /**
     * Ctor.
     *
     * @param selector          is the events to select
     * @param frequency         a frequency to output at
     * @param unit              the unit for the frequency
     * @param frequencyVariable is the variable name providing output rate frequency values
     */
    public OutputLimitClause(OutputLimitSelector selector, Double frequency, String frequencyVariable, OutputLimitUnit unit) {
        this.selector = selector;
        this.frequency = frequency;
        this.frequencyVariable = frequencyVariable;
        this.unit = unit;
    }

    /**
     * Ctor.
     *
     * @param selector            is the events to select
     * @param unit                the unit of selection
     * @param afterTimePeriod     after-keyword time period
     * @param afterNumberOfEvents after-keyword number of events
     */
    public OutputLimitClause(OutputLimitSelector selector, OutputLimitUnit unit, TimePeriodExpression afterTimePeriod, Integer afterNumberOfEvents) {
        this.selector = selector;
        this.unit = unit;
        this.afterTimePeriodExpression = afterTimePeriod;
        this.afterNumberOfEvents = afterNumberOfEvents;
    }

    /**
     * Ctor.
     *
     * @param selector            is the events to select
     * @param crontabAtParameters the crontab schedule parameters
     */
    public OutputLimitClause(OutputLimitSelector selector, Expression[] crontabAtParameters) {
        this.selector = selector;
        this.crontabAtParameters = crontabAtParameters;
        this.unit = OutputLimitUnit.CRONTAB_EXPRESSION;
    }

    /**
     * Ctor.
     *
     * @param selector        is the events to select
     * @param whenExpression  the boolean expression to evaluate to control output
     * @param thenAssignments the variable assignments, optional or an empty list
     */
    public OutputLimitClause(OutputLimitSelector selector, Expression whenExpression, List thenAssignments) {
        this.selector = selector;
        this.whenExpression = whenExpression;
        this.thenAssignments = thenAssignments;
        this.unit = OutputLimitUnit.WHEN_EXPRESSION;
    }

    /**
     * Returns the selector indicating the events to output.
     *
     * @return selector
     */
    public OutputLimitSelector getSelector() {
        return selector;
    }

    /**
     * Sets the selector indicating the events to output.
     *
     * @param selector to set
     */
    public void setSelector(OutputLimitSelector selector) {
        this.selector = selector;
    }

    /**
     * Returns output frequency.
     *
     * @return frequency of output
     */
    public Double getFrequency() {
        return frequency;
    }

    /**
     * Returns the unit the frequency is in.
     *
     * @return unit for the frequency.
     */
    public OutputLimitUnit getUnit() {
        return unit;
    }

    /**
     * Sets the unit the frequency is in.
     *
     * @param unit is the unit for the frequency
     */
    public void setUnit(OutputLimitUnit unit) {
        this.unit = unit;
    }

    /**
     * Returns the variable name of the variable providing output rate frequency values, or null if the frequency is a fixed value.
     *
     * @return variable name or null if no variable is used
     */
    public String getFrequencyVariable() {
        return frequencyVariable;
    }

    /**
     * Sets the variable name of the variable providing output rate frequency values, or null if the frequency is a fixed value.
     *
     * @param frequencyVariable variable name or null if no variable is used
     */
    public void setFrequencyVariable(String frequencyVariable) {
        this.frequencyVariable = frequencyVariable;
    }

    /**
     * Returns the expression that controls output for use with the when-keyword.
     *
     * @return expression should be boolean result
     */
    public Expression getWhenExpression() {
        return whenExpression;
    }

    /**
     * Returns the time period, or null if none provided.
     *
     * @return time period
     */
    public Expression getTimePeriodExpression() {
        return timePeriodExpression;
    }

    /**
     * Returns the list of optional then-keyword variable assignments, if any
     *
     * @return list of variable assignments or null if none
     */
    public List getThenAssignments() {
        return thenAssignments;
    }

    /**
     * Adds a then-keyword variable assigment for use with the when-keyword.
     *
     * @param assignmentExpression expression to calculate new value
     * @return clause
     */
    public OutputLimitClause addThenAssignment(Expression assignmentExpression) {
        thenAssignments.add(new Assignment(assignmentExpression));
        return this;
    }

    /**
     * Returns the crontab parameters, or null if not using crontab-like schedule.
     *
     * @return parameters
     */
    public Expression[] getCrontabAtParameters() {
        return crontabAtParameters;
    }

    /**
     * Returns true for output upon termination of a context partition
     *
     * @return indicator
     */
    public boolean isAndAfterTerminate() {
        return andAfterTerminate;
    }

    /**
     * Set true for output upon termination of a context partition
     *
     * @param andAfterTerminate indicator
     */
    public void setAndAfterTerminate(boolean andAfterTerminate) {
        this.andAfterTerminate = andAfterTerminate;
    }

    /**
     * Renders the clause in textual representation.
     *
     * @param writer to output to
     */
    public void toEPL(StringWriter writer) {
        if (afterTimePeriodExpression != null) {
            writer.write("after ");
            afterTimePeriodExpression.toEPL(writer, ExpressionPrecedenceEnum.MINIMUM);
            writer.write(" ");
        } else if ((afterNumberOfEvents != null) && (afterNumberOfEvents != 0)) {
            writer.write("after ");
            writer.write(Integer.toString(afterNumberOfEvents));
            writer.write(" events ");
        }

        if (selector != OutputLimitSelector.DEFAULT) {
            writer.write(selector.getText());
            writer.write(" ");
        }
        if (unit == OutputLimitUnit.WHEN_EXPRESSION) {
            writer.write("when ");
            whenExpression.toEPL(writer, ExpressionPrecedenceEnum.MINIMUM);

            if ((thenAssignments != null) && (thenAssignments.size() > 0)) {
                writeThenAssignments(writer, thenAssignments);
            }
        } else if (unit == OutputLimitUnit.CRONTAB_EXPRESSION) {
            writer.write("at (");
            String delimiter = "";
            for (int i = 0; i < crontabAtParameters.length; i++) {
                writer.write(delimiter);
                crontabAtParameters[i].toEPL(writer, ExpressionPrecedenceEnum.MINIMUM);
                delimiter = ", ";
            }
            writer.write(")");
        } else if (unit == OutputLimitUnit.TIME_PERIOD && timePeriodExpression != null) {
            writer.write("every ");
            timePeriodExpression.toEPL(writer, ExpressionPrecedenceEnum.MINIMUM);
        } else if (unit == OutputLimitUnit.AFTER) {
            // no action required
        } else if (unit == OutputLimitUnit.CONTEXT_PARTITION_TERM) {
            writer.write("when terminated");
            outputAndAfter(writer);
        } else {
            writer.write("every ");
            if (frequencyVariable == null) {
                writer.write(Integer.toString(frequency.intValue()));
            } else {
                writer.write(frequencyVariable);
            }
            writer.write(" events");
        }

        if (andAfterTerminate) {
            writer.write(" and when terminated");
            outputAndAfter(writer);
        }
    }

    /**
     * Returns the after-keyword time period.
     *
     * @return after-keyword time period
     */
    public Expression getAfterTimePeriodExpression() {
        return afterTimePeriodExpression;
    }

    /**
     * Sets the after-keyword time period.
     *
     * @param afterTimePeriodExpression after-keyword time period
     */
    public void setAfterTimePeriodExpression(Expression afterTimePeriodExpression) {
        this.afterTimePeriodExpression = afterTimePeriodExpression;
    }

    /**
     * Sets the after-keyword time period.
     *
     * @param afterTimePeriodExpression after-keyword time period
     * @return clause
     */
    public OutputLimitClause afterTimePeriodExpression(TimePeriodExpression afterTimePeriodExpression) {
        this.afterTimePeriodExpression = afterTimePeriodExpression;
        return this;
    }

    /**
     * Returns the after-keyword number of events, or null if undefined.
     *
     * @return num events for after-keyword
     */
    public Integer getAfterNumberOfEvents() {
        return afterNumberOfEvents;
    }

    /**
     * Set frequency.
     *
     * @param frequency to set
     */
    public void setFrequency(Double frequency) {
        this.frequency = frequency;
    }

    /**
     * Set when.
     *
     * @param whenExpression to set
     */
    public void setWhenExpression(Expression whenExpression) {
        this.whenExpression = whenExpression;
    }

    /**
     * Set then.
     *
     * @param thenAssignments to set
     */
    public void setThenAssignments(List thenAssignments) {
        this.thenAssignments = thenAssignments;
    }

    /**
     * Crontab.
     *
     * @param crontabAtParameters to set
     */
    public void setCrontabAtParameters(Expression[] crontabAtParameters) {
        this.crontabAtParameters = crontabAtParameters;
    }

    /**
     * Crontab
     *
     * @param timePeriodExpression to set
     */
    public void setTimePeriodExpression(Expression timePeriodExpression) {
        this.timePeriodExpression = timePeriodExpression;
    }

    /**
     * Sets the after-keyword number of events, or null if undefined.
     *
     * @param afterNumberOfEvents set num events for after-keyword
     */
    public void setAfterNumberOfEvents(Integer afterNumberOfEvents) {
        this.afterNumberOfEvents = afterNumberOfEvents;
    }

    /**
     * Sets the after-keyword number of events, or null if undefined.
     *
     * @param afterNumberOfEvents set num events for after-keyword
     * @return clause
     */
    public OutputLimitClause afterNumberOfEvents(Integer afterNumberOfEvents) {
        this.afterNumberOfEvents = afterNumberOfEvents;
        return this;
    }

    /**
     * Returns the optional expression evaluated when a context partition terminates before triggering output.
     *
     * @return expression
     */
    public Expression getAndAfterTerminateAndExpr() {
        return andAfterTerminateAndExpr;
    }

    /**
     * Sets an optional expression evaluated when a context partition terminates before triggering output.
     *
     * @param andAfterTerminateAndExpr expression
     */
    public void setAndAfterTerminateAndExpr(Expression andAfterTerminateAndExpr) {
        this.andAfterTerminateAndExpr = andAfterTerminateAndExpr;
    }

    /**
     * Returns the set-assignments to execute when a context partition terminates.
     *
     * @return set-assignments
     */
    public List getAndAfterTerminateThenAssignments() {
        return andAfterTerminateThenAssignments;
    }

    /**
     * Sets the set-assignments to execute when a context partition terminates.
     *
     * @param andAfterTerminateThenAssignments set-assignments
     */
    public void setAndAfterTerminateThenAssignments(List andAfterTerminateThenAssignments) {
        this.andAfterTerminateThenAssignments = andAfterTerminateThenAssignments;
    }

    private void writeThenAssignments(StringWriter writer, List thenAssignments) {
        writer.write(" then ");
        UpdateClause.renderEPLAssignments(writer, thenAssignments);
    }

    private void outputAndAfter(StringWriter writer) {
        if (andAfterTerminateAndExpr != null) {
            writer.write(" and ");
            andAfterTerminateAndExpr.toEPL(writer, ExpressionPrecedenceEnum.MINIMUM);
        }
        if (andAfterTerminateThenAssignments != null && andAfterTerminateThenAssignments.size() > 0) {
            writeThenAssignments(writer, andAfterTerminateThenAssignments);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy