Example #1
0
        private static void TryAssertion(
            RegressionEnvironment env,
            bool disableImplicitUniqueIdx,
            string uniqueFields,
            string whereClause,
            string backingTable,
            IndexAssertionEventSend assertion)
        {
            SupportQueryPlanIndexHook.Reset();
            var eplUnique = "@Name('s0')" +
                            INDEX_CALLBACK_HOOK +
                            "select S1 as c0, " +
                            "(select S2 from SupportSimpleBeanTwo#unique(" +
                            uniqueFields +
                            ") as ssb2 " +
                            whereClause +
                            ") as c1 " +
                            "from SupportSimpleBeanOne as ssb1";
            if (disableImplicitUniqueIdx) {
                eplUnique = "@Hint('DISABLE_UNIQUE_IMPLICIT_IDX')" + eplUnique;
            }

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

            SupportQueryPlanIndexHook.AssertSubqueryBackingAndReset(SUBQUERY_NUM_FIRST, null, backingTable);

            assertion.Invoke();

            env.UndeployAll();
        }
        private void AssertIndexChoice(bool namedWindow, bool indexShare, string[] indexes, object[] preloadedEvents, string datawindow, IndexAssertion[] assertions)
        {
            var epl = namedWindow ?
                      "create window MyInfra." + datawindow + " as select * from SSB1" :
                      "create table MyInfra(S1 string primary key, I1 int, D1 double, L1 long)";

            if (indexShare)
            {
                epl = "@Hint('enable_window_subquery_indexshare') " + epl;
            }
            _epService.EPAdministrator.CreateEPL(epl);
            _epService.EPAdministrator.CreateEPL("insert into MyInfra select * from SSB1");
            foreach (var index in indexes)
            {
                _epService.EPAdministrator.CreateEPL(index);
            }
            foreach (var @event in preloadedEvents)
            {
                _epService.EPRuntime.SendEvent(@event);
            }

            var count = 0;

            foreach (var assertion in assertions)
            {
                Log.Info("======= Testing #" + count++);
                var consumeEpl = INDEX_CALLBACK_HOOK +
                                 (assertion.Hint ?? "") + "select *, " +
                                 "(select * from MyInfra where " + assertion.WhereClause + ") @eventbean as ssb1 from SSB2 as ssb2";

                EPStatement consumeStmt = null;
                try {
                    consumeStmt = _epService.EPAdministrator.CreateEPL(consumeEpl);
                }
                catch (EPStatementException ex) {
                    if (assertion.EventSendAssertion == null)
                    {
                        // no assertion, expected
                        Assert.IsTrue(ex.Message.Contains("index hint busted"));
                        continue;
                    }
                    throw new EPRuntimeException("Unexpected statement exception: " + ex.Message, ex);
                }

                // assert index and access
                SupportQueryPlanIndexHook.AssertSubqueryBackingAndReset(0, assertion.ExpectedIndexName, assertion.IndexBackingClass);
                consumeStmt.AddListener(_listenerStmtOne);
                assertion.EventSendAssertion.Invoke();
                consumeStmt.Dispose();
            }

            _epService.EPAdministrator.DestroyAllStatements();
            _epService.EPAdministrator.Configuration.RemoveEventType("MyInfra", false);
        }
Example #3
0
        private void RunAssertion(bool disableImplicitUniqueIdx, String uniqueFields, String whereClause, String backingTable, IndexAssertionEventSend assertion)
        {
            String eplUnique = INDEX_CALLBACK_HOOK + "select s1 as c0, " +
                               "(select s2 from SSB2.std:unique(" + uniqueFields + ") as ssb2 " + whereClause + ") as c1 " +
                               "from SSB1 as ssb1";

            if (disableImplicitUniqueIdx)
            {
                eplUnique = "@Hint('DISABLE_UNIQUE_IMPLICIT_IDX')" + eplUnique;
            }
            EPStatement stmtUnique = _epService.EPAdministrator.CreateEPL(eplUnique);

            stmtUnique.Events += _listener.Update;

            SupportQueryPlanIndexHook.AssertSubqueryBackingAndReset(0, null, backingTable);

            assertion.Invoke();

            stmtUnique.Dispose();
        }
