/*
* *************************************************************************************
* 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.epl.spec;
import com.espertech.esper.collection.Pair;
import com.espertech.esper.epl.expression.ExprValidationException;
import com.espertech.esper.epl.parse.EPLTreeWalker;
import com.espertech.esper.filter.*;
import com.espertech.esper.pattern.EvalFilterFactoryNode;
import com.espertech.esper.pattern.EvalNodeAnalysisResult;
import com.espertech.esper.pattern.EvalNodeUtil;
import com.espertech.esper.support.bean.SupportBean;
import com.espertech.esper.support.epl.parse.SupportEPLTreeWalkerFactory;
import com.espertech.esper.support.epl.parse.SupportParserHelper;
import com.espertech.esper.support.view.SupportStatementContextFactory;
import junit.framework.TestCase;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.tree.Tree;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
public class TestPatternStreamSpecRaw extends TestCase
{
public void testPatternEquals() throws Exception
{
String text = "select * from pattern [" +
"s=" + SupportBean.class.getName() + "(intPrimitive=5) -> " +
"t=" + SupportBean.class.getName() + "(intPrimitive=s.intBoxed)" +
"]";
tryPatternEquals(text);
text = "select * from pattern [" +
"s=" + SupportBean.class.getName() + "(5=intPrimitive) -> " +
"t=" + SupportBean.class.getName() + "(s.intBoxed=intPrimitive)" +
"]";
tryPatternEquals(text);
}
public void testInvalid() throws Exception
{
String text = "select * from pattern [" +
"s=" + SupportBean.class.getName() + " -> " +
"t=" + SupportBean.class.getName() + "(intPrimitive=s.doubleBoxed)" +
"]";
tryInvalid(text);
text = "select * from pattern [" +
"s=" + SupportBean.class.getName() + " -> " +
"t=" + SupportBean.class.getName() + "(intPrimitive in (s.doubleBoxed))" +
"]";
tryInvalid(text);
}
private void tryInvalid(String text) throws Exception
{
try
{
PatternStreamSpecRaw raw = makeSpec(text);
compile(raw);
fail();
}
catch (ExprValidationException ex)
{
// expected
}
}
public void testPatternExpressions() throws Exception
{
String text = "select * from pattern [" +
"s=" + SupportBean.class.getName() + "(intPrimitive in (s.intBoxed + 1, 0), intBoxed+1=intPrimitive-1)" +
"]";
PatternStreamSpecRaw raw = makeSpec(text);
PatternStreamSpecCompiled spec = compile(raw);
assertEquals(1, spec.getTaggedEventTypes().size());
assertEquals(SupportBean.class, spec.getTaggedEventTypes().get("s").getFirst().getUnderlyingType());
EvalNodeAnalysisResult evalNodeAnalysisResult = EvalNodeUtil.recursiveAnalyzeChildNodes(spec.getEvalFactoryNode());
List<EvalFilterFactoryNode> filters = evalNodeAnalysisResult.getFilterNodes();
assertEquals(1, filters.size());
// node 0
EvalFilterFactoryNode filterNode = filters.get(0);
assertEquals(SupportBean.class, filterNode.getFilterSpec().getFilterForEventType().getUnderlyingType());
assertEquals(1, filterNode.getFilterSpec().getParameters().size());
FilterSpecParamExprNode exprParam = (FilterSpecParamExprNode) filterNode.getFilterSpec().getParameters().getFirst();
}
public void testPatternInSetOfVal() throws Exception
{
String text = "select * from pattern [" +
"s=" + SupportBean.class.getName() + " -> " +
SupportBean.class.getName() + "(intPrimitive in (s.intBoxed, 0))" +
"]";
PatternStreamSpecRaw raw = makeSpec(text);
PatternStreamSpecCompiled spec = compile(raw);
assertEquals(1, spec.getTaggedEventTypes().size());
assertEquals(SupportBean.class, spec.getTaggedEventTypes().get("s").getFirst().getUnderlyingType());
EvalNodeAnalysisResult evalNodeAnalysisResult = EvalNodeUtil.recursiveAnalyzeChildNodes(spec.getEvalFactoryNode());
List<EvalFilterFactoryNode> filters = evalNodeAnalysisResult.getFilterNodes();
assertEquals(2, filters.size());
// node 0
EvalFilterFactoryNode filterNode = filters.get(0);
assertEquals(SupportBean.class, filterNode.getFilterSpec().getFilterForEventType().getUnderlyingType());
assertEquals(0, filterNode.getFilterSpec().getParameters().size());
// node 1
filterNode = filters.get(1);
assertEquals(SupportBean.class, filterNode.getFilterSpec().getFilterForEventType().getUnderlyingType());
assertEquals(1, filterNode.getFilterSpec().getParameters().size());
FilterSpecParamIn inlist = (FilterSpecParamIn) filterNode.getFilterSpec().getParameters().getFirst();
assertEquals(FilterOperator.IN_LIST_OF_VALUES, inlist.getFilterOperator());
assertEquals(2, inlist.getListOfValues().size());
// in-value 1
InSetOfValuesEventProp prop = (InSetOfValuesEventProp) inlist.getListOfValues().get(0);
assertEquals("s", prop.getResultEventAsName());
assertEquals("intBoxed", prop.getResultEventProperty());
// in-value 1
InSetOfValuesConstant constant = (InSetOfValuesConstant) inlist.getListOfValues().get(1);
assertEquals(0, constant.getConstant());
}
public void testRange() throws Exception
{
String text = "select * from pattern [" +
"s=" + SupportBean.class.getName() + " -> " +
SupportBean.class.getName() + "(intPrimitive between s.intBoxed and 100)" +
"]";
PatternStreamSpecRaw raw = makeSpec(text);
PatternStreamSpecCompiled spec = compile(raw);
assertEquals(1, spec.getTaggedEventTypes().size());
assertEquals(SupportBean.class, spec.getTaggedEventTypes().get("s").getFirst().getUnderlyingType());
EvalNodeAnalysisResult evalNodeAnalysisResult = EvalNodeUtil.recursiveAnalyzeChildNodes(spec.getEvalFactoryNode());
List<EvalFilterFactoryNode> filters = evalNodeAnalysisResult.getFilterNodes();
assertEquals(2, filters.size());
// node 0
EvalFilterFactoryNode filterNode = filters.get(0);
assertEquals(SupportBean.class, filterNode.getFilterSpec().getFilterForEventType().getUnderlyingType());
assertEquals(0, filterNode.getFilterSpec().getParameters().size());
// node 1
filterNode = filters.get(1);
assertEquals(SupportBean.class, filterNode.getFilterSpec().getFilterForEventType().getUnderlyingType());
assertEquals(1, filterNode.getFilterSpec().getParameters().size());
FilterSpecParamRange range = (FilterSpecParamRange) filterNode.getFilterSpec().getParameters().getFirst();
assertEquals(FilterOperator.RANGE_CLOSED, range.getFilterOperator());
// min-value
RangeValueEventProp prop = (RangeValueEventProp) range.getMin();
assertEquals("s", prop.getResultEventAsName());
assertEquals("intBoxed", prop.getResultEventProperty());
// max-value
RangeValueDouble constant = (RangeValueDouble) range.getMax();
assertEquals(100d, constant.getDoubleValue());
}
private void tryPatternEquals(String text) throws Exception
{
PatternStreamSpecRaw raw = makeSpec(text);
PatternStreamSpecCompiled spec = compile(raw);
assertEquals(2, spec.getTaggedEventTypes().size());
assertEquals(SupportBean.class, spec.getTaggedEventTypes().get("s").getFirst().getUnderlyingType());
assertEquals(SupportBean.class, spec.getTaggedEventTypes().get("t").getFirst().getUnderlyingType());
EvalNodeAnalysisResult evalNodeAnalysisResult = EvalNodeUtil.recursiveAnalyzeChildNodes(spec.getEvalFactoryNode());
List<EvalFilterFactoryNode> filters = evalNodeAnalysisResult.getFilterNodes();
assertEquals(2, filters.size());
// node 0
EvalFilterFactoryNode filterNode = filters.get(0);
assertEquals(SupportBean.class, filterNode.getFilterSpec().getFilterForEventType().getUnderlyingType());
assertEquals(1, filterNode.getFilterSpec().getParameters().size());
FilterSpecParamConstant constant = (FilterSpecParamConstant) filterNode.getFilterSpec().getParameters().getFirst();
assertEquals(FilterOperator.EQUAL, constant.getFilterOperator());
assertEquals("intPrimitive", constant.getLookupable().getExpression());
assertEquals(5, constant.getFilterConstant());
// node 1
filterNode = filters.get(1);
assertEquals(SupportBean.class, filterNode.getFilterSpec().getFilterForEventType().getUnderlyingType());
assertEquals(1, filterNode.getFilterSpec().getParameters().size());
FilterSpecParamEventProp eventprop = (FilterSpecParamEventProp) filterNode.getFilterSpec().getParameters().getFirst();
assertEquals(FilterOperator.EQUAL, constant.getFilterOperator());
assertEquals("intPrimitive", constant.getLookupable().getExpression());
assertEquals("s", eventprop.getResultEventAsName());
assertEquals("intBoxed", eventprop.getResultEventProperty());
}
private PatternStreamSpecCompiled compile(PatternStreamSpecRaw raw) throws Exception
{
PatternStreamSpecCompiled compiled = (PatternStreamSpecCompiled) raw.compile(SupportStatementContextFactory.makeContext(), new HashSet<String>(), false, Collections.<Integer>emptyList());
return compiled;
}
private static PatternStreamSpecRaw makeSpec(String expression) throws Exception
{
Pair<Tree, CommonTokenStream> ast = SupportParserHelper.parseEPL(expression);
SupportParserHelper.displayAST(ast.getFirst());
EPLTreeWalker walker = SupportEPLTreeWalkerFactory.makeWalker(ast.getFirst(), ast.getSecond());
walker.startEPLExpressionRule();
PatternStreamSpecRaw spec = (PatternStreamSpecRaw) walker.getStatementSpec().getStreamSpecs().get(0);
return spec;
}
}