com.espertech.esper.pattern.PatternExpressionUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.espertech.esper.pattern.PatternExpressionUtil.java

Source

/**************************************************************************************
 * 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);
        }
    }
}