Example #4
0
        public void TestUniqueIndexCorrelated()
        {
            _epService.EPAdministrator.Configuration.AddEventType <SupportBean>();
            _epService.EPAdministrator.Configuration.AddEventType("S0", typeof(SupportBean_S0));
            String[] fields = "c0,c1".Split(',');

            // test std:unique
            String eplUnique = INDEX_CALLBACK_HOOK + "select id as c0, " +
                               "(select IntPrimitive from SupportBean.std:unique(TheString) where TheString = s0.p00) as c1 " +
                               "from S0 as s0";
            EPStatement stmtUnique = _epService.EPAdministrator.CreateEPL(eplUnique);

            stmtUnique.Events += _listener.Update;

            SupportQueryPlanIndexHook.AssertSubqueryBackingAndReset(0, null, BACKING_SINGLE_UNIQUE);

            _epService.EPRuntime.SendEvent(new SupportBean("E1", 1));
            _epService.EPRuntime.SendEvent(new SupportBean("E2", 2));
            _epService.EPRuntime.SendEvent(new SupportBean("E1", 3));
            _epService.EPRuntime.SendEvent(new SupportBean("E2", 4));

            _epService.EPRuntime.SendEvent(new SupportBean_S0(10, "E2"));
            EPAssertionUtil.AssertProps(_listener.AssertOneGetNewAndReset(), fields, new Object[] { 10, 4 });

            _epService.EPRuntime.SendEvent(new SupportBean_S0(11, "E1"));
            EPAssertionUtil.AssertProps(_listener.AssertOneGetNewAndReset(), fields, new Object[] { 11, 3 });

            stmtUnique.Dispose();

            // test std:firstunique
            String eplFirstUnique = INDEX_CALLBACK_HOOK + "select id as c0, " +
                                    "(select IntPrimitive from SupportBean.std:firstunique(TheString) where TheString = s0.p00) as c1 " +
                                    "from S0 as s0";
            EPStatement stmtFirstUnique = _epService.EPAdministrator.CreateEPL(eplFirstUnique);

            stmtFirstUnique.Events += _listener.Update;

            SupportQueryPlanIndexHook.AssertSubqueryBackingAndReset(0, null, BACKING_SINGLE_UNIQUE);

            _epService.EPRuntime.SendEvent(new SupportBean("E1", 1));
            _epService.EPRuntime.SendEvent(new SupportBean("E2", 2));
            _epService.EPRuntime.SendEvent(new SupportBean("E1", 3));
            _epService.EPRuntime.SendEvent(new SupportBean("E2", 4));

            _epService.EPRuntime.SendEvent(new SupportBean_S0(10, "E2"));
            EPAssertionUtil.AssertProps(_listener.AssertOneGetNewAndReset(), fields, new Object[] { 10, 2 });

            _epService.EPRuntime.SendEvent(new SupportBean_S0(11, "E1"));
            EPAssertionUtil.AssertProps(_listener.AssertOneGetNewAndReset(), fields, new Object[] { 11, 1 });

            stmtFirstUnique.Dispose();

            // test intersection std:firstunique
            String eplIntersection = INDEX_CALLBACK_HOOK + "select id as c0, " +
                                     "(select IntPrimitive from SupportBean.win:time(1).std:unique(TheString) where TheString = s0.p00) as c1 " +
                                     "from S0 as s0";
            EPStatement stmtIntersection = _epService.EPAdministrator.CreateEPL(eplIntersection);

            stmtIntersection.Events += _listener.Update;

            SupportQueryPlanIndexHook.AssertSubqueryBackingAndReset(0, null, BACKING_SINGLE_UNIQUE);

            _epService.EPRuntime.SendEvent(new SupportBean("E1", 1));
            _epService.EPRuntime.SendEvent(new SupportBean("E1", 2));
            _epService.EPRuntime.SendEvent(new SupportBean("E1", 3));
            _epService.EPRuntime.SendEvent(new SupportBean("E2", 4));

            _epService.EPRuntime.SendEvent(new SupportBean_S0(10, "E2"));
            EPAssertionUtil.AssertProps(_listener.AssertOneGetNewAndReset(), fields, new Object[] { 10, 4 });

            _epService.EPRuntime.SendEvent(new SupportBean_S0(11, "E1"));
            EPAssertionUtil.AssertProps(_listener.AssertOneGetNewAndReset(), fields, new Object[] { 11, 3 });

            stmtIntersection.Dispose();

            // test grouped unique
            String eplGrouped = INDEX_CALLBACK_HOOK + "select id as c0, " +
                                "(select LongPrimitive from SupportBean.std:groupwin(TheString).std:unique(IntPrimitive) where TheString = s0.p00 and IntPrimitive = s0.id) as c1 " +
                                "from S0 as s0";
            EPStatement stmtGrouped = _epService.EPAdministrator.CreateEPL(eplGrouped);

            stmtGrouped.Events += _listener.Update;

            SupportQueryPlanIndexHook.AssertSubqueryBackingAndReset(0, null, BACKING_MULTI_UNIQUE);

            _epService.EPRuntime.SendEvent(MakeBean("E1", 1, 100));
            _epService.EPRuntime.SendEvent(MakeBean("E1", 2, 101));
            _epService.EPRuntime.SendEvent(MakeBean("E1", 1, 102));

            _epService.EPRuntime.SendEvent(new SupportBean_S0(1, "E1"));
            EPAssertionUtil.AssertProps(_listener.AssertOneGetNewAndReset(), fields, new Object[] { 1, 102L });

            stmtGrouped.Dispose();
        }
