Exemple #1
0
        private void RunAssertionAliasesAggregationOM(EPServiceProvider epService)
        {
            var model = new EPStatementObjectModel();

            model.SelectClause      = SelectClause.Create("symbol", "volume").Add(Expressions.Sum("price"), "mySum");
            model.FromClause        = FromClause.Create(FilterStream.Create(typeof(SupportMarketDataBean).FullName).AddView(View.Create("length", Expressions.Constant(20))));
            model.GroupByClause     = GroupByClause.Create("symbol");
            model.OutputLimitClause = OutputLimitClause.Create(6);
            model.OrderByClause     = OrderByClause.Create(Expressions.Sum("price")).Add("symbol", false);
            model = (EPStatementObjectModel)SerializableObjectCopier.Copy(epService.Container, model);

            string statementString = "select symbol, volume, sum(price) as mySum from " +
                                     typeof(SupportMarketDataBean).FullName + "#length(20) " +
                                     "group by symbol " +
                                     "output every 6 events " +
                                     "order by sum(price), symbol";

            Assert.AreEqual(statementString, model.ToEPL());

            var         testListener = new SupportUpdateListener();
            EPStatement statement    = epService.EPAdministrator.Create(model);

            statement.Events += testListener.Update;

            TryAssertionDefault(epService, testListener);

            statement.Dispose();
        }
Exemple #2
0
        private void RunAssertionOutputCrontabAtOMCreate(EPServiceProvider epService)
        {
            // every 15 minutes 8am to 5pm
            SendTimeEvent(epService, 1, 17, 10, 0, 0);
            string expression = "select * from MarketData#lastevent output at (*/15, 8:17, *, *, *)";

            var model = new EPStatementObjectModel();

            model.SelectClause = SelectClause.CreateWildcard();
            model.FromClause   = FromClause.Create(FilterStream.Create("MarketData")
                                                   .AddView("lastevent"));
            var crontabParams = new Expression[] {
                Expressions.CrontabScheduleFrequency(15),
                Expressions.CrontabScheduleRange(8, 17),
                Expressions.CrontabScheduleWildcard(),
                Expressions.CrontabScheduleWildcard(),
                Expressions.CrontabScheduleWildcard()
            };

            model.OutputLimitClause = OutputLimitClause.CreateSchedule(crontabParams);

            string epl = model.ToEPL();

            Assert.AreEqual(expression, epl);
            EPStatement stmt     = epService.EPAdministrator.Create(model);
            var         listener = new SupportUpdateListener();

            stmt.Events += listener.Update;
            TryAssertionCrontab(epService, 1, stmt, listener);
        }
Exemple #3
0
            public void Run(RegressionEnvironment env)
            {
                var model = new EPStatementObjectModel();
                model.SelectClause = SelectClause.Create("Symbol", "Volume").Add(Expressions.Sum("Price"), "mySum");
                model.FromClause = FromClause.Create(
                    FilterStream.Create(typeof(SupportMarketDataBean).Name)
                        .AddView(View.Create("length", Expressions.Constant(20))));
                model.GroupByClause = GroupByClause.Create("Symbol");
                model.OutputLimitClause = OutputLimitClause.Create(6);
                model.OrderByClause = OrderByClause.Create(Expressions.Sum("Price")).Add("Symbol", false);
                model = env.CopyMayFail(model);

                var epl = "select Symbol, Volume, sum(Price) as mySum from " +
                          "SupportMarketDataBean#length(20) " +
                          "group by Symbol " +
                          "output every 6 events " +
                          "order by sum(Price), Symbol";
                Assert.AreEqual(epl, model.ToEPL());

                model.Annotations = Collections.SingletonList(AnnotationPart.NameAnnotation("s0"));
                env.CompileDeploy(model).AddListener("s0");

                TryAssertionDefault(env);

                env.UndeployAll();
            }
