/*
* *************************************************************************************
* 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.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.SupportUpdateListener;
import com.espertech.esper.support.bean.SupportBeanRange;
import com.espertech.esper.support.bean.SupportBean_ST0;
import com.espertech.esper.support.bean.SupportBean_ST1;
import com.espertech.esper.support.client.SupportConfigFactory;
import junit.framework.TestCase;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class TestPerf3StreamRangeJoin extends TestCase
{
private static final Log log = LogFactory.getLog(TestPerf3StreamRangeJoin.class);
private EPServiceProvider epService;
private SupportUpdateListener listener;
public void setUp()
{
Configuration config = SupportConfigFactory.getConfiguration();
config.getEngineDefaults().getLogging().setEnableQueryPlan(true);
epService = EPServiceProviderManager.getDefaultProvider(config);
epService.initialize();
listener = new SupportUpdateListener();
epService.getEPAdministrator().getConfiguration().addEventType("SupportBean_ST0", SupportBean_ST0.class);
epService.getEPAdministrator().getConfiguration().addEventType("SupportBean_ST1", SupportBean_ST1.class);
epService.getEPAdministrator().getConfiguration().addEventType("SupportBeanRange", SupportBeanRange.class);
}
protected void tearDown() throws Exception {
listener = null;
}
/**
* This join algorithm profits from merge join cartesian indicated via @hint.
*/
public void testPerf3StreamKeyAndRange() {
epService.getEPAdministrator().createEPL("create window ST0.win:keepall() as SupportBean_ST0");
epService.getEPAdministrator().createEPL("@Name('I1') insert into ST0 select * from SupportBean_ST0");
epService.getEPAdministrator().createEPL("create window ST1.win:keepall() as SupportBean_ST1");
epService.getEPAdministrator().createEPL("@Name('I2') insert into ST1 select * from SupportBean_ST1");
// Preload
log.info("Preloading events");
for (int i = 0; i < 10000; i++)
{
epService.getEPRuntime().sendEvent(new SupportBean_ST0("ST0", "G", i));
epService.getEPRuntime().sendEvent(new SupportBean_ST1("ST1", "G", i));
}
log.info("Done preloading");
String epl = "@Hint('PREFER_MERGE_JOIN') select * from SupportBeanRange.std:lastevent() a " +
"inner join ST0 st0 on st0.key0 = a.key " +
"inner join ST1 st1 on st1.key1 = a.key " +
"where " +
"st0.p00 between rangeStart and rangeEnd and st1.p10 between rangeStart and rangeEnd";
runAssertion(epl);
epl = "@Hint('PREFER_MERGE_JOIN') select * from SupportBeanRange.std:lastevent() a, ST0 st0, ST1 st1 " +
"where st0.key0 = a.key and st1.key1 = a.key and " +
"st0.p00 between rangeStart and rangeEnd and st1.p10 between rangeStart and rangeEnd";
runAssertion(epl);
}
/**
* This join algorithm uses merge join cartesian (not nested iteration).
*/
public void testPerf3StreamRangeOnly() {
epService.getEPAdministrator().createEPL("create window ST0.win:keepall() as SupportBean_ST0");
epService.getEPAdministrator().createEPL("@Name('I1') insert into ST0 select * from SupportBean_ST0");
epService.getEPAdministrator().createEPL("create window ST1.win:keepall() as SupportBean_ST1");
epService.getEPAdministrator().createEPL("@Name('I2') insert into ST1 select * from SupportBean_ST1");
// Preload
log.info("Preloading events");
for (int i = 0; i < 10000; i++)
{
epService.getEPRuntime().sendEvent(new SupportBean_ST0("ST0", "ST0", i));
epService.getEPRuntime().sendEvent(new SupportBean_ST1("ST1", "ST1", i));
}
log.info("Done preloading");
// start query
//String epl = "select * from SupportBeanRange.std:lastevent() a, ST0 st0, ST1 st1 " +
// "where st0.key0 = a.key and st1.key1 = a.key";
String epl = "select * from SupportBeanRange.std:lastevent() a, ST0 st0, ST1 st1 " +
"where st0.p00 between rangeStart and rangeEnd and st1.p10 between rangeStart and rangeEnd";
EPStatement stmt = epService.getEPAdministrator().createEPL(epl);
stmt.addListener(listener);
// Repeat
log.info("Querying");
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++)
{
epService.getEPRuntime().sendEvent(new SupportBeanRange("R", "R", 100, 101));
assertEquals(4, listener.getAndResetLastNewData().length);
}
log.info("Done Querying");
long endTime = System.currentTimeMillis();
log.info("delta=" + (endTime - startTime));
assertTrue((endTime - startTime) < 500);
stmt.destroy();
}
/**
* This join algorithm profits from nested iteration execution.
*/
public void testPerf3StreamUnidirectionalKeyAndRange() {
epService.getEPAdministrator().createEPL("create window SBR.win:keepall() as SupportBeanRange");
epService.getEPAdministrator().createEPL("@Name('I1') insert into SBR select * from SupportBeanRange");
epService.getEPAdministrator().createEPL("create window ST1.win:keepall() as SupportBean_ST1");
epService.getEPAdministrator().createEPL("@Name('I2') insert into ST1 select * from SupportBean_ST1");
// Preload
log.info("Preloading events");
epService.getEPRuntime().sendEvent(new SupportBeanRange("ST1", "G", 4000, 4004));
for (int i = 0; i < 10000; i++)
{
epService.getEPRuntime().sendEvent(new SupportBean_ST1("ST1", "G", i));
}
log.info("Done preloading");
String epl = "select * from SupportBean_ST0 st0 unidirectional, SBR a, ST1 st1 " +
"where st0.key0 = a.key and st1.key1 = a.key and " +
"st1.p10 between rangeStart and rangeEnd";
EPStatement stmt = epService.getEPAdministrator().createEPL(epl);
stmt.addListener(listener);
// Repeat
log.info("Querying");
long startTime = System.currentTimeMillis();
for (int i = 0; i < 500; i++)
{
epService.getEPRuntime().sendEvent(new SupportBean_ST0("ST0", "G", -1));
assertEquals(5, listener.getAndResetLastNewData().length);
}
log.info("Done Querying");
long delta = System.currentTimeMillis() - startTime;
log.info("delta=" + delta);
// This works best with a nested iteration join (and not a cardinal join)
assertTrue("delta=" + delta, delta < 500);
stmt.destroy();
}
private void runAssertion(String epl) {
EPStatement stmt = epService.getEPAdministrator().createEPL(epl);
stmt.addListener(listener);
// Repeat
log.info("Querying");
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++)
{
epService.getEPRuntime().sendEvent(new SupportBeanRange("R", "G", 100, 101));
assertEquals(4, listener.getAndResetLastNewData().length);
}
log.info("Done Querying");
long endTime = System.currentTimeMillis();
log.info("delta=" + (endTime - startTime));
assertTrue((endTime - startTime) < 500);
stmt.destroy();
}
}