/*
* *************************************************************************************
* 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.bookexample.OrderBean;
import com.espertech.esper.support.bean.SupportBean;
import com.espertech.esper.support.client.SupportConfigFactory;
import junit.framework.TestCase;
public class TestFilterPropertyNested extends TestCase
{
private EPServiceProvider epService;
private SupportUpdateListener listener;
public void setUp()
{
epService = EPServiceProviderManager.getDefaultProvider(SupportConfigFactory.getConfiguration());
epService.initialize();
listener = new SupportUpdateListener();
}
protected void tearDown() throws Exception {
listener = null;
}
public void testNamedWindowFilter()
{
String[] fields = "reviewId".split(",");
epService.getEPAdministrator().getConfiguration().addEventType("OrderEvent", OrderBean.class);
epService.getEPAdministrator().createEPL("create window OrderWindow.std:lastevent() as OrderEvent");
epService.getEPAdministrator().createEPL("insert into OrderWindow select * from OrderEvent");
String stmtText = "select reviewId from OrderWindow[books][reviews] bookReviews order by reviewId asc";
EPStatement stmt = epService.getEPAdministrator().createEPL(stmtText);
stmt.addListener(listener);
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventOne());
EPAssertionUtil.assertPropsPerRow(listener.getLastNewData(), fields, new Object[][]{{1}, {2}, {10}});
listener.reset();
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventFour());
EPAssertionUtil.assertPropsPerRow(listener.getLastNewData(), fields, new Object[][]{{201}});
listener.reset();
}
public void testNamedWindowSubquery()
{
String[] fields = "theString,totalPrice".split(",");
epService.getEPAdministrator().getConfiguration().addEventType("OrderEvent", OrderBean.class);
epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class);
epService.getEPAdministrator().createEPL("create window OrderWindow.std:lastevent() as OrderEvent");
epService.getEPAdministrator().createEPL("insert into OrderWindow select * from OrderEvent");
String stmtText = "select *, (select sum(price) from OrderWindow[books]) as totalPrice from SupportBean";
EPStatement stmt = epService.getEPAdministrator().createEPL(stmtText);
stmt.addListener(listener);
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventOne());
epService.getEPRuntime().sendEvent(new SupportBean("E1", 1));
EPAssertionUtil.assertPropsPerRow(listener.getLastNewData(), fields, new Object[][]{{"E1", 24d + 35d + 27d}});
listener.reset();
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventFour());
epService.getEPRuntime().sendEvent(new SupportBean("E2", 2));
EPAssertionUtil.assertPropsPerRow(listener.getLastNewData(), fields, new Object[][]{{"E2", 15d + 13d}});
listener.reset();
}
public void testNamedWindowOnTrigger()
{
String[] fields = "theString,intPrimitive".split(",");
epService.getEPAdministrator().getConfiguration().addEventType("OrderEvent", OrderBean.class);
epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class);
epService.getEPAdministrator().createEPL("create window SupportBeanWindow.std:lastevent() as SupportBean");
epService.getEPAdministrator().createEPL("insert into SupportBeanWindow select * from SupportBean");
epService.getEPAdministrator().createEPL("create window OrderWindow.std:lastevent() as OrderEvent");
epService.getEPAdministrator().createEPL("insert into OrderWindow select * from OrderEvent");
String stmtText = "on OrderWindow[books] owb select sbw.* from SupportBeanWindow sbw where theString = title";
EPStatement stmt = epService.getEPAdministrator().createEPL(stmtText);
stmt.addListener(listener);
epService.getEPRuntime().sendEvent(new SupportBean("E1", 1));
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventFour());
assertFalse(listener.isInvoked());
epService.getEPRuntime().sendEvent(new SupportBean("Foundation 2", 2));
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventFour());
EPAssertionUtil.assertPropsPerRow(listener.getLastNewData(), fields, new Object[][]{{"Foundation 2", 2}});
}
public void testSimple()
{
String[] fields = "reviewId".split(",");
epService.getEPAdministrator().getConfiguration().addEventType("OrderEvent", OrderBean.class);
String stmtText = "select reviewId from OrderEvent[books][reviews] bookReviews order by reviewId asc";
EPStatementSPI stmt = (EPStatementSPI) epService.getEPAdministrator().createEPL(stmtText);
assertTrue(stmt.getStatementContext().isStatelessSelect());
stmt.addListener(listener);
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventOne());
EPAssertionUtil.assertPropsPerRow(listener.getLastNewData(), fields, new Object[][]{{1}, {2}, {10}});
listener.reset();
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventFour());
EPAssertionUtil.assertPropsPerRow(listener.getLastNewData(), fields, new Object[][]{{201}});
listener.reset();
}
public void testWhere()
{
String[] fields = "reviewId".split(",");
epService.getEPAdministrator().getConfiguration().addEventType("OrderEvent", OrderBean.class);
// try where in root
String stmtText = "select reviewId from OrderEvent[books where title = 'Enders Game'][reviews] bookReviews order by reviewId asc";
EPStatement stmt = epService.getEPAdministrator().createEPL(stmtText);
stmt.addListener(listener);
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventOne());
EPAssertionUtil.assertPropsPerRow(listener.getLastNewData(), fields, new Object[][]{{1}, {2}});
listener.reset();
// try where in different levels
stmt.destroy();
stmtText = "select reviewId from OrderEvent[books where title = 'Enders Game'][reviews where reviewId in (1, 10)] bookReviews order by reviewId asc";
stmt = epService.getEPAdministrator().createEPL(stmtText);
stmt.addListener(listener);
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventOne());
EPAssertionUtil.assertPropsPerRow(listener.getLastNewData(), fields, new Object[][]{{1}});
listener.reset();
// try where in combination
stmt.destroy();
stmtText = "select reviewId from OrderEvent[books as bc][reviews as rw where rw.reviewId in (1, 10) and bc.title = 'Enders Game'] bookReviews order by reviewId asc";
stmt = epService.getEPAdministrator().createEPL(stmtText);
stmt.addListener(listener);
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventOne());
EPAssertionUtil.assertPropsPerRow(listener.getLastNewData(), fields, new Object[][]{{1}});
listener.reset();
assertFalse(listener.isInvoked());
}
public void testColumnSelect()
{
epService.getEPAdministrator().getConfiguration().addEventType("OrderEvent", OrderBean.class);
// columns supplied
String stmtText = "select * from OrderEvent[select bookId, orderdetail.orderId as orderId from books][select reviewId from reviews] bookReviews order by reviewId asc";
EPStatement stmt = epService.getEPAdministrator().createEPL(stmtText);
stmt.addListener(listener);
runAssertion();
stmt.destroy();
// stream wildcards identify fragments
stmtText = "select orderFrag.orderdetail.orderId as orderId, bookFrag.bookId as bookId, reviewFrag.reviewId as reviewId " +
"from OrderEvent[books as book][select myorder.* as orderFrag, book.* as bookFrag, review.* as reviewFrag from reviews as review] as myorder";
stmt = epService.getEPAdministrator().createEPL(stmtText);
stmt.addListener(listener);
runAssertion();
stmt.destroy();
// one event type dedicated as underlying
stmtText = "select orderdetail.orderId as orderId, bookFrag.bookId as bookId, reviewFrag.reviewId as reviewId " +
"from OrderEvent[books as book][select myorder.*, book.* as bookFrag, review.* as reviewFrag from reviews as review] as myorder";
stmt = epService.getEPAdministrator().createEPL(stmtText);
stmt.addListener(listener);
runAssertion();
stmt.destroy();
// wildcard unnamed as underlying
stmtText = "select orderFrag.orderdetail.orderId as orderId, bookId, reviewId " +
"from OrderEvent[select * from books][select myorder.* as orderFrag, reviewId from reviews as review] as myorder";
stmt = epService.getEPAdministrator().createEPL(stmtText);
stmt.addListener(listener);
runAssertion();
stmt.destroy();
// wildcard named as underlying
stmtText = "select orderFrag.orderdetail.orderId as orderId, bookFrag.bookId as bookId, reviewFrag.reviewId as reviewId " +
"from OrderEvent[select * from books as bookFrag][select myorder.* as orderFrag, review.* as reviewFrag from reviews as review] as myorder";
stmt = epService.getEPAdministrator().createEPL(stmtText);
stmt.addListener(listener);
runAssertion();
stmt.destroy();
// object model
stmtText = "select orderFrag.orderdetail.orderId as orderId, bookId, reviewId " +
"from OrderEvent[select * from books][select myorder.* as orderFrag, reviewId from reviews as review] as myorder";
EPStatementObjectModel model = epService.getEPAdministrator().compileEPL(stmtText);
assertEquals(stmtText, model.toEPL());
stmt = epService.getEPAdministrator().create(model, stmtText);
stmt.addListener(listener);
runAssertion();
stmt.destroy();
}
public void testPatternSelect()
{
epService.getEPAdministrator().getConfiguration().addEventType("OrderEvent", OrderBean.class);
epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class);
EPStatement stmt = epService.getEPAdministrator().createEPL("select * from pattern [" +
"every r=OrderEvent[books][reviews] -> SupportBean(intPrimitive = r[0].reviewId)]");
stmt.addListener(listener);
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventOne());
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventFour());
epService.getEPRuntime().sendEvent(new SupportBean("E1", 1));
assertTrue(listener.getAndClearIsInvoked());
epService.getEPRuntime().sendEvent(new SupportBean("E2", -1));
assertFalse(listener.getAndClearIsInvoked());
epService.getEPRuntime().sendEvent(new SupportBean("E2", 201));
assertTrue(listener.getAndClearIsInvoked());
}
public void testSubSelect()
{
epService.getEPAdministrator().getConfiguration().addEventType("OrderEvent", OrderBean.class);
epService.getEPAdministrator().getConfiguration().addEventType("SupportBean", SupportBean.class);
EPStatement stmt = epService.getEPAdministrator().createEPL("select theString from SupportBean s0 where " +
"exists (select * from OrderEvent[books][reviews].std:unique(reviewId) where reviewId = s0.intPrimitive)");
stmt.addListener(listener);
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventOne());
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventFour());
epService.getEPRuntime().sendEvent(new SupportBean("E1", 1));
assertTrue(listener.getAndClearIsInvoked());
epService.getEPRuntime().sendEvent(new SupportBean("E2", -1));
assertFalse(listener.getAndClearIsInvoked());
epService.getEPRuntime().sendEvent(new SupportBean("E2", 201));
assertTrue(listener.getAndClearIsInvoked());
}
public void testUnderlyingSelect()
{
String[] fields = "orderId,bookId,reviewId".split(",");
epService.getEPAdministrator().getConfiguration().addEventType("OrderEvent", OrderBean.class);
String stmtText = "select orderdetail.orderId as orderId, bookFrag.bookId as bookId, reviewFrag.reviewId as reviewId " +
//String stmtText = "select * " +
"from OrderEvent[books as book][select myorder.*, book.* as bookFrag, review.* as reviewFrag from reviews as review] as myorder";
EPStatement stmt = epService.getEPAdministrator().createEPL(stmtText);
stmt.addListener(listener);
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventOne());
EPAssertionUtil.assertPropsPerRow(listener.getLastNewData(), fields, new Object[][]{
{"PO200901", "10020", 1}, {"PO200901", "10020", 2}, {"PO200901", "10021", 10}});
listener.reset();
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventFour());
EPAssertionUtil.assertPropsPerRow(listener.getLastNewData(), fields, new Object[][]{{"PO200904", "10031", 201}});
listener.reset();
}
public void testInvalid()
{
epService.getEPAdministrator().getConfiguration().addEventType("OrderEvent", OrderBean.class);
tryInvalid("select bookId from OrderEvent[select count(*) from books]",
"Expression in a property-selection may not utilize an aggregation function [select bookId from OrderEvent[select count(*) from books]]");
tryInvalid("select bookId from OrderEvent[select bookId, (select abc from review.std:lastevent()) from books]",
"Expression in a property-selection may not utilize a subselect [select bookId from OrderEvent[select bookId, (select abc from review.std:lastevent()) from books]]");
tryInvalid("select bookId from OrderEvent[select prev(1, bookId) from books]",
"Previous function cannot be used in this context [select bookId from OrderEvent[select prev(1, bookId) from books]]");
tryInvalid("select bookId from OrderEvent[select * from books][select * from reviews]",
"A column name must be supplied for all but one stream if multiple streams are selected via the stream.* notation [select bookId from OrderEvent[select * from books][select * from reviews]]");
tryInvalid("select bookId from OrderEvent[select abc from books][reviews]",
"Property named 'abc' is not valid in any stream [select bookId from OrderEvent[select abc from books][reviews]]");
tryInvalid("select bookId from OrderEvent[books][reviews]",
"Error starting statement: Property named 'bookId' is not valid in any stream [select bookId from OrderEvent[books][reviews]]");
tryInvalid("select orderId from OrderEvent[books]",
"Error starting statement: Property named 'orderId' is not valid in any stream [select orderId from OrderEvent[books]]");
tryInvalid("select * from OrderEvent[books where abc=1]",
"Property named 'abc' is not valid in any stream [select * from OrderEvent[books where abc=1]]");
tryInvalid("select * from OrderEvent[abc]",
"Property named 'abc' is not valid in any stream [select * from OrderEvent[abc]]");
}
private void runAssertion()
{
String[] fields = "orderId,bookId,reviewId".split(",");
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventOne());
EPAssertionUtil.assertPropsPerRow(listener.getLastNewData(), fields, new Object[][]{
{"PO200901", "10020", 1}, {"PO200901", "10020", 2}, {"PO200901", "10021", 10}});
listener.reset();
epService.getEPRuntime().sendEvent(TestFilterPropertySimple.makeEventFour());
EPAssertionUtil.assertPropsPerRow(listener.getLastNewData(), fields, new Object[][]{{"PO200904", "10031", 201}});
listener.reset();
}
private void tryInvalid(String text, String message)
{
try
{
epService.getEPAdministrator().createEPL(text);
fail();
}
catch (EPStatementException ex)
{
assertEquals(message, ex.getMessage());
}
}
}