Exemple #4
0
            public void Run(RegressionEnvironment env)
            {
                // every 15 minutes 8am to 5pm
                SendTimeEvent(env, 1, 17, 10, 0, 0);
                var expression = "select * from SupportMarketDataBean#lastevent output at (*/15, 8:17, *, *, *)";

                var model = new EPStatementObjectModel();
                model.SelectClause = SelectClause.CreateWildcard();
                model.FromClause = FromClause.Create(FilterStream.Create("SupportMarketDataBean").AddView("lastevent"));
                Expression[] crontabParams = {
                    Expressions.CrontabScheduleFrequency(15),
                    Expressions.CrontabScheduleRange(8, 17),
                    Expressions.CrontabScheduleWildcard(),
                    Expressions.CrontabScheduleWildcard(),
                    Expressions.CrontabScheduleWildcard()
                };
                model.OutputLimitClause = OutputLimitClause.CreateSchedule(crontabParams);

                var epl = model.ToEPL();
                Assert.AreEqual(expression, epl);

                model.Annotations = Collections.SingletonList(AnnotationPart.NameAnnotation("s0"));
                env.CompileDeploy(model).AddListener("s0");

                TryAssertionCrontab(env, 1);
            }
            public void Run(RegressionEnvironment env)
            {
                var milestone = new AtomicLong();

                SendTimer(env, 0);
                var stmtText = "select TheString from SupportBean#keepall output after " +
                               "0.0d days " +
                               "0.0d hours " +
                               "0.0d minutes " +
                               "20.0d seconds " +
                               "0.0d milliseconds " +
                               "every " +
                               "0.0d days " +
                               "0.0d hours " +
                               "0.0d minutes " +
                               "5.0d seconds " +
                               "0.0d milliseconds";
                env.CompileDeploy("@Name('s0') " + stmtText).AddListener("s0");

                TryAssertionEveryPolicy(env, milestone);

                env.UndeployAll();

                var model = new EPStatementObjectModel();
                model.SelectClause = SelectClause.Create("TheString");
                model.FromClause = FromClause.Create(FilterStream.Create("SupportBean").AddView("keepall"));
                model.OutputLimitClause = OutputLimitClause.Create(Expressions.TimePeriod(0, 0, 0, 5, 0))
                    .WithAfterTimePeriodExpression(Expressions.TimePeriod(0, 0, 0, 20, 0));
                Assert.AreEqual(stmtText, model.ToEPL());
            }
Exemple #6
0
        public void TestOutputCrontabAtOMCreate()
        {
            // every 15 minutes 8am to 5pm
            SendTimeEvent(1, 17, 10, 0, 0);
            var expression = "select * from MarketData.std:lastevent() output at (*/15, 8:17, *, *, *)";

            var model = new EPStatementObjectModel();

            model.SelectClause = SelectClause.CreateWildcard();
            model.FromClause   = FromClause.Create(FilterStream.Create("MarketData").AddView("std", "lastevent"));
            var crontabParams = new Expression[] {
                Expressions.CrontabScheduleFrequency(15),
                Expressions.CrontabScheduleRange(8, 17),
                Expressions.CrontabScheduleWildcard(),
                Expressions.CrontabScheduleWildcard(),
                Expressions.CrontabScheduleWildcard()
            };

            model.OutputLimitClause = OutputLimitClause.CreateSchedule(crontabParams);

            var epl = model.ToEPL();

            Assert.AreEqual(expression, epl);
            var stmt = _epService.EPAdministrator.Create(model);

            stmt.AddListener(_listener);
            RunAssertionCrontab(1, stmt);
        }
        public void TestAliasesAggregationOM()
        {
            var model = new EPStatementObjectModel();

            model.SelectClause      = SelectClause.Create("Symbol", "Volume").Add(Expressions.Sum("Price"), "mySum");
            model.FromClause        = FromClause.Create(FilterStream.Create(typeof(SupportMarketDataBean).FullName).AddView(View.Create("length", Expressions.Constant(20))));
            model.GroupByClause     = GroupByClause.Create("Symbol");
            model.OutputLimitClause = OutputLimitClause.Create(6);
            model.OrderByClause     = OrderByClause.Create(Expressions.Sum("Price")).Add("Symbol", false);
            model = (EPStatementObjectModel)SerializableObjectCopier.Copy(model);

            var statementString = "select Symbol, Volume, sum(Price) as mySum from " +
                                  typeof(SupportMarketDataBean).FullName + "#length(20) " +
                                  "group by Symbol " +
                                  "output every 6 events " +
                                  "order by sum(Price), Symbol";

            Assert.AreEqual(statementString, model.ToEPL());

            _testListener = new SupportUpdateListener();
            var statement = _epService.EPAdministrator.Create(model);

            statement.AddListener(_testListener);

            RunAssertionDefault();
        }
