/* * ************************************************************************************* * 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.view; import com.espertech.esper.client.EPServiceProvider; import com.espertech.esper.client.EPServiceProviderManager; import com.espertech.esper.client.EPStatement; import com.espertech.esper.client.EventBean; import com.espertech.esper.client.scopetest.SupportUpdateListener; import com.espertech.esper.client.time.CurrentTimeEvent; import com.espertech.esper.core.service.EPStatementSPI; import com.espertech.esper.support.bean.SupportBean; import com.espertech.esper.support.bean.SupportBean_S0; import com.espertech.esper.support.bean.SupportMarketDataBean; import com.espertech.esper.support.client.SupportConfigFactory; import junit.framework.TestCase; import java.util.Random; public class TestPriorFunction extends TestCase { private EPServiceProvider epService; private SupportUpdateListener listener; public void setUp() { listener = new SupportUpdateListener(); epService = EPServiceProviderManager.getDefaultProvider(SupportConfigFactory.getConfiguration()); epService.initialize(); } protected void tearDown() throws Exception { listener = null; } public void testPriorTimewindowStats() { epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class); String epl = "SELECT prior(1, average) as value FROM SupportBean().win:time(5 minutes).stat:uni(intPrimitive)"; EPStatement stmt = epService.getEPAdministrator().createEPL(epl); stmt.addListener(listener); epService.getEPRuntime().sendEvent(new SupportBean("E1", 1)); assertEquals(null, listener.assertOneGetNewAndReset().get("value")); epService.getEPRuntime().sendEvent(new SupportBean("E1", 4)); assertEquals(1.0, listener.assertOneGetNewAndReset().get("value")); epService.getEPRuntime().sendEvent(new SupportBean("E1", 5)); assertEquals(2.5, listener.assertOneGetNewAndReset().get("value")); } public void testPriorStream() { epService.getEPAdministrator().getConfiguration().addEventType("S0", SupportBean_S0.class); String text = "select prior(1, s0) as result from S0.win:length(2) as s0"; EPStatement stmt = epService.getEPAdministrator().createEPL(text); stmt.addListener(listener); SupportBean_S0 e1 = new SupportBean_S0(3); epService.getEPRuntime().sendEvent(e1); assertEquals(null, listener.assertOneGetNewAndReset().get("result")); epService.getEPRuntime().sendEvent(new SupportBean_S0(3)); assertEquals(e1, listener.assertOneGetNewAndReset().get("result")); assertEquals(SupportBean_S0.class, stmt.getEventType().getPropertyType("result")); } public void testPriorTimeWindow() { String viewExpr = "select irstream symbol as currSymbol, " + " prior(2, symbol) as priorSymbol, " + " prior(2, price) as priorPrice " + "from " + SupportMarketDataBean.class.getName() + ".win:time(1 min) "; EPStatement selectTestView = epService.getEPAdministrator().createEPL(viewExpr); selectTestView.addListener(listener); // assert select result type assertEquals(String.class, selectTestView.getEventType().getPropertyType("priorSymbol")); assertEquals(double.class, selectTestView.getEventType().getPropertyType("priorPrice")); sendTimer(0); assertFalse(listener.isInvoked()); sendMarketEvent("D1", 1); assertNewEvents("D1", null, null); sendTimer(1000); assertFalse(listener.isInvoked()); sendMarketEvent("D2", 2); assertNewEvents("D2", null, null); sendTimer(2000); assertFalse(listener.isInvoked()); sendMarketEvent("D3", 3); assertNewEvents("D3", "D1", 1d); sendTimer(3000); assertFalse(listener.isInvoked()); sendMarketEvent("D4", 4); assertNewEvents("D4", "D2", 2d); sendTimer(4000); assertFalse(listener.isInvoked()); sendMarketEvent("D5", 5); assertNewEvents("D5", "D3", 3d); sendTimer(30000); assertFalse(listener.isInvoked()); sendMarketEvent("D6", 6); assertNewEvents("D6", "D4", 4d); sendTimer(60000); assertOldEvents("D1", null, null); sendTimer(61000); assertOldEvents("D2", null, null); sendTimer(62000); assertOldEvents("D3", "D1", 1d); sendTimer(63000); assertOldEvents("D4", "D2", 2d); sendTimer(64000); assertOldEvents("D5", "D3", 3d); sendTimer(90000); assertOldEvents("D6", "D4", 4d); sendMarketEvent("D7", 7); assertNewEvents("D7", "D5", 5d); sendMarketEvent("D8", 8); sendMarketEvent("D9", 9); sendMarketEvent("D10", 10); sendMarketEvent("D11", 11); listener.reset(); // release batch sendTimer(150000); EventBean[] oldData = listener.getLastOldData(); assertNull(listener.getLastNewData()); assertEquals(5, oldData.length); assertEvent(oldData[0], "D7", "D5", 5d); assertEvent(oldData[1], "D8", "D6", 6d); assertEvent(oldData[2], "D9", "D7", 7d); assertEvent(oldData[3], "D10", "D8", 8d); assertEvent(oldData[4], "D11", "D9", 9d); } public void testPriorExtTimedWindow() { String viewExpr = "select irstream symbol as currSymbol, " + " prior(2, symbol) as priorSymbol, " + " prior(3, price) as priorPrice " + "from " + SupportMarketDataBean.class.getName() + ".win:ext_timed(volume, 1 min) "; EPStatement selectTestView = epService.getEPAdministrator().createEPL(viewExpr); selectTestView.addListener(listener); // assert select result type assertEquals(String.class, selectTestView.getEventType().getPropertyType("priorSymbol")); assertEquals(double.class, selectTestView.getEventType().getPropertyType("priorPrice")); sendMarketEvent("D1", 1, 0); assertNewEvents("D1", null, null); sendMarketEvent("D2", 2, 1000); assertNewEvents("D2", null, null); sendMarketEvent("D3", 3, 3000); assertNewEvents("D3", "D1", null); sendMarketEvent("D4", 4, 4000); assertNewEvents("D4", "D2", 1d); sendMarketEvent("D5", 5, 5000); assertNewEvents("D5", "D3", 2d); sendMarketEvent("D6", 6, 30000); assertNewEvents("D6", "D4", 3d); sendMarketEvent("D7", 7, 60000); assertEvent(listener.getLastNewData()[0], "D7", "D5", 4d); assertEvent(listener.getLastOldData()[0], "D1", null, null); listener.reset(); sendMarketEvent("D8", 8, 61000); assertEvent(listener.getLastNewData()[0], "D8", "D6", 5d); assertEvent(listener.getLastOldData()[0], "D2", null, null); listener.reset(); sendMarketEvent("D9", 9, 63000); assertEvent(listener.getLastNewData()[0], "D9", "D7", 6d); assertEvent(listener.getLastOldData()[0], "D3", "D1", null); listener.reset(); sendMarketEvent("D10", 10, 64000); assertEvent(listener.getLastNewData()[0], "D10", "D8", 7d); assertEvent(listener.getLastOldData()[0], "D4", "D2", 1d); listener.reset(); sendMarketEvent("D10", 10, 150000); EventBean[] oldData = listener.getLastOldData(); assertEquals(6, oldData.length); assertEvent(oldData[0], "D5", "D3", 2d); } public void testPriorTimeBatchWindow() { String viewExpr = "select irstream symbol as currSymbol, " + " prior(3, symbol) as priorSymbol, " + " prior(2, price) as priorPrice " + "from " + SupportMarketDataBean.class.getName() + ".win:time_batch(1 min) "; EPStatement selectTestView = epService.getEPAdministrator().createEPL(viewExpr); selectTestView.addListener(listener); // assert select result type assertEquals(String.class, selectTestView.getEventType().getPropertyType("priorSymbol")); assertEquals(double.class, selectTestView.getEventType().getPropertyType("priorPrice")); sendTimer(0); assertFalse(listener.isInvoked()); sendMarketEvent("A", 1); sendMarketEvent("B", 2); assertFalse(listener.isInvoked()); sendTimer(60000); assertEquals(2, listener.getLastNewData().length); assertEvent(listener.getLastNewData()[0], "A", null, null); assertEvent(listener.getLastNewData()[1], "B", null, null); assertNull(listener.getLastOldData()); listener.reset(); sendTimer(80000); sendMarketEvent("C", 3); assertFalse(listener.isInvoked()); sendTimer(120000); assertEquals(1, listener.getLastNewData().length); assertEvent(listener.getLastNewData()[0], "C", null, 1d); assertEquals(2, listener.getLastOldData().length); assertEvent(listener.getLastOldData()[0], "A", null, null); listener.reset(); sendTimer(300000); sendMarketEvent("D", 4); sendMarketEvent("E", 5); sendMarketEvent("F", 6); sendMarketEvent("G", 7); sendTimer(360000); assertEquals(4, listener.getLastNewData().length); assertEvent(listener.getLastNewData()[0], "D", "A", 2d); assertEvent(listener.getLastNewData()[1], "E", "B", 3d); assertEvent(listener.getLastNewData()[2], "F", "C", 4d); assertEvent(listener.getLastNewData()[3], "G", "D", 5d); } public void testPriorUnbound() { String viewExpr = "select symbol as currSymbol, " + " prior(3, symbol) as priorSymbol, " + " prior(2, price) as priorPrice " + "from " + SupportMarketDataBean.class.getName(); EPStatement selectTestView = epService.getEPAdministrator().createEPL(viewExpr); selectTestView.addListener(listener); // assert select result type assertEquals(String.class, selectTestView.getEventType().getPropertyType("priorSymbol")); assertEquals(double.class, selectTestView.getEventType().getPropertyType("priorPrice")); sendMarketEvent("A", 1); assertNewEvents("A", null, null); sendMarketEvent("B", 2); assertNewEvents("B", null, null); sendMarketEvent("C", 3); assertNewEvents("C", null, 1d); sendMarketEvent("D", 4); assertNewEvents("D", "A", 2d); sendMarketEvent("E", 5); assertNewEvents("E", "B", 3d); } public void testPriorNoDataWindowWhere() { String text = "select * from " + SupportMarketDataBean.class.getName() + " where prior(1, price) = 100"; EPStatement stmt = epService.getEPAdministrator().createEPL(text); stmt.addListener(listener); sendMarketEvent("IBM", 75); assertFalse(listener.isInvoked()); sendMarketEvent("IBM", 100); assertFalse(listener.isInvoked()); sendMarketEvent("IBM", 120); assertTrue(listener.isInvoked()); } public void testLongRunningSingle() { String viewExpr = "select symbol as currSymbol, " + " prior(3, symbol) as prior0Symbol " + "from " + SupportMarketDataBean.class.getName() + ".ext:sort(3, symbol)"; EPStatement selectTestView = epService.getEPAdministrator().createEPL(viewExpr); selectTestView.addListener(listener); Random random = new Random(); // 200000 is a better number for a memory test, however for short unit tests this is 2000 for (int i = 0; i < 2000; i++) { if (i % 10000 == 0) { //System.out.println(i); } sendMarketEvent(Integer.toString(random.nextInt()), 4); if (i % 1000 == 0) { listener.reset(); } } } public void testLongRunningUnbound() { String viewExpr = "select symbol as currSymbol, " + " prior(3, symbol) as prior0Symbol " + "from " + SupportMarketDataBean.class.getName(); EPStatementSPI selectTestView = (EPStatementSPI) epService.getEPAdministrator().createEPL(viewExpr); selectTestView.addListener(listener); assertFalse(selectTestView.getStatementContext().isStatelessSelect()); Random random = new Random(); // 200000 is a better number for a memory test, however for short unit tests this is 2000 for (int i = 0; i < 2000; i++) { if (i % 10000 == 0) { //System.out.println(i); } sendMarketEvent(Integer.toString(random.nextInt()), 4); if (i % 1000 == 0) { listener.reset(); } } } public void testLongRunningMultiple() { String viewExpr = "select symbol as currSymbol, " + " prior(3, symbol) as prior0Symbol, " + " prior(2, symbol) as prior1Symbol, " + " prior(1, symbol) as prior2Symbol, " + " prior(0, symbol) as prior3Symbol, " + " prior(0, price) as prior0Price, " + " prior(1, price) as prior1Price, " + " prior(2, price) as prior2Price, " + " prior(3, price) as prior3Price " + "from " + SupportMarketDataBean.class.getName() + ".ext:sort(3, symbol)"; EPStatement selectTestView = epService.getEPAdministrator().createEPL(viewExpr); selectTestView.addListener(listener); Random random = new Random(); // 200000 is a better number for a memory test, however for short unit tests this is 2000 for (int i = 0; i < 2000; i++) { if (i % 10000 == 0) { //System.out.println(i); } sendMarketEvent(Integer.toString(random.nextInt()), 4); if (i % 1000 == 0) { listener.reset(); } } } public void testPriorLengthWindow() { String viewExpr = "select irstream symbol as currSymbol, " + "prior(0, symbol) as prior0Symbol, " + "prior(1, symbol) as prior1Symbol, " + "prior(2, symbol) as prior2Symbol, " + "prior(3, symbol) as prior3Symbol, " + "prior(0, price) as prior0Price, " + "prior(1, price) as prior1Price, " + "prior(2, price) as prior2Price, " + "prior(3, price) as prior3Price " + "from " + SupportMarketDataBean.class.getName() + ".win:length(3) "; EPStatement selectTestView = epService.getEPAdministrator().createEPL(viewExpr); selectTestView.addListener(listener); // assert select result type assertEquals(String.class, selectTestView.getEventType().getPropertyType("prior0Symbol")); assertEquals(double.class, selectTestView.getEventType().getPropertyType("prior0Price")); sendMarketEvent("A", 1); assertNewEvents("A", "A", 1d, null, null, null, null, null, null); sendMarketEvent("B", 2); assertNewEvents("B", "B", 2d, "A", 1d, null, null, null, null); sendMarketEvent("C", 3); assertNewEvents("C", "C", 3d, "B", 2d, "A", 1d, null, null); sendMarketEvent("D", 4); EventBean newEvent = listener.getLastNewData()[0]; EventBean oldEvent = listener.getLastOldData()[0]; assertEventProps(newEvent, "D", "D", 4d, "C", 3d, "B", 2d, "A", 1d); assertEventProps(oldEvent, "A", "A", 1d, null, null, null, null, null, null); sendMarketEvent("E", 5); newEvent = listener.getLastNewData()[0]; oldEvent = listener.getLastOldData()[0]; assertEventProps(newEvent, "E", "E", 5d, "D", 4d, "C", 3d, "B", 2d); assertEventProps(oldEvent, "B", "B", 2d, "A", 1d, null, null, null, null); sendMarketEvent("F", 6); newEvent = listener.getLastNewData()[0]; oldEvent = listener.getLastOldData()[0]; assertEventProps(newEvent, "F", "F", 6d, "E", 5d, "D", 4d, "C", 3d); assertEventProps(oldEvent, "C", "C", 3d, "B", 2d, "A", 1d, null, null); sendMarketEvent("G", 7); newEvent = listener.getLastNewData()[0]; oldEvent = listener.getLastOldData()[0]; assertEventProps(newEvent, "G", "G", 7d, "F", 6d, "E", 5d, "D", 4d); assertEventProps(oldEvent, "D", "D", 4d, "C", 3d, "B", 2d, "A", 1d); sendMarketEvent("G", 8); oldEvent = listener.getLastOldData()[0]; assertEventProps(oldEvent, "E", "E", 5d, "D", 4d, "C", 3d, "B", 2d); } public void testPriorLengthWindowWhere() { String viewExpr = "select prior(2, symbol) as currSymbol " + "from " + SupportMarketDataBean.class.getName() + ".win:length(1) " + "where prior(2, price) > 100"; EPStatement selectTestView = epService.getEPAdministrator().createEPL(viewExpr); selectTestView.addListener(listener); sendMarketEvent("A", 1); sendMarketEvent("B", 130); sendMarketEvent("C", 10); assertFalse(listener.isInvoked()); sendMarketEvent("D", 5); assertEquals("B", listener.assertOneGetNewAndReset().get("currSymbol")); } public void testPriorSortWindow() { String viewExpr = "select irstream symbol as currSymbol, " + " prior(0, symbol) as prior0Symbol, " + " prior(1, symbol) as prior1Symbol, " + " prior(2, symbol) as prior2Symbol, " + " prior(3, symbol) as prior3Symbol, " + " prior(0, price) as prior0Price, " + " prior(1, price) as prior1Price, " + " prior(2, price) as prior2Price, " + " prior(3, price) as prior3Price " + "from " + SupportMarketDataBean.class.getName() + ".ext:sort(3, symbol)"; tryPriorSortWindow(viewExpr); viewExpr = "select irstream symbol as currSymbol, " + " prior(3, symbol) as prior3Symbol, " + " prior(1, symbol) as prior1Symbol, " + " prior(2, symbol) as prior2Symbol, " + " prior(0, symbol) as prior0Symbol, " + " prior(2, price) as prior2Price, " + " prior(1, price) as prior1Price, " + " prior(0, price) as prior0Price, " + " prior(3, price) as prior3Price " + "from " + SupportMarketDataBean.class.getName() + ".ext:sort(3, symbol)"; tryPriorSortWindow(viewExpr); } public void testPriorTimeBatchWindowJoin() { String viewExpr = "select theString as currSymbol, " + "prior(2, symbol) as priorSymbol, " + "prior(1, price) as priorPrice " + "from " + SupportBean.class.getName() + ".win:keepall(), " + SupportMarketDataBean.class.getName() + ".win:time_batch(1 min)"; EPStatement selectTestView = epService.getEPAdministrator().createEPL(viewExpr); selectTestView.addListener(listener); // assert select result type assertEquals(String.class, selectTestView.getEventType().getPropertyType("priorSymbol")); assertEquals(double.class, selectTestView.getEventType().getPropertyType("priorPrice")); sendTimer(0); assertFalse(listener.isInvoked()); sendMarketEvent("A", 1); sendMarketEvent("B", 2); sendBeanEvent("X1"); assertFalse(listener.isInvoked()); sendTimer(60000); assertEquals(2, listener.getLastNewData().length); assertEvent(listener.getLastNewData()[0], "X1", null, null); assertEvent(listener.getLastNewData()[1], "X1", null, 1d); assertNull(listener.getLastOldData()); listener.reset(); sendMarketEvent("C1", 11); sendMarketEvent("C2", 12); sendMarketEvent("C3", 13); assertFalse(listener.isInvoked()); sendTimer(120000); assertEquals(3, listener.getLastNewData().length); assertEvent(listener.getLastNewData()[0], "X1", "A", 2d); assertEvent(listener.getLastNewData()[1], "X1", "B", 11d); assertEvent(listener.getLastNewData()[2], "X1", "C1", 12d); } private void tryPriorSortWindow(String viewExpr) { EPStatement statement = epService.getEPAdministrator().createEPL(viewExpr); statement.addListener(listener); sendMarketEvent("COX", 30); assertNewEvents("COX", "COX", 30d, null, null, null, null, null, null); sendMarketEvent("IBM", 45); assertNewEvents("IBM", "IBM", 45d, "COX", 30d, null, null, null, null); sendMarketEvent("MSFT", 33); assertNewEvents("MSFT", "MSFT", 33d, "IBM", 45d, "COX", 30d, null, null); sendMarketEvent("XXX", 55); EventBean newEvent = listener.getLastNewData()[0]; EventBean oldEvent = listener.getLastOldData()[0]; assertEventProps(newEvent, "XXX", "XXX", 55d, "MSFT", 33d, "IBM", 45d, "COX", 30d); assertEventProps(oldEvent, "XXX", "XXX", 55d, "MSFT", 33d, "IBM", 45d, "COX", 30d); sendMarketEvent("BOO", 20); newEvent = listener.getLastNewData()[0]; oldEvent = listener.getLastOldData()[0]; assertEventProps(newEvent, "BOO", "BOO", 20d, "XXX", 55d, "MSFT", 33d, "IBM", 45d); assertEventProps(oldEvent, "MSFT", "MSFT", 33d, "IBM", 45d, "COX", 30d, null, null); sendMarketEvent("DOR", 1); newEvent = listener.getLastNewData()[0]; oldEvent = listener.getLastOldData()[0]; assertEventProps(newEvent, "DOR", "DOR", 1d, "BOO", 20d, "XXX", 55d, "MSFT", 33d); assertEventProps(oldEvent, "IBM", "IBM", 45d, "COX", 30d, null, null, null, null); sendMarketEvent("AAA", 2); newEvent = listener.getLastNewData()[0]; oldEvent = listener.getLastOldData()[0]; assertEventProps(newEvent, "AAA", "AAA", 2d, "DOR", 1d, "BOO", 20d, "XXX", 55d); assertEventProps(oldEvent, "DOR", "DOR", 1d, "BOO", 20d, "XXX", 55d, "MSFT", 33d); sendMarketEvent("AAB", 2); oldEvent = listener.getLastOldData()[0]; assertEventProps(oldEvent, "COX", "COX", 30d, null, null, null, null, null, null); listener.reset(); statement.stop(); } private void assertNewEvents(String currSymbol, String priorSymbol, Double priorPrice) { EventBean[] oldData = listener.getLastOldData(); EventBean[] newData = listener.getLastNewData(); assertNull(oldData); assertEquals(1, newData.length); assertEvent(newData[0], currSymbol, priorSymbol, priorPrice); listener.reset(); } private void assertEvent(EventBean eventBean, String currSymbol, String priorSymbol, Double priorPrice) { assertEquals(currSymbol, eventBean.get("currSymbol")); assertEquals(priorSymbol, eventBean.get("priorSymbol")); assertEquals(priorPrice, eventBean.get("priorPrice")); } private void assertNewEvents(String currSymbol, String prior0Symbol, Double prior0Price, String prior1Symbol, Double prior1Price, String prior2Symbol, Double prior2Price, String prior3Symbol, Double prior3Price) { EventBean[] oldData = listener.getLastOldData(); EventBean[] newData = listener.getLastNewData(); assertNull(oldData); assertEquals(1, newData.length); assertEventProps(newData[0], currSymbol, prior0Symbol, prior0Price, prior1Symbol, prior1Price, prior2Symbol, prior2Price, prior3Symbol, prior3Price); listener.reset(); } private void assertEventProps(EventBean eventBean, String currSymbol, String prior0Symbol, Double prior0Price, String prior1Symbol, Double prior1Price, String prior2Symbol, Double prior2Price, String prior3Symbol, Double prior3Price) { assertEquals(currSymbol, eventBean.get("currSymbol")); assertEquals(prior0Symbol, eventBean.get("prior0Symbol")); assertEquals(prior0Price, eventBean.get("prior0Price")); assertEquals(prior1Symbol, eventBean.get("prior1Symbol")); assertEquals(prior1Price, eventBean.get("prior1Price")); assertEquals(prior2Symbol, eventBean.get("prior2Symbol")); assertEquals(prior2Price, eventBean.get("prior2Price")); assertEquals(prior3Symbol, eventBean.get("prior3Symbol")); assertEquals(prior3Price, eventBean.get("prior3Price")); listener.reset(); } private void sendTimer(long timeInMSec) { CurrentTimeEvent theEvent = new CurrentTimeEvent(timeInMSec); epService.getEPRuntime().sendEvent(theEvent); } private void sendMarketEvent(String symbol, double price) { SupportMarketDataBean bean = new SupportMarketDataBean(symbol, price, 0L, null); epService.getEPRuntime().sendEvent(bean); } private void sendMarketEvent(String symbol, double price, long volume) { SupportMarketDataBean bean = new SupportMarketDataBean(symbol, price, volume, null); epService.getEPRuntime().sendEvent(bean); } private void sendBeanEvent(String theString) { SupportBean bean = new SupportBean(); bean.setTheString(theString); epService.getEPRuntime().sendEvent(bean); } private void assertOldEvents(String currSymbol, String priorSymbol, Double priorPrice) { EventBean[] oldData = listener.getLastOldData(); EventBean[] newData = listener.getLastNewData(); assertNull(newData); assertEquals(1, oldData.length); assertEquals(currSymbol, oldData[0].get("currSymbol")); assertEquals(priorSymbol, oldData[0].get("priorSymbol")); assertEquals(priorPrice, oldData[0].get("priorPrice")); listener.reset(); } }