/* *************************************************************************************** * 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.client.time.CurrentTimeEvent; import com.espertech.esper.core.service.EPStatementSPI; import com.espertech.esper.core.service.StatementType; import com.espertech.esper.metrics.instrumentation.InstrumentationHelper; import com.espertech.esper.supportregression.bean.*; import com.espertech.esper.supportregression.client.SupportConfigFactory; import com.espertech.esper.supportregression.epl.SupportQueryPlanIndexHook; import com.espertech.esper.supportregression.util.IndexAssertion; import com.espertech.esper.supportregression.util.IndexAssertionEventSend; import com.espertech.esper.supportregression.util.IndexBackingTableInfo; import com.espertech.esper.supportregression.util.SupportMessageAssertUtil; import junit.framework.TestCase; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Collection; import java.util.Map; public class TestInfraOnSelect extends TestCase implements IndexBackingTableInfo { private final static Logger log = LoggerFactory.getLogger(TestInfraOnSelect.class); private EPServiceProvider epService; private SupportUpdateListener listenerSelect; 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());} listenerSelect = new SupportUpdateListener(); SupportQueryPlanIndexHook.reset(); } protected void tearDown() throws Exception { if (InstrumentationHelper.ENABLED) { InstrumentationHelper.endTest();} listenerSelect = null; } public void testOnSelectIndexChoice() { runAssertionOnSelectIndexChoice(true); runAssertionOnSelectIndexChoice(false); } public void testWindowAgg() { epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class); epService.getEPAdministrator().getConfiguration().addEventType("S0", SupportBean_S0.class); epService.getEPAdministrator().getConfiguration().addEventType("S1", SupportBean_S1.class); runAssertionWindowAgg(true); runAssertionWindowAgg(false); } public void testSelectAggregationHavingStreamWildcard() { epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class); epService.getEPAdministrator().getConfiguration().addEventType("SupportBean_A", SupportBean_A.class); runAssertionSelectAggregationHavingStreamWildcard(true); runAssertionSelectAggregationHavingStreamWildcard(false); } public void testPatternTimedSelectNW() { runAssertionPatternTimedSelect(true); } public void testPatternTimedSelectTable() { runAssertionPatternTimedSelect(false); } public void testInvalid() { runAssertionInvalid(true); runAssertionInvalid(false); } public void testSelectCondition() { runAssertionSelectCondition(true); runAssertionSelectCondition(false); } public void testSelectJoinColumnsLimit() { runAssertionSelectJoinColumnsLimit(true); runAssertionSelectJoinColumnsLimit(false); } public void testSelectAggregation() { runAssertionSelectAggregation(true); runAssertionSelectAggregation(false); } public void testSelectAggregationCorrelated() { runAssertionSelectAggregationCorrelated(true); runAssertionSelectAggregationCorrelated(false); } public void testSelectAggregationGrouping() { runAssertionSelectAggregationGrouping(true); runAssertionSelectAggregationGrouping(false); } public void testSelectCorrelationDelete() { runAssertionSelectCorrelationDelete(true); runAssertionSelectCorrelationDelete(false); } public void testPatternCorrelation() { runAssertionPatternCorrelation(true); runAssertionPatternCorrelation(false); } private void runAssertionPatternCorrelation(boolean namedWindow) { String[] fields = new String[] {"a", "b"}; // create window String stmtTextCreate = namedWindow ? "create window MyInfra#keepall as select theString as a, intPrimitive as b from " + SupportBean.class.getName() : "create table MyInfra(a string primary key, b int primary key)"; EPStatement stmtCreate = epService.getEPAdministrator().createEPL(stmtTextCreate); // create select stmt String stmtTextSelect = "on pattern [every ea=" + SupportBean_A.class.getName() + " or every eb=" + SupportBean_B.class.getName() + "] select mywin.* from MyInfra as mywin where a = coalesce(ea.id, eb.id)"; EPStatement stmtSelect = epService.getEPAdministrator().createEPL(stmtTextSelect); stmtSelect.addListener(listenerSelect); // create insert into String stmtTextInsertOne = "insert into MyInfra select theString as a, intPrimitive as b from " + SupportBean.class.getName(); epService.getEPAdministrator().createEPL(stmtTextInsertOne); // send 3 event sendSupportBean("E1", 1); sendSupportBean("E2", 2); sendSupportBean("E3", 3); assertFalse(listenerSelect.isInvoked()); // fire trigger sendSupportBean_A("X1"); assertFalse(listenerSelect.isInvoked()); EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E2", 2}, {"E3", 3}}); if (namedWindow) { EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fields, null); } sendSupportBean_B("E2"); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{"E2", 2}); if (namedWindow) { EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fields, new Object[][]{{"E2", 2}}); } sendSupportBean_A("E1"); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{"E1", 1}); if (namedWindow) { EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fields, new Object[][]{{"E1", 1}}); } sendSupportBean_B("E3"); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{"E3", 3}); if (namedWindow) { EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fields, new Object[][]{{"E3", 3}}); } EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E2", 2}, {"E3", 3}}); stmtCreate.destroy(); stmtSelect.destroy(); epService.getEPAdministrator().destroyAllStatements(); epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false); } private void runAssertionSelectCorrelationDelete(boolean namedWindow) { String[] fields = new String[] {"a", "b"}; // create window String stmtTextCreate = namedWindow ? "create window MyInfra#keepall as select theString as a, intPrimitive as b from " + SupportBean.class.getName() : "create table MyInfra(a string primary key, b int primary key)"; EPStatement stmtCreate = epService.getEPAdministrator().createEPL(stmtTextCreate); // create select stmt String stmtTextSelect = "on " + SupportBean_A.class.getName() + " select mywin.* from MyInfra as mywin where id = a"; EPStatement stmtSelect = epService.getEPAdministrator().createEPL(stmtTextSelect); stmtSelect.addListener(listenerSelect); // create insert into String stmtTextInsertOne = "insert into MyInfra select theString as a, intPrimitive as b from " + SupportBean.class.getName(); epService.getEPAdministrator().createEPL(stmtTextInsertOne); // create delete stmt String stmtTextDelete = "on " + SupportBean_B.class.getName() + " delete from MyInfra where a = id"; EPStatement stmtDelete = epService.getEPAdministrator().createEPL(stmtTextDelete); // send 3 event sendSupportBean("E1", 1); sendSupportBean("E2", 2); sendSupportBean("E3", 3); assertFalse(listenerSelect.isInvoked()); // fire trigger sendSupportBean_A("X1"); assertFalse(listenerSelect.isInvoked()); EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E2", 2}, {"E3", 3}}); if (namedWindow) { EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fields, null); } sendSupportBean_A("E2"); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{"E2", 2}); EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E2", 2}, {"E3", 3}}); if (namedWindow) { EPAssertionUtil.assertPropsPerRowAnyOrder(stmtSelect.iterator(), fields, new Object[][]{{"E2", 2}}); } sendSupportBean_A("E1"); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{"E1", 1}); if (namedWindow) { EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fields, new Object[][]{{"E1", 1}}); } EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E1", 1}, {"E2", 2}, {"E3", 3}}); // delete event sendSupportBean_B("E1"); assertFalse(listenerSelect.isInvoked()); sendSupportBean_A("E1"); assertFalse(listenerSelect.isInvoked()); EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fields, new Object[][]{{"E2", 2}, {"E3", 3}}); if (namedWindow) { EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fields, null); } sendSupportBean_A("E2"); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{"E2", 2}); if (namedWindow) { EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fields, new Object[][]{{"E2", 2}}); } stmtSelect.destroy(); stmtDelete.destroy(); stmtCreate.destroy(); epService.getEPAdministrator().destroyAllStatements(); epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false); } private void runAssertionSelectAggregationGrouping(boolean namedWindow) { String[] fields = new String[] {"a", "sumb"}; SupportUpdateListener listenerSelectTwo = new SupportUpdateListener(); // create window String stmtTextCreate = namedWindow ? "create window MyInfra#keepall as select theString as a, intPrimitive as b from " + SupportBean.class.getName() : "create table MyInfra(a string primary key, b int primary key)"; EPStatement stmtCreate = epService.getEPAdministrator().createEPL(stmtTextCreate); // create select stmt String stmtTextSelect = "on " + SupportBean_A.class.getName() + " select a, sum(b) as sumb from MyInfra group by a order by a desc"; EPStatement stmtSelect = epService.getEPAdministrator().createEPL(stmtTextSelect); stmtSelect.addListener(listenerSelect); // create select stmt String stmtTextSelectTwo = "on " + SupportBean_A.class.getName() + " select a, sum(b) as sumb from MyInfra group by a having sum(b) > 5 order by a desc"; EPStatement stmtSelectTwo = epService.getEPAdministrator().createEPL(stmtTextSelectTwo); stmtSelectTwo.addListener(listenerSelectTwo); // create insert into String stmtTextInsertOne = "insert into MyInfra select theString as a, intPrimitive as b from " + SupportBean.class.getName(); epService.getEPAdministrator().createEPL(stmtTextInsertOne); // fire trigger sendSupportBean_A("A1"); assertFalse(listenerSelect.isInvoked()); assertFalse(listenerSelectTwo.isInvoked()); // send 3 events sendSupportBean("E1", 1); sendSupportBean("E2", 2); sendSupportBean("E1", 5); assertFalse(listenerSelect.isInvoked()); assertFalse(listenerSelectTwo.isInvoked()); // fire trigger sendSupportBean_A("A1"); EPAssertionUtil.assertPropsPerRow(listenerSelect.getLastNewData(), fields, new Object[][]{{"E2", 2}, {"E1", 6}}); assertNull(listenerSelect.getLastOldData()); listenerSelect.reset(); EPAssertionUtil.assertPropsPerRow(listenerSelectTwo.getLastNewData(), fields, new Object[][]{{"E1", 6}}); assertNull(listenerSelect.getLastOldData()); listenerSelect.reset(); // send 3 events sendSupportBean("E4", -1); sendSupportBean("E2", 10); sendSupportBean("E1", 100); assertFalse(listenerSelect.isInvoked()); sendSupportBean_A("A2"); EPAssertionUtil.assertPropsPerRow(listenerSelect.getLastNewData(), fields, new Object[][]{{"E4", -1}, {"E2", 12}, {"E1", 106}}); // create delete stmt, delete E2 String stmtTextDelete = "on " + SupportBean_B.class.getName() + " delete from MyInfra where id = a"; epService.getEPAdministrator().createEPL(stmtTextDelete); sendSupportBean_B("E2"); sendSupportBean_A("A3"); EPAssertionUtil.assertPropsPerRow(listenerSelect.getLastNewData(), fields, new Object[][]{{"E4", -1}, {"E1", 106}}); assertNull(listenerSelect.getLastOldData()); listenerSelect.reset(); EPAssertionUtil.assertPropsPerRow(listenerSelectTwo.getLastNewData(), fields, new Object[][]{{"E1", 106}}); assertNull(listenerSelectTwo.getLastOldData()); listenerSelectTwo.reset(); EventType resultType = stmtSelect.getEventType(); assertEquals(2, resultType.getPropertyNames().length); assertEquals(String.class, resultType.getPropertyType("a")); assertEquals(Integer.class, resultType.getPropertyType("sumb")); stmtSelect.destroy(); stmtCreate.destroy(); stmtSelectTwo.destroy(); epService.getEPAdministrator().destroyAllStatements(); epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false); } private void runAssertionSelectAggregationCorrelated(boolean namedWindow) { String[] fields = new String[] {"sumb"}; // create window String stmtTextCreate = namedWindow ? "create window MyInfra#keepall as select theString as a, intPrimitive as b from " + SupportBean.class.getName() : "create table MyInfra(a string primary key, b int primary key)"; EPStatement stmtCreate = epService.getEPAdministrator().createEPL(stmtTextCreate); // create select stmt String stmtTextSelect = "on " + SupportBean_A.class.getName() + " select sum(b) as sumb from MyInfra where a = id"; EPStatement stmtSelect = epService.getEPAdministrator().createEPL(stmtTextSelect); stmtSelect.addListener(listenerSelect); // create insert into String stmtTextInsertOne = "insert into MyInfra select theString as a, intPrimitive as b from " + SupportBean.class.getName(); epService.getEPAdministrator().createEPL(stmtTextInsertOne); // send 3 event sendSupportBean("E1", 1); sendSupportBean("E2", 2); sendSupportBean("E3", 3); assertFalse(listenerSelect.isInvoked()); // fire trigger sendSupportBean_A("A1"); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{null}); if (namedWindow) { EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fields, new Object[][]{{null}}); } // fire trigger sendSupportBean_A("E2"); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{2}); if (namedWindow) { EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fields, new Object[][]{{2}}); } sendSupportBean("E2", 10); sendSupportBean_A("E2"); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{12}); if (namedWindow) { EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fields, new Object[][]{{12}}); } EventType resultType = stmtSelect.getEventType(); assertEquals(1, resultType.getPropertyNames().length); assertEquals(Integer.class, resultType.getPropertyType("sumb")); stmtSelect.destroy(); stmtCreate.destroy(); epService.getEPAdministrator().destroyAllStatements(); epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false); } private void runAssertionSelectAggregation(boolean namedWindow) { String[] fields = new String[] {"sumb"}; // create window String stmtTextCreate = namedWindow ? "create window MyInfra#keepall as select theString as a, intPrimitive as b from " + SupportBean.class.getName() : "create table MyInfra (a string primary key, b int primary key)"; EPStatement stmtCreate = epService.getEPAdministrator().createEPL(stmtTextCreate); // create select stmt String stmtTextSelect = "on " + SupportBean_A.class.getName() + " select sum(b) as sumb from MyInfra"; EPStatement stmtSelect = epService.getEPAdministrator().createEPL(stmtTextSelect); stmtSelect.addListener(listenerSelect); // create insert into String stmtTextInsertOne = "insert into MyInfra select theString as a, intPrimitive as b from " + SupportBean.class.getName(); epService.getEPAdministrator().createEPL(stmtTextInsertOne); // send 3 event sendSupportBean("E1", 1); sendSupportBean("E2", 2); sendSupportBean("E3", 3); assertFalse(listenerSelect.isInvoked()); // fire trigger sendSupportBean_A("A1"); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{6}); if (namedWindow) { EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fields, new Object[][]{{6}}); } // create delete stmt String stmtTextDelete = "on " + SupportBean_B.class.getName() + " delete from MyInfra where id = a"; epService.getEPAdministrator().createEPL(stmtTextDelete); // Delete E2 sendSupportBean_B("E2"); // fire trigger sendSupportBean_A("A2"); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{4}); if (namedWindow) { EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fields, new Object[][]{{4}}); } sendSupportBean("E4", 10); sendSupportBean_A("A3"); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{14}); if (namedWindow) { EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fields, new Object[][]{{14}}); } EventType resultType = stmtSelect.getEventType(); assertEquals(1, resultType.getPropertyNames().length); assertEquals(Integer.class, resultType.getPropertyType("sumb")); stmtSelect.destroy(); stmtCreate.destroy(); epService.getEPAdministrator().destroyAllStatements(); epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false); } private void runAssertionSelectJoinColumnsLimit(boolean namedWindow) { String[] fields = new String[] {"triggerid", "wina", "b"}; // create window String stmtTextCreate = namedWindow ? "create window MyInfra#keepall as select theString as a, intPrimitive as b from " + SupportBean.class.getName() : "create table MyInfra (a string primary key, b int)"; EPStatement stmtCreate = epService.getEPAdministrator().createEPL(stmtTextCreate); // create select stmt String stmtTextSelect = "on " + SupportBean_A.class.getName() + " as trigger select trigger.id as triggerid, win.a as wina, b from MyInfra as win order by wina"; EPStatement stmtSelect = epService.getEPAdministrator().createEPL(stmtTextSelect); stmtSelect.addListener(listenerSelect); // create insert into String stmtTextInsertOne = "insert into MyInfra select theString as a, intPrimitive as b from " + SupportBean.class.getName(); epService.getEPAdministrator().createEPL(stmtTextInsertOne); // send 3 event sendSupportBean("E1", 1); sendSupportBean("E2", 2); assertFalse(listenerSelect.isInvoked()); // fire trigger sendSupportBean_A("A1"); assertEquals(2, listenerSelect.getLastNewData().length); EPAssertionUtil.assertProps(listenerSelect.getLastNewData()[0], fields, new Object[]{"A1", "E1", 1}); EPAssertionUtil.assertProps(listenerSelect.getLastNewData()[1], fields, new Object[]{"A1", "E2", 2}); if (namedWindow) { EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fields, new Object[][]{{"A1", "E1", 1}, {"A1", "E2", 2}}); } // try limit clause stmtSelect.destroy(); stmtTextSelect = "on " + SupportBean_A.class.getName() + " as trigger select trigger.id as triggerid, win.a as wina, b from MyInfra as win order by wina limit 1"; stmtSelect = epService.getEPAdministrator().createEPL(stmtTextSelect); stmtSelect.addListener(listenerSelect); sendSupportBean_A("A1"); assertEquals(1, listenerSelect.getLastNewData().length); EPAssertionUtil.assertProps(listenerSelect.getLastNewData()[0], fields, new Object[]{"A1", "E1", 1}); if (namedWindow) { EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fields, new Object[][]{{"A1", "E1", 1}}); } stmtCreate.destroy(); listenerSelect.reset(); epService.getEPAdministrator().destroyAllStatements(); epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false); } private void runAssertionSelectCondition(boolean namedWindow) { String[] fieldsCreate = new String[] {"a", "b"}; String[] fieldsOnSelect = new String[] {"a", "b", "id"}; // create window String stmtTextCreate = namedWindow ? "create window MyInfra#keepall as select theString as a, intPrimitive as b from " + SupportBean.class.getName() : "create table MyInfra (a string primary key, b int)"; EPStatement stmtCreate = epService.getEPAdministrator().createEPL(stmtTextCreate); // create select stmt String stmtTextSelect = "on " + SupportBean_A.class.getName() + " select mywin.*, id from MyInfra as mywin where MyInfra.b < 3 order by a asc"; EPStatement stmtSelect = epService.getEPAdministrator().createEPL(stmtTextSelect); stmtSelect.addListener(listenerSelect); assertEquals(StatementType.ON_SELECT, ((EPStatementSPI) stmtSelect).getStatementMetadata().getStatementType()); // create insert into String stmtTextInsertOne = "insert into MyInfra select theString as a, intPrimitive as b from " + SupportBean.class.getName(); epService.getEPAdministrator().createEPL(stmtTextInsertOne); // send 3 event sendSupportBean("E1", 1); sendSupportBean("E2", 2); sendSupportBean("E3", 3); assertFalse(listenerSelect.isInvoked()); // fire trigger sendSupportBean_A("A1"); assertEquals(2, listenerSelect.getLastNewData().length); EPAssertionUtil.assertProps(listenerSelect.getLastNewData()[0], fieldsCreate, new Object[]{"E1", 1}); EPAssertionUtil.assertProps(listenerSelect.getLastNewData()[1], fieldsCreate, new Object[]{"E2", 2}); EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fieldsCreate, new Object[][]{{"E1", 1}, {"E2", 2}, {"E3", 3}}); if (namedWindow) { EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fieldsOnSelect, new Object[][]{{"E1", 1, "A1"}, {"E2", 2, "A1"}}); } else { assertFalse(stmtSelect.iterator().hasNext()); } sendSupportBean("E4", 0); sendSupportBean_A("A2"); assertEquals(3, listenerSelect.getLastNewData().length); EPAssertionUtil.assertProps(listenerSelect.getLastNewData()[0], fieldsOnSelect, new Object[]{"E1", 1, "A2"}); EPAssertionUtil.assertProps(listenerSelect.getLastNewData()[1], fieldsOnSelect, new Object[]{"E2", 2, "A2"}); EPAssertionUtil.assertProps(listenerSelect.getLastNewData()[2], fieldsOnSelect, new Object[]{"E4", 0, "A2"}); EPAssertionUtil.assertPropsPerRowAnyOrder(stmtCreate.iterator(), fieldsCreate, new Object[][]{{"E1", 1}, {"E2", 2}, {"E3", 3}, {"E4", 0}}); if (namedWindow) { EPAssertionUtil.assertPropsPerRow(stmtSelect.iterator(), fieldsCreate, new Object[][]{{"E1", 1}, {"E2", 2}, {"E4", 0}}); } stmtSelect.destroy(); stmtCreate.destroy(); listenerSelect.reset(); epService.getEPAdministrator().destroyAllStatements(); epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false); } private void runAssertionInvalid(boolean namedWindow) { String stmtTextCreate = namedWindow ? "create window MyInfra#keepall as select * from " + SupportBean.class.getName() : "create table MyInfra (theString string, intPrimitive int)"; epService.getEPAdministrator().createEPL(stmtTextCreate); SupportMessageAssertUtil.tryInvalid(epService, "on " + SupportBean_A.class.getName() + " select * from MyInfra where sum(intPrimitive) > 100", "Error validating expression: An aggregate function may not appear in a WHERE clause (use the HAVING clause) ["); SupportMessageAssertUtil.tryInvalid(epService, "on " + SupportBean_A.class.getName() + " insert into MyStream select * from DUMMY", "Named window or table 'DUMMY' has not been declared ["); SupportMessageAssertUtil.tryInvalid(epService, "on " + SupportBean_A.class.getName() + " select prev(1, theString) from MyInfra", "Error starting statement: Failed to validate select-clause expression 'prev(1,theString)': Previous function cannot be used in this context ["); epService.getEPAdministrator().destroyAllStatements(); epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false); } private void runAssertionPatternTimedSelect(boolean namedWindow) { // test for JIRA ESPER-332 sendTimer(0, epService); String stmtTextCreate = namedWindow ? "create window MyInfra#keepall as select * from " + SupportBean.class.getName() : "create table MyInfra as (theString string)"; epService.getEPAdministrator().createEPL(stmtTextCreate); String stmtCount = "on pattern[every timer:interval(10 sec)] select count(eve), eve from MyInfra as eve"; epService.getEPAdministrator().createEPL(stmtCount); String stmtTextOnSelect = "on pattern [ every timer:interval(10 sec)] select theString from MyInfra having count(theString) > 0"; EPStatement stmt = epService.getEPAdministrator().createEPL(stmtTextOnSelect); stmt.addListener(listenerSelect); String stmtTextInsertOne = namedWindow ? "insert into MyInfra select * from " + SupportBean.class.getName() : "insert into MyInfra select theString from " + SupportBean.class.getName(); epService.getEPAdministrator().createEPL(stmtTextInsertOne); sendTimer(11000, epService); assertFalse(listenerSelect.isInvoked()); sendTimer(21000, epService); assertFalse(listenerSelect.isInvoked()); sendSupportBean("E1", 1); sendTimer(31000, epService); assertEquals("E1", listenerSelect.assertOneGetNewAndReset().get("theString")); epService.getEPAdministrator().destroyAllStatements(); epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false); } private void runAssertionSelectAggregationHavingStreamWildcard(boolean namedWindow) { // create window String stmtTextCreate = namedWindow ? "create window MyInfra#keepall as (a string, b int)" : "create table MyInfra as (a string primary key, b int primary key)"; epService.getEPAdministrator().createEPL(stmtTextCreate); String stmtTextInsertOne = "insert into MyInfra select theString as a, intPrimitive as b from SupportBean"; epService.getEPAdministrator().createEPL(stmtTextInsertOne); String stmtTextSelect = "on SupportBean_A select mwc.* as mwcwin from MyInfra mwc where id = a group by a having sum(b) = 20"; EPStatementSPI select = (EPStatementSPI) epService.getEPAdministrator().createEPL(stmtTextSelect); assertFalse(select.getStatementContext().isStatelessSelect()); select.addListener(listenerSelect); // send 3 event sendSupportBean("E1", 16); sendSupportBean("E2", 2); sendSupportBean("E1", 4); // fire trigger sendSupportBean_A("E1"); EventBean[] events = listenerSelect.getLastNewData(); assertEquals(2, events.length); assertEquals("E1", events[0].get("mwcwin.a")); assertEquals("E1", events[1].get("mwcwin.a")); epService.getEPAdministrator().destroyAllStatements(); epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false); } private void runAssertionWindowAgg(boolean namedWindow) { String eplCreate = namedWindow ? "create window MyInfra#keepall as SupportBean" : "create table MyInfra(theString string primary key, intPrimitive int)"; epService.getEPAdministrator().createEPL(eplCreate); String eplInsert = namedWindow ? "insert into MyInfra select * from SupportBean" : "insert into MyInfra select theString, intPrimitive from SupportBean"; epService.getEPAdministrator().createEPL(eplInsert); epService.getEPAdministrator().createEPL("on S1 as s1 delete from MyInfra where s1.p10 = theString"); EPStatement stmt = epService.getEPAdministrator().createEPL("on S0 as s0 " + "select window(win.*) as c0," + "window(win.*).where(v => v.intPrimitive < 2) as c1, " + "window(win.*).toMap(k=>k.theString,v=>v.intPrimitive) as c2 " + "from MyInfra as win"); stmt.addListener(listenerSelect); SupportBean[] beans = new SupportBean[3]; for (int i = 0; i < beans.length; i++) { beans[i] = new SupportBean("E" + i, i); } epService.getEPRuntime().sendEvent(beans[0]); epService.getEPRuntime().sendEvent(beans[1]); epService.getEPRuntime().sendEvent(new SupportBean_S0(10)); assertReceived(namedWindow, beans, new int[]{0, 1}, new int[]{0, 1}, "E0,E1".split(","), new Object[] {0,1}); // add bean epService.getEPRuntime().sendEvent(beans[2]); epService.getEPRuntime().sendEvent(new SupportBean_S0(10)); assertReceived(namedWindow, beans, new int[]{0, 1, 2}, new int[]{0, 1}, "E0,E1,E2".split(","), new Object[] {0,1, 2}); // delete bean epService.getEPRuntime().sendEvent(new SupportBean_S1(11, "E1")); epService.getEPRuntime().sendEvent(new SupportBean_S0(12)); assertReceived(namedWindow, beans, new int[]{0, 2}, new int[]{0}, "E0,E2".split(","), new Object[] {0,2}); // delete another bean epService.getEPRuntime().sendEvent(new SupportBean_S1(13, "E0")); epService.getEPRuntime().sendEvent(new SupportBean_S0(14)); assertReceived(namedWindow, beans, new int[]{2}, new int[0], "E2".split(","), new Object[] {2}); // delete last bean epService.getEPRuntime().sendEvent(new SupportBean_S1(15, "E2")); epService.getEPRuntime().sendEvent(new SupportBean_S0(16)); assertReceived(namedWindow, beans, null, null, null, null); epService.getEPAdministrator().destroyAllStatements(); epService.getEPAdministrator().getConfiguration().removeEventType("MyInfra", false); } private void assertReceived(boolean namedWindow, SupportBean[] beans, int[] indexesAll, int[] indexesWhere, String[] mapKeys, Object[] mapValues) { EventBean received = listenerSelect.assertOneGetNewAndReset(); Object[] expectedAll; Object[] expectedWhere; if (!namedWindow) { expectedAll = SupportBean.getOAStringAndIntPerIndex(beans, indexesAll); expectedWhere = SupportBean.getOAStringAndIntPerIndex(beans, indexesWhere); EPAssertionUtil.assertEqualsAnyOrder(expectedAll, (Object[]) received.get("c0")); Collection receivedColl = (Collection) received.get("c1"); EPAssertionUtil.assertEqualsAnyOrder(expectedWhere, receivedColl == null ? null : receivedColl.toArray()); } else { expectedAll = SupportBean.getBeansPerIndex(beans, indexesAll); expectedWhere = SupportBean.getBeansPerIndex(beans, indexesWhere); EPAssertionUtil.assertEqualsExactOrder(expectedAll, (Object[]) received.get("c0")); EPAssertionUtil.assertEqualsExactOrder(expectedWhere, (Collection) received.get("c1")); } EPAssertionUtil.assertPropsMap((Map) received.get("c2"), mapKeys, mapValues); } public void runAssertionOnSelectIndexChoice(boolean isNamedWindow) { epService.getEPAdministrator().getConfiguration().addEventType("SSB1", SupportSimpleBeanOne.class); epService.getEPAdministrator().getConfiguration().addEventType("SSB2", SupportSimpleBeanTwo.class); String backingUniqueS1 = "unique hash={s1(string)} btree={} advanced={}"; String backingUniqueS1L1 = "unique hash={s1(string),l1(long)} btree={} advanced={}"; String backingNonUniqueS1 = "non-unique hash={s1(string)} btree={} advanced={}"; String backingUniqueS1D1 = "unique hash={s1(string),d1(double)} btree={} advanced={}"; String backingBtreeI1 = "non-unique hash={} btree={i1(int)} advanced={}"; String backingBtreeD1 = "non-unique hash={} btree={d1(double)} advanced={}"; String expectedIdxNameS1 = isNamedWindow ? null : "MyInfra"; Object[] preloadedEventsOne = new Object[] {new SupportSimpleBeanOne("E1", 10, 11, 12), new SupportSimpleBeanOne("E2", 20, 21, 22)}; IndexAssertionEventSend eventSendAssertion = new IndexAssertionEventSend() { public void run() { String[] fields = "ssb2.s2,ssb1.s1,ssb1.i1".split(","); epService.getEPRuntime().sendEvent(new SupportSimpleBeanTwo("E2", 50, 21, 22)); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{"E2", "E2", 20}); epService.getEPRuntime().sendEvent(new SupportSimpleBeanTwo("E1", 60, 11, 12)); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[] {"E1", "E1", 10}); } }; // single index one field (std:unique(s1)) assertIndexChoice(isNamedWindow, new String[0], preloadedEventsOne, "std:unique(s1)", new IndexAssertion[] { new IndexAssertion(null, "s1 = s2", expectedIdxNameS1, backingUniqueS1, eventSendAssertion), new IndexAssertion(null, "s1 = ssb2.s2 and l1 = ssb2.l2", expectedIdxNameS1, backingUniqueS1, eventSendAssertion), new IndexAssertion("@Hint('index(One)')", "s1 = ssb2.s2 and l1 = ssb2.l2", expectedIdxNameS1, backingUniqueS1, eventSendAssertion), new IndexAssertion("@Hint('index(Two,bust)')", "s1 = ssb2.s2 and l1 = ssb2.l2"),// busted }); // single index one field (std:unique(s1)) if (isNamedWindow) { String[] indexOneField = new String[] {"create unique index One on MyInfra (s1)"}; assertIndexChoice(isNamedWindow, indexOneField, preloadedEventsOne, "std:unique(s1)", new IndexAssertion[] { new IndexAssertion(null, "s1 = s2", "One", backingUniqueS1, eventSendAssertion), new IndexAssertion(null, "s1 = ssb2.s2 and l1 = ssb2.l2", "One", backingUniqueS1, eventSendAssertion), new IndexAssertion("@Hint('index(One)')", "s1 = ssb2.s2 and l1 = ssb2.l2", "One", backingUniqueS1, eventSendAssertion), new IndexAssertion("@Hint('index(Two,bust)')", "s1 = ssb2.s2 and l1 = ssb2.l2"),// busted }); } // single index two field (std:unique(s1)) String[] indexTwoField = new String[] {"create unique index One on MyInfra (s1, l1)"}; assertIndexChoice(isNamedWindow, indexTwoField, preloadedEventsOne, "std:unique(s1)", new IndexAssertion[] { new IndexAssertion(null, "s1 = ssb2.s2", expectedIdxNameS1, backingUniqueS1, eventSendAssertion), new IndexAssertion(null, "s1 = ssb2.s2 and l1 = ssb2.l2", "One", backingUniqueS1L1, eventSendAssertion), }); assertIndexChoice(isNamedWindow, indexTwoField, preloadedEventsOne, "win:keepall()", new IndexAssertion[] { new IndexAssertion(null, "s1 = ssb2.s2", expectedIdxNameS1, isNamedWindow ? backingNonUniqueS1 : backingUniqueS1, eventSendAssertion), new IndexAssertion(null, "s1 = ssb2.s2 and l1 = ssb2.l2", "One", backingUniqueS1L1, eventSendAssertion), }); // two index one unique (std:unique(s1)) String[] indexSetTwo = new String[] { "create index One on MyInfra (s1)", "create unique index Two on MyInfra (s1, d1)"}; assertIndexChoice(isNamedWindow, indexSetTwo, preloadedEventsOne, "std:unique(s1)", new IndexAssertion[] { new IndexAssertion(null, "s1 = ssb2.s2", isNamedWindow ? "One" : "MyInfra", isNamedWindow ? backingNonUniqueS1 : backingUniqueS1, eventSendAssertion), new IndexAssertion(null, "s1 = ssb2.s2 and l1 = ssb2.l2", isNamedWindow ? "One" : "MyInfra", isNamedWindow ? backingNonUniqueS1 : backingUniqueS1, eventSendAssertion), new IndexAssertion("@Hint('index(One)')", "s1 = ssb2.s2 and l1 = ssb2.l2", "One", backingNonUniqueS1, eventSendAssertion), new IndexAssertion("@Hint('index(Two,One)')", "s1 = ssb2.s2 and l1 = ssb2.l2", "One", backingNonUniqueS1, eventSendAssertion), new IndexAssertion("@Hint('index(Two,bust)')", "s1 = ssb2.s2 and l1 = ssb2.l2"), // busted new IndexAssertion("@Hint('index(explicit,bust)')", "s1 = ssb2.s2 and l1 = ssb2.l2", isNamedWindow ? "One" : "MyInfra", isNamedWindow ? backingNonUniqueS1 : backingUniqueS1, eventSendAssertion), new IndexAssertion(null, "s1 = ssb2.s2 and d1 = ssb2.d2 and l1 = ssb2.l2", isNamedWindow ? "Two" : "MyInfra", isNamedWindow ? backingUniqueS1D1 : backingUniqueS1, eventSendAssertion), new IndexAssertion("@Hint('index(explicit,bust)')", "d1 = ssb2.d2 and l1 = ssb2.l2"), // busted }); // two index one unique (win:keepall) assertIndexChoice(isNamedWindow, indexSetTwo, preloadedEventsOne, "win:keepall()", new IndexAssertion[] { new IndexAssertion(null, "s1 = ssb2.s2", isNamedWindow ? "One" : "MyInfra", isNamedWindow ? backingNonUniqueS1 : backingUniqueS1, eventSendAssertion), new IndexAssertion(null, "s1 = ssb2.s2 and l1 = ssb2.l2", isNamedWindow ? "One" : "MyInfra", isNamedWindow ? backingNonUniqueS1 : backingUniqueS1, eventSendAssertion), new IndexAssertion("@Hint('index(One)')", "s1 = ssb2.s2 and l1 = ssb2.l2", "One", backingNonUniqueS1, eventSendAssertion), new IndexAssertion("@Hint('index(Two,One)')", "s1 = ssb2.s2 and l1 = ssb2.l2", "One", backingNonUniqueS1, eventSendAssertion), new IndexAssertion("@Hint('index(Two,bust)')", "s1 = ssb2.s2 and l1 = ssb2.l2"), // busted new IndexAssertion("@Hint('index(explicit,bust)')", "s1 = ssb2.s2 and l1 = ssb2.l2", isNamedWindow ? "One" : "MyInfra", isNamedWindow ? backingNonUniqueS1 : backingUniqueS1, eventSendAssertion), new IndexAssertion(null, "s1 = ssb2.s2 and d1 = ssb2.d2 and l1 = ssb2.l2", isNamedWindow ? "Two" : "MyInfra", isNamedWindow ? backingUniqueS1D1 : backingUniqueS1, eventSendAssertion), new IndexAssertion("@Hint('index(explicit,bust)')", "d1 = ssb2.d2 and l1 = ssb2.l2"), // busted }); // range (std:unique(s1)) IndexAssertionEventSend noAssertion = new IndexAssertionEventSend() { public void run() { } }; String[] indexSetThree = new String[] { "create index One on MyInfra (i1 btree)", "create index Two on MyInfra (d1 btree)"}; assertIndexChoice(isNamedWindow, indexSetThree, preloadedEventsOne, "std:unique(s1)", new IndexAssertion[] { new IndexAssertion(null, "i1 between 1 and 10", "One", backingBtreeI1, noAssertion), new IndexAssertion(null, "d1 between 1 and 10", "Two", backingBtreeD1, noAssertion), new IndexAssertion("@Hint('index(One, bust)')", "d1 between 1 and 10"),// busted }); // rel ops Object[] preloadedEventsRelOp = new Object[] {new SupportSimpleBeanOne("E1", 10, 11, 12)}; IndexAssertionEventSend relOpAssertion = new IndexAssertionEventSend() { public void run() { String[] fields = "ssb2.s2,ssb1.s1,ssb1.i1".split(","); epService.getEPRuntime().sendEvent(new SupportSimpleBeanTwo("EX", 0, 0, 0)); EPAssertionUtil.assertProps(listenerSelect.assertOneGetNewAndReset(), fields, new Object[]{"EX", "E1", 10}); } }; assertIndexChoice(isNamedWindow, new String[0], preloadedEventsRelOp, "win:keepall()", new IndexAssertion[] { new IndexAssertion(null, "9 < i1", null, isNamedWindow ? backingBtreeI1 : null, relOpAssertion), new IndexAssertion(null, "10 <= i1", null, isNamedWindow ? backingBtreeI1 : null, relOpAssertion), new IndexAssertion(null, "i1 <= 10", null, isNamedWindow ? backingBtreeI1 : null, relOpAssertion), new IndexAssertion(null, "i1 < 11", null, isNamedWindow ? backingBtreeI1 : null, relOpAssertion), new IndexAssertion(null, "11 > i1", null, isNamedWindow ? backingBtreeI1 : null, relOpAssertion), }); } private void assertIndexChoice(boolean isNamedWindow, String[] indexes, Object[] preloadedEvents, String datawindow, IndexAssertion[] assertions) { String eplCreate = isNamedWindow ? "@name('create-window') create window MyInfra." + datawindow + " as SSB1" : "@name('create-table') create table MyInfra(s1 string primary key, i1 int, d1 double, l1 long)"; epService.getEPAdministrator().createEPL(eplCreate); epService.getEPAdministrator().createEPL("insert into MyInfra select s1,i1,d1,l1 from SSB1"); for (String index : indexes) { epService.getEPAdministrator().createEPL(index, "create-index '" + index + "'"); } for (Object event : preloadedEvents) { epService.getEPRuntime().sendEvent(event); } int count = 0; for (IndexAssertion assertion : assertions) { log.info("======= Testing #" + count++); String consumeEpl = INDEX_CALLBACK_HOOK + (assertion.getHint() == null ? "" : assertion.getHint()) + "@name('on-select') on SSB2 as ssb2 " + "select * " + "from MyInfra as ssb1 where " + assertion.getWhereClause(); EPStatement consumeStmt; try { consumeStmt = epService.getEPAdministrator().createEPL(consumeEpl); } catch (EPStatementException ex) { if (assertion.getEventSendAssertion() == null) { // no assertion, expected assertTrue(ex.getMessage().contains("index hint busted")); continue; } throw new RuntimeException("Unexpected statement exception: " + ex.getMessage(), ex); } // assert index and access SupportQueryPlanIndexHook.assertOnExprTableAndReset(assertion.getExpectedIndexName(), assertion.getIndexBackingClass()); consumeStmt.addListener(listenerSelect); assertion.getEventSendAssertion().run(); consumeStmt.destroy(); } 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 void sendTimer(long timeInMSec, EPServiceProvider epService) { CurrentTimeEvent theEvent = new CurrentTimeEvent(timeInMSec); EPRuntime runtime = epService.getEPRuntime(); runtime.sendEvent(theEvent); } }