Exemple #8
0
        /// <summary>
        /// Limit the output of the query.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="esperQuery">The esper query.</param>
        /// <param name="selector">The selector.</param>
        /// <param name="frequency">The frequency.</param>
        /// <returns></returns>
        public static EsperQuery <T> OutputLimit <T>(this EsperQuery <T> esperQuery, OutputLimitSelector selector, double frequency)
        {
            var parentObjectModel = esperQuery.ObjectModel;
            var deriveObjectModel = parentObjectModel.ShallowCopy();

            deriveObjectModel.OutputLimitClause = OutputLimitClause.Create(selector, frequency);
            return(new EsperQuery <T>(esperQuery.ServiceProvider, deriveObjectModel));
        }
Exemple #9
0
        /// <summary>
        /// Limit the output of the query.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="esperQuery">The esper query.</param>
        /// <param name="selector">The selector.</param>
        /// <param name="timePeriodExpression">The time period expression.</param>
        /// <returns></returns>
        public static EsperQuery <T> OutputLimit <T>(this EsperQuery <T> esperQuery, OutputLimitSelector selector, TimePeriodExpression timePeriodExpression)
        {
            var parentObjectModel = esperQuery.ObjectModel;
            var deriveObjectModel = parentObjectModel.ShallowCopy();

            deriveObjectModel.OutputLimitClause = OutputLimitClause.Create(selector, timePeriodExpression);
            return(new EsperQuery <T>(esperQuery.ServiceProvider, deriveObjectModel));
        }
Exemple #10
0
        /// <summary>
        /// Limit the output of the query.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="esperQuery">The esper query.</param>
        /// <param name="frequencyVariable">is the variable name providing output rate frequency values</param>
        /// <returns>clause</returns>
        public static EsperQuery <T> OutputLimit <T>(this EsperQuery <T> esperQuery, String frequencyVariable)
        {
            var parentObjectModel = esperQuery.ObjectModel;
            var deriveObjectModel = parentObjectModel.ShallowCopy();

            deriveObjectModel.OutputLimitClause = OutputLimitClause.Create(frequencyVariable);
            return(new EsperQuery <T>(esperQuery.ServiceProvider, deriveObjectModel));
        }
