/**************************************************************************************
* 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.pattern;
import com.espertech.esper.client.EPException;
import com.espertech.esper.client.EventBean;
import com.espertech.esper.collection.MultiKeyUntyped;
import com.espertech.esper.epl.expression.ExprEvaluator;
import com.espertech.esper.epl.expression.ExprEvaluatorContext;
import com.espertech.esper.epl.expression.ExprNode;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.util.ArrayList;
import java.util.List;
/**
* Utility for evaluating pattern expressions.
*/
public class PatternExpressionUtil
{
private static Log log = LogFactory.getLog(PatternExpressionUtil.class);
public static Object getKeys(MatchedEventMap currentState, EvalEveryDistinctNode everyDistinctNode)
{
EventBean[] eventsPerStream = everyDistinctNode.getFactoryNode().getConvertor().convert(currentState);
ExprEvaluator[] expressions = everyDistinctNode.getFactoryNode().getDistinctExpressionsArray();
if (expressions.length == 1) {
return expressions[0].evaluate(eventsPerStream, true, everyDistinctNode.getContext().getAgentInstanceContext());
}
Object[] keys = new Object[expressions.length];
for (int i = 0; i < keys.length; i++)
{
keys[i] = expressions[i].evaluate(eventsPerStream, true, everyDistinctNode.getContext().getAgentInstanceContext());
}
return new MultiKeyUntyped(keys);
}
/**
* Ctor.
* @param objectName is the pattern object name
* @param beginState the pattern begin state
* @param parameters object parameters
* @param convertor for converting to a event-per-stream view for use to evaluate expressions
* @param exprEvaluatorContext expression evaluation context
* @return expression results
* @throws EPException if the evaluate failed
*/
public static List<Object> evaluate(String objectName, MatchedEventMap beginState, List<ExprNode> parameters, MatchedEventConvertor convertor, ExprEvaluatorContext exprEvaluatorContext)
throws EPException
{
List<Object> results = new ArrayList<Object>();
int count = 0;
EventBean[] eventsPerStream = convertor.convert(beginState);
for (ExprNode expr : parameters)
{
try
{
Object result = evaluate(objectName, expr, eventsPerStream, exprEvaluatorContext);
results.add(result);
count++;
}
catch (RuntimeException ex)
{
String message = objectName + " invalid parameter in expression " + count;
if (ex.getMessage() != null)
{
message += ": " + ex.getMessage();
}
log.error(message, ex);
throw new EPException(message);
}
}
return results;
}
/**
* Evaluate the pattern expression.
* @param objectName pattern object name
* @param beginState pattern state
* @param parameter expression node
* @param convertor to converting from pattern match to event-per-stream
* @param exprEvaluatorContext expression evaluation context
* @return evaluation result
* @throws EPException if the evaluation failed
*/
public static Object evaluate(String objectName, MatchedEventMap beginState, ExprNode parameter, MatchedEventConvertor convertor, ExprEvaluatorContext exprEvaluatorContext)
throws EPException
{
EventBean[] eventsPerStream = convertor.convert(beginState);
return evaluate(objectName, parameter, eventsPerStream, exprEvaluatorContext);
}
private static Object evaluate(String objectName, ExprNode expression, EventBean[] eventsPerStream, ExprEvaluatorContext exprEvaluatorContext) throws EPException
{
try
{
return expression.getExprEvaluator().evaluate(eventsPerStream, true, exprEvaluatorContext);
}
catch (RuntimeException ex)
{
String message = objectName + " failed to evaluate expression";
if (ex.getMessage() != null)
{
message += ": " + ex.getMessage();
}
log.error(message, ex);
throw new EPException(message);
}
}
}