/**************************************************************************************
* Copyright (C) 2008 EsperTech, Inc. All rights reserved. *
* http://esper.codehaus.org *
* 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.epl.view;
import com.espertech.esper.core.service.StatementContext;
import com.espertech.esper.epl.expression.ExprConstantNodeImpl;
import com.espertech.esper.epl.expression.ExprValidationException;
import com.espertech.esper.epl.spec.OnTriggerSetAssignment;
import com.espertech.esper.epl.spec.OutputLimitLimitType;
import com.espertech.esper.epl.spec.OutputLimitRateType;
import com.espertech.esper.epl.spec.OutputLimitSpec;
import com.espertech.esper.epl.variable.VariableReader;
import com.espertech.esper.util.JavaClassHelper;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.util.Collections;
/**
* Factory for output condition instances.
*/
public class OutputConditionFactoryFactory
{
private static final Log log = LogFactory.getLog(OutputConditionFactoryFactory.class);
/**
* Creates an output condition instance.
* @param outputLimitSpec specifies what kind of condition to create
* @return instance for performing output
*/
public static OutputConditionFactory createCondition(OutputLimitSpec outputLimitSpec,
StatementContext statementContext,
boolean isGrouped,
boolean isWithHavingClause)
throws ExprValidationException
{
if(outputLimitSpec == null)
{
return new OutputConditionNullFactory();
}
// Check if a variable is present
VariableReader reader = null;
if (outputLimitSpec.getVariableName() != null)
{
reader = statementContext.getVariableService().getReader(outputLimitSpec.getVariableName());
if (reader == null)
{
throw new IllegalArgumentException("Variable named '" + outputLimitSpec.getVariableName() + "' has not been declared");
}
}
if(outputLimitSpec.getDisplayLimit() == OutputLimitLimitType.FIRST)
{
if (isGrouped) {
return new OutputConditionNullFactory();
}
if (!isWithHavingClause) {
return new OutputConditionFirstFactory(outputLimitSpec, statementContext, isGrouped, isWithHavingClause);
}
}
if(outputLimitSpec.getRateType() == OutputLimitRateType.CRONTAB)
{
return new OutputConditionCrontabFactory(outputLimitSpec.getCrontabAtSchedule(), statementContext);
}
else if(outputLimitSpec.getRateType() == OutputLimitRateType.WHEN_EXPRESSION)
{
return new OutputConditionExpressionFactory(outputLimitSpec.getWhenExpressionNode(), outputLimitSpec.getThenExpressions(), statementContext, outputLimitSpec.getAndAfterTerminateExpr(), outputLimitSpec.getAndAfterTerminateThenExpressions());
}
else if(outputLimitSpec.getRateType() == OutputLimitRateType.EVENTS)
{
if (log.isDebugEnabled())
{
log.debug(".createCondition creating OutputConditionCount with event rate " + outputLimitSpec);
}
if ((reader != null) && (!JavaClassHelper.isNumericNonFP(reader.getType())))
{
throw new IllegalArgumentException("Variable named '" + outputLimitSpec.getVariableName() + "' must be type integer, long or short");
}
int rate = -1;
if (outputLimitSpec.getRate() != null)
{
rate = outputLimitSpec.getRate().intValue();
}
return new OutputConditionCountFactory(rate, reader);
}
else if (outputLimitSpec.getRateType() == OutputLimitRateType.TERM)
{
if (outputLimitSpec.getAndAfterTerminateExpr() == null && (outputLimitSpec.getAndAfterTerminateThenExpressions() == null || outputLimitSpec.getAndAfterTerminateThenExpressions().isEmpty())) {
return new OutputConditionTermFactory();
}
else {
return new OutputConditionExpressionFactory(new ExprConstantNodeImpl(false), Collections.<OnTriggerSetAssignment>emptyList(), statementContext, outputLimitSpec.getAndAfterTerminateExpr(), outputLimitSpec.getAndAfterTerminateThenExpressions());
}
}
else {
if (log.isDebugEnabled())
{
log.debug(".createCondition creating OutputConditionTime with interval length " + outputLimitSpec.getRate());
}
if ((reader != null) && (!JavaClassHelper.isNumeric(reader.getType())))
{
throw new IllegalArgumentException("Variable named '" + outputLimitSpec.getVariableName() + "' must be of numeric type");
}
return new OutputConditionTimeFactory(outputLimitSpec.getTimePeriodExpr(), statementContext);
}
}
}