Exemple #11
0
        /// <summary>
        /// Limit the output of the query.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="esperQuery">The esper query.</param>
        /// <param name="scheduleParameters">the crontab schedule parameters</param>
        /// <returns>clause</returns>
        public static EsperQuery <T> OutputLimit <T>(this EsperQuery <T> esperQuery, client.soda.Expression[] scheduleParameters)
        {
            var parentObjectModel = esperQuery.ObjectModel;
            var deriveObjectModel = parentObjectModel.ShallowCopy();

            deriveObjectModel.OutputLimitClause = OutputLimitClause.CreateSchedule(scheduleParameters);
            return(new EsperQuery <T>(esperQuery.ServiceProvider, deriveObjectModel));
        }
        private void RunAssertionDirectNumberOfEvents(EPServiceProvider epService)
        {
            string[]    fields   = "TheString".Split(',');
            string      stmtText = "select TheString from SupportBean#keepall output after 3 events";
            EPStatement stmt     = epService.EPAdministrator.CreateEPL(stmtText);
            var         listener = new SupportUpdateListener();

            stmt.Events += listener.Update;

            SendEvent(epService, "E1");
            SendEvent(epService, "E2");
            SendEvent(epService, "E3");
            Assert.IsFalse(listener.IsInvoked);

            SendEvent(epService, "E4");
            EPAssertionUtil.AssertProps(listener.AssertOneGetNewAndReset(), fields, new object[] { "E4" });

            SendEvent(epService, "E5");
            EPAssertionUtil.AssertProps(listener.AssertOneGetNewAndReset(), fields, new object[] { "E5" });

            stmt.Dispose();

            var model = new EPStatementObjectModel();

            model.SelectClause      = SelectClause.Create("TheString");
            model.FromClause        = FromClause.Create(FilterStream.Create("SupportBean").AddView("keepall"));
            model.OutputLimitClause = OutputLimitClause.CreateAfter(3);
            Assert.AreEqual("select TheString from SupportBean#keepall output after 3 events ", model.ToEPL());

            stmt         = epService.EPAdministrator.Create(model);
            stmt.Events += listener.Update;

            SendEvent(epService, "E1");
            SendEvent(epService, "E2");
            SendEvent(epService, "E3");
            Assert.IsFalse(listener.IsInvoked);

            SendEvent(epService, "E4");
            EPAssertionUtil.AssertProps(listener.AssertOneGetNewAndReset(), fields, new object[] { "E4" });

            SendEvent(epService, "E5");
            EPAssertionUtil.AssertProps(listener.AssertOneGetNewAndReset(), fields, new object[] { "E5" });

            model = epService.EPAdministrator.CompileEPL("select TheString from SupportBean#keepall output after 3 events");
            Assert.AreEqual("select TheString from SupportBean#keepall output after 3 events ", model.ToEPL());

            stmt.Dispose();
        }
        public void TestEveryPolicy()
        {
            SendTimer(0);
            var stmtText = "select TheString from SupportBean.win:keepall() output after 0 days 0 hours 0 minutes 20 seconds 0 milliseconds every 0 days 0 hours 0 minutes 5 seconds 0 milliseconds";
            var stmt     = _epService.EPAdministrator.CreateEPL(stmtText);

            stmt.AddListener(_listener);

            RunAssertion();

            var model = new EPStatementObjectModel();

            model.SelectClause      = SelectClause.Create("TheString");
            model.FromClause        = FromClause.Create(FilterStream.Create("SupportBean").AddView("win", "keepall"));
            model.OutputLimitClause = OutputLimitClause.Create(Expressions.TimePeriod(0, 0, 0, 5, 0)).SetAfterTimePeriodExpression(Expressions.TimePeriod(0, 0, 0, 20, 0));
            Assert.AreEqual(stmtText, model.ToEPL());
        }
Exemple #14
0
        public void TestDirectNumberOfEvents()
        {
            String      stmtText = "select TheString from SupportBean.win:keepall() output after 3 events";
            EPStatement stmt     = _epService.EPAdministrator.CreateEPL(stmtText);

            stmt.Events += _listener.Update;

            SendEvent("E1");
            SendEvent("E2");
            SendEvent("E3");
            Assert.IsFalse(_listener.IsInvoked);

            SendEvent("E4");
            EPAssertionUtil.AssertProps(_listener.AssertOneGetNewAndReset(), _fields, new Object[] { "E4" });

            SendEvent("E5");
            EPAssertionUtil.AssertProps(_listener.AssertOneGetNewAndReset(), _fields, new Object[] { "E5" });

            stmt.Dispose();

            var model = new EPStatementObjectModel();

            model.SelectClause      = SelectClause.Create("TheString");
            model.FromClause        = FromClause.Create(FilterStream.Create("SupportBean").AddView("win", "keepall"));
            model.OutputLimitClause = OutputLimitClause.CreateAfter(3);
            Assert.AreEqual("select TheString from SupportBean.win:keepall() output after 3 events ", model.ToEPL());

            stmt         = _epService.EPAdministrator.Create(model);
            stmt.Events += _listener.Update;

            SendEvent("E1");
            SendEvent("E2");
            SendEvent("E3");
            Assert.IsFalse(_listener.IsInvoked);

            SendEvent("E4");
            EPAssertionUtil.AssertProps(_listener.AssertOneGetNewAndReset(), _fields, new Object[] { "E4" });

            SendEvent("E5");
            EPAssertionUtil.AssertProps(_listener.AssertOneGetNewAndReset(), _fields, new Object[] { "E5" });

            model =
                _epService.EPAdministrator.CompileEPL(
                    "select TheString from SupportBean.win:keepall() output after 3 events");
            Assert.AreEqual("select TheString from SupportBean.win:keepall() output after 3 events ", model.ToEPL());
        }