Example #5
0
        private static void AssertIndexChoice(
            RegressionEnvironment env,
            bool namedWindow,
            bool indexShare,
            string[] indexes,
            object[] preloadedEvents,
            string datawindow,
            IndexAssertion[] assertions)
        {
            var path = new RegressionPath();
            var epl = namedWindow
                ? "create window MyInfra." + datawindow + " as select * from SupportSimpleBeanOne"
                : "create table MyInfra(S1 string primary key, I1 int, D1 double, L1 long)";
            if (indexShare) {
                epl = "@Hint('enable_window_subquery_indexshare') " + epl;
            }

            env.CompileDeploy(epl, path);
            env.CompileDeploy("insert into MyInfra select * from SupportSimpleBeanOne", path);
            foreach (var index in indexes) {
                env.CompileDeploy(index, path);
            }

            foreach (var @event in preloadedEvents) {
                env.SendEventBean(@event);
            }

            var count = 0;
            foreach (var assertion in assertions) {
                log.Info("======= Testing #" + count++);
                var consumeEpl = INDEX_CALLBACK_HOOK +
                                 "@Name('s0') " +
                                 (assertion.Hint ?? "") +
                                 "select *, " +
                                 "(select * from MyInfra where " +
                                 assertion.WhereClause +
                                 ") @eventbean as ssb1 from SupportSimpleBeanTwo as ssb2";

                EPCompiled compiled;
                try {
                    compiled = env.CompileWCheckedEx(consumeEpl, path);
                }
                catch (EPCompileException ex) {
                    if (assertion.EventSendAssertion == null) {
                        // no assertion, expected
                        Assert.IsTrue(ex.Message.Contains("index hint busted"));
                        continue;
                    }

                    throw new EPException("Unexpected statement exception: " + ex.Message, ex);
                }

                env.Deploy(compiled);

                // assert index and access
                SupportQueryPlanIndexHook.AssertSubqueryBackingAndReset(
                    0,
                    assertion.ExpectedIndexName,
                    assertion.IndexBackingClass);
                env.AddListener("s0");
                assertion.EventSendAssertion.Invoke();
                env.UndeployModuleContaining("s0");
            }

            env.UndeployAll();
        }
