/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.siddhi.core.query.partition;
import org.apache.log4j.Logger;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.wso2.siddhi.core.ExecutionPlanRuntime;
import org.wso2.siddhi.core.SiddhiManager;
import org.wso2.siddhi.core.event.Event;
import org.wso2.siddhi.core.stream.input.InputHandler;
import org.wso2.siddhi.core.stream.output.StreamCallback;
import org.wso2.siddhi.core.util.EventPrinter;
import org.wso2.siddhi.core.util.SiddhiTestHelper;
import java.util.concurrent.atomic.AtomicInteger;
public class JoinPartitionTestCase {
private static final Logger log = Logger.getLogger(JoinPartitionTestCase.class);
private AtomicInteger count = new AtomicInteger(0);
private boolean eventArrived;
@Before
public void init() {
count.set(0);
eventArrived = false;
}
@Test
public void testJoinPartition1() throws InterruptedException {
log.info("Join partition test1");
SiddhiManager siddhiManager = new SiddhiManager();
String executionPlan = "define stream cseEventStream (symbol string, user string,volume int); define stream " +
"twitterStream (user string, tweet string, company string);"
+ "partition with (user of cseEventStream, user of twitterStream) begin @info(name = 'query1') " +
"from cseEventStream#window.time(1 sec) join twitterStream#window.time(1 sec) " +
"on cseEventStream.symbol== twitterStream.company " +
"select cseEventStream.symbol as symbol, twitterStream.tweet, cseEventStream.volume " +
"insert all events into outputStream ;" + "" +
"end ";
ExecutionPlanRuntime executionPlanRuntime = siddhiManager.createExecutionPlanRuntime(executionPlan);
executionPlanRuntime.addCallback("outputStream", new StreamCallback() {
@Override
public void receive(Event[] events) {
EventPrinter.print(events);
count.addAndGet(events.length);
eventArrived = true;
}
});
InputHandler cseEventStreamHandler = executionPlanRuntime.getInputHandler("cseEventStream");
InputHandler twitterStreamHandler = executionPlanRuntime.getInputHandler("twitterStream");
executionPlanRuntime.start();
cseEventStreamHandler.send(new Object[]{"WSO2", "User1", 100});
twitterStreamHandler.send(new Object[]{"User1", "Hello World", "WSO2"});
twitterStreamHandler.send(new Object[]{"User1", "Hellno World", "WSO2"});
SiddhiTestHelper.waitForEvents(100, 4, count, 6000);
Assert.assertEquals(4, count.get());
executionPlanRuntime.shutdown();
}
@Test
public void testJoinPartition2() throws InterruptedException {
log.info("Join partition test2");
SiddhiManager siddhiManager = new SiddhiManager();
String executionPlan = "define stream cseEventStream (symbol string, user string,volume int); define stream " +
"twitterStream (user string, tweet string, company string);"
+ "partition with (user of cseEventStream, user of twitterStream) begin @info(name = 'query1') " +
"from cseEventStream#window.time(1 sec) join twitterStream#window.time(1 sec) " +
"on cseEventStream.symbol== twitterStream.company " +
"select cseEventStream.symbol as symbol, cseEventStream.user as user,twitterStream.tweet, " +
"cseEventStream.volume " +
"insert all events into outputStream ;" + "" +
"end ";
ExecutionPlanRuntime executionPlanRuntime = siddhiManager.createExecutionPlanRuntime(executionPlan);
executionPlanRuntime.addCallback("outputStream", new StreamCallback() {
@Override
public void receive(Event[] events) {
EventPrinter.print(events);
count.addAndGet(events.length);
eventArrived = true;
}
});
InputHandler cseEventStreamHandler = executionPlanRuntime.getInputHandler("cseEventStream");
InputHandler twitterStreamHandler = executionPlanRuntime.getInputHandler("twitterStream");
executionPlanRuntime.start();
cseEventStreamHandler.send(new Object[]{"WSO2", "User1", 100});
twitterStreamHandler.send(new Object[]{"User1", "Hello World", "WSO2"});
twitterStreamHandler.send(new Object[]{"User1", "World", "WSO2"});
cseEventStreamHandler.send(new Object[]{"IBM", "User2", 100});
twitterStreamHandler.send(new Object[]{"User2", "Hello World", "IBM"});
twitterStreamHandler.send(new Object[]{"User2", "World", "IBM"});
SiddhiTestHelper.waitForEvents(1000, 8, count, 12000);
Assert.assertEquals(8, count.get());
executionPlanRuntime.shutdown();
}
@Test
public void testJoinPartition3() throws InterruptedException {
log.info("Join partition test3");
SiddhiManager siddhiManager = new SiddhiManager();
String executionPlan = "define stream cseEventStream (symbol string, user string,volume int); define stream " +
"twitterStream (user string, tweet string, company string);"
+ "partition with (user of cseEventStream, user of twitterStream) begin @info(name = 'query1') " +
"from cseEventStream#window.time(1 sec) join twitterStream#window.time(1 sec) " +
"on cseEventStream.symbol== twitterStream.company " +
"select cseEventStream.symbol as symbol, cseEventStream.user as user,twitterStream.tweet, " +
"cseEventStream.volume " +
"insert all events into #outputStream ;" +
"@info(name = 'query2') from #outputStream select symbol,user insert all events into outStream;" +
"end ";
ExecutionPlanRuntime executionPlanRuntime = siddhiManager.createExecutionPlanRuntime(executionPlan);
executionPlanRuntime.addCallback("outStream", new StreamCallback() {
@Override
public void receive(Event[] events) {
EventPrinter.print(events);
count.addAndGet(events.length);
eventArrived = true;
}
});
InputHandler cseEventStreamHandler = executionPlanRuntime.getInputHandler("cseEventStream");
InputHandler twitterStreamHandler = executionPlanRuntime.getInputHandler("twitterStream");
executionPlanRuntime.start();
cseEventStreamHandler.send(new Object[]{"WSO2", "User1", 100});
twitterStreamHandler.send(new Object[]{"User1", "Hello World", "WSO2"});
twitterStreamHandler.send(new Object[]{"User1", "World", "WSO2"});
cseEventStreamHandler.send(new Object[]{"IBM", "User2", 100});
twitterStreamHandler.send(new Object[]{"User2", "Hello World", "IBM"});
twitterStreamHandler.send(new Object[]{"User2", "World", "IBM"});
SiddhiTestHelper.waitForEvents(100, 8, count, 6000);
Assert.assertEquals(8, count.get());
Assert.assertTrue(eventArrived);
executionPlanRuntime.shutdown();
}
@Test
public void testJoinPartition4() throws InterruptedException {
log.info("Join partition test4");
SiddhiManager siddhiManager = new SiddhiManager();
String executionPlan = "define stream cseEventStream (symbol string, user string,volume int); define stream " +
"twitterStream (user string, tweet string, company string);"
+ "partition with (user of cseEventStream, user of twitterStream) begin @info(name = 'query1') " +
"from cseEventStream#window.time(1 sec) join twitterStream#window.time(1 sec) " +
"on cseEventStream.symbol== twitterStream.company " +
"select cseEventStream.symbol as symbol, cseEventStream.user as user,twitterStream.tweet, " +
"cseEventStream.volume " +
"insert all events into #outputStream ;" +
"@info(name = 'query2') from #outputStream select symbol,user insert all events into outputStream;" +
"end ";
ExecutionPlanRuntime executionPlanRuntime = siddhiManager.createExecutionPlanRuntime(executionPlan);
executionPlanRuntime.addCallback("outputStream", new StreamCallback() {
@Override
public void receive(Event[] events) {
EventPrinter.print(events);
count.addAndGet(events.length);
eventArrived = true;
}
});
InputHandler cseEventStreamHandler = executionPlanRuntime.getInputHandler("cseEventStream");
InputHandler twitterStreamHandler = executionPlanRuntime.getInputHandler("twitterStream");
InputHandler outputStreamStreamHandler = executionPlanRuntime.getInputHandler("outputStream");
executionPlanRuntime.start();
cseEventStreamHandler.send(new Object[]{"WSO2", "User1", 100});
twitterStreamHandler.send(new Object[]{"User1", "Hello World", "WSO2"});
twitterStreamHandler.send(new Object[]{"User1", "World", "WSO2"});
cseEventStreamHandler.send(new Object[]{"IBM", "User1", 100});
twitterStreamHandler.send(new Object[]{"User1", "Hello World", "IBM"});
twitterStreamHandler.send(new Object[]{"User1", "World", "IBM"});
outputStreamStreamHandler.send(new Object[]{"GOOG", "new_user_1"});
outputStreamStreamHandler.send(new Object[]{"GOOG", "new_user_2"});
SiddhiTestHelper.waitForEvents(100, 10, count, 6000);
Assert.assertEquals(10, count.get());
executionPlanRuntime.shutdown();
}
@Test
public void testJoinPartition5() throws InterruptedException {
log.info("Join partition test5");
SiddhiManager siddhiManager = new SiddhiManager();
String executionPlan = "" +
"" +
"define stream cseEventStream (symbol string, user string,volume int); " +
"" +
"define stream twitterStream (user string, tweet string, company string);" +
" " +
"partition with (user of cseEventStream) begin " +
"@info(name = 'query2') from cseEventStream select symbol, user, sum(volume) as volume insert all " +
"events into #cseInnerStream;" +
"@info(name = 'query1') from #cseInnerStream#window.time(1 sec) join twitterStream#window.time(1 sec)" +
" " +
"on twitterStream.company== #cseInnerStream.symbol " +
"select #cseInnerStream.user as user,twitterStream.tweet as tweet, twitterStream.company, " +
"#cseInnerStream.volume , #cseInnerStream.symbol " +
"insert all events into outputStream ;" +
"end ";
ExecutionPlanRuntime executionPlanRuntime = siddhiManager.createExecutionPlanRuntime(executionPlan);
executionPlanRuntime.addCallback("outputStream", new StreamCallback() {
@Override
public void receive(Event[] events) {
EventPrinter.print(events);
count.addAndGet(events.length);
eventArrived = true;
}
});
InputHandler cseEventStreamHandler = executionPlanRuntime.getInputHandler("cseEventStream");
InputHandler twitterStreamHandler = executionPlanRuntime.getInputHandler("twitterStream");
executionPlanRuntime.start();
cseEventStreamHandler.send(new Object[]{"WSO2", "User1", 200});
cseEventStreamHandler.send(new Object[]{"IBM", "User2", 500});
twitterStreamHandler.send(new Object[]{"User1", "Hello World", "WSO2"});
twitterStreamHandler.send(new Object[]{"User1", "Hello World", "IBM"});
twitterStreamHandler.send(new Object[]{"User3", "Hello World", "GOOG"});
SiddhiTestHelper.waitForEvents(100, 4, count, 6000);
Assert.assertEquals(4, count.get());
Assert.assertTrue(eventArrived);
executionPlanRuntime.shutdown();
}
@Test
public void testJoinPartition6() throws InterruptedException {
log.info("Join partition test6");
SiddhiManager siddhiManager = new SiddhiManager();
String executionPlan = "define stream cseEventStream (symbol string, user string,volume int); define stream " +
"twitterStream (user string, tweet string, company string);"
+ "partition with (user of cseEventStream) begin " +
"@info(name = 'query2') from cseEventStream select symbol, user, sum(volume) as volume insert all " +
"events into #cseEventStream;" +
"@info(name = 'query1') from #cseEventStream#window.time(1 sec) join twitterStream#window.time(1 sec)" +
" " +
"on twitterStream.company== #cseEventStream.symbol " +
"select #cseEventStream.user as user,twitterStream.tweet as tweet, twitterStream.company, " +
"#cseEventStream.volume , #cseEventStream.symbol " +
"insert all events into outputStream ;" +
"end ";
ExecutionPlanRuntime executionPlanRuntime = siddhiManager.createExecutionPlanRuntime(executionPlan);
executionPlanRuntime.addCallback("outputStream", new StreamCallback() {
@Override
public void receive(Event[] events) {
EventPrinter.print(events);
count.addAndGet(events.length);
eventArrived = true;
}
});
InputHandler cseEventStreamHandler = executionPlanRuntime.getInputHandler("cseEventStream");
InputHandler twitterStreamHandler = executionPlanRuntime.getInputHandler("twitterStream");
executionPlanRuntime.start();
cseEventStreamHandler.send(new Object[]{"WSO2", "User1", 200});
cseEventStreamHandler.send(new Object[]{"IBM", "User2", 500});
twitterStreamHandler.send(new Object[]{"User1", "Hello World", "IBM"});
twitterStreamHandler.send(new Object[]{"User1", "Hello World", "WSO2"});
SiddhiTestHelper.waitForEvents(100, 4, count, 6000);
Assert.assertEquals(4, count.get());
Assert.assertTrue(eventArrived);
executionPlanRuntime.shutdown();
}
@Test
public void testJoinPartition7() throws InterruptedException {
log.info("Join partition test7");
SiddhiManager siddhiManager = new SiddhiManager();
String executionPlan = "define stream cseEventStream (symbol string, user string,volume int); define stream " +
"twitterStream (user string, tweet string, company string, volume int);"
+ "partition with (volume>=100 as 'large' or volume<100 as 'small' of cseEventStream, volume>=100 as " +
"'large' or volume<100 as 'small' of twitterStream) begin @info(name = 'query1') " +
"from cseEventStream#window.time(1 sec) join twitterStream#window.time(1 sec) " +
"on cseEventStream.user== twitterStream.user " +
"select cseEventStream.symbol as symbol, cseEventStream.user as user,twitterStream.tweet, " +
"cseEventStream.volume,twitterStream.company " +
"insert all events into outputStream;" +
"end ";
ExecutionPlanRuntime executionPlanRuntime = siddhiManager.createExecutionPlanRuntime(executionPlan);
executionPlanRuntime.addCallback("outputStream", new StreamCallback() {
@Override
public void receive(Event[] events) {
EventPrinter.print(events);
count.addAndGet(events.length);
eventArrived = true;
}
});
InputHandler cseEventStreamHandler = executionPlanRuntime.getInputHandler("cseEventStream");
InputHandler twitterStreamHandler = executionPlanRuntime.getInputHandler("twitterStream");
executionPlanRuntime.start();
cseEventStreamHandler.send(new Object[]{"WSO2", "User1", 200});
twitterStreamHandler.send(new Object[]{"User1", "Hello World", "WSO2", 200});
twitterStreamHandler.send(new Object[]{"User1", "World", "WSO2", 200});
cseEventStreamHandler.send(new Object[]{"IBM", "User1", 10});
twitterStreamHandler.send(new Object[]{"User1", "Hello World", "WSO2", 10});
twitterStreamHandler.send(new Object[]{"User1", "World", "IBM", 10});
SiddhiTestHelper.waitForEvents(100, 8, count, 6000);
Assert.assertEquals(8, count.get());
Assert.assertTrue(eventArrived);
executionPlanRuntime.shutdown();
}
@Test
public void testJoinPartition8() throws InterruptedException {
log.info("Join partition test8");
SiddhiManager siddhiManager = new SiddhiManager();
String executionPlan = "define stream cseEventStream (symbol string, user string,volume int); define stream " +
"twitterStream (user string, tweet string, company string);"
+ "partition with (user of cseEventStream) begin @info(name = 'query1') " +
"from cseEventStream#window.time(1 sec) join twitterStream#window.time(1 sec) " +
"on cseEventStream.symbol== twitterStream.company " +
"select cseEventStream.symbol as symbol, twitterStream.tweet, cseEventStream.volume " +
"insert all events into outputStream ;" + "" +
"end ";
ExecutionPlanRuntime executionPlanRuntime = siddhiManager.createExecutionPlanRuntime(executionPlan);
executionPlanRuntime.addCallback("outputStream", new StreamCallback() {
@Override
public void receive(Event[] events) {
EventPrinter.print(events);
count.addAndGet(events.length);
eventArrived = true;
}
});
InputHandler cseEventStreamHandler = executionPlanRuntime.getInputHandler("cseEventStream");
InputHandler twitterStreamHandler = executionPlanRuntime.getInputHandler("twitterStream");
executionPlanRuntime.start();
cseEventStreamHandler.send(new Object[]{"WSO2", "User1", 100});
twitterStreamHandler.send(new Object[]{"User1", "Hello World", "WSO2"});
twitterStreamHandler.send(new Object[]{"User2", "Hellno World", "WSO2"});
twitterStreamHandler.send(new Object[]{"User3", "Hellno World", "WSO2"});
SiddhiTestHelper.waitForEvents(100, 6, count, 6000);
Assert.assertEquals(6, count.get());
executionPlanRuntime.shutdown();
}
@Test
public void testJoinPartition9() throws InterruptedException {
log.info("Join partition test9");
SiddhiManager siddhiManager = new SiddhiManager();
String executionPlan = "define stream cseEventStream (symbol string, user string,volume int); define stream " +
"twitterStream (user string, tweet string, company string);"
+ "partition with (user of cseEventStream, user of twitterStream) begin @info(name = 'query1') " +
"from cseEventStream#window.length(1) unidirectional join twitterStream#window.length(1) " +
"on cseEventStream.symbol== twitterStream.company " +
"select cseEventStream.user, cseEventStream.symbol as symbol, twitterStream.tweet, cseEventStream" +
".volume " +
"insert all events into outputStream ;" + "" +
"end ";
ExecutionPlanRuntime executionPlanRuntime = siddhiManager.createExecutionPlanRuntime(executionPlan);
executionPlanRuntime.addCallback("outputStream", new StreamCallback() {
@Override
public void receive(Event[] events) {
EventPrinter.print(events);
count.addAndGet(events.length);
eventArrived = true;
}
});
InputHandler cseEventStreamHandler = executionPlanRuntime.getInputHandler("cseEventStream");
InputHandler twitterStreamHandler = executionPlanRuntime.getInputHandler("twitterStream");
executionPlanRuntime.start();
twitterStreamHandler.send(new Object[]{"User1", "Hello World", "WSO2"});
cseEventStreamHandler.send(new Object[]{"WSO2", "User1", 100});
cseEventStreamHandler.send(new Object[]{"WSO2", "User2", 100});
twitterStreamHandler.send(new Object[]{"User2", "Hello World", "WSO2"});
twitterStreamHandler.send(new Object[]{"User3", "Hello World", "WSO2"});
cseEventStreamHandler.send(new Object[]{"WSO2", "User3", 100});
SiddhiTestHelper.waitForEvents(100, 2, count, 60000);
Assert.assertEquals(2, count.get());
executionPlanRuntime.shutdown();
}
@Test
public void testJoinPartition10() throws InterruptedException {
log.info("Join partition test10");
SiddhiManager siddhiManager = new SiddhiManager();
String executionPlan = "" +
"" +
"define stream cseEventStream (symbol string, user string,volume int); " +
"define stream twitterStream (user string, tweet string, company string); " +
"" +
"partition with (user of cseEventStream, user of twitterStream) " +
"begin " +
" @info(name = 'query1') " +
" from cseEventStream#window.length(1) unidirectional join twitterStream#window.length(1) " +
" select cseEventStream.symbol as symbol, twitterStream.tweet, cseEventStream.volume, " +
"cseEventStream.user" +
" insert all events into outputStream1 ;" + "" +
"end;" +
"" +
"partition with (user of outputStream1) " +
"begin " +
" @info(name = 'query1') " +
" from outputStream1#window.length(1) join twitterStream#window.length(1) " +
" select outputStream1.symbol as symbol, twitterStream.tweet, outputStream1.volume " +
" insert all events into outputStream ;" + "" +
"end;" +
" ";
ExecutionPlanRuntime executionPlanRuntime = siddhiManager.createExecutionPlanRuntime(executionPlan);
executionPlanRuntime.addCallback("outputStream", new StreamCallback() {
@Override
public void receive(Event[] events) {
EventPrinter.print(events);
count.addAndGet(events.length);
eventArrived = true;
}
});
InputHandler cseEventStreamHandler = executionPlanRuntime.getInputHandler("cseEventStream");
InputHandler twitterStreamHandler = executionPlanRuntime.getInputHandler("twitterStream");
executionPlanRuntime.start();
twitterStreamHandler.send(new Object[]{"User1", "Hello World", "WSO2"});
cseEventStreamHandler.send(new Object[]{"WSO2", "User1", 100});
cseEventStreamHandler.send(new Object[]{"WSO2", "User2", 100});
twitterStreamHandler.send(new Object[]{"User2", "Hello World", "WSO2"});
twitterStreamHandler.send(new Object[]{"User3", "Hello World", "WSO2"});
cseEventStreamHandler.send(new Object[]{"WSO2", "User3", 100});
SiddhiTestHelper.waitForEvents(100, 3, count, 60000);
Assert.assertEquals(3, count.get());
executionPlanRuntime.shutdown();
}
}