/* *************************************************************************************** * 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.epl; 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.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_S0; import com.espertech.esper.supportregression.bean.SupportSimpleBeanOne; import com.espertech.esper.supportregression.bean.SupportSimpleBeanTwo; import com.espertech.esper.supportregression.client.SupportConfigFactory; import com.espertech.esper.supportregression.epl.SupportQueryPlanIndexHook; import com.espertech.esper.supportregression.util.IndexAssertionEventSend; import com.espertech.esper.supportregression.util.IndexBackingTableInfo; import junit.framework.TestCase; public class TestSubselectIndex extends TestCase implements IndexBackingTableInfo { private EPServiceProvider epService; private SupportUpdateListener listener; 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());} listener = new SupportUpdateListener(); SupportQueryPlanIndexHook.reset(); } protected void tearDown() throws Exception { if (InstrumentationHelper.ENABLED) { InstrumentationHelper.endTest();} listener = null; } public void testIndexChoicesOverdefinedWhere() { epService.getEPAdministrator().getConfiguration().addEventType("SSB1", SupportSimpleBeanOne.class); epService.getEPAdministrator().getConfiguration().addEventType("SSB2", SupportSimpleBeanTwo.class); // test no where clause with unique IndexAssertionEventSend assertNoWhere = new IndexAssertionEventSend() { public void run() { String[] fields = "c0,c1".split(","); epService.getEPRuntime().sendEvent(new SupportSimpleBeanTwo("E1", 1, 2, 3)); epService.getEPRuntime().sendEvent(new SupportSimpleBeanOne("EX", 10, 11, 12)); EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{"EX", "E1"}); epService.getEPRuntime().sendEvent(new SupportSimpleBeanTwo("E2", 1, 2, 3)); epService.getEPRuntime().sendEvent(new SupportSimpleBeanOne("EY", 10, 11, 12)); EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{"EY", null}); } }; runAssertion(false, "s2,i2", "", BACKING_UNINDEXED, assertNoWhere); // test no where clause with unique on multiple props, exact specification of where-clause IndexAssertionEventSend assertSendEvents = new IndexAssertionEventSend() { public void run() { String[] fields = "c0,c1".split(","); epService.getEPRuntime().sendEvent(new SupportSimpleBeanTwo("E1", 1, 3, 10)); epService.getEPRuntime().sendEvent(new SupportSimpleBeanTwo("E2", 1, 2, 0)); epService.getEPRuntime().sendEvent(new SupportSimpleBeanTwo("E3", 1, 3, 9)); epService.getEPRuntime().sendEvent(new SupportSimpleBeanOne("EX", 1, 3, 9)); EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{"EX", "E3"}); } }; runAssertion(false, "d2,i2", "where ssb2.i2 = ssb1.i1 and ssb2.d2 = ssb1.d1", BACKING_MULTI_UNIQUE, assertSendEvents); runAssertion(false, "d2,i2", "where ssb2.d2 = ssb1.d1 and ssb2.i2 = ssb1.i1", BACKING_MULTI_UNIQUE, assertSendEvents); runAssertion(false, "d2,i2", "where ssb2.l2 = ssb1.l1 and ssb2.d2 = ssb1.d1 and ssb2.i2 = ssb1.i1", BACKING_MULTI_UNIQUE, assertSendEvents); runAssertion(false, "d2,i2", "where ssb2.l2 = ssb1.l1 and ssb2.i2 = ssb1.i1", BACKING_MULTI_DUPS, assertSendEvents); runAssertion(false, "d2,i2", "where ssb2.d2 = ssb1.d1", BACKING_SINGLE_DUPS, assertSendEvents); runAssertion(false, "d2,i2", "where ssb2.i2 = ssb1.i1 and ssb2.d2 = ssb1.d1 and ssb2.l2 between 1 and 1000", BACKING_MULTI_UNIQUE, assertSendEvents); runAssertion(false, "d2,i2", "where ssb2.d2 = ssb1.d1 and ssb2.l2 between 1 and 1000", BACKING_COMPOSITE, assertSendEvents); runAssertion(false, "i2,d2,l2", "where ssb2.l2 = ssb1.l1 and ssb2.d2 = ssb1.d1", BACKING_MULTI_DUPS, assertSendEvents); runAssertion(false, "i2,d2,l2", "where ssb2.l2 = ssb1.l1 and ssb2.i2 = ssb1.i1 and ssb2.d2 = ssb1.d1", BACKING_MULTI_UNIQUE, assertSendEvents); runAssertion(false, "d2,l2,i2", "where ssb2.l2 = ssb1.l1 and ssb2.i2 = ssb1.i1 and ssb2.d2 = ssb1.d1", BACKING_MULTI_UNIQUE, assertSendEvents); runAssertion(false, "d2,l2,i2", "where ssb2.l2 = ssb1.l1 and ssb2.i2 = ssb1.i1 and ssb2.d2 = ssb1.d1 and ssb2.s2 between 'E3' and 'E4'", BACKING_MULTI_UNIQUE, assertSendEvents); runAssertion(false, "l2", "where ssb2.l2 = ssb1.l1", BACKING_SINGLE_UNIQUE, assertSendEvents); runAssertion(true, "l2", "where ssb2.l2 = ssb1.l1", BACKING_SINGLE_DUPS, assertSendEvents); runAssertion(false, "l2", "where ssb2.l2 = ssb1.l1 and ssb1.i1 between 1 and 20", BACKING_SINGLE_UNIQUE, assertSendEvents); } private void runAssertion(boolean disableImplicitUniqueIdx, String uniqueFields, String whereClause, String backingTable, IndexAssertionEventSend assertion) { String eplUnique = INDEX_CALLBACK_HOOK + "select s1 as c0, " + "(select s2 from SSB2#unique(" + uniqueFields + ") as ssb2 " + whereClause + ") as c1 " + "from SSB1 as ssb1"; if (disableImplicitUniqueIdx) { eplUnique = "@Hint('DISABLE_UNIQUE_IMPLICIT_IDX')" + eplUnique; } EPStatement stmtUnique = epService.getEPAdministrator().createEPL(eplUnique); stmtUnique.addListener(listener); SupportQueryPlanIndexHook.assertSubqueryBackingAndReset(0, null, backingTable); assertion.run(); stmtUnique.destroy(); } public void testUniqueIndexCorrelated() { epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class); epService.getEPAdministrator().getConfiguration().addEventType("S0", SupportBean_S0.class); String[] fields = "c0,c1".split(","); // test std:unique String eplUnique = INDEX_CALLBACK_HOOK + "select id as c0, " + "(select intPrimitive from SupportBean#unique(theString) where theString = s0.p00) as c1 " + "from S0 as s0"; EPStatement stmtUnique = epService.getEPAdministrator().createEPL(eplUnique); stmtUnique.addListener(listener); SupportQueryPlanIndexHook.assertSubqueryBackingAndReset(0, null, BACKING_SINGLE_UNIQUE); epService.getEPRuntime().sendEvent(new SupportBean("E1", 1)); epService.getEPRuntime().sendEvent(new SupportBean("E2", 2)); epService.getEPRuntime().sendEvent(new SupportBean("E1", 3)); epService.getEPRuntime().sendEvent(new SupportBean("E2", 4)); epService.getEPRuntime().sendEvent(new SupportBean_S0(10, "E2")); EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {10, 4}); epService.getEPRuntime().sendEvent(new SupportBean_S0(11, "E1")); EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{11, 3}); stmtUnique.destroy(); // test std:firstunique String eplFirstUnique = INDEX_CALLBACK_HOOK + "select id as c0, " + "(select intPrimitive from SupportBean#firstunique(theString) where theString = s0.p00) as c1 " + "from S0 as s0"; EPStatement stmtFirstUnique = epService.getEPAdministrator().createEPL(eplFirstUnique); stmtFirstUnique.addListener(listener); SupportQueryPlanIndexHook.assertSubqueryBackingAndReset(0, null, BACKING_SINGLE_UNIQUE); epService.getEPRuntime().sendEvent(new SupportBean("E1", 1)); epService.getEPRuntime().sendEvent(new SupportBean("E2", 2)); epService.getEPRuntime().sendEvent(new SupportBean("E1", 3)); epService.getEPRuntime().sendEvent(new SupportBean("E2", 4)); epService.getEPRuntime().sendEvent(new SupportBean_S0(10, "E2")); EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {10, 2}); epService.getEPRuntime().sendEvent(new SupportBean_S0(11, "E1")); EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{11, 1}); stmtFirstUnique.destroy(); // test intersection std:firstunique String eplIntersection = INDEX_CALLBACK_HOOK + "select id as c0, " + "(select intPrimitive from SupportBean#time(1)#unique(theString) where theString = s0.p00) as c1 " + "from S0 as s0"; EPStatement stmtIntersection = epService.getEPAdministrator().createEPL(eplIntersection); stmtIntersection.addListener(listener); SupportQueryPlanIndexHook.assertSubqueryBackingAndReset(0, null, BACKING_SINGLE_UNIQUE); epService.getEPRuntime().sendEvent(new SupportBean("E1", 1)); epService.getEPRuntime().sendEvent(new SupportBean("E1", 2)); epService.getEPRuntime().sendEvent(new SupportBean("E1", 3)); epService.getEPRuntime().sendEvent(new SupportBean("E2", 4)); epService.getEPRuntime().sendEvent(new SupportBean_S0(10, "E2")); EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {10, 4}); epService.getEPRuntime().sendEvent(new SupportBean_S0(11, "E1")); EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{11, 3}); stmtIntersection.destroy(); // test grouped unique String eplGrouped = INDEX_CALLBACK_HOOK + "select id as c0, " + "(select longPrimitive from SupportBean#groupwin(theString)#unique(intPrimitive) where theString = s0.p00 and intPrimitive = s0.id) as c1 " + "from S0 as s0"; EPStatement stmtGrouped = epService.getEPAdministrator().createEPL(eplGrouped); stmtGrouped.addListener(listener); SupportQueryPlanIndexHook.assertSubqueryBackingAndReset(0, null, BACKING_MULTI_UNIQUE); epService.getEPRuntime().sendEvent(makeBean("E1", 1, 100)); epService.getEPRuntime().sendEvent(makeBean("E1", 2, 101)); epService.getEPRuntime().sendEvent(makeBean("E1", 1, 102)); epService.getEPRuntime().sendEvent(new SupportBean_S0(1, "E1")); EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] {1, 102L}); stmtGrouped.destroy(); } private SupportBean makeBean(String theString, int intPrimitive, long longPrimitive) { SupportBean bean = new SupportBean(theString, intPrimitive); bean.setLongPrimitive(longPrimitive); return bean; } }