/*
***************************************************************************************
* 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.scopetest.EPAssertionUtil;
import com.espertech.esper.client.scopetest.SupportUpdateListener;
import com.espertech.esper.metrics.instrumentation.InstrumentationHelper;
import junit.framework.TestCase;
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.soda.*;
import com.espertech.esper.supportregression.bean.SupportBean;
import com.espertech.esper.supportregression.bean.SupportMarketDataBean;
import com.espertech.esper.supportregression.bean.SupportBean_B;
import com.espertech.esper.supportregression.client.SupportConfigFactory;
public class TestNamedWindowOM extends TestCase
{
private EPServiceProvider epService;
private SupportUpdateListener listenerWindow;
private SupportUpdateListener listenerStmtOne;
private SupportUpdateListener listenerOnSelect;
public void setUp()
{
Configuration config = SupportConfigFactory.getConfiguration();
epService = EPServiceProviderManager.getDefaultProvider(config);
epService.initialize();
if (InstrumentationHelper.ENABLED) { InstrumentationHelper.startTest(epService, this.getClass(), getName());}
listenerWindow = new SupportUpdateListener();
listenerStmtOne = new SupportUpdateListener();
listenerOnSelect = new SupportUpdateListener();
}
protected void tearDown() throws Exception {
if (InstrumentationHelper.ENABLED) { InstrumentationHelper.endTest();}
listenerWindow = null;
listenerStmtOne = null;
listenerOnSelect = null;
}
public void testCompile()
{
String[] fields = new String[] {"key", "value"};
String stmtTextCreate = "create window MyWindow#keepall as select theString as key, longBoxed as value from " + SupportBean.class.getName();
EPStatementObjectModel modelCreate = epService.getEPAdministrator().compileEPL(stmtTextCreate);
EPStatement stmtCreate = epService.getEPAdministrator().create(modelCreate);
stmtCreate.addListener(listenerWindow);
assertEquals("create window MyWindow#keepall as select theString as key, longBoxed as value from " + SupportBean.class.getName(), modelCreate.toEPL());
String stmtTextOnSelect = "on " + SupportBean_B.class.getName() + " select mywin.* from MyWindow as mywin";
EPStatementObjectModel modelOnSelect = epService.getEPAdministrator().compileEPL(stmtTextOnSelect);
EPStatement stmtOnSelect = epService.getEPAdministrator().create(modelOnSelect);
stmtOnSelect.addListener(listenerOnSelect);
String stmtTextInsert = "insert into MyWindow select theString as key, longBoxed as value from " + SupportBean.class.getName();
EPStatementObjectModel modelInsert = epService.getEPAdministrator().compileEPL(stmtTextInsert);
EPStatement stmtInsert = epService.getEPAdministrator().create(modelInsert);
String stmtTextSelectOne = "select irstream key, value*2 as value from MyWindow(key is not null)";
EPStatementObjectModel modelSelect = epService.getEPAdministrator().compileEPL(stmtTextSelectOne);
EPStatement stmtSelectOne = epService.getEPAdministrator().create(modelSelect);
stmtSelectOne.addListener(listenerStmtOne);
assertEquals(stmtTextSelectOne, modelSelect.toEPL());
// send events
sendSupportBean("E1", 10L);
EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetNewAndReset(), fields, new Object[]{"E1", 20L});
EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E1", 10L});
sendSupportBean("E2", 20L);
EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetNewAndReset(), fields, new Object[]{"E2", 40L});
EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E2", 20L});
// create delete stmt
String stmtTextDelete = "on " + SupportMarketDataBean.class.getName() + " as s0 delete from MyWindow as s1 where s0.symbol=s1.key";
EPStatementObjectModel modelDelete = epService.getEPAdministrator().compileEPL(stmtTextDelete);
epService.getEPAdministrator().create(modelDelete);
assertEquals("on " + SupportMarketDataBean.class.getName() + " as s0 delete from MyWindow as s1 where s0.symbol=s1.key", modelDelete.toEPL());
// send delete event
sendMarketBean("E1");
EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetOldAndReset(), fields, new Object[]{"E1", 20L});
EPAssertionUtil.assertProps(listenerWindow.assertOneGetOldAndReset(), fields, new Object[]{"E1", 10L});
// send delete event again, none deleted now
sendMarketBean("E1");
assertFalse(listenerStmtOne.isInvoked());
assertFalse(listenerWindow.isInvoked());
// send delete event
sendMarketBean("E2");
EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetOldAndReset(), fields, new Object[]{"E2", 40L});
EPAssertionUtil.assertProps(listenerWindow.assertOneGetOldAndReset(), fields, new Object[]{"E2", 20L});
// trigger on-select on empty window
assertFalse(listenerOnSelect.isInvoked());
epService.getEPRuntime().sendEvent(new SupportBean_B("B1"));
assertFalse(listenerOnSelect.isInvoked());
sendSupportBean("E3", 30L);
EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetNewAndReset(), fields, new Object[]{"E3", 60L});
EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E3", 30L});
// trigger on-select on the filled window
epService.getEPRuntime().sendEvent(new SupportBean_B("B2"));
EPAssertionUtil.assertProps(listenerOnSelect.assertOneGetNewAndReset(), fields, new Object[]{"E3", 30L});
stmtSelectOne.destroy();
stmtInsert.destroy();
stmtCreate.destroy();
}
public void testOM()
{
String[] fields = new String[] {"key", "value"};
// create window object model
EPStatementObjectModel model = new EPStatementObjectModel();
model.setCreateWindow(CreateWindowClause.create("MyWindow").addView("keepall"));
model.setSelectClause(SelectClause.create()
.addWithAsProvidedName("theString", "key")
.addWithAsProvidedName("longBoxed", "value"));
model.setFromClause(FromClause.create(FilterStream.create(SupportBean.class.getName())));
EPStatement stmtCreate = epService.getEPAdministrator().create(model);
stmtCreate.addListener(listenerWindow);
String stmtTextCreate = "create window MyWindow#keepall as select theString as key, longBoxed as value from " + SupportBean.class.getName();
assertEquals(stmtTextCreate, model.toEPL());
String stmtTextInsert = "insert into MyWindow select theString as key, longBoxed as value from " + SupportBean.class.getName();
EPStatementObjectModel modelInsert = epService.getEPAdministrator().compileEPL(stmtTextInsert);
EPStatement stmtInsert = epService.getEPAdministrator().create(modelInsert);
// Consumer statement object model
model = new EPStatementObjectModel();
Expression multi = Expressions.multiply(Expressions.property("value"), Expressions.constant(2));
model.setSelectClause(SelectClause.create().streamSelector(StreamSelector.RSTREAM_ISTREAM_BOTH)
.add("key")
.add(multi, "value"));
model.setFromClause(FromClause.create(FilterStream.create("MyWindow", Expressions.isNotNull("value"))));
EPStatement stmtSelectOne = epService.getEPAdministrator().create(model);
stmtSelectOne.addListener(listenerStmtOne);
String stmtTextSelectOne = "select irstream key, value*2 as value from MyWindow(value is not null)";
assertEquals(stmtTextSelectOne, model.toEPL());
// send events
sendSupportBean("E1", 10L);
EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetNewAndReset(), fields, new Object[]{"E1", 20L});
EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E1", 10L});
sendSupportBean("E2", 20L);
EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetNewAndReset(), fields, new Object[]{"E2", 40L});
EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E2", 20L});
// create delete stmt
model = new EPStatementObjectModel();
model.setOnExpr(OnClause.createOnDelete("MyWindow", "s1"));
model.setFromClause(FromClause.create(FilterStream.create(SupportMarketDataBean.class.getName(), "s0")));
model.setWhereClause(Expressions.eqProperty("s0.symbol", "s1.key"));
epService.getEPAdministrator().create(model);
String stmtTextDelete = "on " + SupportMarketDataBean.class.getName() + " as s0 delete from MyWindow as s1 where s0.symbol=s1.key";
assertEquals(stmtTextDelete, model.toEPL());
// send delete event
sendMarketBean("E1");
EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetOldAndReset(), fields, new Object[]{"E1", 20L});
EPAssertionUtil.assertProps(listenerWindow.assertOneGetOldAndReset(), fields, new Object[]{"E1", 10L});
// send delete event again, none deleted now
sendMarketBean("E1");
assertFalse(listenerStmtOne.isInvoked());
assertFalse(listenerWindow.isInvoked());
// send delete event
sendMarketBean("E2");
EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetOldAndReset(), fields, new Object[]{"E2", 40L});
EPAssertionUtil.assertProps(listenerWindow.assertOneGetOldAndReset(), fields, new Object[]{"E2", 20L});
// On-select object model
model = new EPStatementObjectModel();
model.setOnExpr(OnClause.createOnSelect("MyWindow", "s1"));
model.setWhereClause(Expressions.eqProperty("s0.id", "s1.key"));
model.setFromClause(FromClause.create(FilterStream.create(SupportBean_B.class.getName(), "s0")));
model.setSelectClause(SelectClause.createStreamWildcard("s1"));
EPStatement statement = epService.getEPAdministrator().create(model);
statement.addListener(listenerOnSelect);
String stmtTextOnSelect = "on " + SupportBean_B.class.getName() + " as s0 select s1.* from MyWindow as s1 where s0.id=s1.key";
assertEquals(stmtTextOnSelect, model.toEPL());
// send some more events
sendSupportBean("E3", 30L);
sendSupportBean("E4", 40L);
epService.getEPRuntime().sendEvent(new SupportBean_B("B1"));
assertFalse(listenerOnSelect.isInvoked());
// trigger on-select
epService.getEPRuntime().sendEvent(new SupportBean_B("E3"));
EPAssertionUtil.assertProps(listenerOnSelect.assertOneGetNewAndReset(), fields, new Object[]{"E3", 30L});
stmtSelectOne.destroy();
stmtInsert.destroy();
stmtCreate.destroy();
}
public void testOMCreateTableSyntax()
{
String expected = "create window MyWindow#keepall as (a1 string, a2 double, a3 int)";
// create window object model
EPStatementObjectModel model = new EPStatementObjectModel();
CreateWindowClause clause = CreateWindowClause.create("MyWindow").addView("keepall");
clause.addColumn(new SchemaColumnDesc("a1", "string", false, false));
clause.addColumn(new SchemaColumnDesc("a2", "double", false, false));
clause.addColumn(new SchemaColumnDesc("a3", "int", false, false));
model.setCreateWindow(clause);
assertEquals(expected, model.toEPL());
EPStatement stmtCreate = epService.getEPAdministrator().create(model);
assertEquals(expected, stmtCreate.getText());
}
private SupportBean sendSupportBean(String theString, Long longBoxed)
{
SupportBean bean = new SupportBean();
bean.setTheString(theString);
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);
}
}