/*
* *************************************************************************************
* 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.view;
import com.espertech.esper.client.EPServiceProvider;
import com.espertech.esper.client.EPServiceProviderManager;
import com.espertech.esper.client.EPStatement;
import com.espertech.esper.client.EPStatementException;
import com.espertech.esper.client.scopetest.EPAssertionUtil;
import com.espertech.esper.client.scopetest.SupportUpdateListener;
import com.espertech.esper.client.soda.EPStatementObjectModel;
import com.espertech.esper.core.service.EPStatementSPI;
import com.espertech.esper.support.bean.SupportBean;
import com.espertech.esper.support.bean.SupportBeanNumeric;
import com.espertech.esper.support.client.SupportConfigFactory;
import junit.framework.TestCase;
import java.math.BigDecimal;
import java.math.BigInteger;
public class TestAggregateFiltered extends TestCase
{
private EPServiceProvider epService;
private SupportUpdateListener listener;
public void setUp()
{
listener = new SupportUpdateListener();
epService = EPServiceProviderManager.getDefaultProvider(SupportConfigFactory.getConfiguration());
epService.initialize();
epService.getEPAdministrator().getConfiguration().addEventType(BlackWhiteEvent.class);
epService.getEPAdministrator().getConfiguration().addEventType(SupportBean.class);
epService.getEPAdministrator().getConfiguration().addEventType(SupportBeanNumeric.class);
}
protected void tearDown() throws Exception {
listener = null;
}
public void testBlackWhitePercent()
{
String[] fields = "cb,cnb,c,pct".split(",");
EPStatementSPI stmt = (EPStatementSPI) epService.getEPAdministrator().createEPL("select count(*, black) as cb, count(*, not black) as cnb, count(*) as c, count(*, black)/count(*) as pct from BlackWhiteEvent.win:length(3)");
stmt.addListener(listener);
assertFalse(stmt.getStatementContext().isStatelessSelect());
epService.getEPRuntime().sendEvent(new BlackWhiteEvent(true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{1L, 0L, 1L, 1d});
epService.getEPRuntime().sendEvent(new BlackWhiteEvent(false));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{1L, 1L, 2L, 0.5d});
epService.getEPRuntime().sendEvent(new BlackWhiteEvent(false));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{1L, 2L, 3L, 1 / 3d});
epService.getEPRuntime().sendEvent(new BlackWhiteEvent(false));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{0L, 3L, 3L, 0d});
}
public void testCountVariations()
{
String[] fields = "c1,c2".split(",");
EPStatement stmt = epService.getEPAdministrator().createEPL("select " +
"count(intBoxed, boolPrimitive) as c1," +
"count(distinct intBoxed, boolPrimitive) as c2 " +
"from SupportBean.win:length(3)");
stmt.addListener(listener);
epService.getEPRuntime().sendEvent(makeBean(100, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{1L, 1L});
epService.getEPRuntime().sendEvent(makeBean(100, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{2L, 1L});
epService.getEPRuntime().sendEvent(makeBean(101, false));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{2L, 1L});
epService.getEPRuntime().sendEvent(makeBean(102, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{2L, 2L});
epService.getEPRuntime().sendEvent(makeBean(103, false));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{1L, 1L});
epService.getEPRuntime().sendEvent(makeBean(104, false));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{1L, 1L});
epService.getEPRuntime().sendEvent(makeBean(105, false));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{0L, 0L});
}
public void testAllAggFunctions() {
String[] fields = "cavedev,cavg,cmax,cmedian,cmin,cstddev,csum".split(",");
EPStatementSPI stmt = (EPStatementSPI) epService.getEPAdministrator().createEPL("select " +
"avedev(intBoxed, boolPrimitive) as cavedev," +
"avg(intBoxed, boolPrimitive) as cavg, " +
"fmax(intBoxed, boolPrimitive) as cmax, " +
"median(intBoxed, boolPrimitive) as cmedian, " +
"fmin(intBoxed, boolPrimitive) as cmin, " +
"stddev(intBoxed, boolPrimitive) as cstddev, " +
"sum(intBoxed, boolPrimitive) as csum " +
"from SupportBean.win:length(3)");
stmt.addListener(listener);
epService.getEPRuntime().sendEvent(makeBean(100, false));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{null, null, null, null, null, null, null});
epService.getEPRuntime().sendEvent(makeBean(10, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{0.0d, 10.0, 10, 10.0, 10, null, 10});
epService.getEPRuntime().sendEvent(makeBean(11, false));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{0.0d, 10.0, 10, 10.0, 10, null, 10});
epService.getEPRuntime().sendEvent(makeBean(20, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{5.0d, 15.0, 20, 15.0, 10, 7.0710678118654755, 30});
epService.getEPRuntime().sendEvent(makeBean(30, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{5.0d, 25.0, 30, 25.0, 20, 7.0710678118654755, 50});
// Test all remaining types of "sum"
stmt.destroy();
fields = "c1,c2,c3,c4".split(",");
stmt = (EPStatementSPI) epService.getEPAdministrator().createEPL("select " +
"sum(floatPrimitive, boolPrimitive) as c1," +
"sum(doublePrimitive, boolPrimitive) as c2, " +
"sum(longPrimitive, boolPrimitive) as c3, " +
"sum(shortPrimitive, boolPrimitive) as c4 " +
"from SupportBean.win:length(2)");
stmt.addListener(listener);
epService.getEPRuntime().sendEvent(makeBean(2f, 3d, 4L, (short) 5, false));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{null, null, null, null});
epService.getEPRuntime().sendEvent(makeBean(3f, 4d, 5L, (short) 6, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{3f, 4d, 5L, 6});
epService.getEPRuntime().sendEvent(makeBean(4f, 5d, 6L, (short) 7, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{7f, 9d, 11L, 13});
epService.getEPRuntime().sendEvent(makeBean(1f, 1d, 1L, (short) 1, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{5f, 6d, 7L, 8});
// Test min/max-ever
stmt.destroy();
fields = "c1,c2".split(",");
stmt = (EPStatementSPI) epService.getEPAdministrator().createEPL("select " +
"fmax(intBoxed, boolPrimitive) as c1," +
"fmin(intBoxed, boolPrimitive) as c2 " +
"from SupportBean");
stmt.addListener(listener);
assertFalse(stmt.getStatementContext().isStatelessSelect());
epService.getEPRuntime().sendEvent(makeBean(10, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{10, 10});
epService.getEPRuntime().sendEvent(makeBean(20, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{20, 10});
epService.getEPRuntime().sendEvent(makeBean(8, false));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{20, 10});
epService.getEPRuntime().sendEvent(makeBean(7, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{20, 7});
epService.getEPRuntime().sendEvent(makeBean(30, false));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{20, 7});
epService.getEPRuntime().sendEvent(makeBean(40, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{40, 7});
// test big decimal big integer
stmt.destroy();
fields = "c1,c2,c3".split(",");
stmt = (EPStatementSPI) epService.getEPAdministrator().createEPL("select " +
"avg(bigdec, bigint < 100) as c1," +
"sum(bigdec, bigint < 100) as c2, " +
"sum(bigint, bigint < 100) as c3 " +
"from SupportBeanNumeric.win:length(2)");
stmt.addListener(listener);
epService.getEPRuntime().sendEvent(new SupportBeanNumeric(new BigInteger("10"), new BigDecimal(20)));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{new BigDecimal(20), new BigDecimal(20), new BigInteger("10")});
epService.getEPRuntime().sendEvent(new SupportBeanNumeric(new BigInteger("101"), new BigDecimal(101)));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{new BigDecimal(20), new BigDecimal(20), new BigInteger("10")});
epService.getEPRuntime().sendEvent(new SupportBeanNumeric(new BigInteger("20"), new BigDecimal(40)));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{new BigDecimal(40), new BigDecimal(40), new BigInteger("20")});
epService.getEPRuntime().sendEvent(new SupportBeanNumeric(new BigInteger("30"), new BigDecimal(50)));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{new BigDecimal(45), new BigDecimal(90), new BigInteger("50")});
stmt.destroy();
String epl = "select " +
"avedev(distinct intBoxed, boolPrimitive) as cavedev, " +
"avg(distinct intBoxed, boolPrimitive) as cavg, " +
"fmax(distinct intBoxed, boolPrimitive) as cmax, " +
"median(distinct intBoxed, boolPrimitive) as cmedian, " +
"fmin(distinct intBoxed, boolPrimitive) as cmin, " +
"stddev(distinct intBoxed, boolPrimitive) as cstddev, " +
"sum(distinct intBoxed, boolPrimitive) as csum " +
"from SupportBean.win:length(3)";
stmt = (EPStatementSPI) epService.getEPAdministrator().createEPL(epl);
stmt.addListener(listener);
runAssertionDistinct();
// test SODA
stmt.destroy();
EPStatementObjectModel model = epService.getEPAdministrator().compileEPL(epl);
assertEquals(epl, model.toEPL());
stmt = (EPStatementSPI) epService.getEPAdministrator().create(model);
stmt.addListener(listener);
assertEquals(epl, stmt.getText());
runAssertionDistinct();
}
private void runAssertionDistinct() {
String[] fields = "cavedev,cavg,cmax,cmedian,cmin,cstddev,csum".split(",");
epService.getEPRuntime().sendEvent(makeBean(100, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{0d, 100d, 100, 100d, 100, null, 100});
epService.getEPRuntime().sendEvent(makeBean(100, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{0d, 100d, 100, 100d, 100, null, 100});
epService.getEPRuntime().sendEvent(makeBean(200, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{50d, 150d, 200, 150d, 100, 70.71067811865476, 300});
epService.getEPRuntime().sendEvent(makeBean(200, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{50d, 150d, 200, 150d, 100, 70.71067811865476, 300});
epService.getEPRuntime().sendEvent(makeBean(200, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{0d, 200d, 200, 200d, 200, null, 200});
}
public void testFirstLastEver() {
String epl = "select " +
"firstever(intBoxed, boolPrimitive) as c1, " +
"lastever(intBoxed, boolPrimitive) as c2 " +
"from SupportBean.win:length(3)";
EPStatement stmt = epService.getEPAdministrator().createEPL(epl);
stmt.addListener(listener);
runAssertionFirstLastEver();
// test SODA
stmt.destroy();
EPStatementObjectModel model = epService.getEPAdministrator().compileEPL(epl);
assertEquals(epl, model.toEPL());
stmt = epService.getEPAdministrator().create(model);
stmt.addListener(listener);
assertEquals(epl, stmt.getText());
runAssertionFirstLastEver();
}
private void runAssertionFirstLastEver() {
String[] fields = "c1,c2".split(",");
epService.getEPRuntime().sendEvent(makeBean(100, false));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{null, null});
epService.getEPRuntime().sendEvent(makeBean(100, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{100, 100});
epService.getEPRuntime().sendEvent(makeBean(200, true));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{100, 200});
epService.getEPRuntime().sendEvent(makeBean(201, false));
EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), fields, new Object[]{100, 200});
}
public void testInvalid() {
tryInvalid("select count(*, intPrimitive) from SupportBean",
"Error starting statement: Invalid filter expression parameter to the aggregation function 'count' is expected to return a boolean value but returns int [select count(*, intPrimitive) from SupportBean]");
tryInvalid("select fmin(intPrimitive) from SupportBean",
"Error starting statement: MIN-filtered aggregation function must have a filter expression as a second parameter [select fmin(intPrimitive) from SupportBean]");
}
private void tryInvalid(String epl, String message) {
try {
epService.getEPAdministrator().createEPL(epl);
fail();
}
catch (EPStatementException ex) {
assertEquals(message, ex.getMessage());
}
}
private SupportBean makeBean(float floatPrimitive, double doublePrimitive, long longPrimitive, short shortPrimitive, boolean boolPrimitive) {
SupportBean sb = new SupportBean();
sb.setFloatPrimitive(floatPrimitive);
sb.setDoublePrimitive(doublePrimitive);
sb.setLongPrimitive(longPrimitive);
sb.setShortPrimitive(shortPrimitive);
sb.setBoolPrimitive(boolPrimitive);
return sb;
}
private SupportBean makeBean(Integer intBoxed, boolean boolPrimitive) {
SupportBean sb = new SupportBean();
sb.setIntBoxed(intBoxed);
sb.setBoolPrimitive(boolPrimitive);
return sb;
}
public static class BlackWhiteEvent {
private boolean black;
public BlackWhiteEvent(boolean black) {
this.black = black;
}
public boolean isBlack() {
return black;
}
}
}