/*
***************************************************************************************
* 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.view;
import com.espertech.esper.core.service.ExprEvaluatorContextStatement;
import com.espertech.esper.core.service.StatementContext;
import com.espertech.esper.epl.core.StreamTypeService;
import com.espertech.esper.epl.core.StreamTypeServiceImpl;
import com.espertech.esper.epl.expression.core.ExprEvaluator;
import com.espertech.esper.epl.expression.core.ExprNode;
import com.espertech.esper.epl.expression.time.*;
import com.espertech.esper.util.JavaClassHelper;
public class ViewFactoryTimePeriodHelper {
public static ExprTimePeriodEvalDeltaConstFactory validateAndEvaluateTimeDeltaFactory(String viewName,
StatementContext statementContext,
ExprNode expression,
String expectedMessage,
int expressionNumber)
throws ViewParameterException {
StreamTypeService streamTypeService = new StreamTypeServiceImpl(statementContext.getEngineURI(), false);
ExprTimePeriodEvalDeltaConstFactory factory;
if (expression instanceof ExprTimePeriod) {
ExprTimePeriod validated = (ExprTimePeriod) ViewFactorySupport.validateExpr(viewName, statementContext, expression, streamTypeService, expressionNumber);
factory = validated.constEvaluator(new ExprEvaluatorContextStatement(statementContext, false));
} else {
ExprNode validated = ViewFactorySupport.validateExpr(viewName, statementContext, expression, streamTypeService, expressionNumber);
ExprEvaluator secondsEvaluator = validated.getExprEvaluator();
Class returnType = JavaClassHelper.getBoxedType(secondsEvaluator.getType());
if (!JavaClassHelper.isNumeric(returnType)) {
throw new ViewParameterException(expectedMessage);
}
if (validated.isConstantResult()) {
Number time = (Number) ViewFactorySupport.evaluate(secondsEvaluator, 0, viewName, statementContext);
if (!ExprTimePeriodUtil.validateTime(time, statementContext.getTimeAbacus())) {
throw new ViewParameterException(ExprTimePeriodUtil.getTimeInvalidMsg(viewName, "view", time));
}
long msec = statementContext.getTimeAbacus().deltaForSecondsNumber(time);
factory = new ExprTimePeriodEvalDeltaConstGivenDelta(msec);
} else {
factory = new ExprTimePeriodEvalDeltaConstFactoryMsec(secondsEvaluator, statementContext.getTimeAbacus());
}
}
return factory;
}
}