/* * ************************************************************************************* * 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.EPAssertionUtil; import com.espertech.esper.client.scopetest.SupportUpdateListener; import com.espertech.esper.client.soda.EPStatementObjectModel; import com.espertech.esper.support.bean.*; import com.espertech.esper.support.client.SupportConfigFactory; import junit.framework.TestCase; import java.util.Collections; import java.util.Map; public class TestDotExpression extends TestCase { private EPServiceProvider epService; private SupportUpdateListener listener; protected void setUp() { epService = EPServiceProviderManager.getDefaultProvider(SupportConfigFactory.getConfiguration()); epService.initialize(); listener = new SupportUpdateListener(); } protected void tearDown() throws Exception { listener = null; } public void testMapIndexPropertyRooted() { epService.getEPAdministrator().getConfiguration().addEventType(MyTypeErasure.class); EPStatement stmt = epService.getEPAdministrator().createEPL("select " + "innerTypes('key1') as c0,\n" + "innerTypes(key) as c1,\n" + "innerTypes('key1').ids[1] as c2,\n" + "innerTypes(key).getIds(subkey) as c3,\n" + "innerTypesArray[1].ids[1] as c4,\n" + "innerTypesArray(subkey).getIds(subkey) as c5\n" + "from MyTypeErasure"); stmt.addListener(listener); assertEquals(InnerType.class, stmt.getEventType().getPropertyType("c0")); assertEquals(InnerType.class, stmt.getEventType().getPropertyType("c1")); assertEquals(int.class, stmt.getEventType().getPropertyType("c2")); assertEquals(int.class, stmt.getEventType().getPropertyType("c3")); MyTypeErasure event = new MyTypeErasure("key1", 2, Collections.singletonMap("key1", new InnerType(new int[] {20, 30, 40})), new InnerType[] {new InnerType(new int[] {2, 3}), new InnerType(new int[] {4, 5}), new InnerType(new int[] {6, 7, 8})}); epService.getEPRuntime().sendEvent(event); EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), "c0,c1,c2,c3,c4,c5".split(","), new Object[] {event.getInnerTypes().get("key1"), event.getInnerTypes().get("key1"), 30, 40, 5, 8}); } public void testInvalid() { epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class); epService.getEPAdministrator().getConfiguration().addEventType("SupportChainTop", SupportChainTop.class); tryInvalid("select (abc).noSuchMethod() from SupportBean abc", "Error starting statement: Could not find enumeration method, date-time method or instance method named 'noSuchMethod' in class 'com.espertech.esper.support.bean.SupportBean' taking no parameters [select (abc).noSuchMethod() from SupportBean abc]"); tryInvalid("select (abc).getChildOne(\"abc\", 10).noSuchMethod() from SupportChainTop abc", "Error starting statement: Could not find enumeration method, date-time method or instance method named 'noSuchMethod' in class 'com.espertech.esper.support.bean.SupportChainChildOne' taking no parameters [select (abc).getChildOne(\"abc\", 10).noSuchMethod() from SupportChainTop abc]"); } public void testNestedPropertyInstanceExpr() { epService.getEPAdministrator().getConfiguration().addEventType("LevelZero", LevelZero.class); epService.getEPAdministrator().createEPL("select " + "levelOne.getCustomLevelOne(10) as val0, " + "levelOne.levelTwo.getCustomLevelTwo(20) as val1, " + "levelOne.levelTwo.levelThree.getCustomLevelThree(30) as val2 " + "from LevelZero").addListener(listener); epService.getEPRuntime().sendEvent(new LevelZero(new LevelOne(new LevelTwo(new LevelThree())))); EPAssertionUtil.assertProps(listener.assertOneGetNewAndReset(), "val0,val1,val2".split(","), new Object[]{"level1:10", "level2:20", "level3:30"}); } public void testChainedUnparameterized() { epService.getEPAdministrator().getConfiguration().addEventType("SupportBeanComplexProps", SupportBeanComplexProps.class); String epl = "select " + "(nested).getNestedValue(), " + "(nested).getNestedNested().getNestedNestedValue() " + "from SupportBeanComplexProps"; EPStatement stmt = epService.getEPAdministrator().createEPL(epl); stmt.addListener(listener); SupportBeanComplexProps bean = SupportBeanComplexProps.makeDefaultBean(); Object[][] rows = new Object[][] { {"(nested).getNestedValue()", String.class} }; for (int i = 0; i < rows.length; i++) { EventPropertyDescriptor prop = stmt.getEventType().getPropertyDescriptors()[i]; assertEquals(rows[i][0], prop.getPropertyName()); assertEquals(rows[i][1], prop.getPropertyType()); } epService.getEPRuntime().sendEvent(bean); EPAssertionUtil.assertProps(listener.assertOneGetNew(), "(nested).getNestedValue()".split(","), new Object[]{bean.getNested().getNestedValue()}); } public void testChainedParameterized() { epService.getEPAdministrator().getConfiguration().addEventType("SupportChainTop", SupportChainTop.class); String subexpr="(top).getChildOne(\"abc\", 10).getChildTwo(\"append\")"; String epl = "select " + subexpr + " from SupportChainTop as top"; EPStatement stmt = epService.getEPAdministrator().createEPL(epl); stmt.addListener(listener); runAssertionChainedParam(stmt, subexpr); listener.reset(); stmt.destroy(); EPStatementObjectModel model = epService.getEPAdministrator().compileEPL(epl); assertEquals(epl, model.toEPL()); stmt = epService.getEPAdministrator().create(model); stmt.addListener(listener); runAssertionChainedParam(stmt, subexpr); } public void testArrayPropertySizeAndGet() { epService.getEPAdministrator().getConfiguration().addEventType("SupportBeanComplexProps", SupportBeanComplexProps.class); String epl = "select " + "(arrayProperty).size() as size, " + "(arrayProperty).get(0) as get0, " + "(arrayProperty).get(1) as get1, " + "(arrayProperty).get(2) as get2, " + "(arrayProperty).get(3) as get3 " + "from SupportBeanComplexProps"; EPStatement stmt = epService.getEPAdministrator().createEPL(epl); stmt.addListener(listener); SupportBeanComplexProps bean = SupportBeanComplexProps.makeDefaultBean(); Object[][] rows = new Object[][] { {"size", Integer.class}, {"get0", int.class}, {"get1", int.class}, {"get2", int.class}, {"get3", int.class} }; for (int i = 0; i < rows.length; i++) { EventPropertyDescriptor prop = stmt.getEventType().getPropertyDescriptors()[i]; assertEquals("failed for " + rows[i][0], rows[i][0], prop.getPropertyName()); assertEquals("failed for " + rows[i][0], rows[i][1], prop.getPropertyType()); } epService.getEPRuntime().sendEvent(bean); EPAssertionUtil.assertProps(listener.assertOneGetNew(), "size,get0,get1,get2,get3".split(","), new Object[]{bean.getArrayProperty().length, bean.getArrayProperty()[0], bean.getArrayProperty()[1], bean.getArrayProperty()[2], null}); } public void testArrayPropertySizeAndGetChained() { epService.getEPAdministrator().getConfiguration().addEventType("SupportBeanCombinedProps", SupportBeanCombinedProps.class); String epl = "select " + "(abc).getArray().size() as size, " + "(abc).getArray().get(0).getNestLevOneVal() as get0 " + "from SupportBeanCombinedProps as abc"; EPStatement stmt = epService.getEPAdministrator().createEPL(epl); stmt.addListener(listener); SupportBeanCombinedProps bean = SupportBeanCombinedProps.makeDefaultBean(); Object[][] rows = new Object[][] { {"size", Integer.class}, {"get0", String.class}, }; for (int i = 0; i < rows.length; i++) { EventPropertyDescriptor prop = stmt.getEventType().getPropertyDescriptors()[i]; assertEquals(rows[i][0], prop.getPropertyName()); assertEquals(rows[i][1], prop.getPropertyType()); } epService.getEPRuntime().sendEvent(bean); EPAssertionUtil.assertProps(listener.assertOneGetNew(), "size,get0".split(","), new Object[]{bean.getArray().length, bean.getArray()[0].getNestLevOneVal()}); } private void runAssertionChainedParam(EPStatement stmt, String subexpr) { Object[][] rows = new Object[][] { {subexpr, SupportChainChildTwo.class} }; for (int i = 0; i < rows.length; i++) { EventPropertyDescriptor prop = stmt.getEventType().getPropertyDescriptors()[i]; assertEquals(rows[i][0], prop.getPropertyName()); assertEquals(rows[i][1], prop.getPropertyType()); } epService.getEPRuntime().sendEvent(new SupportChainTop()); Object result = listener.assertOneGetNewAndReset().get(subexpr); assertEquals("abcappend", ((SupportChainChildTwo)result).getText()); } private void tryInvalid(String epl, String message) { try { epService.getEPAdministrator().createEPL(epl); fail(); } catch (EPStatementException ex) { assertEquals(message, ex.getMessage()); } } public static class LevelZero { private LevelOne levelOne; private LevelZero(LevelOne levelOne) { this.levelOne = levelOne; } public LevelOne getLevelOne() { return levelOne; } } public static class LevelOne { private LevelTwo levelTwo; public LevelOne(LevelTwo levelTwo) { this.levelTwo = levelTwo; } public LevelTwo getLevelTwo() { return levelTwo; } public String getCustomLevelOne(int val) { return "level1:" + val; } } public static class LevelTwo { private LevelThree levelThree; public LevelTwo(LevelThree levelThree) { this.levelThree = levelThree; } public LevelThree getLevelThree() { return levelThree; } public String getCustomLevelTwo(int val) { return "level2:" + val; } } public static class LevelThree { public String getCustomLevelThree(int val) { return "level3:" + val; } } public static class MyTypeErasure { private String key; private int subkey; private Map<String, InnerType> innerTypes; private InnerType[] innerTypesArray; public MyTypeErasure(String key, int subkey, Map<String, InnerType> innerTypes, InnerType[] innerTypesArray) { this.key = key; this.subkey = subkey; this.innerTypes = innerTypes; this.innerTypesArray = innerTypesArray; } public Map<String, InnerType> getInnerTypes() { return innerTypes; } public String getKey() { return key; } public int getSubkey() { return subkey; } public InnerType[] getInnerTypesArray() { return innerTypesArray; } } public static class InnerType { private final int[] ids; public InnerType(int[] ids) { this.ids = ids; } public int[] getIds() { return ids; } public int getIds(int subkey) { return ids[subkey]; } } }