/* *************************************************************************************** * 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.client.EventType; import com.espertech.esper.core.context.util.AgentInstanceContext; import com.espertech.esper.core.service.StatementContext; import com.espertech.esper.epl.expression.core.ExprEvaluator; import com.espertech.esper.epl.expression.core.ExprNode; import com.espertech.esper.epl.expression.core.ExprValidationException; import com.espertech.esper.epl.expression.visitor.ExprNodeIdentifierVisitor; import com.espertech.esper.epl.spec.OnTriggerSetAssignment; import com.espertech.esper.epl.variable.VariableReadWritePackage; import com.espertech.esper.event.arr.ObjectArrayEventBean; import java.util.List; /** * Output condition for output rate limiting that handles when-then expressions for controlling output. */ public class OutputConditionPolledExpressionFactory implements OutputConditionPolledFactory { private final ExprEvaluator whenExpressionNode; private final VariableReadWritePackage variableReadWritePackage; private final EventType oatypeBuiltinProperties; /** * Ctor. * * @param whenExpressionNode the expression to evaluate, returning true when to output * @param assignments is the optional then-clause variable assignments, or null or empty if none * @param statementContext context * @throws ExprValidationException when validation fails */ public OutputConditionPolledExpressionFactory(ExprNode whenExpressionNode, List<OnTriggerSetAssignment> assignments, StatementContext statementContext) throws ExprValidationException { this.whenExpressionNode = whenExpressionNode.getExprEvaluator(); // determine if using properties boolean containsBuiltinProperties = false; if (containsBuiltinProperties(whenExpressionNode)) { containsBuiltinProperties = true; } else { if (assignments != null) { for (OnTriggerSetAssignment assignment : assignments) { if (containsBuiltinProperties(assignment.getExpression())) { containsBuiltinProperties = true; } } } } if (containsBuiltinProperties) { oatypeBuiltinProperties = statementContext.getEventAdapterService().createAnonymousObjectArrayType(OutputConditionPolledExpressionFactory.class.getName(), OutputConditionExpressionTypeUtil.TYPEINFO); } else { oatypeBuiltinProperties = null; } if (assignments != null) { variableReadWritePackage = new VariableReadWritePackage(assignments, statementContext.getVariableService(), statementContext.getEventAdapterService()); } else { variableReadWritePackage = null; } } public OutputConditionPolled makeFromState(AgentInstanceContext agentInstanceContext, OutputConditionPolledState state) { ObjectArrayEventBean builtinProperties = null; if (oatypeBuiltinProperties != null) { builtinProperties = new ObjectArrayEventBean(OutputConditionExpressionTypeUtil.getOAPrototype(), oatypeBuiltinProperties); } OutputConditionPolledExpressionState expressionState = (OutputConditionPolledExpressionState) state; return new OutputConditionPolledExpression(this, expressionState, agentInstanceContext, builtinProperties); } public OutputConditionPolled makeNew(AgentInstanceContext agentInstanceContext) { ObjectArrayEventBean builtinProperties = null; Long lastOutputTimestamp = null; if (oatypeBuiltinProperties != null) { builtinProperties = new ObjectArrayEventBean(OutputConditionExpressionTypeUtil.getOAPrototype(), oatypeBuiltinProperties); lastOutputTimestamp = agentInstanceContext.getStatementContext().getSchedulingService().getTime(); } OutputConditionPolledExpressionState state = new OutputConditionPolledExpressionState(0, 0, 0, 0, lastOutputTimestamp); return new OutputConditionPolledExpression(this, state, agentInstanceContext, builtinProperties); } public ExprEvaluator getWhenExpressionNode() { return whenExpressionNode; } public VariableReadWritePackage getVariableReadWritePackage() { return variableReadWritePackage; } private boolean containsBuiltinProperties(ExprNode expr) { ExprNodeIdentifierVisitor propertyVisitor = new ExprNodeIdentifierVisitor(false); expr.accept(propertyVisitor); return !propertyVisitor.getExprProperties().isEmpty(); } }