/* * ************************************************************************************* * 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.*; import com.espertech.esper.client.scopetest.SupportUpdateListener; import com.espertech.esper.client.soda.*; import com.espertech.esper.support.bean.SupportBean; import com.espertech.esper.support.bean.SupportBean_S0; import com.espertech.esper.support.client.SupportConfigFactory; import com.espertech.esper.util.SerializableObjectCopier; import junit.framework.TestCase; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.util.Arrays; public class TestPerRowFunc extends TestCase { private EPServiceProvider epService; private SupportUpdateListener testListener; public void setUp() { testListener = new SupportUpdateListener(); epService = EPServiceProviderManager.getDefaultProvider(SupportConfigFactory.getConfiguration()); epService.initialize(); } protected void tearDown() throws Exception { testListener = null; } public void testCoalesceBeans() { tryCoalesceBeans("select coalesce(a.theString, b.theString) as myString, coalesce(a, b) as myBean" + " from pattern [every (a=" + SupportBean.class.getName() + "(theString='s0') or b=" + SupportBean.class.getName() + "(theString='s1'))]"); tryCoalesceBeans("SELECT COALESCE(a.theString, b.theString) AS myString, COALESCE(a, b) AS myBean" + " FROM PATTERN [EVERY (a=" + SupportBean.class.getName() + "(theString='s0') OR b=" + SupportBean.class.getName() + "(theString='s1'))]"); } private void tryCoalesceBeans(String viewExpr) { epService.initialize(); EPStatement selectTestView = epService.getEPAdministrator().createEPL(viewExpr); selectTestView.addListener(testListener); SupportBean theEvent = sendEvent("s0"); EventBean eventReceived = testListener.assertOneGetNewAndReset(); assertEquals("s0", eventReceived.get("myString")); assertSame(theEvent, eventReceived.get("myBean")); theEvent = sendEvent("s1"); eventReceived = testListener.assertOneGetNewAndReset(); assertEquals("s1", eventReceived.get("myString")); assertSame(theEvent, eventReceived.get("myBean")); } public void testCoalesceLong() { EPStatement selectTestView = setupCoalesce("coalesce(longBoxed, intBoxed, shortBoxed)"); assertEquals(Long.class, selectTestView.getEventType().getPropertyType("result")); sendEvent(1L, 2, (short) 3); assertEquals(1L, testListener.assertOneGetNewAndReset().get("result")); sendBoxedEvent(null, 2, null); assertEquals(2L, testListener.assertOneGetNewAndReset().get("result")); sendBoxedEvent(null, null, Short.parseShort("3")); assertEquals(3L, testListener.assertOneGetNewAndReset().get("result")); sendBoxedEvent(null, null, null); assertEquals(null, testListener.assertOneGetNewAndReset().get("result")); } public void testCoalesceLong_OM() throws Exception { String viewExpr = "select coalesce(longBoxed, intBoxed, shortBoxed) as result" + " from " + SupportBean.class.getName() + ".win:length(1000)"; EPStatementObjectModel model = new EPStatementObjectModel(); model.setSelectClause(SelectClause.create().add(Expressions.coalesce( "longBoxed", "intBoxed", "shortBoxed"), "result")); model.setFromClause(FromClause.create(FilterStream.create(SupportBean.class.getName()).addView("win", "length", Expressions.constant(1000)))); model = (EPStatementObjectModel) SerializableObjectCopier.copy(model); assertEquals(viewExpr, model.toEPL()); epService.initialize(); EPStatement selectTestView = epService.getEPAdministrator().create(model); selectTestView.addListener(testListener); assertEquals(Long.class, selectTestView.getEventType().getPropertyType("result")); runCoalesceLong(); } public void testCoalesceLong_Compile() { String viewExpr = "select coalesce(longBoxed, intBoxed, shortBoxed) as result" + " from " + SupportBean.class.getName() + ".win:length(1000)"; EPStatementObjectModel model = epService.getEPAdministrator().compileEPL(viewExpr); assertEquals(viewExpr, model.toEPL()); epService.initialize(); EPStatement selectTestView = epService.getEPAdministrator().create(model); selectTestView.addListener(testListener); assertEquals(Long.class, selectTestView.getEventType().getPropertyType("result")); runCoalesceLong(); } private void runCoalesceLong() { sendEvent(1L, 2, (short) 3); assertEquals(1L, testListener.assertOneGetNewAndReset().get("result")); sendBoxedEvent(null, 2, null); assertEquals(2L, testListener.assertOneGetNewAndReset().get("result")); sendBoxedEvent(null, null, Short.parseShort("3")); assertEquals(3L, testListener.assertOneGetNewAndReset().get("result")); sendBoxedEvent(null, null, null); assertEquals(null, testListener.assertOneGetNewAndReset().get("result")); } public void testCoalesceDouble() { EPStatement selectTestView = setupCoalesce("coalesce(null, byteBoxed, shortBoxed, intBoxed, longBoxed, floatBoxed, doubleBoxed)"); assertEquals(Double.class, selectTestView.getEventType().getPropertyType("result")); sendEventWithDouble(null, null, null, null, null, null); assertEquals(null, testListener.assertOneGetNewAndReset().get("result")); sendEventWithDouble(null, Short.parseShort("2"), null, null, null, 1d); assertEquals(2d, testListener.assertOneGetNewAndReset().get("result")); sendEventWithDouble(null, null, null, null, null, 100d); assertEquals(100d, testListener.assertOneGetNewAndReset().get("result")); sendEventWithDouble(null, null, null, null, 10f, 100d); assertEquals(10d, testListener.assertOneGetNewAndReset().get("result")); sendEventWithDouble(null, null, 1, 5l, 10f, 100d); assertEquals(1d, testListener.assertOneGetNewAndReset().get("result")); sendEventWithDouble(Byte.parseByte("3"), null, null, null, null, null); assertEquals(3d, testListener.assertOneGetNewAndReset().get("result")); sendEventWithDouble(null, null, null, 5l, 10f, 100d); assertEquals(5d, testListener.assertOneGetNewAndReset().get("result")); } private EPStatement setupCoalesce(String coalesceExpr) { epService.initialize(); String viewExpr = "select " + coalesceExpr + " as result" + " from " + SupportBean.class.getName() + ".win:length(1000) "; EPStatement selectTestView = epService.getEPAdministrator().createEPL(viewExpr); selectTestView.addListener(testListener); return selectTestView; } public void testCoalesceInvalid() { String viewExpr = "select coalesce(null, null) as result" + " from " + SupportBean.class.getName() + ".win:length(3) "; EPStatement selectTestView = epService.getEPAdministrator().createEPL(viewExpr); assertEquals(null, selectTestView.getEventType().getPropertyType("result")); tryCoalesceInvalid("coalesce(intPrimitive)"); tryCoalesceInvalid("coalesce(intPrimitive, string)"); tryCoalesceInvalid("coalesce(intPrimitive, xxx)"); tryCoalesceInvalid("coalesce(intPrimitive, booleanBoxed)"); tryCoalesceInvalid("coalesce(charPrimitive, longBoxed)"); tryCoalesceInvalid("coalesce(charPrimitive, string, string)"); tryCoalesceInvalid("coalesce(string, longBoxed)"); tryCoalesceInvalid("coalesce(null, longBoxed, string)"); tryCoalesceInvalid("coalesce(null, null, boolBoxed, 1l)"); } private void tryCoalesceInvalid(String coalesceExpr) { String viewExpr = "select " + coalesceExpr + " as result" + " from " + SupportBean.class.getName() + ".win:length(3) "; try { epService.getEPAdministrator().createEPL(viewExpr); fail(); } catch (EPStatementException ex) { // expected } } public void testMinMaxEventType() { EPStatement selectTestView = setUpMinMax(); EventType type = selectTestView.getEventType(); log.debug(".testGetEventType properties=" + Arrays.toString(type.getPropertyNames())); assertEquals(Long.class, type.getPropertyType("myMax")); assertEquals(Long.class, type.getPropertyType("myMin")); assertEquals(Long.class, type.getPropertyType("myMinEx")); assertEquals(Long.class, type.getPropertyType("myMaxEx")); } public void testMinMaxWindowStats() { setUpMinMax(); testListener.reset(); runMinMaxWindowStats(); } public void testMinMaxWindowStats_OM() throws Exception { String viewExpr = "select max(longBoxed, intBoxed) as myMax, " + "max(longBoxed, intBoxed, shortBoxed) as myMaxEx, " + "min(longBoxed, intBoxed) as myMin, " + "min(longBoxed, intBoxed, shortBoxed) as myMinEx" + " from " + SupportBean.class.getName() + ".win:length(3)"; EPStatementObjectModel model = new EPStatementObjectModel(); model.setSelectClause(SelectClause.create() .add(Expressions.max("longBoxed", "intBoxed"), "myMax") .add(Expressions.max(Expressions.property("longBoxed"), Expressions.property("intBoxed"), Expressions.property("shortBoxed")), "myMaxEx") .add(Expressions.min("longBoxed", "intBoxed"), "myMin") .add(Expressions.min(Expressions.property("longBoxed"), Expressions.property("intBoxed"), Expressions.property("shortBoxed")), "myMinEx") ); model.setFromClause(FromClause.create(FilterStream.create(SupportBean.class.getName()).addView("win", "length", Expressions.constant(3)))); model = (EPStatementObjectModel) SerializableObjectCopier.copy(model); assertEquals(viewExpr, model.toEPL()); EPStatement selectTestView = epService.getEPAdministrator().create(model); selectTestView.addListener(testListener); testListener.reset(); runMinMaxWindowStats(); } public void testMinMaxWindowStats_Compile() throws Exception { String viewExpr = "select max(longBoxed, intBoxed) as myMax, " + "max(longBoxed, intBoxed, shortBoxed) as myMaxEx, " + "min(longBoxed, intBoxed) as myMin, " + "min(longBoxed, intBoxed, shortBoxed) as myMinEx" + " from " + SupportBean.class.getName() + ".win:length(3)"; EPStatementObjectModel model = epService.getEPAdministrator().compileEPL(viewExpr); model = (EPStatementObjectModel) SerializableObjectCopier.copy(model); assertEquals(viewExpr, model.toEPL()); EPStatement selectTestView = epService.getEPAdministrator().create(model); selectTestView.addListener(testListener); testListener.reset(); runMinMaxWindowStats(); } private void runMinMaxWindowStats() { sendEvent(10, 20, (short)4); EventBean received = testListener.getAndResetLastNewData()[0]; assertEquals(20L, received.get("myMax")); assertEquals(10L, received.get("myMin")); assertEquals(4L, received.get("myMinEx")); assertEquals(20L, received.get("myMaxEx")); sendEvent(-10, -20, (short)-30); received = testListener.getAndResetLastNewData()[0]; assertEquals(-10L, received.get("myMax")); assertEquals(-20L, received.get("myMin")); assertEquals(-30L, received.get("myMinEx")); assertEquals(-10L, received.get("myMaxEx")); } public void testOperators() { String viewExpr = "select longBoxed % intBoxed as myMod " + " from " + SupportBean.class.getName() + ".win:length(3) where not(longBoxed > intBoxed)"; EPStatement selectTestView = epService.getEPAdministrator().createEPL(viewExpr); selectTestView.addListener(testListener); sendEvent(1, 1, (short)0); assertEquals(0l, testListener.getLastNewData()[0].get("myMod")); testListener.reset(); sendEvent(2, 1, (short)0); assertFalse(testListener.getAndClearIsInvoked()); sendEvent(2, 3, (short)0); assertEquals(2l, testListener.getLastNewData()[0].get("myMod")); testListener.reset(); } public void testConcat() { String viewExpr = "select p00 || p01 as c1, p00 || p01 || p02 as c2, p00 || '|' || p01 as c3" + " from " + SupportBean_S0.class.getName() + ".win:length(10)"; EPStatement selectTestView = epService.getEPAdministrator().createEPL(viewExpr); selectTestView.addListener(testListener); epService.getEPRuntime().sendEvent(new SupportBean_S0(1, "a", "b", "c")); assertConcat("ab", "abc", "a|b"); epService.getEPRuntime().sendEvent(new SupportBean_S0(1, null, "b", "c")); assertConcat(null, null, null); epService.getEPRuntime().sendEvent(new SupportBean_S0(1, "", "b", "c")); assertConcat("b", "bc", "|b"); epService.getEPRuntime().sendEvent(new SupportBean_S0(1, "123", null, "c")); assertConcat(null, null, null); epService.getEPRuntime().sendEvent(new SupportBean_S0(1, "123", "456", "c")); assertConcat("123456", "123456c", "123|456"); epService.getEPRuntime().sendEvent(new SupportBean_S0(1, "123", "456", null)); assertConcat("123456", null, "123|456"); } private EPStatement setUpMinMax() { String viewExpr = "select max(longBoxed, intBoxed) as myMax, " + "max(longBoxed, intBoxed, shortBoxed) as myMaxEx," + "min(longBoxed, intBoxed) as myMin," + "min(longBoxed, intBoxed, shortBoxed) as myMinEx" + " from " + SupportBean.class.getName() + ".win:length(3) "; EPStatement selectTestView = epService.getEPAdministrator().createEPL(viewExpr); selectTestView.addListener(testListener); return selectTestView; } private SupportBean sendEvent(String theString) { SupportBean bean = new SupportBean(); bean.setTheString(theString); epService.getEPRuntime().sendEvent(bean); return bean; } private void sendEvent(long longBoxed, int intBoxed, short shortBoxed) { sendBoxedEvent(longBoxed, intBoxed, shortBoxed); } private void sendBoxedEvent(Long longBoxed, Integer intBoxed, Short shortBoxed) { SupportBean bean = new SupportBean(); bean.setLongBoxed(longBoxed); bean.setIntBoxed(intBoxed); bean.setShortBoxed(shortBoxed); epService.getEPRuntime().sendEvent(bean); } private void sendEventWithDouble(Byte byteBoxed, Short shortBoxed, Integer intBoxed, Long longBoxed, Float floatBoxed, Double doubleBoxed) { SupportBean bean = new SupportBean(); bean.setByteBoxed(byteBoxed); bean.setShortBoxed(shortBoxed); bean.setIntBoxed(intBoxed); bean.setLongBoxed(longBoxed); bean.setFloatBoxed(floatBoxed); bean.setDoubleBoxed(doubleBoxed); epService.getEPRuntime().sendEvent(bean); } private void assertConcat(String c1, String c2, String c3) { EventBean theEvent = testListener.getLastNewData()[0]; assertEquals(c1, theEvent.get("c1")); assertEquals(c2, theEvent.get("c2")); assertEquals(c3, theEvent.get("c3")); testListener.reset(); } private static final Log log = LogFactory.getLog(TestSelectExpr.class); }