com.espertech.esper.regression.epl.TestPerfNamedWindowSubquery.java Source code

Java tutorial

Introduction

Here is the source code for com.espertech.esper.regression.epl.TestPerfNamedWindowSubquery.java

Source

/*
 * *************************************************************************************
 *  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.EPAssertionUtil;
import com.espertech.esper.client.scopetest.SupportUpdateListener;
import com.espertech.esper.support.bean.SupportBean;
import com.espertech.esper.support.bean.SupportBeanRange;
import com.espertech.esper.support.client.SupportConfigFactory;
import com.espertech.esper.util.EventRepresentationEnum;
import junit.framework.TestCase;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.util.HashMap;
import java.util.LinkedHashMap;

public class TestPerfNamedWindowSubquery extends TestCase {
    private static final Log log = LogFactory.getLog(TestPerfNamedWindowSubquery.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();
        epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class);
        listener = new SupportUpdateListener();
    }

    protected void tearDown() throws Exception {
        listener = null;
    }

    public void testConstantValue() {
        epService.getEPAdministrator().getConfiguration().addEventType("SupportBeanRange", SupportBeanRange.class);
        epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class);

        runConstantValueAssertion(false, false);
        runConstantValueAssertion(true, false);
        runConstantValueAssertion(true, true);
    }

    private void runConstantValueAssertion(boolean indexShare, boolean buildIndex) {
        String createEpl = "create window MyWindow.win:keepall() as select * from SupportBean";
        if (indexShare) {
            createEpl = "@Hint('enable_window_subquery_indexshare') " + createEpl;
        }
        epService.getEPAdministrator().createEPL(createEpl);

        if (buildIndex) {
            epService.getEPAdministrator()
                    .createEPL("create index idx1 on MyWindow(theString hash, intPrimitive btree)");
        }
        epService.getEPAdministrator().createEPL("insert into MyWindow select * from SupportBean");

        // preload
        for (int i = 0; i < 10000; i++) {
            SupportBean bean = new SupportBean("E" + i, i);
            bean.setDoublePrimitive(i);
            epService.getEPRuntime().sendEvent(bean);
        }

        // single-field compare
        String[] fields = "val".split(",");
        String eplSingle = "select (select intPrimitive from MyWindow where theString = 'E9734') as val from SupportBeanRange sbr";
        EPStatement stmtSingle = epService.getEPAdministrator().createEPL(eplSingle);
        stmtSingle.addListener(listener);

        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            epService.getEPRuntime().sendEvent(new SupportBeanRange("R", "", -1, -1));
            EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] { 9734 });
        }
        long delta = System.currentTimeMillis() - startTime;
        assertTrue("delta=" + delta, delta < 500);
        stmtSingle.destroy();

        // two-field compare
        String eplTwoHash = "select (select intPrimitive from MyWindow where theString = 'E9736' and intPrimitive = 9736) as val from SupportBeanRange sbr";
        EPStatement stmtTwoHash = epService.getEPAdministrator().createEPL(eplTwoHash);
        stmtTwoHash.addListener(listener);

        startTime = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            epService.getEPRuntime().sendEvent(new SupportBeanRange("R", "", -1, -1));
            EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] { 9736 });
        }
        delta = System.currentTimeMillis() - startTime;
        assertTrue("delta=" + delta, delta < 500);
        stmtTwoHash.destroy();

        // range compare single
        if (buildIndex) {
            epService.getEPAdministrator().createEPL("create index idx2 on MyWindow(intPrimitive btree)");
        }
        String eplSingleBTree = "select (select intPrimitive from MyWindow where intPrimitive between 9735 and 9735) as val from SupportBeanRange sbr";
        EPStatement stmtSingleBtree = epService.getEPAdministrator().createEPL(eplSingleBTree);
        stmtSingleBtree.addListener(listener);

        startTime = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            epService.getEPRuntime().sendEvent(new SupportBeanRange("R", "", -1, -1));
            EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] { 9735 });
        }
        delta = System.currentTimeMillis() - startTime;
        assertTrue("delta=" + delta, delta < 500);
        stmtSingleBtree.destroy();

        // range compare composite
        String eplComposite = "select (select intPrimitive from MyWindow where theString = 'E9738' and intPrimitive between 9738 and 9738) as val from SupportBeanRange sbr";
        EPStatement stmtComposite = epService.getEPAdministrator().createEPL(eplComposite);
        stmtComposite.addListener(listener);

        startTime = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            epService.getEPRuntime().sendEvent(new SupportBeanRange("R", "", -1, -1));
            EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] { 9738 });
        }
        delta = System.currentTimeMillis() - startTime;
        assertTrue("delta=" + delta, delta < 500);
        stmtComposite.destroy();

        // destroy all
        epService.getEPAdministrator().destroyAllStatements();
    }

    public void testKeyAndRange() {
        epService.getEPAdministrator().getConfiguration().addEventType("SupportBeanRange", SupportBeanRange.class);
        epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class);

        runKeyAndRangeAssertion(false, false);
        runKeyAndRangeAssertion(true, false);
        runKeyAndRangeAssertion(true, true);
    }

    private void runKeyAndRangeAssertion(boolean indexShare, boolean buildIndex) {
        String createEpl = "create window MyWindow.win:keepall() as select * from SupportBean";
        if (indexShare) {
            createEpl = "@Hint('enable_window_subquery_indexshare') " + createEpl;
        }
        epService.getEPAdministrator().createEPL(createEpl);

        if (buildIndex) {
            epService.getEPAdministrator()
                    .createEPL("create index idx1 on MyWindow(theString hash, intPrimitive btree)");
        }
        epService.getEPAdministrator().createEPL("insert into MyWindow select * from SupportBean");

        // preload
        for (int i = 0; i < 10000; i++) {
            String theString = i < 5000 ? "A" : "B";
            epService.getEPRuntime().sendEvent(new SupportBean(theString, i));
        }

        String[] fields = "cols.mini,cols.maxi".split(",");
        String queryEpl = "select (select min(intPrimitive) as mini, max(intPrimitive) as maxi from MyWindow where theString = sbr.key and intPrimitive between sbr.rangeStart and sbr.rangeEnd) as cols from SupportBeanRange sbr";
        EPStatement stmt = epService.getEPAdministrator().createEPL(queryEpl);
        stmt.addListener(listener);

        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            epService.getEPRuntime().sendEvent(new SupportBeanRange("R1", "A", 300, 312));
            EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] { 300, 312 });
        }
        long delta = System.currentTimeMillis() - startTime;
        assertTrue("delta=" + delta, delta < 500);
        log.info("delta=" + delta);

        epService.getEPAdministrator().destroyAllStatements();
    }

    public void testRange() {
        epService.getEPAdministrator().getConfiguration().addEventType("SupportBeanRange", SupportBeanRange.class);
        epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class);

        runRangeAssertion(false, false);
        runRangeAssertion(true, false);
        runRangeAssertion(true, true);
    }

    private void runRangeAssertion(boolean indexShare, boolean buildIndex) {
        String createEpl = "create window MyWindow.win:keepall() as select * from SupportBean";
        if (indexShare) {
            createEpl = "@Hint('enable_window_subquery_indexshare') " + createEpl;
        }
        epService.getEPAdministrator().createEPL(createEpl);

        if (buildIndex) {
            epService.getEPAdministrator().createEPL("create index idx1 on MyWindow(intPrimitive btree)");
        }
        epService.getEPAdministrator().createEPL("insert into MyWindow select * from SupportBean");

        // preload
        for (int i = 0; i < 10000; i++) {
            epService.getEPRuntime().sendEvent(new SupportBean("E1", i));
        }

        String[] fields = "cols.mini,cols.maxi".split(",");
        String queryEpl = "select (select min(intPrimitive) as mini, max(intPrimitive) as maxi from MyWindow where intPrimitive between sbr.rangeStart and sbr.rangeEnd) as cols from SupportBeanRange sbr";
        EPStatement stmt = epService.getEPAdministrator().createEPL(queryEpl);
        stmt.addListener(listener);

        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            epService.getEPRuntime().sendEvent(new SupportBeanRange("R1", "K", 300, 312));
            EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] { 300, 312 });
        }
        long delta = System.currentTimeMillis() - startTime;
        assertTrue("delta=" + delta, delta < 500);
        log.info("delta=" + delta);

        epService.getEPAdministrator().destroyAllStatements();
    }

    public void testKeyedRange() {
        epService.getEPAdministrator().getConfiguration().addEventType("SupportBeanRange", SupportBeanRange.class);
        epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class);

        String createEpl = "create window MyWindow.win:keepall() as select * from SupportBean";
        epService.getEPAdministrator().createEPL(createEpl);
        epService.getEPAdministrator().createEPL("insert into MyWindow select * from SupportBean");

        // preload
        for (int i = 0; i < 10000; i++) {
            String key = i < 5000 ? "A" : "B";
            epService.getEPRuntime().sendEvent(new SupportBean(key, i));
        }

        String[] fields = "cols.mini,cols.maxi".split(",");
        String queryEpl = "select (select min(intPrimitive) as mini, max(intPrimitive) as maxi from MyWindow "
                + "where theString = sbr.key and intPrimitive between sbr.rangeStart and sbr.rangeEnd) as cols from SupportBeanRange sbr";
        EPStatement stmt = epService.getEPAdministrator().createEPL(queryEpl);
        stmt.addListener(listener);

        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 500; i++) {
            epService.getEPRuntime().sendEvent(new SupportBeanRange("R1", "A", 299, 313));
            EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] { 299, 313 });

            epService.getEPRuntime().sendEvent(new SupportBeanRange("R2", "B", 7500, 7510));
            EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] { 7500, 7510 });
        }
        long delta = System.currentTimeMillis() - startTime;
        assertTrue("delta=" + delta, delta < 500);
        log.info("delta=" + delta);
    }

    public void testNoShare() {
        runAssertion(false, false, false);
    }

    public void testShare() {
        runAssertion(true, false, false);
    }

    public void testShareCreate() {
        runAssertion(true, false, true);
    }

    public void testDisableShare() {
        runAssertion(true, true, false);
    }

    public void testDisableShareCreate() {
        runAssertion(true, true, true);
    }

    private void runAssertion(boolean enableIndexShareCreate, boolean disableIndexShareConsumer,
            boolean createExplicitIndex) {
        epService.getEPAdministrator().createEPL("create schema EventSchema(e0 string, e1 int, e2 string)");

        String createEpl = "create window MyWindow.win:keepall() as select * from SupportBean";
        if (enableIndexShareCreate) {
            createEpl = "@Hint('enable_window_subquery_indexshare') " + createEpl;
        }
        epService.getEPAdministrator().createEPL(createEpl);
        epService.getEPAdministrator().createEPL("insert into MyWindow select * from SupportBean");

        if (createExplicitIndex) {
            epService.getEPAdministrator().createEPL("create index MyIndex on MyWindow (theString)");
        }

        String consumeEpl = "select e0, (select theString from MyWindow where intPrimitive = es.e1 and theString = es.e2) as val from EventSchema as es";
        if (disableIndexShareConsumer) {
            consumeEpl = "@Hint('disable_window_subquery_indexshare') " + consumeEpl;
        }
        EPStatement consumeStmt = epService.getEPAdministrator().createEPL(consumeEpl);
        consumeStmt.addListener(listener);

        String[] fields = "e0,val".split(",");

        // test once
        epService.getEPRuntime().sendEvent(new SupportBean("WX", 10));
        sendEvent("E1", 10, "WX");
        EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[] { "E1", "WX" });

        // preload
        for (int i = 0; i < 10000; i++) {
            epService.getEPRuntime().sendEvent(new SupportBean("W" + i, i));
        }

        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 5000; i++) {
            sendEvent("E" + i, i, "W" + i);
            EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields,
                    new Object[] { "E" + i, "W" + i });
        }
        long endTime = System.currentTimeMillis();
        long delta = endTime - startTime;
        assertTrue("delta=" + delta, delta < 500);

        epService.getEPAdministrator().destroyAllStatements();
    }

    private void sendEvent(String e0, int e1, String e2) {
        HashMap<String, Object> theEvent = new LinkedHashMap<String, Object>();
        theEvent.put("e0", e0);
        theEvent.put("e1", e1);
        theEvent.put("e2", e2);
        if (EventRepresentationEnum.getEngineDefault(epService).isObjectArrayEvent()) {
            epService.getEPRuntime().sendEvent(theEvent.values().toArray(), "EventSchema");
        } else {
            epService.getEPRuntime().sendEvent(theEvent, "EventSchema");
        }
    }
}