/*
***************************************************************************************
* 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.Configuration;
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.core.service.EPServiceProviderSPI;
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_B;
import com.espertech.esper.supportregression.client.SupportConfigFactory;
import junit.framework.TestCase;
public class TestInfraOnDelete extends TestCase
{
private EPServiceProviderSPI epService;
private SupportUpdateListener listenerInfra;
private SupportUpdateListener listenerDelete;
private SupportUpdateListener listenerSelect;
public void setUp()
{
Configuration config = SupportConfigFactory.getConfiguration();
config.getEngineDefaults().getLogging().setEnableQueryPlan(true);
epService = (EPServiceProviderSPI) EPServiceProviderManager.getDefaultProvider(config);
epService.initialize();
if (InstrumentationHelper.ENABLED) { InstrumentationHelper.startTest(epService, this.getClass(), getName());}
listenerInfra = new SupportUpdateListener();
listenerDelete = new SupportUpdateListener();
listenerSelect = new SupportUpdateListener();
for (Class clazz : new Class[] {SupportBean.class, SupportBean_A.class, SupportBean_B.class}) {
epService.getEPAdministrator().getConfiguration().addEventType(clazz);
}
}
protected void tearDown() throws Exception {
if (InstrumentationHelper.ENABLED) { InstrumentationHelper.endTest();}
listenerInfra = null;
listenerDelete = null;
listenerSelect = null;
}
public void testDeleteCondition() throws Exception {
runAssertionDeleteCondition(true);
runAssertionDeleteCondition(false);
}
public void testDeletePattern() throws Exception {
runAssertionDeletePattern(true);
runAssertionDeletePattern(false);
}
public void testDeleteAll() throws Exception {
runAssertionDeleteAll(true);
runAssertionDeleteAll(false);
}
private void runAssertionDeleteAll(boolean namedWindow) throws Exception
{
// create window
String stmtTextCreate = namedWindow ?
"@Name('CreateInfra') create window MyInfra#keepall as select theString as a, intPrimitive as b from " + SupportBean.class.getName() :
"@Name('CreateInfra') create table MyInfra (a string primary key, b int)";
EPStatement stmtCreate = epService.getEPAdministrator().createEPL(stmtTextCreate);
stmtCreate.addListener(listenerInfra);
// create delete stmt
String stmtTextDelete = "@Name('OnDelete') on " + SupportBean_A.class.getName() + " delete from MyInfra";
EPStatement stmtDelete = epService.getEPAdministrator().createEPL(stmtTextDelete);
stmtDelete.addListener(listenerDelete);
EPAssertionUtil.assertEqualsAnyOrder(stmtDelete.getEventType().getPropertyNames(), new String[]{"a", "b"});
// create insert into
String stmtTextInsertOne = "@Name('Insert') insert into MyInfra select theString as a, intPrimitive as b from " + SupportBean.class.getName();
epService.getEPAdministrator().createEPL(stmtTextInsertOne);
// create consumer
String[] fields = new String[] {"a", "b"};
String stmtTextSelect = "@Name('Select') select irstream MyInfra.a as a, b from MyInfra as s1";
EPStatement stmtSelect = epService.getEPAdministrator().createEPL(stmtTextSelect);
stmtSelect.addListener(listenerSelect);
// Delete all events, no result expected
sendSupportBean_A("A1");
assertFalse(listenerInfra.isInvoked());
assertFalse(listenerSelect.isInvoked());
assertFalse(listenerDelete.isInvoked());
assertEquals(0, getCount("MyInfra"));
// send 1 event
sendSupportBean("E1", 1);
if (namedWindow) {
EPAssertionUtil.assertProps(listenerInfra.assertOneGetNewAndReset(), fields, new Object[]{"E1", 1});
EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{"E1", 1});
}
else {
assertFalse(listenerInfra.isInvoked());
assertFalse(listenerSelect.isInvoked());
}
EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}});
EPAssertionUtil.assertPropsPerRow(stmtDelete.iterator(), fields, null);
assertEquals(1, getCount("MyInfra"));
// Delete all events, 1 row expected
sendSupportBean_A("A2");
if (namedWindow) {
EPAssertionUtil.assertProps(listenerInfra.assertOneGetOldAndReset(), fields, new Object[]{"E1", 1});
EPAssertionUtil.assertProps(listenerSelect.assertOneGetOldAndReset(), fields, new Object[]{"E1", 1});
EPAssertionUtil.assertPropsPerRow(stmtDelete.iterator(), fields, new Object[][]{{"E1", 1}});
}
EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, null);
EPAssertionUtil.assertProps(listenerDelete.assertOneGetNewAndReset(), fields, new Object[]{"E1", 1});
assertEquals(0, getCount("MyInfra"));
// send 2 events
sendSupportBean("E2", 2);
sendSupportBean("E3", 3);
listenerInfra.reset();
EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, new Object[][]{{"E2", 2}, {"E3", 3}});
assertFalse(listenerDelete.isInvoked());
assertEquals(2, getCount("MyInfra"));
// Delete all events, 2 rows expected
sendSupportBean_A("A2");
if (namedWindow) {
EPAssertionUtil.assertProps(listenerInfra.getLastOldData()[0], fields, new Object[]{"E2", 2});
EPAssertionUtil.assertProps(listenerInfra.getLastOldData()[1], fields, new Object[]{"E3", 3});
EPAssertionUtil.assertPropsPerRow(stmtDelete.iterator(), fields, new Object[][]{{"E2", 2}, {"E3", 3}});
}
EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, null);
assertEquals(2, listenerDelete.getLastNewData().length);
EPAssertionUtil.assertProps(listenerDelete.getLastNewData()[0], fields, new Object[]{"E2", 2});
EPAssertionUtil.assertProps(listenerDelete.getLastNewData()[1], fields, new Object[]{"E3", 3});
assertEquals(0, getCount("MyInfra"));
listenerInfra.reset();
listenerDelete.reset();
listenerSelect.reset();
epService.getEPAdministrator().destroyAllStatements();
epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false);
}
private void runAssertionDeletePattern(boolean isNamedWindow) throws Exception
{
// create infra
String stmtTextCreate = isNamedWindow ?
"create window MyInfra#keepall as select theString as a, intPrimitive as b from SupportBean" :
"create table MyInfra(a string primary key, b int)";
EPStatement stmtCreate = epService.getEPAdministrator().createEPL(stmtTextCreate);
stmtCreate.addListener(listenerInfra);
// create delete stmt
String stmtTextDelete = "on pattern [every ea=" + SupportBean_A.class.getName() + " or every eb=" + SupportBean_B.class.getName() + "] " + " delete from MyInfra";
EPStatement stmtDelete = epService.getEPAdministrator().createEPL(stmtTextDelete);
stmtDelete.addListener(listenerDelete);
// create insert into
String stmtTextInsertOne = "insert into MyInfra select theString as a, intPrimitive as b from SupportBean";
epService.getEPAdministrator().createEPL(stmtTextInsertOne);
// send 1 event
String[] fields = new String[] {"a", "b"};
sendSupportBean("E1", 1);
if (isNamedWindow) {
EPAssertionUtil.assertProps(listenerInfra.assertOneGetNewAndReset(), fields, new Object[]{"E1", 1});
EPAssertionUtil.assertPropsPerRow(stmtDelete.iterator(), fields, null);
}
EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}});
assertEquals(1, getCount("MyInfra"));
// Delete all events using A, 1 row expected
sendSupportBean_A("A1");
if (isNamedWindow) {
EPAssertionUtil.assertProps(listenerInfra.assertOneGetOldAndReset(), fields, new Object[]{"E1", 1});
EPAssertionUtil.assertPropsPerRow(stmtDelete.iterator(), fields, new Object[][]{{"E1", 1}});
}
EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, null);
EPAssertionUtil.assertProps(listenerDelete.assertOneGetNewAndReset(), fields, new Object[]{"E1", 1});
assertEquals(0, getCount("MyInfra"));
// send 1 event
sendSupportBean("E2", 2);
if (isNamedWindow) {
EPAssertionUtil.assertProps(listenerInfra.assertOneGetNewAndReset(), fields, new Object[]{"E2", 2});
}
EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, new Object[][]{{"E2", 2}});
assertEquals(1, getCount("MyInfra"));
// Delete all events using B, 1 row expected
sendSupportBean_B("B1");
if (isNamedWindow) {
EPAssertionUtil.assertProps(listenerInfra.assertOneGetOldAndReset(), fields, new Object[]{"E2", 2});
EPAssertionUtil.assertPropsPerRow(stmtDelete.iterator(), fields, new Object[][]{{"E2", 2}});
}
EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, null);
EPAssertionUtil.assertProps(listenerDelete.assertOneGetNewAndReset(), fields, new Object[]{"E2", 2});
assertEquals(0, getCount("MyInfra"));
stmtDelete.destroy();
stmtCreate.destroy();
epService.getEPAdministrator().destroyAllStatements();
epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false);
}
private void runAssertionDeleteCondition(boolean isNamedWindow) throws Exception {
// create infra
String stmtTextCreate = isNamedWindow ?
"create window MyInfra#keepall as select theString as a, intPrimitive as b from SupportBean" :
"create table MyInfra (a string primary key, b int)";
EPStatement stmtCreate = epService.getEPAdministrator().createEPL(stmtTextCreate);
stmtCreate.addListener(listenerInfra);
// create delete stmt
String stmtTextDelete = "on SupportBean_A delete from MyInfra where 'X' || a || 'X' = id";
epService.getEPAdministrator().createEPL(stmtTextDelete);
// create delete stmt
stmtTextDelete = "on SupportBean_B delete from MyInfra where b < 5";
epService.getEPAdministrator().createEPL(stmtTextDelete);
// create insert into
String stmtTextInsertOne = "insert into MyInfra select theString as a, intPrimitive as b from SupportBean";
epService.getEPAdministrator().createEPL(stmtTextInsertOne);
// send 3 event
sendSupportBean("E1", 1);
sendSupportBean("E2", 2);
sendSupportBean("E3", 3);
assertEquals(3, getCount("MyInfra"));
listenerInfra.reset();
String[] fields = new String[] {"a", "b"};
EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E2", 2}, {"E3", 3}});
// delete E2
sendSupportBean_A("XE2X");
if (isNamedWindow) {
assertEquals(1, listenerInfra.getLastOldData().length);
EPAssertionUtil.assertProps(listenerInfra.getLastOldData()[0], fields, new Object[]{"E2", 2});
}
listenerInfra.reset();
EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E3", 3}});
assertEquals(2, getCount("MyInfra"));
sendSupportBean("E7", 7);
EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E3", 3}, {"E7", 7}});
assertEquals(3, getCount("MyInfra"));
// delete all under 5
sendSupportBean_B("B1");
if (isNamedWindow) {
assertEquals(2, listenerInfra.getLastOldData().length);
EPAssertionUtil.assertProps(listenerInfra.getLastOldData()[0], fields, new Object[]{"E1", 1});
EPAssertionUtil.assertProps(listenerInfra.getLastOldData()[1], fields, new Object[]{"E3", 3});
}
EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E7", 7}});
assertEquals(1, getCount("MyInfra"));
epService.getEPAdministrator().destroyAllStatements();
epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false);
}
private SupportBean_A sendSupportBean_A(String id)
{
SupportBean_A bean = new SupportBean_A(id);
epService.getEPRuntime().sendEvent(bean);
return bean;
}
private SupportBean_B sendSupportBean_B(String id)
{
SupportBean_B bean = new SupportBean_B(id);
epService.getEPRuntime().sendEvent(bean);
return bean;
}
private SupportBean sendSupportBean(String theString, int intPrimitive)
{
SupportBean bean = new SupportBean();
bean.setTheString(theString);
bean.setIntPrimitive(intPrimitive);
epService.getEPRuntime().sendEvent(bean);
return bean;
}
private long getCount(String windowOrTableName) throws Exception
{
return (Long) epService.getEPRuntime().executeQuery("select count(*) as c0 from " + windowOrTableName).getArray()[0].get("c0");
}
}