Exemple #15
0
        public void TestOutputRateEventsAll_OM()
        {
            _epService.EPAdministrator.Configuration.AddVariable("var_output_limit", typeof(long), "3");

            EPStatementObjectModel model = new EPStatementObjectModel();

            model.SelectClause      = SelectClause.Create().Add(Expressions.CountStar(), "cnt");
            model.FromClause        = FromClause.Create(FilterStream.Create(typeof(SupportBean).FullName));
            model.OutputLimitClause = OutputLimitClause.Create(OutputLimitSelector.LAST, "var_output_limit");

            String      stmtTextSelect = "select count(*) as cnt from " + typeof(SupportBean).FullName + " output last every var_output_limit events";
            EPStatement stmtSelect     = _epService.EPAdministrator.Create(model);

            stmtSelect.Events += _listener.Update;
            Assert.AreEqual(stmtTextSelect, model.ToEPL());

            RunAssertionOutputRateEventsAll();
        }
Exemple #16
0
            public void Run(RegressionEnvironment env)
            {
                env.Runtime.VariableService.SetVariableValue(null, "var_output_limit", 3L);
                var model = new EPStatementObjectModel();
                model.SelectClause = SelectClause.Create().Add(Expressions.CountStar(), "cnt");
                model.FromClause = FromClause.Create(FilterStream.Create(typeof(SupportBean).Name));
                model.OutputLimitClause = OutputLimitClause.Create(OutputLimitSelector.LAST, "var_output_limit");
                model.Annotations = Collections.SingletonList(AnnotationPart.NameAnnotation("s0"));

                var stmtTextSelect =
                    "@Name('s0') select count(*) as cnt from SupportBean output last every var_output_limit events";
                Assert.AreEqual(stmtTextSelect, model.ToEPL());
                env.CompileDeploy(model, new RegressionPath()).AddListener("s0");

                TryAssertionOutputRateEventsAll(env);

                env.UndeployAll();
            }
        private void RunAssertionOutputRateEventsAll_OM(EPServiceProvider epService)
        {
            epService.EPRuntime.SetVariableValue("var_output_limit", 3L);
            var model = new EPStatementObjectModel();

            model.SelectClause      = SelectClause.Create().Add(Expressions.CountStar(), "cnt");
            model.FromClause        = FromClause.Create(FilterStream.Create(typeof(SupportBean).FullName));
            model.OutputLimitClause = OutputLimitClause.Create(OutputLimitSelector.LAST, "var_output_limit");

            string      stmtTextSelect = "select count(*) as cnt from " + typeof(SupportBean).FullName + " output last every var_output_limit events";
            EPStatement stmtSelect     = epService.EPAdministrator.Create(model);
            var         listener       = new SupportUpdateListener();

            stmtSelect.Events += listener.Update;
            Assert.AreEqual(stmtTextSelect, model.ToEPL());

            TryAssertionOutputRateEventsAll(epService, listener);

            stmtSelect.Dispose();
        }
Exemple #18
0
        public void TestCreateFromOMComplete()
        {
            var model = new EPStatementObjectModel();

            model.InsertInto   = InsertIntoClause.Create("ReadyStreamAvg", "line", "avgAge");
            model.SelectClause = SelectClause.Create()
                                 .Add("line")
                                 .Add(Expressions.Avg("age"), "avgAge");
            var filter = Filter.Create(typeof(SupportBean).FullName, Expressions.In("line", 1, 8, 10));

            model.FromClause        = FromClause.Create(FilterStream.Create(filter, "RS").AddView("win", "time", Expressions.Constant(10)));
            model.WhereClause       = Expressions.IsNotNull("waverId");
            model.GroupByClause     = GroupByClause.Create("line");
            model.HavingClause      = Expressions.Lt(Expressions.Avg("age"), Expressions.Constant(0));
            model.OutputLimitClause = OutputLimitClause.Create(Expressions.TimePeriod(null, null, null, 10, null));
            model.OrderByClause     = OrderByClause.Create("line");

            Assert.AreEqual("insert into ReadyStreamAvg(line, avgAge) select line, avg(age) as avgAge from com.espertech.esper.support.bean.SupportBean(line in (1,8,10)).win:time(10) as RS where waverId is not null group by line having avg(age)<0 output every 10 seconds order by line", model.ToEPL());
            SerializableObjectCopier.Copy(model);
        }
