/*
***************************************************************************************
* 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.rowrecog;
import com.espertech.esper.client.*;
import com.espertech.esper.client.scopetest.EPAssertionUtil;
import com.espertech.esper.client.scopetest.SupportUpdateListener;
import com.espertech.esper.client.time.CurrentTimeEvent;
import com.espertech.esper.metrics.instrumentation.InstrumentationHelper;
import com.espertech.esper.supportregression.client.SupportConfigFactory;
import com.espertech.esper.supportregression.util.SupportModelHelper;
import junit.framework.TestCase;
public class TestRowPatternRecognitionIntervalOrTerminated extends TestCase {
private EPServiceProvider epService;
private SupportUpdateListener listener;
public void setUp() {
Configuration config = SupportConfigFactory.getConfiguration();
config.getEngineDefaults().getViewResources().setShareViews(false);
config.addEventType("MyEvent", SupportRecogBean.class);
config.getEngineDefaults().getExecution().setAllowIsolatedService(true);
epService = EPServiceProviderManager.getDefaultProvider(config);
epService.initialize();
if (InstrumentationHelper.ENABLED) { InstrumentationHelper.startTest(epService, this.getClass(), getName());}
listener = new SupportUpdateListener();
epService.getEPAdministrator().getConfiguration().addEventType("TemperatureSensorEvent",
"id,device,temp".split(","), new Object[] {String.class, int.class, double.class});
}
public void tearDown() {
if (InstrumentationHelper.ENABLED) { InstrumentationHelper.endTest();}
listener = null;
}
public void testOrTerminated() throws Exception
{
runAssertionDocSample();
runAssertion_A_Bstar(false);
runAssertion_A_Bstar(true);
runAssertion_Astar();
runAssertion_A_Bplus();
runAssertion_A_Bstar_or_Cstar();
runAssertion_A_B_Cstar();
runAssertion_A_B();
runAssertion_A_Bstar_or_C();
runAssertion_A_parenthesisBstar();
}
private void runAssertion_A_Bstar_or_C() {
EPServiceProviderIsolated isolated = epService.getEPServiceIsolated("I1");
sendTimer(isolated, 0);
String[] fields = "a,b0,b1,b2,c".split(",");
String text = "select * from MyEvent#keepall " +
"match_recognize (" +
" measures A.theString as a, B[0].theString as b0, B[1].theString as b1, B[2].theString as b2, C.theString as c " +
" pattern (A (B* | C))" +
" interval 10 seconds or terminated" +
" define" +
" A as A.theString like 'A%'," +
" B as B.theString like 'B%'," +
" C as C.theString like 'C%'" +
")";
EPStatement stmt = isolated.getEPAdministrator().createEPL(text, "stmt1", null);
stmt.addListener(listener);
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A1"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("C1"));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{"A1", null, null, null, "C1"});
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A2"));
assertFalse(listener.isInvoked());
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B1"));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{"A2", null, null, null, null});
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B2"));
assertFalse(listener.isInvoked());
isolated.getEPRuntime().sendEvent(new SupportRecogBean("X1"));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{"A2", "B1", "B2", null, null});
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A3"));
sendTimer(isolated, 10000);
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{"A3", null, null, null, null});
sendTimer(isolated, Integer.MAX_VALUE);
assertFalse(listener.isInvoked());
// destroy
stmt.destroy();
isolated.destroy();
}
private void runAssertion_A_B() {
EPServiceProviderIsolated isolated = epService.getEPServiceIsolated("I1");
sendTimer(isolated, 0);
// the interval is not effective
String[] fields = "a,b".split(",");
String text = "select * from MyEvent#keepall " +
"match_recognize (" +
" measures A.theString as a, B.theString as b" +
" pattern (A B)" +
" interval 10 seconds or terminated" +
" define" +
" A as A.theString like 'A%'," +
" B as B.theString like 'B%'" +
")";
EPStatement stmt = isolated.getEPAdministrator().createEPL(text, "stmt1", null);
stmt.addListener(listener);
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A1"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B1"));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {"A1", "B1"});
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A2"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A3"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B2"));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {"A3", "B2"});
// destroy
stmt.destroy();
isolated.destroy();
}
private void runAssertionDocSample() {
EPServiceProviderIsolated isolated = epService.getEPServiceIsolated("I1");
sendTimer(isolated, 0);
String[] fields = "a_id,count_b,first_b,last_b".split(",");
String text = "select * from TemperatureSensorEvent\n" +
"match_recognize (\n" +
" partition by device\n" +
" measures A.id as a_id, count(B.id) as count_b, first(B.id) as first_b, last(B.id) as last_b\n" +
" pattern (A B*)\n" +
" interval 5 seconds or terminated\n" +
" define\n" +
" A as A.temp > 100,\n" +
" B as B.temp > 100)";
EPStatement stmt = isolated.getEPAdministrator().createEPL(text, "stmt1", null);
stmt.addListener(listener);
sendTemperatureEvent(isolated, "E1", 1, 98);
sendTemperatureEvent(isolated, "E2", 1, 101);
sendTemperatureEvent(isolated, "E3", 1, 102);
sendTemperatureEvent(isolated, "E4", 1, 101); // falls below
assertFalse(listener.isInvoked());
sendTemperatureEvent(isolated, "E5", 1, 100); // falls below
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{"E2", 2L, "E3", "E4"});
sendTimer(isolated, Integer.MAX_VALUE);
assertFalse(listener.isInvoked());
// destroy
stmt.destroy();
isolated.destroy();
}
private void runAssertion_A_B_Cstar() {
EPServiceProviderIsolated isolated = epService.getEPServiceIsolated("I1");
sendTimer(isolated, 0);
String[] fields = "a,b,c0,c1,c2".split(",");
String text = "select * from MyEvent#keepall " +
"match_recognize (" +
" measures A.theString as a, B.theString as b, " +
"C[0].theString as c0, C[1].theString as c1, C[2].theString as c2 " +
" pattern (A B C*)" +
" interval 10 seconds or terminated" +
" define" +
" A as A.theString like 'A%'," +
" B as B.theString like 'B%'," +
" C as C.theString like 'C%'" +
")";
EPStatement stmt = isolated.getEPAdministrator().createEPL(text, "stmt1", null);
stmt.addListener(listener);
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A1"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B1"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("C1"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("C2"));
assertFalse(listener.isInvoked());
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B2"));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{"A1", "B1", "C1", "C2", null});
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A2"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("X1"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B3"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("X2"));
assertFalse(listener.isInvoked());
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A3"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B4"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("X3"));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{"A3", "B4", null, null, null});
sendTimer(isolated, 20000);
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A4"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B5"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("C3"));
assertFalse(listener.isInvoked());
sendTimer(isolated, 30000);
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{"A4", "B5", "C3", null, null});
sendTimer(isolated, Integer.MAX_VALUE);
assertFalse(listener.isInvoked());
// destroy
stmt.destroy();
isolated.destroy();
}
private void runAssertion_A_Bstar_or_Cstar() {
EPServiceProviderIsolated isolated = epService.getEPServiceIsolated("I1");
sendTimer(isolated, 0);
String[] fields = "a,b0,b1,c0,c1".split(",");
String text = "select * from MyEvent#keepall " +
"match_recognize (" +
" measures A.theString as a, " +
"B[0].theString as b0, B[1].theString as b1, " +
"C[0].theString as c0, C[1].theString as c1 " +
" pattern (A (B* | C*))" +
" interval 10 seconds or terminated" +
" define" +
" A as A.theString like 'A%'," +
" B as B.theString like 'B%'," +
" C as C.theString like 'C%'" +
")";
EPStatement stmt = isolated.getEPAdministrator().createEPL(text, "stmt1", null);
stmt.addListener(listener);
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A1"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("X1"));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {"A1", null, null, null, null});
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A2"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("C1"));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{"A2", null, null, null, null});
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B1"));
EPAssertionUtil.assertPropsPerRow(listener.getAndResetLastNewData(), fields,
new Object[][]{{"A2", null, null, "C1", null}});
isolated.getEPRuntime().sendEvent(new SupportRecogBean("C2"));
assertFalse(listener.isInvoked());
// destroy
stmt.destroy();
isolated.destroy();
}
private void runAssertion_A_Bplus() {
EPServiceProviderIsolated isolated = epService.getEPServiceIsolated("I1");
sendTimer(isolated, 0);
String[] fields = "a,b0,b1,b2".split(",");
String text = "select * from MyEvent#keepall " +
"match_recognize (" +
" measures A.theString as a, B[0].theString as b0, B[1].theString as b1, B[2].theString as b2" +
" pattern (A B+)" +
" interval 10 seconds or terminated" +
" define" +
" A as A.theString like 'A%'," +
" B as B.theString like 'B%'" +
")";
EPStatement stmt = isolated.getEPAdministrator().createEPL(text, "stmt1", null);
stmt.addListener(listener);
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A1"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("X1"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A2"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B2"));
assertFalse(listener.isInvoked());
isolated.getEPRuntime().sendEvent(new SupportRecogBean("X2"));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {"A2", "B2", null, null});
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A3"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A4"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B3"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B4"));
assertFalse(listener.isInvoked());
isolated.getEPRuntime().sendEvent(new SupportRecogBean("X3", -1));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {"A4", "B3", "B4", null});
// destroy
stmt.destroy();
isolated.destroy();
}
private void runAssertion_Astar() {
EPServiceProviderIsolated isolated = epService.getEPServiceIsolated("I1");
sendTimer(isolated, 0);
String[] fields = "a0,a1,a2,a3,a4".split(",");
String text = "select * from MyEvent#keepall " +
"match_recognize (" +
" measures A[0].theString as a0, A[1].theString as a1, A[2].theString as a2, A[3].theString as a3, A[4].theString as a4" +
" pattern (A*)" +
" interval 10 seconds or terminated" +
" define" +
" A as theString like 'A%'" +
")";
EPStatement stmt = isolated.getEPAdministrator().createEPL(text, "stmt1", null);
stmt.addListener(listener);
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A1"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A2"));
assertFalse(listener.isInvoked());
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B1"));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {"A1", "A2", null, null, null});
sendTimer(isolated, 2000);
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A3"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A4"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A5"));
assertFalse(listener.isInvoked());
sendTimer(isolated, 12000);
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {"A3", "A4", "A5", null, null});
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A6"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B2"));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {"A3", "A4", "A5", "A6", null});
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B3"));
assertFalse(listener.isInvoked());
// destroy
stmt.destroy();
isolated.destroy();
}
private void runAssertion_A_Bstar(boolean allMatches) {
EPServiceProviderIsolated isolated = epService.getEPServiceIsolated("I1");
sendTimer(isolated, 0);
String[] fields = "a,b0,b1,b2".split(",");
String text = "select * from MyEvent#keepall " +
"match_recognize (" +
" measures A.theString as a, B[0].theString as b0, B[1].theString as b1, B[2].theString as b2" +
(allMatches ? " all matches" : "") +
" pattern (A B*)" +
" interval 10 seconds or terminated" +
" define" +
" A as A.theString like \"A%\"," +
" B as B.theString like \"B%\"" +
")";
EPStatement stmt = isolated.getEPAdministrator().createEPL(text, "stmt1", null);
stmt.addListener(listener);
// test output by terminated because of misfit event
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A1"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B1"));
assertFalse(listener.isInvoked());
isolated.getEPRuntime().sendEvent(new SupportRecogBean("X1"));
if (!allMatches) {
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {"A1", "B1", null, null});
}
else {
EPAssertionUtil.assertPropsPerRowAnyOrder(listener.getAndResetLastNewData(), fields,
new Object[][] {{"A1", "B1", null, null}, {"A1", null, null, null}});
}
sendTimer(isolated, 20000);
assertFalse(listener.isInvoked());
// test output by timer expiry
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A2"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B2"));
assertFalse(listener.isInvoked());
sendTimer(isolated, 29999);
sendTimer(isolated, 30000);
if (!allMatches) {
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {"A2", "B2", null, null});
}
else {
EPAssertionUtil.assertPropsPerRowAnyOrder(listener.getAndResetLastNewData(), fields,
new Object[][] {{"A2", "B2", null, null}, {"A2", null, null, null}});
}
// destroy
stmt.destroy();
isolated.destroy();
EPStatement stmtFromModel = SupportModelHelper.compileCreate(epService, text);
stmtFromModel.destroy();
}
private void runAssertion_A_parenthesisBstar() {
EPServiceProviderIsolated isolated = epService.getEPServiceIsolated("I1");
sendTimer(isolated, 0);
String[] fields = "a,b0,b1,b2".split(",");
String text = "select * from MyEvent#keepall " +
"match_recognize (" +
" measures A.theString as a, B[0].theString as b0, B[1].theString as b1, B[2].theString as b2" +
" pattern (A (B)*)" +
" interval 10 seconds or terminated" +
" define" +
" A as A.theString like \"A%\"," +
" B as B.theString like \"B%\"" +
")";
EPStatement stmt = isolated.getEPAdministrator().createEPL(text, "stmt1", null);
stmt.addListener(listener);
// test output by terminated because of misfit event
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A1"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B1"));
assertFalse(listener.isInvoked());
isolated.getEPRuntime().sendEvent(new SupportRecogBean("X1"));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {"A1", "B1", null, null});
sendTimer(isolated, 20000);
assertFalse(listener.isInvoked());
// test output by timer expiry
isolated.getEPRuntime().sendEvent(new SupportRecogBean("A2"));
isolated.getEPRuntime().sendEvent(new SupportRecogBean("B2"));
assertFalse(listener.isInvoked());
sendTimer(isolated, 29999);
sendTimer(isolated, 30000);
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {"A2", "B2", null, null});
// destroy
stmt.destroy();
isolated.destroy();
EPStatement stmtFromModel = SupportModelHelper.compileCreate(epService, text);
stmtFromModel.destroy();
}
private void sendTemperatureEvent(EPServiceProviderIsolated isolated, String id, int device, double temp) {
isolated.getEPRuntime().sendEvent(new Object[] {id, device, temp}, "TemperatureSensorEvent");
}
private void sendTimer(EPServiceProviderIsolated isolated, long time)
{
CurrentTimeEvent theEvent = new CurrentTimeEvent(time);
isolated.getEPRuntime().sendEvent(theEvent);
}
}