/*
***************************************************************************************
* 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.pattern;
import com.espertech.esper.client.EPException;
import com.espertech.esper.client.EventBean;
import com.espertech.esper.collection.MultiKeyUntyped;
import com.espertech.esper.core.context.util.AgentInstanceContext;
import com.espertech.esper.epl.expression.core.ExprEvaluator;
import com.espertech.esper.epl.expression.core.ExprEvaluatorContext;
import com.espertech.esper.epl.expression.core.ExprNode;
import com.espertech.esper.epl.expression.time.ExprTimePeriod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
/**
* Utility for evaluating pattern expressions.
*/
public class PatternExpressionUtil {
private static Logger log = LoggerFactory.getLogger(PatternExpressionUtil.class);
public static Object getKeys(MatchedEventMap matchEvent, MatchedEventConvertor convertor, ExprEvaluator[] expressions, AgentInstanceContext agentInstanceContext) {
EventBean[] eventsPerStream = convertor.convert(matchEvent);
if (expressions.length == 1) {
return expressions[0].evaluate(eventsPerStream, true, agentInstanceContext);
}
Object[] keys = new Object[expressions.length];
for (int i = 0; i < keys.length; i++) {
keys[i] = expressions[i].evaluate(eventsPerStream, true, agentInstanceContext);
}
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 convertor to converting from pattern match to event-per-stream
* @param exprEvaluatorContext expression evaluation context
* @param timePeriod time period
* @return evaluation result
* @throws EPException if the evaluation failed
*/
public static Object evaluateTimePeriod(String objectName, MatchedEventMap beginState, ExprTimePeriod timePeriod, MatchedEventConvertor convertor, ExprEvaluatorContext exprEvaluatorContext)
throws EPException {
EventBean[] eventsPerStream = convertor.convert(beginState);
try {
return timePeriod.evaluateGetTimePeriod(eventsPerStream, true, exprEvaluatorContext);
} catch (RuntimeException ex) {
throw handleRuntimeEx(ex, objectName);
}
}
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) {
throw handleRuntimeEx(ex, objectName);
}
}
private static EPException handleRuntimeEx(RuntimeException ex, String objectName) {
String message = objectName + " failed to evaluate expression";
if (ex.getMessage() != null) {
message += ": " + ex.getMessage();
}
log.error(message, ex);
throw new EPException(message);
}
public static void toPrecedenceFreeEPL(StringWriter writer, String delimiterText, List<EvalFactoryNode> childNodes, PatternExpressionPrecedenceEnum precedence) {
String delimiter = "";
for (EvalFactoryNode child : childNodes) {
writer.append(delimiter);
child.toEPL(writer, precedence);
delimiter = " " + delimiterText + " ";
}
}
}