/* * ************************************************************************************* * 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.epl; import com.espertech.esper.client.*; import com.espertech.esper.client.scopetest.EPAssertionUtil; import com.espertech.esper.support.bean.SupportBean; import com.espertech.esper.support.bean.SupportBean_A; import com.espertech.esper.support.bean.SupportSimpleBeanOne; import com.espertech.esper.support.bean.SupportSimpleBeanTwo; import com.espertech.esper.support.client.SupportConfigFactory; import com.espertech.esper.support.epl.SupportQueryPlanIndexHook; import com.espertech.esper.support.util.IndexAssertion; import com.espertech.esper.support.util.IndexAssertionFAF; import com.espertech.esper.support.util.IndexBackingTableInfo; import junit.framework.TestCase; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class TestNamedWindowIndexFAFPerf extends TestCase implements IndexBackingTableInfo { private static Log log = LogFactory.getLog(TestNamedWindowIndexFAFPerf.class); private EPServiceProvider epService; public void setUp() { Configuration config = SupportConfigFactory.getConfiguration(); epService = EPServiceProviderManager.getDefaultProvider(config); epService.initialize(); } public void testFAFKeyBTreePerformance() { epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class); // create window one epService.getEPAdministrator().createEPL("create window MyWindow.win:keepall() as SupportBean"); epService.getEPAdministrator().createEPL("insert into MyWindow select * from SupportBean"); EPStatement idx = epService.getEPAdministrator().createEPL("create index idx1 on MyWindow(intPrimitive btree)"); // insert X rows int maxRows = 10000; //for performance testing change to int maxRows = 100000; for (int i = 0; i < maxRows; i++) { epService.getEPRuntime().sendEvent(new SupportBean("A", i)); } epService.getEPRuntime().sendEvent(new SupportBean("B", 100)); // fire single-key queries String eplIdx1One = "select intPrimitive as sumi from MyWindow where intPrimitive = 5501"; runFAFAssertion(eplIdx1One, 5501); String eplIdx1Two = "select sum(intPrimitive) as sumi from MyWindow where intPrimitive > 9997"; runFAFAssertion(eplIdx1Two, 9998 + 9999); // drop index, create multikey btree idx.destroy(); idx = epService.getEPAdministrator().createEPL("create index idx2 on MyWindow(intPrimitive btree, theString btree)"); String eplIdx2One = "select intPrimitive as sumi from MyWindow where intPrimitive = 5501 and theString = 'A'"; runFAFAssertion(eplIdx2One, 5501); String eplIdx2Two = "select sum(intPrimitive) as sumi from MyWindow where intPrimitive in [5000:5004) and theString = 'A'"; runFAFAssertion(eplIdx2Two, 5000+5001+5003+5002); String eplIdx2Three = "select sum(intPrimitive) as sumi from MyWindow where intPrimitive=5001 and theString between 'A' and 'B'"; runFAFAssertion(eplIdx2Three, 5001); } private void runFAFAssertion(String epl, Integer expected) { long start = System.currentTimeMillis(); int loops = 1000; EPOnDemandPreparedQuery query = epService.getEPRuntime().prepareQuery(epl); for (int i = 0; i < loops; i++) { runFAFQuery(query, expected); } long end = System.currentTimeMillis(); long delta = end - start; assertTrue("delta=" + delta, delta < 1000); } public void testFAFKeyAndRangePerformance() { epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class); // create window one epService.getEPAdministrator().createEPL("create window MyWindow.win:keepall() as SupportBean"); epService.getEPAdministrator().createEPL("insert into MyWindow select * from SupportBean"); epService.getEPAdministrator().createEPL("create index idx1 on MyWindow(theString hash, intPrimitive btree)"); // insert X rows int maxRows = 10000; //for performance testing change to int maxRows = 100000; for (int i=0; i < maxRows; i++) { epService.getEPRuntime().sendEvent(new SupportBean("A", i)); } runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where theString = 'A' and intPrimitive not in [3:9997]", 1+2+9998+9999); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where theString = 'A' and intPrimitive not in [3:9997)", 1+2+9997+9998+9999); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where theString = 'A' and intPrimitive not in (3:9997]", 1+2+3+9998+9999); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where theString = 'A' and intPrimitive not in (3:9997)", 1+2+3+9997+9998+9999); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where theString = 'B' and intPrimitive not in (3:9997)", null); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where theString = 'A' and intPrimitive between 200 and 202", 603); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where theString = 'A' and intPrimitive between 202 and 199", 199+200+201+202); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where theString = 'A' and intPrimitive >= 200 and intPrimitive <= 202", 603); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where theString = 'A' and intPrimitive >= 202 and intPrimitive <= 200", null); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where theString = 'A' and intPrimitive > 9997", 9998 + 9999); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where theString = 'A' and intPrimitive >= 9997", 9997 + 9998 + 9999); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where theString = 'A' and intPrimitive < 5", 4+3+2+1); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where theString = 'A' and intPrimitive <= 5", 5+4+3+2+1); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where theString = 'A' and intPrimitive in [200:202]", 603); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where theString = 'A' and intPrimitive in [200:202)", 401); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where theString = 'A' and intPrimitive in (200:202]", 403); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where theString = 'A' and intPrimitive in (200:202)", 201); // test no value returned EPOnDemandPreparedQuery query = epService.getEPRuntime().prepareQuery("select * from MyWindow where theString = 'A' and intPrimitive < 0"); EPOnDemandQueryResult result = query.execute(); assertEquals(0, result.getArray().length); } public void testFAFRangePerformance() { epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class); // create window one epService.getEPAdministrator().createEPL("create window MyWindow.win:keepall() as SupportBean"); epService.getEPAdministrator().createEPL("insert into MyWindow select * from SupportBean"); epService.getEPAdministrator().createEPL("create index idx1 on MyWindow(intPrimitive btree)"); // insert X rows int maxRows = 10000; //for performance testing change to int maxRows = 100000; for (int i=0; i < maxRows; i++) { epService.getEPRuntime().sendEvent(new SupportBean("K", i)); } runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where intPrimitive between 200 and 202", 603); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where intPrimitive between 202 and 199", 199+200+201+202); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where intPrimitive >= 200 and intPrimitive <= 202", 603); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where intPrimitive >= 202 and intPrimitive <= 200", null); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where intPrimitive > 9997", 9998 + 9999); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where intPrimitive >= 9997", 9997 + 9998 + 9999); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where intPrimitive < 5", 4+3+2+1); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where intPrimitive <= 5", 5+4+3+2+1); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where intPrimitive in [200:202]", 603); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where intPrimitive in [200:202)", 401); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where intPrimitive in (200:202]", 403); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where intPrimitive in (200:202)", 201); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where intPrimitive not in [3:9997]", 1+2+9998+9999); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where intPrimitive not in [3:9997)", 1+2+9997+9998+9999); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where intPrimitive not in (3:9997]", 1+2+3+9998+9999); runFAFAssertion("select sum(intPrimitive) as sumi from MyWindow where intPrimitive not in (3:9997)", 1+2+3+9997+9998+9999); // test no value returned EPOnDemandPreparedQuery query = epService.getEPRuntime().prepareQuery("select * from MyWindow where intPrimitive < 0"); EPOnDemandQueryResult result = query.execute(); assertEquals(0, result.getArray().length); } public void testFAFKeyPerformance() { epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class); epService.getEPAdministrator().getConfiguration().addEventType("SupportBean_A", SupportBean_A.class); // create window one String stmtTextCreateOne = "create window MyWindowOne.win:keepall() as (f1 string, f2 int)"; epService.getEPAdministrator().createEPL(stmtTextCreateOne); epService.getEPAdministrator().createEPL("insert into MyWindowOne(f1, f2) select theString, intPrimitive from SupportBean"); epService.getEPAdministrator().createEPL("create index MyWindowOneIndex on MyWindowOne(f1)"); // insert X rows int maxRows = 100; //for performance testing change to int maxRows = 100000; for (int i=0; i < maxRows; i++) { epService.getEPRuntime().sendEvent(new SupportBean("K" + i, i)); } // fire N queries each returning 1 row long start = System.currentTimeMillis(); String queryText = "select * from MyWindowOne where f1='K10'"; EPOnDemandPreparedQuery query = epService.getEPRuntime().prepareQuery(queryText); int loops = 10000; for (int i = 0; i < loops; i++) { EPOnDemandQueryResult result = query.execute(); assertEquals(1, result.getArray().length); assertEquals("K10", result.getArray()[0].get("f1")); } long end = System.currentTimeMillis(); long delta = end - start; assertTrue("delta=" + delta, delta < 500); // test no value returned queryText = "select * from MyWindowOne where f1='KX'"; query = epService.getEPRuntime().prepareQuery(queryText); EPOnDemandQueryResult result = query.execute(); assertEquals(0, result.getArray().length); // test query null queryText = "select * from MyWindowOne where f1=null"; query = epService.getEPRuntime().prepareQuery(queryText); result = query.execute(); assertEquals(0, result.getArray().length); // insert null and test null epService.getEPRuntime().sendEvent(new SupportBean(null, -2)); result = query.execute(); assertEquals(0, result.getArray().length); // test two values epService.getEPRuntime().sendEvent(new SupportBean(null, -1)); query = epService.getEPRuntime().prepareQuery("select * from MyWindowOne where f1 is null order by f2 asc"); result = query.execute(); assertEquals(2, result.getArray().length); assertEquals(-2, result.getArray()[0].get("f2")); assertEquals(-1, result.getArray()[1].get("f2")); } private void runFAFQuery(EPOnDemandPreparedQuery query, Integer expectedValue) { EPOnDemandQueryResult result = query.execute(); assertEquals(1, result.getArray().length); assertEquals(expectedValue, result.getArray()[0].get("sumi")); } }