Exemple #19
0
            public void Run(RegressionEnvironment env)
            {
                EPStatementObjectModel model = new EPStatementObjectModel();
                model.SetInsertInto(InsertIntoClause.Create("ReadyStreamAvg", "line", "avgAge"));
                model.SetSelect(SelectClause.Create().Add("line").Add(Expressions.Avg("age"), "avgAge"));
                Filter filter = Filter.Create(typeof(SupportBean).FullName, Expressions.In("line", 1, 8, 10));
                model.SetFrom(FromClause.Create(FilterStream.Create(filter, "RS").AddView("time", Expressions.Constant(10))));
                model.SetWhere(Expressions.IsNotNull("waverId"));
                model.SetGroupBy(GroupByClause.Create("line"));
                model.SetHaving(Expressions.Lt(Expressions.Avg("age"), Expressions.Constant(0)));
                model.SetOutputLimit(OutputLimitClause.Create(Expressions.TimePeriod(null, null, null, 10, null)));
                model.SetOrderBy(OrderByClause.Create("line"));

                Assert.AreEqual(
                    "insert into ReadyStreamAvg(line, avgAge) select line, avg(age) as avgAge from " +
                    typeof(SupportBean).CleanName() +
                    "(line in (1,8,10))#time(10) as RS where waverId is not null group by line having avg(age)<0 output every 10.0d seconds order by line",
                    model.ToEPL());
                SerializableObjectCopier.CopyMayFail(env.Container, model);
            }
        private void RunAssertionEveryPolicy(EPServiceProvider epService)
        {
            SendTimer(epService, 0);
            string      stmtText = "select TheString from SupportBean#keepall output after 0 days 0 hours 0 minutes 20 seconds 0 milliseconds every 0 days 0 hours 0 minutes 5 seconds 0 milliseconds";
            EPStatement stmt     = epService.EPAdministrator.CreateEPL(stmtText);
            var         listener = new SupportUpdateListener();

            stmt.Events += listener.Update;

            TryAssertionEveryPolicy(epService, listener);

            stmt.Dispose();

            var model = new EPStatementObjectModel();

            model.SelectClause      = SelectClause.Create("TheString");
            model.FromClause        = FromClause.Create(FilterStream.Create("SupportBean").AddView("keepall"));
            model.OutputLimitClause = OutputLimitClause.Create(Expressions.TimePeriod(0, 0, 0, 5, 0))
                                      .SetAfterTimePeriodExpression(Expressions.TimePeriod(0, 0, 0, 20, 0));
            Assert.AreEqual(stmtText, model.ToEPL());
        }
Exemple #21
0
            public void Run(RegressionEnvironment env)
            {
                env.Runtime.VariableService.SetVariableValue(null, "myvar", 0);
                SendTimeEvent(env, 1, 8, 0, 0, 0);
                env.CompileDeploy("on SupportBean set myvar = IntPrimitive");

                var expression =
                    "@Name('s0') select Symbol from SupportMarketDataBean#length(2) output when myvar=1 then set myvar=0, count_insert_var=count_insert";
                var model = new EPStatementObjectModel();
                model.SelectClause = SelectClause.Create("Symbol");
                model.FromClause = FromClause.Create(
                    FilterStream.Create("SupportMarketDataBean").AddView("length", Expressions.Constant(2)));
                model.OutputLimitClause = OutputLimitClause.Create(Expressions.Eq("myvar", 1))
                    .WithAddThenAssignment(Expressions.Eq(Expressions.Property("myvar"), Expressions.Constant(0)))
                    .WithAddThenAssignment(
                        Expressions.Eq(Expressions.Property("count_insert_var"), Expressions.Property("count_insert")));
                model.Annotations = Collections.SingletonList(AnnotationPart.NameAnnotation("s0"));
                var epl = model.ToEPL();
                Assert.AreEqual(expression, epl);
                env.Runtime.VariableService.SetVariableValue(null, "myvar", 0);
                env.CompileDeploy(model).AddListener("s0");

                env.UndeployAll();
            }
