public void Run(RegressionEnvironment env) { var model = new EPStatementObjectModel(); model.SelectClause = SelectClause.CreateWildcard(); var fromClause = FromClause.Create( FilterStream.Create("SupportBean_A", "streamA") .AddView(View.Create("length", Expressions.Constant(3))), FilterStream.Create("SupportBean_B", "streamB") .AddView(View.Create("length", Expressions.Constant(3))), FilterStream.Create("SupportBean_C", "streamC") .AddView(View.Create("length", Expressions.Constant(3)))); model.FromClause = fromClause; model.WhereClause = Expressions.And( Expressions.EqProperty("streamA.Id", "streamB.Id"), Expressions.EqProperty("streamB.Id", "streamC.Id"), Expressions.EqProperty("streamA.Id", "streamC.Id")); model = env.CopyMayFail(model); var epl = "select * from " + "SupportBean_A#length(3) as streamA, " + "SupportBean_B#length(3) as streamB, " + "SupportBean_C#length(3) as streamC " + "where streamA.Id=streamB.Id " + "and streamB.Id=streamC.Id " + "and streamA.Id=streamC.Id"; Assert.AreEqual(epl, model.ToEPL()); model.Annotations = Collections.SingletonList(AnnotationPart.NameAnnotation("s0")); env.CompileDeploy(model).AddListener("s0").Milestone(0); RunJoinUniquePerId(env); env.UndeployAll(); }
public void TestJoinUniquePerIdOM() { var model = new EPStatementObjectModel(); model.SelectClause = SelectClause.CreateWildcard(); model.FromClause = FromClause.Create( FilterStream.Create(_eventA, "streamA").AddView(View.Create("win", "length", Expressions.Constant(3))), FilterStream.Create(_eventB, "streamB").AddView(View.Create("win", "length", Expressions.Constant(3))), FilterStream.Create(_eventC, "streamC").AddView(View.Create("win", "length", Expressions.Constant(3)))); model.WhereClause = Expressions.And( Expressions.EqProperty("streamA.id", "streamB.id"), Expressions.EqProperty("streamB.id", "streamC.id"), Expressions.EqProperty("streamA.id", "streamC.id")); model = (EPStatementObjectModel)SerializableObjectCopier.Copy(model); String joinStatement = "select * from " + _eventA + ".win:length(3) as streamA, " + _eventB + ".win:length(3) as streamB, " + _eventC + ".win:length(3) as streamC " + "where streamA.id=streamB.id " + "and streamB.id=streamC.id " + "and streamA.id=streamC.id"; EPStatement joinView = _epService.EPAdministrator.Create(model); joinView.Events += _updateListener.Update; Assert.AreEqual(joinStatement, model.ToEPL()); RunJoinUniquePerId(); }
private void RunAssertionJoinUniquePerIdOM(EPServiceProvider epService) { var model = new EPStatementObjectModel(); model.SelectClause = SelectClause.CreateWildcard(); FromClause fromClause = FromClause.Create( FilterStream.Create(EVENT_A, "streamA").AddView(View.Create("length", Expressions.Constant(3))), FilterStream.Create(EVENT_B, "streamB").AddView(View.Create("length", Expressions.Constant(3))), FilterStream.Create(EVENT_C, "streamC").AddView(View.Create("length", Expressions.Constant(3)))); model.FromClause = fromClause; model.WhereClause = Expressions.And( Expressions.EqProperty("streamA.id", "streamB.id"), Expressions.EqProperty("streamB.id", "streamC.id"), Expressions.EqProperty("streamA.id", "streamC.id")); model = (EPStatementObjectModel)SerializableObjectCopier.Copy(epService.Container, model); string epl = "select * from " + EVENT_A + "#length(3) as streamA, " + EVENT_B + "#length(3) as streamB, " + EVENT_C + "#length(3) as streamC " + "where streamA.id=streamB.id " + "and streamB.id=streamC.id " + "and streamA.id=streamC.id"; EPStatement stmt = epService.EPAdministrator.Create(model); var updateListener = new SupportUpdateListener(); stmt.Events += updateListener.Update; Assert.AreEqual(epl, model.ToEPL()); RunJoinUniquePerId(epService, updateListener); stmt.Dispose(); }
private void RunAssertionStmtJoin_OM(EPServiceProvider epService) { var model = new EPStatementObjectModel(); model.SelectClause = SelectClause.Create("symbol") .Add(Expressions.Median("price"), "myMedian") .Add(Expressions.MedianDistinct("price"), "myDistMedian") .Add(Expressions.Stddev("price"), "myStdev") .Add(Expressions.Avedev("price"), "myAvedev") .SetStreamSelector(StreamSelector.RSTREAM_ISTREAM_BOTH); FromClause fromClause = FromClause.Create( FilterStream.Create(typeof(SupportBeanString).FullName, "one").AddView(View.Create("length", Expressions.Constant(100))), FilterStream.Create(typeof(SupportMarketDataBean).FullName, "two").AddView(View.Create("length", Expressions.Constant(5)))); model.FromClause = fromClause; model.WhereClause = Expressions.And().Add( Expressions.Or() .Add(Expressions.Eq("symbol", "DELL")) .Add(Expressions.Eq("symbol", "IBM")) .Add(Expressions.Eq("symbol", "GE")) ) .Add(Expressions.EqProperty("one.TheString", "two.symbol")); model.GroupByClause = GroupByClause.Create("symbol"); model = (EPStatementObjectModel)SerializableObjectCopier.Copy(epService.Container, model); string epl = "select irstream symbol, " + "median(price) as myMedian, " + "median(distinct price) as myDistMedian, " + "stddev(price) as myStdev, " + "avedev(price) as myAvedev " + "from " + typeof(SupportBeanString).FullName + "#length(100) as one, " + typeof(SupportMarketDataBean).FullName + "#length(5) as two " + "where (symbol=\"DELL\" or symbol=\"IBM\" or symbol=\"GE\") " + "and one.TheString=two.symbol " + "group by symbol"; Assert.AreEqual(epl, model.ToEPL()); EPStatement stmt = epService.EPAdministrator.Create(model); var listener = new SupportUpdateListener(); stmt.Events += listener.Update; epService.EPRuntime.SendEvent(new SupportBeanString(SYMBOL_DELL)); epService.EPRuntime.SendEvent(new SupportBeanString(SYMBOL_IBM)); epService.EPRuntime.SendEvent(new SupportBeanString("AAA")); TryAssertionStmt(epService, listener, stmt); stmt.Dispose(); }
public void Run(RegressionEnvironment env) { var model = new EPStatementObjectModel(); model.SelectClause = SelectClause.Create("Symbol") .Add(Expressions.Median("Price"), "myMedian") .Add(Expressions.MedianDistinct("Price"), "myDistMedian") .Add(Expressions.Stddev("Price"), "myStdev") .Add(Expressions.Avedev("Price"), "myAvedev") .SetStreamSelector(StreamSelector.RSTREAM_ISTREAM_BOTH); var fromClause = FromClause.Create( FilterStream .Create(typeof(SupportBeanString).Name, "one") .AddView(View.Create("length", Expressions.Constant(100))), FilterStream .Create(typeof(SupportMarketDataBean).Name, "two") .AddView(View.Create("length", Expressions.Constant(5)))); model.FromClause = fromClause; model.WhereClause = Expressions.And() .Add( Expressions.Or() .Add(Expressions.Eq("Symbol", "DELL")) .Add(Expressions.Eq("Symbol", "IBM")) .Add(Expressions.Eq("Symbol", "GE")) ) .Add(Expressions.EqProperty("one.TheString", "two.Symbol")); model.GroupByClause = GroupByClause.Create("Symbol"); model = env.CopyMayFail(model); var epl = "select irstream Symbol, " + "median(Price) as myMedian, " + "median(distinct Price) as myDistMedian, " + "stddev(Price) as myStdev, " + "avedev(Price) as myAvedev " + "from SupportBeanString#length(100) as one, " + "SupportMarketDataBean#length(5) as two " + "where (Symbol=\"DELL\" or Symbol=\"IBM\" or Symbol=\"GE\") " + "and one.TheString=two.Symbol " + "group by Symbol"; Assert.AreEqual(epl, model.ToEPL()); model.Annotations = Collections.SingletonList(AnnotationPart.NameAnnotation("s0")); env.CompileDeploy(model).AddListener("s0"); env.SendEventBean(new SupportBeanString(SYMBOL_DELL)); env.SendEventBean(new SupportBeanString(SYMBOL_IBM)); env.SendEventBean(new SupportBeanString("AAA")); TryAssertionStmt(env, new AtomicLong()); env.UndeployAll(); }
private void RunAssertionWhere_OM(EPServiceProvider epService) { var model = new EPStatementObjectModel(); model.SelectClause = SelectClause.Create() .AddWithAsProvidedName("s0.id", "idS0").AddWithAsProvidedName("s1.id", "idS1"); PatternExpr pattern = Patterns.Or() .Add(Patterns.EveryFilter(typeof(SupportBean_S0).FullName, "s0")) .Add(Patterns.EveryFilter(typeof(SupportBean_S1).FullName, "s1") ); model.FromClause = FromClause.Create(PatternStream.Create(pattern)); model.WhereClause = Expressions.Or() .Add(Expressions.And() .Add(Expressions.IsNotNull("s0.id")) .Add(Expressions.Lt("s0.id", 100)) ) .Add(Expressions.And() .Add(Expressions.IsNotNull("s1.id")) .Add(Expressions.Ge("s1.id", 100)) ); model = (EPStatementObjectModel)SerializableObjectCopier.Copy(epService.Container, model); string reverse = model.ToEPL(); string stmtText = "select s0.id as idS0, s1.id as idS1 " + "from pattern [every s0=" + typeof(SupportBean_S0).FullName + " or every s1=" + typeof(SupportBean_S1).FullName + "] " + "where s0.id is not null and s0.id<100 or s1.id is not null and s1.id>=100"; Assert.AreEqual(stmtText, reverse); EPStatement statement = epService.EPAdministrator.Create(model); var updateListener = new SupportUpdateListener(); statement.Events += updateListener.Update; SendEventS0(epService, 1); AssertEventIds(updateListener, 1, null); SendEventS0(epService, 101); Assert.IsFalse(updateListener.IsInvoked); SendEventS1(epService, 1); Assert.IsFalse(updateListener.IsInvoked); SendEventS1(epService, 100); AssertEventIds(updateListener, null, 100); statement.Dispose(); }
public void TestSumJoin_OM() { var model = new EPStatementObjectModel(); model.SelectClause = SelectClause.Create("Symbol") .Add(Expressions.Median("Price"), "myMedian") .Add(Expressions.MedianDistinct("Price"), "myDistMedian") .Add(Expressions.Stddev("Price"), "myStdev") .Add(Expressions.Avedev("Price"), "myAvedev") .SetStreamSelector(StreamSelector.RSTREAM_ISTREAM_BOTH); var fromClause = FromClause.Create( FilterStream.Create(typeof(SupportBeanString).FullName, "one").AddView(View.Create("length", Expressions.Constant(100))), FilterStream.Create(typeof(SupportMarketDataBean).FullName, "two").AddView(View.Create("length", Expressions.Constant(5)))); model.FromClause = fromClause; model.WhereClause = Expressions.And().Add( Expressions.Or() .Add(Expressions.Eq("Symbol", "DELL")) .Add(Expressions.Eq("Symbol", "IBM")) .Add(Expressions.Eq("Symbol", "GE")) ) .Add(Expressions.EqProperty("one.TheString", "two.Symbol")); model.GroupByClause = GroupByClause.Create("Symbol"); model = (EPStatementObjectModel)SerializableObjectCopier.Copy(model); var viewExpr = "select irstream Symbol, " + "median(Price) as myMedian, " + "median(distinct Price) as myDistMedian, " + "stddev(Price) as myStdev, " + "avedev(Price) as myAvedev " + "from " + typeof(SupportBeanString).FullName + "#length(100) as one, " + typeof(SupportMarketDataBean).FullName + "#length(5) as two " + "where (Symbol=\"DELL\" or Symbol=\"IBM\" or Symbol=\"GE\") " + "and one.TheString=two.Symbol " + "group by Symbol"; Assert.AreEqual(viewExpr, model.ToEPL()); var selectTestView = _epService.EPAdministrator.Create(model); selectTestView.AddListener(_testListener); _epService.EPRuntime.SendEvent(new SupportBeanString(SYMBOL_DELL)); _epService.EPRuntime.SendEvent(new SupportBeanString(SYMBOL_IBM)); _epService.EPRuntime.SendEvent(new SupportBeanString("AAA")); RunAssertion(selectTestView); }
public void Run(RegressionEnvironment env) { var model = new EPStatementObjectModel(); model.SelectClause = SelectClause.Create() .AddWithAsProvidedName("S0.Id", "idS0") .AddWithAsProvidedName("S1.Id", "idS1"); PatternExpr pattern = Patterns.Or() .Add(Patterns.EveryFilter("SupportBean_S0", "S0")) .Add( Patterns.EveryFilter("SupportBean_S1", "S1") ); model.FromClause = FromClause.Create(PatternStream.Create(pattern)); model.WhereClause = Expressions.Or() .Add( Expressions.And() .Add(Expressions.IsNotNull("S0.Id")) .Add(Expressions.Lt("S0.Id", 100)) ) .Add( Expressions.And() .Add(Expressions.IsNotNull("S1.Id")) .Add(Expressions.Ge("S1.Id", 100)) ); model = env.CopyMayFail(model); var reverse = model.ToEPL(); var stmtText = "select S0.Id as idS0, S1.Id as idS1 " + "from pattern [every S0=SupportBean_S0" + " or every S1=SupportBean_S1] " + "where S0.Id is not null and S0.Id<100 or S1.Id is not null and S1.Id>=100"; Assert.AreEqual(stmtText, reverse); model.Annotations = Collections.SingletonList(AnnotationPart.NameAnnotation("s0")); env.CompileDeploy(model).AddListener("s0"); SendEventS0(env, 1); AssertEventIds(env, 1, null); SendEventS0(env, 101); Assert.IsFalse(env.Listener("s0").IsInvoked); SendEventS1(env, 1); Assert.IsFalse(env.Listener("s0").IsInvoked); SendEventS1(env, 100); AssertEventIds(env, null, 100); env.UndeployAll(); }
/// <summary> /// Constrains the specified esper query. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="esperQuery">The esper query.</param> /// <param name="expression">The expression.</param> /// <returns></returns> public static EsperQuery <T> Having <T>(this EsperQuery <T> esperQuery, System.Linq.Expressions.Expression <Func <T, bool> > expression) { var parentObjectModel = esperQuery.ObjectModel; var deriveObjectModel = parentObjectModel.ShallowCopy(); // Adapt or set the where clause according to the expression contents using (ScopedInstance <EPStatementObjectModel> .Set(deriveObjectModel)) { var sodaExpression = LinqToSoda.LinqToSodaExpression(expression); deriveObjectModel.HavingClause = deriveObjectModel.HavingClause == null ? sodaExpression : Expressions.And(deriveObjectModel.WhereClause, sodaExpression); deriveObjectModel.FromClause.Streams[0].StreamName = expression.Parameters[0].Name; return(new EsperQuery <T>(esperQuery.ServiceProvider, deriveObjectModel)); } }
/// <summary> /// Converts a LINQ expression to a SODA expression. /// </summary> /// <param name="expression">The expression.</param> /// <returns></returns> public static Expression LinqToSodaExpression(System.Linq.Expressions.Expression expression) { if (expression == null) { return(null); } switch (expression.NodeType) { case ExpressionType.And: return(Expressions.And( LinqToSodaExpression(((BinaryExpression)expression).Left), LinqToSodaExpression(((BinaryExpression)expression).Right))); case ExpressionType.AndAlso: return(Expressions.And( LinqToSodaExpression(((BinaryExpression)expression).Left), LinqToSodaExpression(((BinaryExpression)expression).Right))); case ExpressionType.Or: return(Expressions.Or( LinqToSodaExpression(((BinaryExpression)expression).Left), LinqToSodaExpression(((BinaryExpression)expression).Right))); case ExpressionType.OrElse: return(Expressions.Or( LinqToSodaExpression(((BinaryExpression)expression).Left), LinqToSodaExpression(((BinaryExpression)expression).Right))); case ExpressionType.Not: return(Expressions.Not( LinqToSodaExpression(((UnaryExpression)expression).Operand))); case ExpressionType.NotEqual: return(Expressions.Not( Expressions.Eq( LinqToSodaExpression(((BinaryExpression)expression).Left), LinqToSodaExpression(((BinaryExpression)expression).Right)))); case ExpressionType.Equal: return(Expressions.Eq( LinqToSodaExpression(((BinaryExpression)expression).Left), LinqToSodaExpression(((BinaryExpression)expression).Right))); case ExpressionType.LessThan: return(Expressions.Lt( LinqToSodaExpression(((BinaryExpression)expression).Left), LinqToSodaExpression(((BinaryExpression)expression).Right))); case ExpressionType.LessThanOrEqual: return(Expressions.Le( LinqToSodaExpression(((BinaryExpression)expression).Left), LinqToSodaExpression(((BinaryExpression)expression).Right))); case ExpressionType.GreaterThan: return(Expressions.Gt( LinqToSodaExpression(((BinaryExpression)expression).Left), LinqToSodaExpression(((BinaryExpression)expression).Right))); case ExpressionType.GreaterThanOrEqual: return(Expressions.Ge( LinqToSodaExpression(((BinaryExpression)expression).Left), LinqToSodaExpression(((BinaryExpression)expression).Right))); case ExpressionType.MemberAccess: return(MemberToSoda(expression)); case ExpressionType.Lambda: return(LambdaToSoda(expression)); case ExpressionType.Convert: { var unary = (UnaryExpression)expression; return(Expressions.Cast( LinqToSodaExpression(unary.Operand), unary.Type.GetSimpleTypeName())); } case ExpressionType.Constant: return(Expressions.Constant( ((System.Linq.Expressions.ConstantExpression)expression).Value)); case ExpressionType.Call: return(CallToSoda(expression)); } throw new ArgumentException( String.Format("Expression of type {0} is not supported", expression.NodeType), "expression"); }