/*
* *************************************************************************************
* 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.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.EPStatement;
import com.espertech.esper.client.hook.ConditionHandlerContext;
import com.espertech.esper.client.hook.ConditionHandlerFactoryContext;
import com.espertech.esper.client.hook.ConditionPatternEngineSubexpressionMax;
import com.espertech.esper.client.hook.ConditionPatternSubexpressionMax;
import com.espertech.esper.client.scopetest.EPAssertionUtil;
import com.espertech.esper.client.scopetest.SupportUpdateListener;
import com.espertech.esper.support.bean.SupportBean;
import com.espertech.esper.support.bean.SupportBeanConstants;
import com.espertech.esper.support.bean.SupportBean_A;
import com.espertech.esper.support.bean.SupportBean_B;
import com.espertech.esper.support.client.SupportConditionHandlerFactory;
import com.espertech.esper.support.client.SupportConfigFactory;
import junit.framework.TestCase;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestFollowedByMaxEnginePool extends TestCase implements SupportBeanConstants
{
private EPServiceProvider epService;
private SupportConditionHandlerFactory.SupportConditionHandler handler;
protected void tearDown() throws Exception {
handler = null;
}
public void testFollowedWithMax()
{
initService(4L, true);
String expressionOne = "@Name('S1') select * from pattern [every a=SupportBean(theString like 'A%') -[2]> b=SupportBean_A(id=a.theString)]";
EPStatement stmtOne = epService.getEPAdministrator().createEPL(expressionOne);
String expressionTwo = "@Name('S2') select * from pattern [every a=SupportBean(theString like 'B%') -> b=SupportBean_B(id=a.theString)]";
EPStatement stmtTwo = epService.getEPAdministrator().createEPL(expressionTwo);
epService.getEPRuntime().sendEvent(new SupportBean("A1", 0));
epService.getEPRuntime().sendEvent(new SupportBean("A2", 0));
epService.getEPRuntime().sendEvent(new SupportBean("B1", 0));
assertTrue(handler.getContexts().isEmpty());
epService.getEPRuntime().sendEvent(new SupportBean("A3", 0));
assertContextStatement(epService, stmtOne, handler.getAndResetContexts(), 2);
epService.getEPRuntime().sendEvent(new SupportBean("B2", 0));
assertTrue(handler.getContexts().isEmpty());
epService.getEPRuntime().sendEvent(new SupportBean("B3", 0));
assertContextEnginePool(epService, stmtTwo, handler.getAndResetContexts(), 4, getExpectedCountMap("S1", 2, "S2", 2));
epService.getEPRuntime().sendEvent(new SupportBean_A("A2"));
epService.getEPRuntime().sendEvent(new SupportBean("B4", 0)); // now A1, B1, B2, B4
assertTrue(handler.getContexts().isEmpty());
epService.getEPRuntime().sendEvent(new SupportBean("A3", 0));
assertContextEnginePool(epService, stmtOne, handler.getAndResetContexts(), 4, getExpectedCountMap("S1", 1, "S2", 3));
stmtOne.destroy();
epService.getEPRuntime().sendEvent(new SupportBean("B4", 0));
assertTrue(handler.getContexts().isEmpty());
epService.getEPRuntime().sendEvent(new SupportBean("B5", 0));
assertContextEnginePool(epService, stmtTwo, handler.getAndResetContexts(), 4, getExpectedCountMap("S2", 4));
}
public void testTwoStatementsAndStopDestroy()
{
initService(4, true);
String expressionOne = "@Name('S1') select * from pattern [every a=SupportBean(theString like 'A%') -> b=SupportBean_A(id=a.theString)]";
EPStatement stmtOne = epService.getEPAdministrator().createEPL(expressionOne);
String expressionTwo = "@Name('S2') select * from pattern [every a=SupportBean(theString like 'B%') -> b=SupportBean_B(id=a.theString)]";
EPStatement stmtTwo = epService.getEPAdministrator().createEPL(expressionTwo);
epService.getEPRuntime().sendEvent(new SupportBean("A1", 0));
epService.getEPRuntime().sendEvent(new SupportBean("A2", 0));
epService.getEPRuntime().sendEvent(new SupportBean("A3", 0));
epService.getEPRuntime().sendEvent(new SupportBean("B1", 0));
assertTrue(handler.getContexts().isEmpty());
epService.getEPRuntime().sendEvent(new SupportBean("B2", 0));
assertContextEnginePool(epService, stmtTwo, handler.getAndResetContexts(), 4, getExpectedCountMap("S1", 3, "S2", 1));
epService.getEPRuntime().sendEvent(new SupportBean("A4", 0));
assertContextEnginePool(epService, stmtOne, handler.getAndResetContexts(), 4, getExpectedCountMap("S1", 3, "S2", 1));
stmtOne.stop();
epService.getEPRuntime().sendEvent(new SupportBean("B3", 0));
epService.getEPRuntime().sendEvent(new SupportBean("B4", 0));
epService.getEPRuntime().sendEvent(new SupportBean("B5", 0));
assertTrue(handler.getContexts().isEmpty());
epService.getEPRuntime().sendEvent(new SupportBean("B6", 0));
assertContextEnginePool(epService, stmtTwo, handler.getAndResetContexts(), 4, getExpectedCountMap("S1", 0, "S2", 4));
stmtOne.destroy();
epService.getEPRuntime().sendEvent(new SupportBean("B7", 0));
assertContextEnginePool(epService, stmtTwo, handler.getAndResetContexts(), 4, getExpectedCountMap("S2", 4));
}
public void testSingleNoOperatorMax()
{
initService(2L, true);
String expression = "@Name('A') select a.id as a, b.id as b from pattern [every a=SupportBean_A -> b=SupportBean_B]";
EPStatement stmt = epService.getEPAdministrator().createEPL(expression);
SupportUpdateListener listener = new SupportUpdateListener();
stmt.addListener(listener);
epService.getEPRuntime().sendEvent(new SupportBean_A("A1"));
epService.getEPRuntime().sendEvent(new SupportBean_A("A2"));
handler.getContexts().clear();
epService.getEPRuntime().sendEvent(new SupportBean_A("A3"));
assertContextEnginePool(epService, stmt, handler.getContexts(), 2, getExpectedCountMap("A", 2));
String fields[] = new String[] {"a", "b"};
epService.getEPRuntime().sendEvent(new SupportBean_B("B1"));
EPAssertionUtil.assertPropsPerRow(listener.getAndResetLastNewData(), fields, new Object[][]{{"A1", "B1"}, {"A2", "B1"}});
epService.getEPRuntime().sendEvent(new SupportBean_A("A4"));
epService.getEPRuntime().sendEvent(new SupportBean_B("B2"));
EPAssertionUtil.assertPropsPerRow(listener.getAndResetLastNewData(), fields, new Object[][]{{"A4", "B2"}});
assertTrue(handler.getContexts().isEmpty());
for (int i = 5; i < 9; i++) {
epService.getEPRuntime().sendEvent(new SupportBean_A("A" + i));
if (i >= 7) {
assertContextEnginePool(epService, stmt, handler.getContexts(), 2, getExpectedCountMap("A", 2));
}
}
epService.getEPRuntime().sendEvent(new SupportBean_B("B3"));
EPAssertionUtil.assertPropsPerRow(listener.getAndResetLastNewData(), fields, new Object[][]{{"A5", "B3"}, {"A6", "B3"}});
epService.getEPRuntime().sendEvent(new SupportBean_B("B4"));
assertFalse(listener.isInvoked());
epService.getEPRuntime().sendEvent(new SupportBean_A("A20"));
epService.getEPRuntime().sendEvent(new SupportBean_A("A21"));
epService.getEPRuntime().sendEvent(new SupportBean_B("B5"));
EPAssertionUtil.assertPropsPerRow(listener.getAndResetLastNewData(), fields, new Object[][]{{"A20", "B5"}, {"A21", "B5"}});
assertTrue(handler.getContexts().isEmpty());
stmt.destroy();
}
public void testNoPreventRuntimeConfig()
{
initService(2L, false);
String expression = "@Name('A') select a.id as a, b.id as b from pattern [every a=SupportBean_A -> b=SupportBean_B]";
EPStatement stmt = epService.getEPAdministrator().createEPL(expression);
SupportUpdateListener listener = new SupportUpdateListener();
stmt.addListener(listener);
epService.getEPRuntime().sendEvent(new SupportBean_A("A1"));
epService.getEPRuntime().sendEvent(new SupportBean_A("A2"));
handler.getContexts().clear();
epService.getEPRuntime().sendEvent(new SupportBean_A("A3"));
assertContextEnginePool(epService, stmt, handler.getContexts(), 2, getExpectedCountMap("A", 2));
handler.getContexts().clear();
epService.getEPRuntime().sendEvent(new SupportBean_A("A4"));
assertContextEnginePool(epService, stmt, handler.getContexts(), 2, getExpectedCountMap("A", 3));
String fields[] = new String[] {"a", "b"};
epService.getEPRuntime().sendEvent(new SupportBean_B("B1"));
EPAssertionUtil.assertPropsPerRow(listener.getAndResetLastNewData(), fields, new Object[][]{{"A1", "B1"}, {"A2", "B1"}, {"A3", "B1"}, {"A4", "B1"}});
// set new max
epService.getEPAdministrator().getConfiguration().setPatternMaxSubexpressions(1L);
epService.getEPRuntime().sendEvent(new SupportBean_A("A5"));
handler.getContexts().clear();
epService.getEPRuntime().sendEvent(new SupportBean_A("A6"));
assertContextEnginePool(epService, stmt, handler.getContexts(), 1, getExpectedCountMap("A", 1));
stmt.destroy();
}
private void initService(long max, boolean preventStart) {
Configuration config = SupportConfigFactory.getConfiguration();
config.addEventType("SupportBean", SupportBean.class);
config.addEventType("SupportBean_A", SupportBean_A.class);
config.addEventType("SupportBean_B", SupportBean_B.class);
config.getEngineDefaults().getConditionHandling().addClass(SupportConditionHandlerFactory.class);
config.getEngineDefaults().getPatterns().setMaxSubexpressions(max);
config.getEngineDefaults().getPatterns().setMaxSubexpressionPreventStart(preventStart);
config.getEngineDefaults().getLogging().setEnableExecutionDebug(true);
epService = EPServiceProviderManager.getDefaultProvider(config);
epService.initialize();
ConditionHandlerFactoryContext context = SupportConditionHandlerFactory.getFactoryContexts().get(0);
assertEquals(epService.getURI(), context.getEngineURI());
handler = SupportConditionHandlerFactory.getLastHandler();
}
private static Map<String, Long> getExpectedCountMap(String statementName, long count) {
Map<String, Long> result = new HashMap<String, Long>();
result.put(statementName, count);
return result;
}
private static Map<String, Long> getExpectedCountMap(String stmtOne, long countOne, String stmtTwo, long countTwo) {
Map<String, Long> result = new HashMap<String, Long>();
result.put(stmtOne, countOne);
result.put(stmtTwo, countTwo);
return result;
}
private static void assertContextEnginePool(EPServiceProvider epService, EPStatement stmt, List<ConditionHandlerContext> contexts, int max, Map<String, Long> counts) {
assertEquals(1, contexts.size());
ConditionHandlerContext context = contexts.get(0);
assertEquals(epService.getURI(), context.getEngineURI());
assertEquals(stmt.getText(), context.getEpl());
assertEquals(stmt.getName(), context.getStatementName());
ConditionPatternEngineSubexpressionMax condition = (ConditionPatternEngineSubexpressionMax) context.getEngineCondition();
assertEquals(max, condition.getMax());
assertEquals(counts.size(), condition.getCounts().size());
for (Map.Entry<String, Long> expected : counts.entrySet()) {
assertEquals("failed for key " + expected.getKey(), expected.getValue(), condition.getCounts().get(expected.getKey()));
}
contexts.clear();
}
private static void assertContextStatement(EPServiceProvider epService, EPStatement stmt, List<ConditionHandlerContext> contexts, int max) {
assertEquals(1, contexts.size());
ConditionHandlerContext context = contexts.get(0);
assertEquals(epService.getURI(), context.getEngineURI());
assertEquals(stmt.getText(), context.getEpl());
assertEquals(stmt.getName(), context.getStatementName());
ConditionPatternSubexpressionMax condition = (ConditionPatternSubexpressionMax) context.getEngineCondition();
assertEquals(max, condition.getMax());
contexts.clear();
}
private static Log log = LogFactory.getLog(TestFollowedByMaxEnginePool.class);
}