/* *************************************************************************************** * 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 com.espertech.esper.supportregression.util.SupportMessageAssertUtil; import junit.framework.TestCase; public class TestInfraSubquery extends TestCase { private EPServiceProvider epService; private SupportUpdateListener listenerWindow; private SupportUpdateListener listenerStmtOne; private SupportUpdateListener listenerStmtTwo; private SupportUpdateListener listenerStmtDelete; public void setUp() { Configuration config = SupportConfigFactory.getConfiguration(); config.getEngineDefaults().getLogging().setEnableQueryPlan(true); 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 testSubquerySelfCheck() { runAssertionSubquerySelfCheck(true); runAssertionSubquerySelfCheck(false); } public void testSubqueryDeleteInsertReplace() { runAssertionSubqueryDeleteInsertReplace(true); runAssertionSubqueryDeleteInsertReplace(false); } public void testInvalidSubquery() { runAssertionInvalidSubquery(true); runAssertionInvalidSubquery(false); } public void testAssertionUncorrelatedSubqueryAggregation() { runAssertionUncorrelatedSubqueryAggregation(true); runAssertionUncorrelatedSubqueryAggregation(false); } private void runAssertionUncorrelatedSubqueryAggregation(boolean namedWindow) { // create window String stmtTextCreate = namedWindow ? "create window MyInfra#keepall as select theString as a, longPrimitive as b from " + SupportBean.class.getName() : "create table MyInfra(a string primary key, b long)"; EPStatement stmtCreate = epService.getEPAdministrator().createEPL(stmtTextCreate); stmtCreate.addListener(listenerWindow); // create insert into String stmtTextInsertOne = "insert into MyInfra select theString as a, longPrimitive as b from " + SupportBean.class.getName(); epService.getEPAdministrator().createEPL(stmtTextInsertOne); // create consumer String stmtTextSelectOne = "select irstream (select sum(b) from MyInfra) as value, symbol from " + SupportMarketDataBean.class.getName(); EPStatement stmtSelectOne = epService.getEPAdministrator().createEPL(stmtTextSelectOne); stmtSelectOne.addListener(listenerStmtOne); sendMarketBean("M1"); String fieldsStmt[] = new String[] {"value", "symbol"}; EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetNewAndReset(), fieldsStmt, new Object[]{null, "M1"}); sendSupportBean("S1", 5L, -1L); sendMarketBean("M2"); EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetNewAndReset(), fieldsStmt, new Object[]{5L, "M2"}); sendSupportBean("S2", 10L, -1L); sendMarketBean("M3"); EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetNewAndReset(), fieldsStmt, new Object[]{15L, "M3"}); // create 2nd consumer EPStatement stmtSelectTwo = epService.getEPAdministrator().createEPL(stmtTextSelectOne); // same stmt stmtSelectTwo.addListener(listenerStmtTwo); sendSupportBean("S3", 8L, -1L); sendMarketBean("M4"); EPAssertionUtil.assertProps(listenerStmtOne.assertOneGetNewAndReset(), fieldsStmt, new Object[]{23L, "M4"}); EPAssertionUtil.assertProps(listenerStmtTwo.assertOneGetNewAndReset(), fieldsStmt, new Object[]{23L, "M4"}); epService.getEPAdministrator().destroyAllStatements(); epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false); } public void runAssertionInvalidSubquery(boolean namedWindow) { String eplCreate = namedWindow ? "create window MyInfra#keepall as " + SupportBean.class.getName() : "create table MyInfra(theString string)"; epService.getEPAdministrator().createEPL(eplCreate); try { epService.getEPAdministrator().createEPL("select (select theString from MyInfra#lastevent) from MyInfra"); fail(); } catch (EPException ex) { if (namedWindow) { assertEquals("Error starting statement: Failed to plan subquery number 1 querying MyInfra: Consuming statements to a named window cannot declare a data window view onto the named window [select (select theString from MyInfra#lastevent) from MyInfra]", ex.getMessage()); } else { SupportMessageAssertUtil.assertMessage(ex, "Views are not supported with tables"); } } epService.getEPAdministrator().destroyAllStatements(); epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false); } private void runAssertionSubqueryDeleteInsertReplace(boolean namedWindow) { String fields[] = new String[] {"key", "value"}; // create window String stmtTextCreate = namedWindow ? "create window MyInfra#keepall as select theString as key, intBoxed as value from " + SupportBean.class.getName() : "create table MyInfra(key string primary key, value int primary key)"; EPStatement stmtCreate = epService.getEPAdministrator().createEPL(stmtTextCreate); stmtCreate.addListener(listenerWindow); // delete String stmtTextDelete = "on " + SupportBean.class.getName() + " delete from MyInfra where key = theString"; EPStatement stmtDelete = epService.getEPAdministrator().createEPL(stmtTextDelete); stmtDelete.addListener(listenerStmtDelete); // create insert into String stmtTextInsertOne = "insert into MyInfra select theString as key, intBoxed as value from " + SupportBean.class.getName() + " as s0"; epService.getEPAdministrator().createEPL(stmtTextInsertOne); sendSupportBean("E1", 1); if (namedWindow) { EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E1", 1}); } EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}}); sendSupportBean("E2", 2); if (namedWindow) { EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E2", 2}); EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E2", 2}}); } else { EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E2", 2}}); } sendSupportBean("E1", 3); if (namedWindow) { assertEquals(2, listenerWindow.getNewDataList().size()); EPAssertionUtil.assertProps(listenerWindow.getOldDataList().get(0)[0], fields, new Object[]{"E1", 1}); EPAssertionUtil.assertProps(listenerWindow.getNewDataList().get(1)[0], fields, new Object[]{"E1", 3}); } EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E2", 2}, {"E1", 3}}); listenerWindow.reset(); epService.getEPAdministrator().destroyAllStatements(); epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false); } private void runAssertionSubquerySelfCheck(boolean namedWindow) { String fields[] = new String[] {"key", "value"}; // create window String stmtTextCreate = namedWindow ? "create window MyInfra#keepall as select theString as key, intBoxed as value from " + SupportBean.class.getName() : "create table MyInfra (key string primary key, value int)"; EPStatement stmtCreate = epService.getEPAdministrator().createEPL(stmtTextCreate); stmtCreate.addListener(listenerWindow); // create insert into (not does insert if key already exists) String stmtTextInsertOne = "insert into MyInfra select theString as key, intBoxed as value from " + SupportBean.class.getName() + " as s0" + " where not exists (select * from MyInfra as win where win.key = s0.theString)"; epService.getEPAdministrator().createEPL(stmtTextInsertOne); sendSupportBean("E1", 1); if (namedWindow) { EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E1", 1}); } else { assertFalse(listenerWindow.isInvoked()); } EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}}); sendSupportBean("E2", 2); if (namedWindow) { EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E2", 2}); } EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E2", 2}}); sendSupportBean("E1", 3); assertFalse(listenerWindow.isInvoked()); EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E2", 2}}); sendSupportBean("E3", 4); if (namedWindow) { EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E3", 4}); EPAssertionUtil.assertPropsPerRow(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E2", 2}, {"E3", 4}}); } else { EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E2", 2}, {"E3", 4}}); } // Add delete String stmtTextDelete = "on " + SupportBean_A.class.getName() + " delete from MyInfra where key = id"; EPStatement stmtDelete = epService.getEPAdministrator().createEPL(stmtTextDelete); stmtDelete.addListener(listenerStmtDelete); // delete E2 epService.getEPRuntime().sendEvent(new SupportBean_A("E2")); if (namedWindow) { EPAssertionUtil.assertProps(listenerWindow.assertOneGetOldAndReset(), fields, new Object[]{"E2", 2}); } EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E3", 4}}); sendSupportBean("E2", 5); if (namedWindow) { EPAssertionUtil.assertProps(listenerWindow.assertOneGetNewAndReset(), fields, new Object[]{"E2", 5}); } EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E3", 4}, {"E2", 5}}); 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 SupportBean sendSupportBean(String theString, int intBoxed) { SupportBean bean = new SupportBean(); bean.setTheString(theString); bean.setIntBoxed(intBoxed); epService.getEPRuntime().sendEvent(bean); return bean; } private void sendMarketBean(String symbol) { SupportMarketDataBean bean = new SupportMarketDataBean(symbol, 0, 0l, ""); epService.getEPRuntime().sendEvent(bean); } }