Example #6
0
            public void Run(RegressionEnvironment env)
            {
                var fields = new[] {"c0", "c1"};
                var milestone = new AtomicLong();

                // test std:unique
                SupportQueryPlanIndexHook.Reset();
                var eplUnique = INDEX_CALLBACK_HOOK +
                                "@Name('s0') select Id as c0, " +
                                "(select IntPrimitive from SupportBean#unique(TheString) where TheString = S0.P00) as c1 " +
                                "from SupportBean_S0 as S0";
                env.CompileDeployAddListenerMile(eplUnique, "s0", milestone.GetAndIncrement());

                SupportQueryPlanIndexHook.AssertSubqueryBackingAndReset(
                    SUBQUERY_NUM_FIRST,
                    null,
                    BACKING_SINGLE_UNIQUE);

                env.SendEventBean(new SupportBean("E1", 1));
                env.SendEventBean(new SupportBean("E2", 2));
                env.SendEventBean(new SupportBean("E1", 3));
                env.SendEventBean(new SupportBean("E2", 4));

                env.SendEventBean(new SupportBean_S0(10, "E2"));
                EPAssertionUtil.AssertProps(
                    env.Listener("s0").AssertOneGetNewAndReset(),
                    fields,
                    new object[] {10, 4});

                env.SendEventBean(new SupportBean_S0(11, "E1"));
                EPAssertionUtil.AssertProps(
                    env.Listener("s0").AssertOneGetNewAndReset(),
                    fields,
                    new object[] {11, 3});

                env.UndeployAll();

                // test std:firstunique
                SupportQueryPlanIndexHook.Reset();
                var eplFirstUnique = INDEX_CALLBACK_HOOK +
                                     "@Name('s0') select Id as c0, " +
                                     "(select IntPrimitive from SupportBean#firstunique(TheString) where TheString = S0.P00) as c1 " +
                                     "from SupportBean_S0 as S0";
                env.CompileDeployAddListenerMile(eplFirstUnique, "s0", milestone.GetAndIncrement());

                SupportQueryPlanIndexHook.AssertSubqueryBackingAndReset(
                    SUBQUERY_NUM_FIRST,
                    null,
                    BACKING_SINGLE_UNIQUE);

                env.SendEventBean(new SupportBean("E1", 1));
                env.SendEventBean(new SupportBean("E2", 2));
                env.SendEventBean(new SupportBean("E1", 3));
                env.SendEventBean(new SupportBean("E2", 4));

                env.SendEventBean(new SupportBean_S0(10, "E2"));
                EPAssertionUtil.AssertProps(
                    env.Listener("s0").AssertOneGetNewAndReset(),
                    fields,
                    new object[] {10, 2});

                env.SendEventBean(new SupportBean_S0(11, "E1"));
                EPAssertionUtil.AssertProps(
                    env.Listener("s0").AssertOneGetNewAndReset(),
                    fields,
                    new object[] {11, 1});

                env.UndeployAll();

                // test intersection std:firstunique
                SupportQueryPlanIndexHook.Reset();
                var eplIntersection = INDEX_CALLBACK_HOOK +
                                      "@Name('s0') select Id as c0, " +
                                      "(select IntPrimitive from SupportBean#time(1)#unique(TheString) where TheString = S0.P00) as c1 " +
                                      "from SupportBean_S0 as S0";
                env.CompileDeployAddListenerMile(eplIntersection, "s0", milestone.GetAndIncrement());

                SupportQueryPlanIndexHook.AssertSubqueryBackingAndReset(
                    SUBQUERY_NUM_FIRST,
                    null,
                    BACKING_SINGLE_UNIQUE);

                env.SendEventBean(new SupportBean("E1", 1));
                env.SendEventBean(new SupportBean("E1", 2));
                env.SendEventBean(new SupportBean("E1", 3));
                env.SendEventBean(new SupportBean("E2", 4));

                env.SendEventBean(new SupportBean_S0(10, "E2"));
                EPAssertionUtil.AssertProps(
                    env.Listener("s0").AssertOneGetNewAndReset(),
                    fields,
                    new object[] {10, 4});

                env.SendEventBean(new SupportBean_S0(11, "E1"));
                EPAssertionUtil.AssertProps(
                    env.Listener("s0").AssertOneGetNewAndReset(),
                    fields,
                    new object[] {11, 3});

                env.UndeployAll();

                // test grouped unique
                SupportQueryPlanIndexHook.Reset();
                var eplGrouped = INDEX_CALLBACK_HOOK +
                                 "@Name('s0') select Id as c0, " +
                                 "(select LongPrimitive from SupportBean#groupwin(TheString)#unique(IntPrimitive) where TheString = S0.P00 and IntPrimitive = S0.Id) as c1 " +
                                 "from SupportBean_S0 as S0";
                env.CompileDeployAddListenerMile(eplGrouped, "s0", milestone.GetAndIncrement());

                SupportQueryPlanIndexHook.AssertSubqueryBackingAndReset(SUBQUERY_NUM_FIRST, null, BACKING_MULTI_UNIQUE);

                env.SendEventBean(MakeBean("E1", 1, 100));
                env.SendEventBean(MakeBean("E1", 2, 101));
                env.SendEventBean(MakeBean("E1", 1, 102));

                env.SendEventBean(new SupportBean_S0(1, "E1"));
                EPAssertionUtil.AssertProps(
                    env.Listener("s0").AssertOneGetNewAndReset(),
                    fields,
                    new object[] {1, 102L});

                env.UndeployAll();
            }