/*
***************************************************************************************
* 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.Configuration;
import com.espertech.esper.client.EPServiceProvider;
import com.espertech.esper.client.EPServiceProviderManager;
import com.espertech.esper.client.EPStatement;
import com.espertech.esper.client.scopetest.EPAssertionUtil;
import com.espertech.esper.client.scopetest.SupportUpdateListener;
import com.espertech.esper.metrics.instrumentation.InstrumentationHelper;
import com.espertech.esper.supportregression.bean.SupportBean;
import com.espertech.esper.supportregression.client.SupportConfigFactory;
import junit.framework.TestCase;
public class TestRowPatternRecognitionArrayAccess extends TestCase {
private EPServiceProvider epService;
private SupportUpdateListener listener;
public void setUp() {
Configuration config = SupportConfigFactory.getConfiguration();
config.addEventType(SupportBean.class);
epService = EPServiceProviderManager.getDefaultProvider(config);
epService.initialize();
listener = new SupportUpdateListener();
if (InstrumentationHelper.ENABLED) { InstrumentationHelper.startTest(epService, this.getClass(), getName());}
}
public void tearDown() {
if (InstrumentationHelper.ENABLED) { InstrumentationHelper.endTest();}
}
public void testSingleMultiMix() {
String[] fields = "a,b0,c,d0,e".split(",");
String text = "select * from SupportBean " +
"match_recognize (" +
" measures A.theString as a, B[0].theString as b0, C.theString as c, D[0].theString as d0, E.theString as e" +
" pattern (A B+ C D+ E)" +
" define" +
" A as A.theString like 'A%', " +
" B as B.theString like 'B%'," +
" C as C.theString like 'C%' and C.intPrimitive = B[1].intPrimitive," +
" D as D.theString like 'D%'," +
" E as E.theString like 'E%' and E.intPrimitive = D[1].intPrimitive and E.intPrimitive = D[0].intPrimitive" +
")";
EPStatement stmt = epService.getEPAdministrator().createEPL(text);
stmt.addListener(listener);
listener.reset();
sendEvents(new Object[][] {{"A1", 100}, {"B1", 50}, {"B2", 49}, {"C1", 49}, {"D1", 2}, {"D2", 2}, {"E1", 2}});
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {"A1", "B1", "C1", "D1", "E1"});
sendEvents(new Object[][] {{"A1", 100}, {"B1", 50}, {"C1", 49}, {"D1", 2}, {"D2", 2}, {"E1", 2}});
assertFalse(listener.isInvoked());
sendEvents(new Object[][] {{"A1", 100}, {"B1", 50}, {"B2", 49}, {"C1", 49}, {"D1", 2}, {"D2", 3}, {"E1", 2}});
assertFalse(listener.isInvoked());
sendEvents(new Object[][] {{"A1", 100}, {"B1", 50}, {"B2", 49}, {"C1", 49}, {"D1", 2}, {"D2", 2}, {"D3", 99}, {"E1", 2}});
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {"A1", "B1", "C1", "D1", "E1"});
}
public void testMultiDepends() {
runAssertionMultiDepends("A B A B C");
runAssertionMultiDepends("(A B)* C");
}
public void testMeasuresClausePresence() throws Exception
{
runMeasuresClausePresence("A as a_array, B as b");
runMeasuresClausePresence("B as b");
runMeasuresClausePresence("A as a_array");
runMeasuresClausePresence("1 as one");
}
public void testLambda() {
String[] fieldsOne = "a0,a1,a2,b".split(",");
String eplOne = "select * from SupportBean " +
"match_recognize (" +
" measures A[0].theString as a0, A[1].theString as a1, A[2].theString as a2, B.theString as b" +
" pattern (A* B)" +
" define" +
" B as (coalesce(A.sumOf(v => v.intPrimitive), 0) + B.intPrimitive) > 100" +
")";
EPStatement stmt = epService.getEPAdministrator().createEPL(eplOne);
stmt.addListener(listener);
listener.reset();
sendEvents(new Object[][] {{"E1", 50}, {"E2", 49}});
assertFalse(listener.isInvoked());
sendEvents(new Object[][] {{"E3", 2}});
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fieldsOne, new Object[] {"E1", "E2", null, "E3"});
sendEvents(new Object[][] {{"E4", 101}});
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fieldsOne, new Object[] {null, null, null, "E4"});
sendEvents(new Object[][] {{"E5", 50}, {"E6", 51}});
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fieldsOne, new Object[] {"E5", null, null, "E6"});
sendEvents(new Object[][] {{"E7", 10}, {"E8", 10}, {"E9", 79}, {"E10", 1}, {"E11", 1}});
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fieldsOne, new Object[] {"E7", "E8", "E9", "E11"});
stmt.destroy();
String[] fieldsTwo = "a[0].theString,a[1].theString,b.theString".split(",");
String eplTwo = "select * from SupportBean " +
"match_recognize (" +
" measures A as a, B as b " +
" pattern (A+ B)" +
" define" +
" A as theString like 'A%', " +
" B as theString like 'B%' and B.intPrimitive > A.sumOf(v => v.intPrimitive)" +
")";
EPStatement stmtTwo = epService.getEPAdministrator().createEPL(eplTwo);
stmtTwo.addListener(listener);
listener.reset();
sendEvents(new Object[][] {{"A1", 1}, {"A2", 2}, {"B1", 3}});
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fieldsTwo, new Object[] {"A2", null, "B1"});
sendEvents(new Object[][] {{"A3", 1}, {"A4", 2}, {"B2", 4}});
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fieldsTwo, new Object[] {"A3", "A4", "B2"});
sendEvents(new Object[][] {{"A5", -1}, {"B3", 0}});
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fieldsTwo, new Object[] {"A5", null, "B3"});
sendEvents(new Object[][] {{"A6", 10}, {"B3", 9}, {"B4", 11}});
sendEvents(new Object[][] {{"A7", 10}, {"A8", 9}, {"A9", 8}});
assertFalse(listener.isInvoked());
sendEvents(new Object[][] {{"B5", 18}});
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fieldsTwo, new Object[] {"A8", "A9", "B5"});
sendEvents(new Object[][] {{"A0", 10}, {"A11", 9}, {"A12", 8}, {"B6", 8}});
assertFalse(listener.isInvoked());
sendEvents(new Object[][] {{"A13", 1}, {"A14", 1}, {"A15", 1}, {"A16", 1}, {"B7", 5}});
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fieldsTwo, new Object[] {"A13", "A14", "B7"});
sendEvents(new Object[][] {{"A17", 1}, {"A18", 1}, {"B8", 1}});
assertFalse(listener.isInvoked());
}
private void runMeasuresClausePresence(String measures) throws Exception
{
String text = "select * from SupportBean " +
"match_recognize (" +
" partition by theString " +
" measures " + measures +
" pattern (A+ B)" +
" define" +
" B as B.intPrimitive = A[0].intPrimitive" +
")";
EPStatement stmt = epService.getEPAdministrator().createEPL(text);
stmt.addListener(listener);
sendEvents(new Object[][] {{"A", 1}, {"A", 0}});
assertFalse(listener.isInvoked());
sendEvents(new Object[][] {{"B", 1}, {"B", 1}});
assertNotNull(listener.assertOneGetNewAndReset());
sendEvents(new Object[][] {{"A", 2}, {"A", 3}});
assertFalse(listener.isInvoked());
sendEvents(new Object[][] {{"B", 2}, {"B", 2}});
assertNotNull(listener.assertOneGetNewAndReset());
stmt.destroy();
}
private void runAssertionMultiDepends(String pattern) {
String[] fields = "a0,a1,b0,b1,c".split(",");
String text = "select * from SupportBean " +
"match_recognize (" +
" measures A[0].theString as a0, A[1].theString as a1, B[0].theString as b0, B[1].theString as b1, C.theString as c" +
" pattern (" + pattern + ")" +
" define" +
" A as theString like 'A%', " +
" B as theString like 'B%'," +
" C as theString like 'C%' and " +
" C.intPrimitive = A[0].intPrimitive and " +
" C.intPrimitive = B[0].intPrimitive and " +
" C.intPrimitive = A[1].intPrimitive and " +
" C.intPrimitive = B[1].intPrimitive" +
")";
EPStatement stmt = epService.getEPAdministrator().createEPL(text);
stmt.addListener(listener);
listener.reset();
sendEvents(new Object[][] {{"A1", 1}, {"B1", 1}, {"A2", 1}, {"B2", 1}});
epService.getEPRuntime().sendEvent(new SupportBean("C1", 1));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {"A1", "A2", "B1", "B2", "C1"});
sendEvents(new Object[][] {{"A10", 1}, {"B10", 1}, {"A11", 1}, {"B11", 2}, {"C2", 2}});
assertFalse(listener.isInvoked());
sendEvents(new Object[][] {{"A20", 2}, {"B20", 2}, {"A21", 1}, {"B21", 2}, {"C3", 2}});
assertFalse(listener.isInvoked());
stmt.destroy();
}
private void sendEvents(Object[][] objects) {
for (Object[] object : objects) {
epService.getEPRuntime().sendEvent(new SupportBean((String) object[0], (Integer) object[1]));
}
}
}