/*
***************************************************************************************
* 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.nwtable;
import com.espertech.esper.client.*;
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.bean.SupportBean_A;
import com.espertech.esper.supportregression.bean.SupportBean_S0;
import com.espertech.esper.supportregression.bean.SupportMarketDataBean;
import com.espertech.esper.supportregression.client.SupportConfigFactory;
import junit.framework.TestCase;
public class TestInfraSubqUncorrel extends TestCase
{
private EPServiceProvider epService;
private SupportUpdateListener listenerWindow;
private SupportUpdateListener listenerStmtOne;
private SupportUpdateListener listenerStmtTwo;
private SupportUpdateListener listenerStmtDelete;
public void setUp()
{
Configuration config = SupportConfigFactory.getConfiguration();
epService = EPServiceProviderManager.getDefaultProvider(config);
epService.initialize();
if (InstrumentationHelper.ENABLED) { InstrumentationHelper.startTest(epService, this.getClass(), getName());}
epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class);
epService.getEPAdministrator().getConfiguration().addEventType("ABean", SupportBean_S0.class);
listenerWindow = new SupportUpdateListener();
listenerStmtOne = new SupportUpdateListener();
listenerStmtTwo = new SupportUpdateListener();
listenerStmtDelete = new SupportUpdateListener();
}
protected void tearDown() throws Exception {
if (InstrumentationHelper.ENABLED) { InstrumentationHelper.endTest();}
listenerWindow = null;
listenerStmtOne = null;
listenerStmtTwo = null;
listenerStmtDelete = null;
}
public void testUncorrelated() {
// named window tests
runAssertion(true, false, false); // testNoShare
runAssertion(true, true, false); // testShare
runAssertion(true, true, true); // testDisableShare
// table tests
runAssertion(false, false, false);
}
private void runAssertion(boolean namedWindow, boolean enableIndexShareCreate, boolean disableIndexShareConsumer)
{
String stmtTextCreate = namedWindow ?
"create window MyInfra#keepall as select theString as a, longPrimitive as b, longBoxed as c from " + SupportBean.class.getName() :
"create table MyInfra(a string primary key, b long, c long)";
if (enableIndexShareCreate) {
stmtTextCreate = "@Hint('enable_window_subquery_indexshare') " + stmtTextCreate;
}
// create window
EPStatement stmtCreate = epService.getEPAdministrator().createEPL(stmtTextCreate);
stmtCreate.addListener(listenerWindow);
// create insert into
String stmtTextInsertOne = "insert into MyInfra select theString as a, longPrimitive as b, longBoxed as c from " + SupportBean.class.getName();
epService.getEPAdministrator().createEPL(stmtTextInsertOne);
// create consumer
String stmtTextSelectOne = "select irstream (select a from MyInfra) as value, symbol from " + SupportMarketDataBean.class.getName();
if (disableIndexShareConsumer) {
stmtTextSelectOne = "@Hint('disable_window_subquery_indexshare') " + stmtTextSelectOne;
}
EPStatement stmtSelectOne = epService.getEPAdministrator().createEPL(stmtTextSelectOne);
stmtSelectOne.addListener(listenerStmtOne);
EPAssertionUtil.assertEqualsAnyOrder(stmtSelectOne.getEventType().getPropertyNames(), new String[]{"value", "symbol"});
assertEquals(String.class, stmtSelectOne.getEventType().getPropertyType("value"));
assertEquals(String.class, stmtSelectOne.getEventType().getPropertyType("symbol"));
sendMarketBean("M1");
String fieldsStmt[] = new String[] {"value", "symbol"};
EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetNewAndReset(), fieldsStmt, new Object[]{null, "M1"});
sendSupportBean("S1", 1L, 2L);
assertFalse(listenerStmtOne.isInvoked());
String fieldsWin[] = new String[] {"a", "b", "c"};
if (namedWindow) {
EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fieldsWin, new Object[]{"S1", 1L, 2L});
}
else {
assertFalse(listenerWindow.isInvoked());
}
// create consumer 2 -- note that this one should not start empty now
String stmtTextSelectTwo = "select irstream (select a from MyInfra) as value, symbol from " + SupportMarketDataBean.class.getName();
if (disableIndexShareConsumer) {
stmtTextSelectTwo = "@Hint('disable_window_subquery_indexshare') " + stmtTextSelectTwo;
}
EPStatement stmtSelectTwo = epService.getEPAdministrator().createEPL(stmtTextSelectTwo);
stmtSelectTwo.addListener(listenerStmtTwo);
sendMarketBean("M1");
EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetNewAndReset(), fieldsStmt, new Object[]{"S1", "M1"});
EPAssertionUtil.assertProps(listenerStmtTwo.assertOneGetNewAndReset(), fieldsStmt, new Object[]{"S1", "M1"});
sendSupportBean("S2", 10L, 20L);
assertFalse(listenerStmtOne.isInvoked());
if (namedWindow) {
EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fieldsWin, new Object[]{"S2", 10L, 20L});
}
sendMarketBean("M2");
EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetNewAndReset(), fieldsStmt, new Object[]{null, "M2"});
assertFalse(listenerWindow.isInvoked());
EPAssertionUtil.assertProps(listenerStmtTwo.assertOneGetNewAndReset(), fieldsStmt, new Object[]{null, "M2"});
// create delete stmt
String stmtTextDelete = "on " + SupportBean_A.class.getName() + " delete from MyInfra where id = a";
EPStatement stmtDelete = epService.getEPAdministrator().createEPL(stmtTextDelete);
stmtDelete.addListener(listenerStmtDelete);
// delete S1
epService.getEPRuntime().sendEvent(new SupportBean_A("S1"));
if (namedWindow) {
EPAssertionUtil.assertProps(listenerWindow.assertOneGetOldAndReset(), fieldsWin, new Object[]{"S1", 1L, 2L});
}
sendMarketBean("M3");
EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetNewAndReset(), fieldsStmt, new Object[]{"S2", "M3"});
EPAssertionUtil.assertProps(listenerStmtTwo.assertOneGetNewAndReset(), fieldsStmt, new Object[]{"S2", "M3"});
// delete S2
epService.getEPRuntime().sendEvent(new SupportBean_A("S2"));
if (namedWindow) {
EPAssertionUtil.assertProps(listenerWindow.assertOneGetOldAndReset(), fieldsWin, new Object[]{"S2", 10L, 20L});
}
sendMarketBean("M4");
EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetNewAndReset(), fieldsStmt, new Object[]{null, "M4"});
EPAssertionUtil.assertProps(listenerStmtTwo.assertOneGetNewAndReset(), fieldsStmt, new Object[]{null, "M4"});
sendSupportBean("S3", 100L, 200L);
if (namedWindow) {
EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fieldsWin, new Object[]{"S3", 100L, 200L});
}
sendMarketBean("M5");
EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetNewAndReset(), fieldsStmt, new Object[]{"S3", "M5"});
EPAssertionUtil.assertProps(listenerStmtTwo.assertOneGetNewAndReset(), fieldsStmt, new Object[]{"S3", "M5"});
epService.getEPAdministrator().destroyAllStatements();
epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false);
}
private SupportBean sendSupportBean(String theString, long longPrimitive, Long longBoxed)
{
SupportBean bean = new SupportBean();
bean.setTheString(theString);
bean.setLongPrimitive(longPrimitive);
bean.setLongBoxed(longBoxed);
epService.getEPRuntime().sendEvent(bean);
return bean;
}
private void sendMarketBean(String symbol)
{
SupportMarketDataBean bean = new SupportMarketDataBean(symbol, 0, 0l, "");
epService.getEPRuntime().sendEvent(bean);
}
}