/* *************************************************************************************** * 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.regression.pattern; import com.espertech.esper.client.Configuration; import com.espertech.esper.client.EPServiceProvider; import com.espertech.esper.client.EPServiceProviderManager; import com.espertech.esper.client.soda.EPStatementObjectModel; import com.espertech.esper.core.service.EPServiceProviderSPI; import com.espertech.esper.core.service.EPStatementSPI; import com.espertech.esper.epl.spec.PatternStreamSpecCompiled; import com.espertech.esper.epl.spec.StatementSpecCompiled; import com.espertech.esper.metrics.instrumentation.InstrumentationHelper; import com.espertech.esper.pattern.PatternExpressionPrecedenceEnum; import com.espertech.esper.supportregression.bean.*; import com.espertech.esper.supportregression.client.SupportConfigFactory; import junit.framework.TestCase; import java.io.StringWriter; public class TestPatternExpressionText extends TestCase { private EPServiceProvider epService; public void setUp() { Configuration config = SupportConfigFactory.getConfiguration(); config.addEventType("SupportBean", SupportBean.class.getName()); config.addEventType("A", SupportBean_A.class.getName()); config.addEventType("B", SupportBean_B.class.getName()); config.addEventType("C", SupportBean_C.class.getName()); config.addEventType("D", SupportBean_D.class.getName()); config.addEventType("E", SupportBean_E.class.getName()); config.addEventType("F", SupportBean_F.class.getName()); config.addEventType("G", SupportBean_G.class.getName()); epService = EPServiceProviderManager.getDefaultProvider(config); epService.initialize(); if (InstrumentationHelper.ENABLED) { InstrumentationHelper.startTest(epService, this.getClass(), getName());} } protected void tearDown() throws Exception { if (InstrumentationHelper.ENABLED) { InstrumentationHelper.endTest();} epService.destroy(); } public void testOp() throws Exception { runAssertion("every a=SupportBean -> b=SupportBean@consume", null); runAssertion("every a=SupportBean -> b=SupportBean@consume", null); runAssertion("every a=SupportBean -> b=SupportBean@consume(2)", null); runAssertion("a=A -> b=B", null); runAssertion("b=B and every d=D", null); runAssertion("every b=B and d=B", null); runAssertion("b=B and d=D", null); runAssertion("every (b=B and d=D)", null); runAssertion("every (b=B and every d=D)", null); runAssertion("every b=B and every d=D", null); runAssertion("every (every b=B and d=D)", null); runAssertion("every a=A and d=D and b=B", null); runAssertion("every (every b=B and every d=D)", null); runAssertion("a=A and d=D and b=B", null); runAssertion("every a=A and every d=D and b=B", null); runAssertion("b=B and b=B", null); runAssertion("every a=A and every d=D and every b=B", null); runAssertion("every (a=A and every d=D and b=B)", null); runAssertion("every (b=B and b=B)", null); runAssertion("every b=B", null); runAssertion("b=B", null); runAssertion("every (every (every b=B))", "every every every b=B"); runAssertion("every (every b=B())", "every every b=B"); runAssertion("b=B -> d=D or not d=D", null); runAssertion("b=B -> (d=D or not d=D)", "b=B -> d=D or not d=D"); runAssertion("b=B -[1000]> d=D or not d=D", null); runAssertion("b=B -> every d=D", null); runAssertion("b=B -> d=D", null); runAssertion("b=B -> not d=D", null); runAssertion("b=B -[1000]> not d=D", null); runAssertion("every b=B -> every d=D", null); runAssertion("every b=B -> d=D", null); runAssertion("every b=B -[10]> d=D", null); runAssertion("every (b=B -> every d=D)", null); runAssertion("every (a_1=A -> b=B -> a_2=A)", null); runAssertion("c=C -> d=D -> a=A", null); runAssertion("every (a_1=A -> b=B -> a_2=A)", null); runAssertion("every (a_1=A -[10]> b=B -[10]> a_2=A)", null); runAssertion("every (every a=A -> every b=B)", null); runAssertion("every (a=A -> every b=B)", null); runAssertion("a=A(id='A2') until D", "a=A(id=\"A2\") until D"); runAssertion("b=B until a=A", null); runAssertion("b=B until D", null); runAssertion("(a=A or b=B) until d=D", null); runAssertion("(a=A or b=B) until (g=G or d=D)", null); runAssertion("a=A until G", null); runAssertion("[2] a=A", null); runAssertion("[1:1] a=A", null); runAssertion("[4] (a=A or b=B)", null); runAssertion("[2] b=B until a=A", null); runAssertion("[2:2] b=B until g=G", null); runAssertion("[:4] b=B until g=G", null); runAssertion("[1:] b=B until g=G", null); runAssertion("[1:2] b=B until a=A", null); runAssertion("c=C -> [2] b=B -> d=D", null); runAssertion("d=D until timer:interval(7 sec)", "d=D until timer:interval(7 seconds)"); runAssertion("every (d=D until b=B)", null); runAssertion("every d=D until b=B", null); runAssertion("(every d=D) until b=B", "every d=D until b=B"); runAssertion("a=A until (every (timer:interval(6 sec) and not A))", "a=A until every (timer:interval(6 seconds) and not A)"); runAssertion("[2] (a=A or b=B)", null); runAssertion("every [2] a=A", "every ([2] a=A)"); runAssertion("every [2] a=A until d=D", "every ([2] a=A) until d=D"); // every has precedence; ESPER-339 runAssertion("[3] (a=A or b=B)", null); runAssertion("[4] (a=A or b=B)", null); runAssertion("(a=A until b=B) until c=C", "a=A until b=B until c=C"); runAssertion("b=B and not d=D", null); runAssertion("every b=B and not g=G", null); runAssertion("every b=B and not g=G", null); runAssertion("b=B and not a=A(id=\"A1\")", null); runAssertion("every (b=B and not b3=B(id=\"B3\"))", null); runAssertion("every (b=B or not D)", null); runAssertion("every (every b=B and not B)", null); runAssertion("every (b=B and not B)", null); runAssertion("(b=B -> d=D) and G", null); runAssertion("(b=B -> d=D) and (a=A -> e=E)", null); runAssertion("b=B -> (d=D() or a=A)", "b=B -> d=D or a=A"); runAssertion("b=B -> ((d=D -> a=A) or (a=A -> e=E))", "b=B -> (d=D -> a=A) or (a=A -> e=E)"); runAssertion("(b=B -> d=D) or a=A", null); runAssertion("(b=B and d=D) or a=A", "b=B and d=D or a=A"); runAssertion("a=A or a=A", null); runAssertion("a=A or b=B or c=C", null); runAssertion("every b=B or every d=D", null); runAssertion("a=A or b=B", null); runAssertion("a=A or every b=B", null); runAssertion("every a=A or d=D", null); runAssertion("every (every b=B or d=D)", null); runAssertion("every (b=B or every d=D)", null); runAssertion("every (every d=D or every b=B)", null); runAssertion("timer:at(10,8,*,*,*)", null); runAssertion("every timer:at(*/5,*,*,*,*,*)", null); runAssertion("timer:at(10,9,*,*,*,10) or timer:at(30,9,*,*,*,*)", null); runAssertion("b=B(id=\"B3\") -> timer:at(20,9,*,*,*,*)", null); runAssertion("timer:at(59,8,*,*,*,59) -> d=D", null); runAssertion("timer:at(22,8,*,*,*) -> b=B -> timer:at(55,*,*,*,*)", null); runAssertion("timer:at(40,*,*,*,*,1) and b=B", null); runAssertion("timer:at(40,9,*,*,*,1) or d=D", null); runAssertion("timer:at(22,8,*,*,*) -> b=B -> timer:at(55,8,*,*,*)", null); runAssertion("timer:at(22,8,*,*,*,1) where timer:within(30 minutes)", null); runAssertion("timer:at(*,9,*,*,*) and timer:at(55,*,*,*,*)", null); runAssertion("timer:at(40,8,*,*,*,1) and b=B", null); runAssertion("timer:interval(2 seconds)", null); runAssertion("timer:interval(2.001)", null); runAssertion("timer:interval(2999 milliseconds)", null); runAssertion("timer:interval(4 seconds) -> b=B", null); runAssertion("b=B -> timer:interval(0)", null); runAssertion("b=B -> timer:interval(6.0) -> d=D", null); runAssertion("every (b=B -> timer:interval(2.0) -> d=D)", null); runAssertion("b=B or timer:interval(2.001)", null); runAssertion("b=B or timer:interval(8.5)", null); runAssertion("timer:interval(8.5) or timer:interval(7.5)", null); runAssertion("timer:interval(999999 milliseconds) or g=G", null); runAssertion("b=B and timer:interval(4000 milliseconds)", null); runAssertion("b=B(id=\"B1\") where timer:within(2 seconds)", null); runAssertion("(every b=B) where timer:within(2.001)", null); runAssertion("every (b=B) where timer:within(6.001)", "every b=B where timer:within(6.001)"); runAssertion("b=B -> d=D where timer:within(4001 milliseconds)", null); runAssertion("b=B -> d=D where timer:within(4 seconds)", null); runAssertion("every (b=B where timer:within(4.001) and d=D where timer:within(6.001))", null); runAssertion("every b=B -> d=D where timer:within(4000 seconds)", null); runAssertion("every b=B -> every d=D where timer:within(4000 seconds)", null); runAssertion("b=B -> d=D where timer:within(3999 seconds)", null); runAssertion("every b=B -> (every d=D) where timer:within(2001)", null); runAssertion("every (b=B -> d=D) where timer:within(6001)", null); runAssertion("b=B where timer:within(2000) or d=D where timer:within(6000)", null); runAssertion("(b=B where timer:within(2000) or d=D where timer:within(6000)) where timer:within(1999)", null); runAssertion("every (b=B where timer:within(2001) and d=D where timer:within(6001))", null); runAssertion("b=B where timer:within(2001) or d=D where timer:within(6001)", null); runAssertion("B where timer:within(2000) or d=D where timer:within(6001)", null); runAssertion("every b=B where timer:within(2001) and every d=D where timer:within(6001)", null); runAssertion("(every b=B) where timer:within(2000) and every d=D where timer:within(6001)", null); runAssertion("b=B(id=\"B1\") where timer:withinmax(2 seconds,100)", null); runAssertion("(every b=B) where timer:withinmax(4.001,2)", null); runAssertion("every b=B where timer:withinmax(2.001,4)", null); runAssertion("every (b=B where timer:withinmax(2001,0))", "every b=B where timer:withinmax(2001,0)"); runAssertion("(every b=B) where timer:withinmax(4.001,2)", null); runAssertion("every b=B -> d=D where timer:withinmax(4000 milliseconds,1)", null); runAssertion("every b=B -> every d=D where timer:withinmax(4000,1)", null); runAssertion("every b=B -> (every d=D) where timer:withinmax(1 days,3)", null); runAssertion("a=A -> (every b=B) while (b.id!=\"B3\")", null); runAssertion("(every b=B) while (b.id!=\"B1\")", null); runAssertion("every-distinct(a.intPrimitive,1) a=SupportBean(theString like \"A%\")", null); runAssertion("every-distinct(a.intPrimitive,1 seconds) a=SupportBean(theString like \"A%\")", null); runAssertion("every-distinct(intPrimitive) a=SupportBean", null); runAssertion("[2] every-distinct(a.intPrimitive) a=SupportBean", null); runAssertion("every-distinct(a[0].intPrimitive) ([2] a=SupportBean)", null); runAssertion("every-distinct(a[0].intPrimitive,a[0].intPrimitive,1 hours) ([2] a=SupportBean)", null); runAssertion("(every-distinct(a.intPrimitive) a=SupportBean) where timer:within(10 seconds)", null); runAssertion("every-distinct(a.intPrimitive) a=SupportBean where timer:within(10)", null); runAssertion("every-distinct(a.intPrimitive,1 hours) a=SupportBean where timer:within(10)", null); runAssertion("every-distinct(a.intPrimitive,b.intPrimitive) (a=SupportBean(theString like \"A%\") and b=SupportBean(theString like \"B%\"))", null); runAssertion("every-distinct(a.intPrimitive) (a=SupportBean and not SupportBean)", null); runAssertion("every-distinct(a.intPrimitive,1 hours) (a=SupportBean and not SupportBean)", null); runAssertion("every-distinct(a.intPrimitive+b.intPrimitive,1 hours) (a=SupportBean -> b=SupportBean)", null); runAssertion("every-distinct(a.intPrimitive) a=SupportBean -> b=SupportBean(intPrimitive=a.intPrimitive)", null); runAssertion("every-distinct(a.intPrimitive) a=SupportBean -> every-distinct(b.intPrimitive) b=SupportBean(theString like \"B%\")", null); } private void runAssertion(String patternText, String expectedIfDifferent) { String epl = "@Name('A') select * from pattern [" + patternText + "]"; runAssertionEPL(epl, patternText, expectedIfDifferent); epl = "@Audit @Name('A') select * from pattern [" + patternText + "]"; runAssertionEPL(epl, patternText, expectedIfDifferent); } private void runAssertionEPL(String epl, String patternText, String expectedIfDifferent) { EPStatementObjectModel model = epService.getEPAdministrator().compileEPL(epl); EPStatementSPI spi = (EPStatementSPI) epService.getEPAdministrator().create(model); StatementSpecCompiled spec = ((EPServiceProviderSPI) (epService)).getStatementLifecycleSvc().getStatementSpec(spi.getStatementId()); PatternStreamSpecCompiled pattern = (PatternStreamSpecCompiled) spec.getStreamSpecs()[0]; StringWriter writer = new StringWriter(); pattern.getEvalFactoryNode().toEPL(writer, PatternExpressionPrecedenceEnum.MINIMUM); if (expectedIfDifferent == null) { assertEquals(patternText, writer.toString()); } else { assertEquals(expectedIfDifferent, writer.toString()); } spi.destroy(); } }