/* * 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.query.api; import org.junit.Test; import org.wso2.siddhi.query.api.execution.query.Query; import org.wso2.siddhi.query.api.execution.query.input.state.State; import org.wso2.siddhi.query.api.execution.query.input.stream.InputStream; import org.wso2.siddhi.query.api.execution.query.selection.Selector; import org.wso2.siddhi.query.api.expression.Expression; import org.wso2.siddhi.query.api.expression.Variable; import org.wso2.siddhi.query.api.expression.condition.Compare; public class PatternQueryTestCase { // from e1=Stream1[price >= 30] -> e2=Stream1[ price >= 20] -> e3=Stream2[ price >= e1.price] // select e1.symbol, avg(e2.price ) as avgPrice // group by e1.symbol // having avgPrice>50; // insert into OutputStream @Test public void testPatternQuery1() { Query query = Query.query(); query.from( InputStream.patternStream( State.next( State.stream(InputStream.stream("e1", "Stream1").filter(Expression.compare(Expression .variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(30)))), State.next( State.stream(InputStream.stream("e2", "Stream1").filter(Expression.compare (Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(20)))), State.stream(InputStream.stream("e3", "Stream2").filter(Expression.compare (Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.variable("price").ofStream("e1")))) ) ) ) ); query.select( Selector.selector(). select("symbol", Expression.variable("symbol").ofStream("e1")). select("avgPrice", Expression.function("avg", Expression.variable("price").ofStream("e2"))). groupBy(Expression.variable("symbol").ofStream("e1")). having(Expression.compare(Expression.variable("avgPrice"), Compare.Operator.GREATER_THAN, Expression.value(50))) ); query.insertInto("OutputStream"); } // from every (e1=Stream1[price >= 30]) -> e2=Stream1[ price >= 20] -> e3=Stream2[ price >= e1.price] // select e1.symbol, avg(e2.price ) as avgPrice // group by e1.symbol // having avgPrice>50; // insert into OutputStream @Test public void testPatternQuery2() { Query query = Query.query(); query.from( InputStream.patternStream( State.next( State.every( State.stream(InputStream.stream("e1", "Stream1").filter(Expression.compare (Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(30))))), State.next( State.stream(InputStream.stream("e2", "Stream1").filter(Expression.compare (Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(20)))), State.stream(InputStream.stream("e3", "Stream2").filter(Expression.compare (Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.variable("price").ofStream("e1")))) ) ) ) ); query.select( Selector.selector(). select("symbol", Expression.variable("symbol").ofStream("e1")). select("avgPrice", Expression.function("avg", Expression.variable("price").ofStream("e2"))). groupBy(Expression.variable("symbol").ofStream("e1")). having(Expression.compare(Expression.variable("avgPrice"), Compare.Operator.GREATER_THAN, Expression.value(50))) ); query.insertInto("OutputStream"); } // from every (e1=Stream1[price >= 30]) -> e2=Stream1[ price >= 20] -> every (e3=Stream2[ price >= e1.price]) -> // e4=Stream3[price>74] -> e5= Stream4[symbol=='IBM'] // select e1.symbol, avg(e2.price ) as avgPrice // insert into OutputStream @Test public void testPatternQuery3() { Query query = Query.query(); query.from( InputStream.patternStream( State.next( State.every( State.stream(InputStream.stream("e1", "Stream1").filter(Expression.compare (Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(30))))), State.next( State.stream(InputStream.stream("e2", "Stream1").filter(Expression.compare (Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(20)))), State.next( State.every( State.stream(InputStream.stream("e3", "Stream2").filter (Expression.compare(Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.variable("price").ofStream("e1"))))), State.next( State.stream(InputStream.stream("e4", "Stream3").filter (Expression.compare(Expression.variable("price"), Compare.Operator.GREATER_THAN, Expression.value(74)))), State.stream(InputStream.stream("e5", "Stream4").filter (Expression.compare(Expression.variable("symbol"), Compare.Operator.EQUAL, Expression.value("IBM")))) ) ) ) ) ) ); query.select( Selector.selector(). select("symbol", Expression.variable("symbol").ofStream("e1")). select("avgPrice", Expression.function("avg", Expression.variable("price").ofStream("e2"))) ); query.insertInto("OutputStream"); } // from every (e1=Stream1[price >= 30] -> e2=Stream1[ price >= 20]) -> e3=Stream2[ price >= e1.price] -> // e4=Stream3[price>74] // select e1.symbol, avg(e2.price ) as avgPrice // insert into OutputStream @Test public void testPatternQuery4() { Query query = Query.query(); query.from( InputStream.patternStream( State.next( State.every( State.next( State.stream(InputStream.stream("e1", "Stream1").filter(Expression .compare(Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(30)))), State.stream(InputStream.stream("e2", "Stream1").filter(Expression .compare(Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(20)))))), State.next( State.stream(InputStream.stream("e3", "Stream2").filter(Expression.compare (Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.variable("price").ofStream("e1")))), State.stream(InputStream.stream("e4", "Stream3").filter(Expression.compare (Expression.variable("price"), Compare.Operator.GREATER_THAN, Expression.value(74))))) ) ) ); query.select( Selector.selector(). select("symbol", Expression.variable("symbol").ofStream("e1")). select("avgPrice", Expression.function("avg", Expression.variable("price").ofStream("e2"))) ); query.insertInto("OutputStream"); } // from every (e1=Stream1[price >= 30]) -> e2=Stream1[ price >= 20] and e3=Stream2[ price >= e1.price] -> // e4=Stream3[price>74] // select e1.symbol, avg(e2.price ) as avgPrice // insert into OutputStream @Test public void testPatternQuery5() { Query query = Query.query(); query.from( InputStream.patternStream( State.next( State.every( State.stream(InputStream.stream("e1", "Stream1").filter(Expression.compare (Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(30))))), State.next( State.logicalAnd( State.stream(InputStream.stream("e2", "Stream1").filter(Expression .compare(Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(20)))), State.stream(InputStream.stream("e3", "Stream2").filter(Expression .compare(Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.variable("price").ofStream("e1"))))) , State.stream(InputStream.stream("e4", "Stream3").filter(Expression.compare (Expression.variable("price"), Compare.Operator.GREATER_THAN, Expression.value(74))))) ) ) ); query.select( Selector.selector(). select("symbol", Expression.variable("symbol").ofStream("e1")). select("avgPrice", Expression.function("avg", Expression.variable("price").ofStream("e2"))) ); query.insertInto("OutputStream"); } // from every (e1=Stream1[price >= 30]) -> e2=Stream1[ price >= 20] or e3=Stream2[ price >= e1.price] within 3 min // -> e4=Stream3[price>74] within 2 min // select e1.symbol, avg(e2.price ) as avgPrice // insert into OutputStream @Test public void testPatternQuery6() { Query query = Query.query(); query.from( InputStream.patternStream( State.next( State.every( State.stream(InputStream.stream("e1", "Stream1").filter(Expression.compare (Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(30))))), State.next( State.logicalOr( State.stream(InputStream.stream("e2", "Stream1").filter(Expression .compare(Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(20)))), State.stream(InputStream.stream("e3", "Stream2").filter(Expression .compare(Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.variable("price").ofStream("e1")))), Expression.Time.minute(3)) , State.stream(InputStream.stream("e4", "Stream3").filter(Expression.compare (Expression.variable("price"), Compare.Operator.GREATER_THAN, Expression.value(74))))) ) ) ); query.select( Selector.selector(). select("symbol", Expression.variable("symbol").ofStream("e1")). select("avgPrice", Expression.function("avg", Expression.variable("price").ofStream("e2"))) ); query.insertInto("OutputStream"); } // from every (e1=Stream1[price >= 30]) -> e2=Stream1[ prev.price >= 20]<3:5> -> e3=Stream2[ price >= e1.price] -> // e4=Stream3[price>74] // select e1.symbol, avg(e2.price ) as avgPrice // insert into OutputStream @Test public void testPatternQuery7() { Query query = Query.query(); query.from( InputStream.patternStream( State.next( State.every( State.stream(InputStream.stream("e1", "Stream1").filter(Expression.compare (Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(30))))), State.next( State.count( State.stream(InputStream.stream("e2", "Stream1").filter(Expression .compare(Expression.variable("price").ofStream("e2", Variable .LAST), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(20)))), 3, 5), State.next( State.stream(InputStream.stream("e3", "Stream2").filter(Expression .compare(Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.variable("price").ofStream("e1")))), State.stream(InputStream.stream("e4", "Stream3").filter(Expression .compare(Expression.variable("price"), Compare.Operator.GREATER_THAN, Expression.value(74))))) ) ) ) ); query.select( Selector.selector(). select("symbol", Expression.variable("symbol").ofStream("e1")). select("avgPrice", Expression.function("avg", Expression.variable("price").ofStream("e2"))) ); query.insertInto("OutputStream"); } // from every (e1=Stream1[price >= 30]) -> e2=Stream1[ prev.price >= 20]<:5> -> e3=Stream2[ price >= e1.price] -> // e4=Stream3[price>74] // select e1.symbol, avg(e2.price ) as avgPrice // insert into OutputStream @Test public void testPatternQuery8() { Query query = Query.query(); query.from( InputStream.patternStream( State.next( State.every( State.stream(InputStream.stream("e1", "Stream1").filter(Expression.compare (Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(30))))), State.next( State.countLessThanEqual( State.stream(InputStream.stream("e2", "Stream1").filter(Expression .compare(Expression.variable("price").ofStream("e2", Variable .LAST), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(20)))), 5), State.next( State.stream(InputStream.stream("e3", "Stream2").filter(Expression .compare(Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.variable("price").ofStream("e1")))), State.stream(InputStream.stream("e4", "Stream3").filter(Expression .compare(Expression.variable("price"), Compare.Operator.GREATER_THAN, Expression.value(74))))) ) ) ) ); query.select( Selector.selector(). select("symbol", Expression.variable("symbol").ofStream("e1")). select("avgPrice", Expression.function("avg", Expression.variable("price").ofStream("e2"))) ); query.insertInto("OutputStream"); } // from every (e1=Stream1[price >= 30]) -> e2=Stream1[ prev.price >= 20]<5:> within 3 min -> e3=Stream2[ price >= // e1.price] -> e4=Stream3[price>74] // select e1.symbol, avg(e2.price ) as avgPrice // insert into OutputStream @Test public void testPatternQuery9() { Query query = Query.query(); query.from( InputStream.patternStream( State.next( State.every( State.stream(InputStream.stream("e1", "Stream1").filter(Expression.compare (Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(30))))), State.next( State.countMoreThanEqual( State.stream(InputStream.stream("e2", "Stream1").filter(Expression .compare(Expression.variable("price").ofStream("e2", Variable .LAST), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(20)))), 5, Expression.Time.minute(3)), State.next( State.stream(InputStream.stream("e3", "Stream2").filter(Expression .compare(Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.variable("price").ofStream("e1")))), State.stream(InputStream.stream("e4", "Stream3").filter(Expression .compare(Expression.variable("price"), Compare.Operator.GREATER_THAN, Expression.value(74))))) ) ) ) ); query.select( Selector.selector(). select("symbol", Expression.variable("symbol").ofStream("e1")). select("avgPrice", Expression.function("avg", Expression.variable("price").ofStream("e2"))) ); query.insertInto("OutputStream"); } // from every (e1=Stream1[price >= 30]) -> (e2=Stream1[ prev.price >= 20] -> e3=Stream2[ price >= e1.price]) // within 4 min -> e4=Stream3[price>74] // select e1.symbol, avg(e2.price ) as avgPrice // insert into OutputStream @Test public void testPatternQuery10() { Query query = Query.query(); query.from( InputStream.patternStream( State.next( State.every( State.stream(InputStream.stream("e1", "Stream1").filter(Expression.compare (Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(30))))), State.next( State.next( State.stream(InputStream.stream("e2", "Stream1").filter(Expression .compare(Expression.variable("price").ofStream("e2", Variable .LAST), Compare.Operator.GREATER_THAN_EQUAL, Expression.value(20)))), State.stream(InputStream.stream("e3", "Stream2").filter(Expression .compare(Expression.variable("price"), Compare.Operator.GREATER_THAN_EQUAL, Expression.variable("price").ofStream("e1")))), Expression.Time.minute(4)), State.stream(InputStream.stream("e4", "Stream3").filter(Expression.compare (Expression.variable("price"), Compare.Operator.GREATER_THAN, Expression.value(74)))) ) ) ) ); query.select( Selector.selector(). select("symbol", Expression.variable("symbol").ofStream("e1")). select("avgPrice", Expression.function("avg", Expression.variable("price").ofStream("e2"))) ); query.insertInto("OutputStream"); } }