/*
***************************************************************************************
* 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.epl.view;
import com.espertech.esper.core.service.StatementContext;
import com.espertech.esper.epl.expression.core.ExprValidationException;
import com.espertech.esper.epl.spec.OutputLimitRateType;
import com.espertech.esper.epl.spec.OutputLimitSpec;
import com.espertech.esper.epl.variable.VariableMetaData;
import com.espertech.esper.util.JavaClassHelper;
/**
* Factory for output condition instances that are polled/queried only.
*/
public class OutputConditionPolledFactoryFactory {
public static OutputConditionPolledFactory createConditionFactory(OutputLimitSpec outputLimitSpec,
StatementContext statementContext)
throws ExprValidationException {
if (outputLimitSpec == null) {
throw new NullPointerException("Output condition by count requires a non-null callback");
}
// check variable use
VariableMetaData variableMetaData = null;
if (outputLimitSpec.getVariableName() != null) {
variableMetaData = statementContext.getVariableService().getVariableMetaData(outputLimitSpec.getVariableName());
if (variableMetaData == null) {
throw new IllegalArgumentException("Variable named '" + outputLimitSpec.getVariableName() + "' has not been declared");
}
}
if (outputLimitSpec.getRateType() == OutputLimitRateType.CRONTAB) {
return new OutputConditionPolledCrontabFactory(outputLimitSpec.getCrontabAtSchedule(), statementContext);
} else if (outputLimitSpec.getRateType() == OutputLimitRateType.WHEN_EXPRESSION) {
return new OutputConditionPolledExpressionFactory(outputLimitSpec.getWhenExpressionNode(), outputLimitSpec.getThenExpressions(), statementContext);
} else if (outputLimitSpec.getRateType() == OutputLimitRateType.EVENTS) {
int rate = -1;
if (outputLimitSpec.getRate() != null) {
rate = outputLimitSpec.getRate().intValue();
}
return new OutputConditionPolledCountFactory(rate, statementContext, outputLimitSpec.getVariableName());
} else {
if (variableMetaData != null && (!JavaClassHelper.isNumeric(variableMetaData.getType()))) {
throw new IllegalArgumentException("Variable named '" + outputLimitSpec.getVariableName() + "' must be of numeric type");
}
return new OutputConditionPolledTimeFactory(outputLimitSpec.getTimePeriodExpr(), statementContext);
}
}
}