/*
***************************************************************************************
* Copyright (C) 2006 EsperTech, Inc. All rights reserved. *
* http://www.espertech.com/esper *
* 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.event;
import com.espertech.esper.client.*;
import com.espertech.esper.client.scopetest.EPAssertionUtil;
import com.espertech.esper.client.scopetest.SupportUpdateListener;
import com.espertech.esper.metrics.instrumentation.InstrumentationHelper;
import com.espertech.esper.supportregression.client.SupportConfigFactory;
import com.espertech.esper.supportregression.bean.SupportBeanComplexProps;
import junit.framework.TestCase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
public class TestRevisionMerge extends TestCase
{
private static final Logger log = LoggerFactory.getLogger(TestRevisionMerge.class);
private EPServiceProvider epService;
private SupportUpdateListener listenerOne;
public void setUp()
{
Configuration config = SupportConfigFactory.getConfiguration();
epService = EPServiceProviderManager.getDefaultProvider(config);
epService.initialize();
if (InstrumentationHelper.ENABLED) { InstrumentationHelper.startTest(epService, this.getClass(), getName());}
listenerOne = new SupportUpdateListener();
}
protected void tearDown() throws Exception {
if (InstrumentationHelper.ENABLED) { InstrumentationHelper.endTest();}
listenerOne = null;
}
public void testMergeDeclared()
{
Map<String, Object> fullType = makeMap(new Object[][] {{"p1", String.class}, {"p2", String.class}, {"p3", String.class}, {"pf", String.class}});
epService.getEPAdministrator().getConfiguration().addEventType("FullType", fullType);
Map<String, Object> deltaType = makeMap(new Object[][] {{"p1", String.class}, {"p2", String.class}, {"p3", String.class}, {"pd", String.class}});
epService.getEPAdministrator().getConfiguration().addEventType("DeltaType", deltaType);
ConfigurationRevisionEventType revEvent = new ConfigurationRevisionEventType();
revEvent.addNameBaseEventType("FullType");
revEvent.addNameDeltaEventType("DeltaType");
revEvent.setPropertyRevision(ConfigurationRevisionEventType.PropertyRevision.MERGE_DECLARED);
revEvent.setKeyPropertyNames(new String[] {"p1"});
epService.getEPAdministrator().getConfiguration().addRevisionEventType("MyExistsRevision", revEvent);
epService.getEPAdministrator().createEPL("create window MyWin#time(10 sec) as select * from MyExistsRevision");
epService.getEPAdministrator().createEPL("insert into MyWin select * from FullType");
epService.getEPAdministrator().createEPL("insert into MyWin select * from DeltaType");
String[] fields = "p1,p2,p3,pf,pd".split(",");
EPStatement consumerOne = epService.getEPAdministrator().createEPL("select irstream * from MyWin");
consumerOne.addListener(listenerOne);
EPAssertionUtil.assertEqualsAnyOrder(consumerOne.getEventType().getPropertyNames(), fields);
epService.getEPRuntime().sendEvent(makeMap("p1,p2,p3,pf","10,20,30,f0"), "FullType");
EPAssertionUtil.assertProps(listenerOne.assertOneGetNewAndReset(), fields, new Object[]{"10", "20", "30", "f0", null});
epService.getEPRuntime().sendEvent(makeMap("p1,p2","10,21"), "DeltaType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "20", "30", "f0", null});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", "21", null, "f0", null});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p3,pf","10,32,f1"), "FullType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "21", null, "f0", null});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", null, "32", "f1", null});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p3,pd","10,33,pd3"), "DeltaType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", null, "32", "f1", null});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", null, "33", "f1", "pd3"});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p2,p3,pf","10,22,34,f2"), "FullType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", null, "33", "f1", "pd3"});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", "22", "34", "f2", "pd3"});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1","10"), "FullType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "22", "34", "f2", "pd3"});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", null, null, null, "pd3"});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p2,p3,pf,pd", "10,23,35,pfx,pd4"), "DeltaType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", null, null, null, "pd3"});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", "23", "35", null, "pd4"});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p2", "10,null"), "DeltaType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "23", "35", null, "pd4"});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", null, null, null, null});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p3,pd,pf","10,36,pdx,f4"), "FullType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", null, null, null, null});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", null, "36", "f4", null});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p3,pd", "10,null,pd5"), "DeltaType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", null, "36", "f4", null});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", null, null, "f4", "pd5"});
listenerOne.reset();
}
public void testMergeNonNull()
{
Map<String, Object> fullType = makeMap(new Object[][] {{"p1", String.class}, {"p2", String.class}, {"p3", String.class}, {"pf", String.class}});
epService.getEPAdministrator().getConfiguration().addEventType("FullType", fullType);
Map<String, Object> deltaType = makeMap(new Object[][] {{"p1", String.class}, {"p2", String.class}, {"p3", String.class}, {"pd", String.class}});
epService.getEPAdministrator().getConfiguration().addEventType("DeltaType", deltaType);
ConfigurationRevisionEventType revEvent = new ConfigurationRevisionEventType();
revEvent.addNameBaseEventType("FullType");
revEvent.addNameDeltaEventType("DeltaType");
revEvent.setPropertyRevision(ConfigurationRevisionEventType.PropertyRevision.MERGE_NON_NULL);
revEvent.setKeyPropertyNames(new String[] {"p1"});
epService.getEPAdministrator().getConfiguration().addRevisionEventType("MyExistsRevision", revEvent);
epService.getEPAdministrator().createEPL("create window MyWin#time(10 sec) as select * from MyExistsRevision");
epService.getEPAdministrator().createEPL("insert into MyWin select * from FullType");
epService.getEPAdministrator().createEPL("insert into MyWin select * from DeltaType");
String[] fields = "p1,p2,p3,pf,pd".split(",");
EPStatement consumerOne = epService.getEPAdministrator().createEPL("select irstream * from MyWin");
consumerOne.addListener(listenerOne);
EPAssertionUtil.assertEqualsAnyOrder(consumerOne.getEventType().getPropertyNames(), fields);
epService.getEPRuntime().sendEvent(makeMap("p1,p2,p3,pf","10,20,30,f0"), "FullType");
EPAssertionUtil.assertProps(listenerOne.assertOneGetNewAndReset(), fields, new Object[]{"10", "20", "30", "f0", null});
epService.getEPRuntime().sendEvent(makeMap("p1,p2","10,21"), "DeltaType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "20", "30", "f0", null});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", "21", "30", "f0", null});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p3,pf","10,32,f1"), "FullType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "21", "30", "f0", null});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", "21", "32", "f1", null});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p3,pd","10,33,pd3"), "DeltaType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "21", "32", "f1", null});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", "21", "33", "f1", "pd3"});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p2,p3,pf","10,22,34,f2"), "FullType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "21", "33", "f1", "pd3"});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", "22", "34", "f2", "pd3"});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1","10"), "FullType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "22", "34", "f2", "pd3"});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", "22", "34", "f2", "pd3"});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p2,p3,pf,pd", "10,23,35,pfx,pd4"), "DeltaType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "22", "34", "f2", "pd3"});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", "23", "35", "f2", "pd4"});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p2", "10,null"), "DeltaType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "23", "35", "f2", "pd4"});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", "23", "35", "f2", "pd4"});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p3,pd,pf","10,36,pdx,f4"), "FullType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "23", "35", "f2", "pd4"});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", "23", "36", "f4", "pd4"});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p3,pd", "10,null,pd5"), "DeltaType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "23", "36", "f4", "pd4"});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", "23", "36", "f4", "pd5"});
listenerOne.reset();
}
public void testMergeExists()
{
Map<String, Object> fullType = makeMap(new Object[][] {{"p1", String.class}, {"p2", String.class}, {"p3", String.class}, {"pf", String.class}});
epService.getEPAdministrator().getConfiguration().addEventType("FullType", fullType);
Map<String, Object> deltaType = makeMap(new Object[][] {{"p1", String.class}, {"p2", String.class}, {"p3", String.class}, {"pd", String.class}});
epService.getEPAdministrator().getConfiguration().addEventType("DeltaType", deltaType);
ConfigurationRevisionEventType revEvent = new ConfigurationRevisionEventType();
revEvent.addNameBaseEventType("FullType");
revEvent.addNameDeltaEventType("DeltaType");
revEvent.setPropertyRevision(ConfigurationRevisionEventType.PropertyRevision.MERGE_EXISTS);
revEvent.setKeyPropertyNames(new String[] {"p1"});
epService.getEPAdministrator().getConfiguration().addRevisionEventType("MyExistsRevision", revEvent);
epService.getEPAdministrator().createEPL("create window MyWin#time(10 sec) as select * from MyExistsRevision");
epService.getEPAdministrator().createEPL("insert into MyWin select * from FullType");
epService.getEPAdministrator().createEPL("insert into MyWin select * from DeltaType");
String[] fields = "p1,p2,p3,pf,pd".split(",");
EPStatement consumerOne = epService.getEPAdministrator().createEPL("select irstream * from MyWin");
consumerOne.addListener(listenerOne);
EPAssertionUtil.assertEqualsAnyOrder(consumerOne.getEventType().getPropertyNames(), fields);
epService.getEPRuntime().sendEvent(makeMap("p1,p2,p3,pf","10,20,30,f0"), "FullType");
EPAssertionUtil.assertProps(listenerOne.assertOneGetNewAndReset(), fields, new Object[]{"10", "20", "30", "f0", null});
epService.getEPRuntime().sendEvent(makeMap("p1,p2","10,21"), "DeltaType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "20", "30", "f0", null});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", "21", "30", "f0", null});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p3,pf","10,32,f1"), "FullType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "21", "30", "f0", null});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", "21", "32", "f1", null});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p3,pd","10,33,pd3"), "DeltaType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "21", "32", "f1", null});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", "21", "33", "f1", "pd3"});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p2,p3,pf","10,22,34,f2"), "FullType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "21", "33", "f1", "pd3"});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", "22", "34", "f2", "pd3"});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1","10"), "FullType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "22", "34", "f2", "pd3"});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", "22", "34", "f2", "pd3"});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p2,p3,pf,pd", "10,23,35,pfx,pd4"), "DeltaType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "22", "34", "f2", "pd3"});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", "23", "35", "f2", "pd4"});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p2", "10,null"), "DeltaType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", "23", "35", "f2", "pd4"});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", null, "35", "f2", "pd4"});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p3,pd,pf","10,36,pdx,f4"), "FullType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", null, "35", "f2", "pd4"});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", null, "36", "f4", "pd4"});
listenerOne.reset();
epService.getEPRuntime().sendEvent(makeMap("p1,p3,pd", "10,null,pd5"), "DeltaType");
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"10", null, "36", "f4", "pd4"});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"10", null, null, "f4", "pd5"});
listenerOne.reset();
}
public void testNestedPropertiesNoDelta()
{
epService.getEPAdministrator().getConfiguration().addEventType("Nested", SupportBeanComplexProps.class);
ConfigurationRevisionEventType revEvent = new ConfigurationRevisionEventType();
revEvent.addNameBaseEventType("Nested");
revEvent.setPropertyRevision(ConfigurationRevisionEventType.PropertyRevision.MERGE_DECLARED);
revEvent.setKeyPropertyNames(new String[] {"simpleProperty"});
epService.getEPAdministrator().getConfiguration().addRevisionEventType("NestedRevision", revEvent);
epService.getEPAdministrator().createEPL("create window MyWin#time(10 sec) as select * from NestedRevision");
epService.getEPAdministrator().createEPL("insert into MyWin select * from Nested");
String[] fields = "key,f1".split(",");
String stmtText = "select irstream simpleProperty as key, nested.nestedValue as f1 from MyWin";
EPStatement consumerOne = epService.getEPAdministrator().createEPL(stmtText);
consumerOne.addListener(listenerOne);
EPAssertionUtil.assertEqualsAnyOrder(consumerOne.getEventType().getPropertyNames(), fields);
epService.getEPRuntime().sendEvent(SupportBeanComplexProps.makeDefaultBean());
EPAssertionUtil.assertProps(listenerOne.assertOneGetNewAndReset(), fields, new Object[]{"simple", "nestedValue"});
SupportBeanComplexProps bean = SupportBeanComplexProps.makeDefaultBean();
bean.getNested().setNestedValue("val2");
epService.getEPRuntime().sendEvent(bean);
EPAssertionUtil.assertProps(listenerOne.getLastOldData()[0], fields, new Object[]{"simple", "nestedValue"});
EPAssertionUtil.assertProps(listenerOne.getLastNewData()[0], fields, new Object[]{"simple", "val2"});
listenerOne.reset();
}
private Map<String, Object> makeMap(Object[][] entries)
{
Map result = new HashMap<String, Object>();
for (int i = 0; i < entries.length; i++)
{
result.put(entries[i][0], entries[i][1]);
}
return result;
}
private Map<String, Object> makeMap(String keysList, String valuesList)
{
String[] keys = keysList.split(",");
String[] values = valuesList.split(",");
Map result = new HashMap<String, Object>();
for (int i = 0; i < keys.length; i++)
{
if (values[i].equals("null"))
{
result.put(keys[i], null);
}
else
{
result.put(keys[i], values[i]);
}
}
return result;
}
}