Exemple #22
0
        public void TestOutputWhenThenExpression()
        {
            SendTimeEvent(1, 8, 0, 0, 0);
            _epService.EPAdministrator.Configuration.AddVariable("myvar", typeof(int), 0);
            _epService.EPAdministrator.Configuration.AddVariable("count_insert_var", typeof(int), 0);
            _epService.EPAdministrator.CreateEPL("on SupportBean set myvar = IntPrimitive");

            var expression = "select Symbol from MarketData.win:length(2) output when myvar=1 then set myvar=0, count_insert_var=count_insert";
            var stmt       = _epService.EPAdministrator.CreateEPL(expression);

            RunAssertion(1, stmt);

            var model = new EPStatementObjectModel();

            model.SelectClause      = SelectClause.Create("Symbol");
            model.FromClause        = FromClause.Create(FilterStream.Create("MarketData").AddView("win", "length", Expressions.Constant(2)));
            model.OutputLimitClause = OutputLimitClause.Create(Expressions.Eq("myvar", 1))
                                      .AddThenAssignment(Expressions.Eq(Expressions.Property("myvar"), Expressions.Constant(0)))
                                      .AddThenAssignment(Expressions.Eq(Expressions.Property("count_insert_var"), Expressions.Property("count_insert")));

            var epl = model.ToEPL();

            Assert.AreEqual(expression, epl);
            stmt = _epService.EPAdministrator.Create(model);
            RunAssertion(2, stmt);

            model = _epService.EPAdministrator.CompileEPL(expression);
            Assert.AreEqual(expression, model.ToEPL());
            stmt = _epService.EPAdministrator.Create(model);
            RunAssertion(3, stmt);

            var outputLast = "select Symbol from MarketData.win:length(2) output last when myvar=1 ";

            model = _epService.EPAdministrator.CompileEPL(outputLast);
            Assert.AreEqual(outputLast.Trim(), model.ToEPL().Trim());

            // test same variable referenced multiple times JIRA-386
            SendTimer(0);
            var listenerOne = new SupportUpdateListener();
            var listenerTwo = new SupportUpdateListener();
            var stmtOne     = _epService.EPAdministrator.CreateEPL("select * from MarketData output last when myvar=100");

            stmtOne.AddListener(listenerOne);
            var stmtTwo = _epService.EPAdministrator.CreateEPL("select * from MarketData output last when myvar=100");

            stmtTwo.AddListener(listenerTwo);
            _epService.EPRuntime.SendEvent(new SupportMarketDataBean("ABC", "E1", 100));
            _epService.EPRuntime.SendEvent(new SupportMarketDataBean("ABC", "E2", 100));

            SendTimer(1000);
            Assert.IsFalse(listenerOne.IsInvoked);
            Assert.IsFalse(listenerTwo.IsInvoked);

            _epService.EPRuntime.SetVariableValue("myvar", 100);
            SendTimer(2000);
            Assert.IsTrue(listenerTwo.IsInvoked);
            Assert.IsTrue(listenerOne.IsInvoked);

            stmtOne.Dispose();
            stmtTwo.Dispose();

            // test when-then with condition triggered by output events
            SendTimeEvent(2, 8, 0, 0, 0);
            var eplToDeploy = "create variable boolean varOutputTriggered = false\n;" +
                              "@Audit @Name('out') select * from SupportBean.std:lastevent() output snapshot when (count_insert > 1 and varOutputTriggered = false) then set varOutputTriggered = true;";

            _epService.EPAdministrator.DeploymentAdmin.ParseDeploy(eplToDeploy);
            _epService.EPAdministrator.GetStatement("out").AddListener(_listener);

            _epService.EPRuntime.SendEvent(new SupportBean("E1", 1));
            Assert.IsFalse(_listener.IsInvoked);

            _epService.EPRuntime.SendEvent(new SupportBean("E2", 2));
            Assert.AreEqual("E2", _listener.AssertOneGetNewAndReset().Get("TheString"));

            _epService.EPRuntime.SendEvent(new SupportBean("E3", 3));
            _epService.EPRuntime.SendEvent(new SupportBean("E4", 4));
            Assert.IsFalse(_listener.IsInvoked);

            _epService.EPRuntime.SetVariableValue("varOutputTriggered", false);     // turns true right away as triggering output

            _epService.EPRuntime.SendEvent(new SupportBean("E5", 5));
            SendTimeEvent(2, 8, 0, 1, 0);
            Assert.AreEqual("E5", _listener.AssertOneGetNewAndReset().Get("TheString"));

            _epService.EPRuntime.SendEvent(new SupportBean("E6", 6));
            Assert.IsFalse(_listener.IsInvoked);

            _epService.EPAdministrator.DestroyAllStatements();

            // test count_total for insert and remove
            _epService.EPAdministrator.CreateEPL("create variable int var_cnt_total = 3");
            var expressionTotal = "select TheString from SupportBean.win:length(2) output when count_insert_total = var_cnt_total or count_remove_total > 2";
            var stmtTotal       = _epService.EPAdministrator.CreateEPL(expressionTotal);

            stmtTotal.AddListener(_listener);

            _epService.EPRuntime.SendEvent(new SupportBean("E1", 1));
            _epService.EPRuntime.SendEvent(new SupportBean("E2", 1));
            Assert.IsFalse(_listener.IsInvoked);

            _epService.EPRuntime.SendEvent(new SupportBean("E3", 1));
            EPAssertionUtil.AssertPropsPerRow(_listener.GetAndResetLastNewData(), "TheString".Split(','), new object[][] { new object[] { "E1" }, new object[] { "E2" }, new object[] { "E3" } });

            _epService.EPRuntime.SetVariableValue("var_cnt_total", -1);

            _epService.EPRuntime.SendEvent(new SupportBean("E4", 1));
            Assert.IsFalse(_listener.GetAndClearIsInvoked());

            _epService.EPRuntime.SendEvent(new SupportBean("E5", 1));
            EPAssertionUtil.AssertPropsPerRow(_listener.GetAndResetLastNewData(), "TheString".Split(','), new object[][] { new object[] { "E4" }, new object[] { "E5" } });
            _epService.EPAdministrator.DestroyAllStatements();
        }
            public void Run(RegressionEnvironment env)
            {
                var fields = new [] { "TheString" };
                var stmtText = "@Name('s0') select TheString from SupportBean#keepall output after 3 events";
                env.CompileDeploy(stmtText).AddListener("s0");

                SendEvent(env, "E1");

                env.Milestone(0);

                SendEvent(env, "E2");
                SendEvent(env, "E3");
                Assert.IsFalse(env.Listener("s0").IsInvoked);

                env.Milestone(1);

                SendEvent(env, "E4");
                EPAssertionUtil.AssertProps(
                    env.Listener("s0").AssertOneGetNewAndReset(),
                    fields,
                    new object[] {"E4"});

                SendEvent(env, "E5");
                EPAssertionUtil.AssertProps(
                    env.Listener("s0").AssertOneGetNewAndReset(),
                    fields,
                    new object[] {"E5"});

                env.UndeployAll();

                var model = new EPStatementObjectModel();
                model.SelectClause = SelectClause.Create("TheString");
                model.FromClause = FromClause.Create(FilterStream.Create("SupportBean").AddView("keepall"));
                model.OutputLimitClause = OutputLimitClause.CreateAfter(3);
                Assert.AreEqual("select TheString from SupportBean#keepall output after 3 events ", model.ToEPL());
                model.Annotations = Collections.SingletonList(AnnotationPart.NameAnnotation("s0"));

                env.CompileDeploy(model).AddListener("s0");

                SendEvent(env, "E1");
                SendEvent(env, "E2");
                SendEvent(env, "E3");
                Assert.IsFalse(env.Listener("s0").IsInvoked);

                SendEvent(env, "E4");
                EPAssertionUtil.AssertProps(
                    env.Listener("s0").AssertOneGetNewAndReset(),
                    fields,
                    new object[] {"E4"});

                SendEvent(env, "E5");
                EPAssertionUtil.AssertProps(
                    env.Listener("s0").AssertOneGetNewAndReset(),
                    fields,
                    new object[] {"E5"});

                model = env.EplToModel("select TheString from SupportBean#keepall output after 3 events");
                Assert.AreEqual("select TheString from SupportBean#keepall output after 3 events ", model.ToEPL());

                env.UndeployAll();
            }