/*
***************************************************************************************
* 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.view.std;
import com.espertech.esper.client.EPException;
import com.espertech.esper.client.EventBean;
import com.espertech.esper.core.context.util.AgentInstanceViewFactoryChainContext;
import com.espertech.esper.core.service.StatementContext;
import com.espertech.esper.core.support.SupportStatementContextFactory;
import com.espertech.esper.epl.expression.core.ExprNode;
import com.espertech.esper.epl.expression.core.ExprNodeUtility;
import com.espertech.esper.supportunit.bean.SupportMarketDataBean;
import com.espertech.esper.supportunit.epl.SupportExprNodeFactory;
import com.espertech.esper.supportunit.event.SupportEventBeanFactory;
import com.espertech.esper.supportunit.event.SupportEventTypeFactory;
import com.espertech.esper.supportunit.view.SupportBeanClassView;
import com.espertech.esper.supportunit.view.SupportMapView;
import com.espertech.esper.supportunit.view.SupportStreamImpl;
import com.espertech.esper.supportunit.view.SupportViewDataChecker;
import com.espertech.esper.view.EventStream;
import junit.framework.TestCase;
public class TestGroupByView extends TestCase {
private GroupByView myGroupByView;
private SupportBeanClassView ultimateChildView;
private StatementContext statementContext;
private AgentInstanceViewFactoryChainContext agentInstanceContext;
public void setUp() throws Exception {
statementContext = SupportStatementContextFactory.makeContext();
agentInstanceContext = SupportStatementContextFactory.makeAgentInstanceViewFactoryContext();
ExprNode[] expressions = SupportExprNodeFactory.makeIdentNodesMD("symbol");
myGroupByView = new GroupByViewImpl(agentInstanceContext, expressions, ExprNodeUtility.getEvaluators(expressions));
SupportBeanClassView childView = new SupportBeanClassView(SupportMarketDataBean.class);
MergeView myMergeView = new MergeView(agentInstanceContext, SupportExprNodeFactory.makeIdentNodesMD("symbol"), SupportEventTypeFactory.createBeanType(SupportMarketDataBean.class), false);
ultimateChildView = new SupportBeanClassView(SupportMarketDataBean.class);
// This is the view hierarchy
myGroupByView.addView(childView);
childView.addView(myMergeView);
myMergeView.addView(ultimateChildView);
SupportBeanClassView.getInstances().clear();
}
public void testViewPush() {
// Reset instance lists of child views
SupportBeanClassView.getInstances().clear();
SupportMapView.getInstances().clear();
// Set up a feed for the view under test - it will have a depth of 3 trades
SupportStreamImpl stream = new SupportStreamImpl(SupportMarketDataBean.class, 3);
stream.addView(myGroupByView);
EventBean[] tradeBeans = new EventBean[10];
// Send an IBM symbol event
tradeBeans[0] = makeTradeBean("IBM", 70);
stream.insert(tradeBeans[0]);
// Expect 1 new beanclass view instance and check its data
assertEquals(1, SupportBeanClassView.getInstances().size());
SupportBeanClassView child_1 = SupportBeanClassView.getInstances().get(0);
SupportViewDataChecker.checkOldData(child_1, null);
SupportViewDataChecker.checkNewData(child_1, new EventBean[]{tradeBeans[0]});
// Check the data of the ultimate receiver
SupportViewDataChecker.checkOldData(ultimateChildView, null);
SupportViewDataChecker.checkNewData(ultimateChildView, new EventBean[]{tradeBeans[0]});
}
public void testUpdate() {
// Set up a feed for the view under test - it will have a depth of 3 trades
SupportStreamImpl stream = new SupportStreamImpl(SupportMarketDataBean.class, 3);
stream.addView(myGroupByView);
// Send old a new events
EventBean[] newEvents = new EventBean[]{makeTradeBean("IBM", 70), makeTradeBean("GE", 10)};
EventBean[] oldEvents = new EventBean[]{makeTradeBean("IBM", 65), makeTradeBean("GE", 9)};
myGroupByView.update(newEvents, oldEvents);
assertEquals(2, SupportBeanClassView.getInstances().size());
SupportBeanClassView child_1 = SupportBeanClassView.getInstances().get(0);
SupportBeanClassView child_2 = SupportBeanClassView.getInstances().get(1);
SupportViewDataChecker.checkOldData(child_1, new EventBean[]{oldEvents[0]});
SupportViewDataChecker.checkNewData(child_1, new EventBean[]{newEvents[0]});
SupportViewDataChecker.checkOldData(child_2, new EventBean[]{oldEvents[1]});
SupportViewDataChecker.checkNewData(child_2, new EventBean[]{newEvents[1]});
newEvents = new EventBean[]{makeTradeBean("IBM", 71), makeTradeBean("GE", 11)};
oldEvents = new EventBean[]{makeTradeBean("IBM", 70), makeTradeBean("GE", 10)};
myGroupByView.update(newEvents, oldEvents);
SupportViewDataChecker.checkOldData(child_1, new EventBean[]{oldEvents[0]});
SupportViewDataChecker.checkNewData(child_1, new EventBean[]{newEvents[0]});
SupportViewDataChecker.checkOldData(child_2, new EventBean[]{oldEvents[1]});
SupportViewDataChecker.checkNewData(child_2, new EventBean[]{newEvents[1]});
}
public void testInvalid() {
try {
myGroupByView.iterator();
assertTrue(false);
} catch (UnsupportedOperationException ex) {
// Expected exception
}
}
public void testMakeSubviews() throws Exception {
EventStream eventStream = new SupportStreamImpl(SupportMarketDataBean.class, 4);
ExprNode[] expressions = SupportExprNodeFactory.makeIdentNodesMD("symbol");
GroupByView groupView = new GroupByViewImpl(agentInstanceContext, expressions, ExprNodeUtility.getEvaluators(expressions));
eventStream.addView(groupView);
Object[] groupByValue = new Object[]{"IBM"};
// Invalid for no child nodes
try {
GroupByViewImpl.makeSubViews(groupView, "symbol".split(","), groupByValue, agentInstanceContext);
assertTrue(false);
} catch (EPException ex) {
// Expected exception
}
// Invalid for child node is a merge node - doesn't make sense to group and merge only
MergeView mergeViewOne = new MergeView(agentInstanceContext, SupportExprNodeFactory.makeIdentNodesMD("symbol"), null, false);
groupView.addView(mergeViewOne);
try {
GroupByViewImpl.makeSubViews(groupView, "symbol".split(","), groupByValue, agentInstanceContext);
assertTrue(false);
} catch (EPException ex) {
// Expected exception
}
// Add a size view parent of merge view
groupView = new GroupByViewImpl(agentInstanceContext, expressions, ExprNodeUtility.getEvaluators(expressions));
FirstElementView firstElementView_1 = new FirstElementView(null);
groupView.addView(firstElementView_1);
groupView.setParent(eventStream);
mergeViewOne = new MergeView(agentInstanceContext, SupportExprNodeFactory.makeIdentNodesMD("symbol"), null, false);
firstElementView_1.addView(mergeViewOne);
Object subViews = GroupByViewImpl.makeSubViews(groupView, "symbol".split(","), groupByValue, agentInstanceContext);
assertTrue(subViews instanceof FirstElementView);
assertTrue(subViews != firstElementView_1);
FirstElementView firstEleView = (FirstElementView) subViews;
assertEquals(1, firstEleView.getViews().length);
assertTrue(firstEleView.getViews()[0] instanceof AddPropertyValueOptionalView);
AddPropertyValueOptionalView md = (AddPropertyValueOptionalView) firstEleView.getViews()[0];
assertEquals(1, md.getViews().length);
assertTrue(md.getViews()[0] == mergeViewOne);
}
private EventBean makeTradeBean(String symbol, int price) {
SupportMarketDataBean bean = new SupportMarketDataBean(symbol, price, 0L, "");
return SupportEventBeanFactory.createObject(bean);
}
}