Example #1
0
        private QueryGraphForge MakeQueryGraph()
        {
            var graph = new QueryGraphForge(2, null, false);

            graph.AddStrictEquals(0, "P01", Make(0, "P01"), 1, "P11", Make(1, "P11"));
            graph.AddStrictEquals(0, "P02", Make(0, "P02"), 1, "P12", Make(1, "P12"));
            return(graph);
        }
        public void TestIndexAlreadyExists()
        {
            queryGraph = new QueryGraphForge(5, null, false);
            queryGraph.AddStrictEquals(0, "P00", Make(0, "P00"), 1, "P10", Make(1, "P10"));
            queryGraph.AddStrictEquals(0, "P00", Make(0, "P00"), 2, "P20", Make(2, "P20"));

            var indexes = QueryPlanIndexBuilder.BuildIndexSpec(queryGraph, types, new string[queryGraph.NumStreams][][]);

            string[][] expected = { new string[] { "P00" } };
            EPAssertionUtil.AssertEqualsExactOrder(expected, indexes[0].IndexProps);
        }
Example #3
0
        public void TestRecursiveBuild()
        {
            var streamNum           = 2;
            var queryGraph          = new QueryGraphForge(6, null, false);
            var outerInnerGraph     = new OuterInnerDirectionalGraph(6);
            var completedStreams    = new HashSet <int>();
            var substreamsPerStream = new LinkedHashMap <int, int[]>();
            var requiredPerStream   = new bool[6];

            outerInnerGraph.Add(3, 2).Add(2, 1).Add(4, 3).Add(1, 0).Add(3, 5);
            var fake = supportExprNodeFactory.MakeIdentNode("TheString", "s0");

            queryGraph.AddStrictEquals(2, "", fake, 3, "", fake);
            queryGraph.AddStrictEquals(3, "", fake, 4, "", fake);
            queryGraph.AddStrictEquals(3, "", fake, 5, "", fake);
            queryGraph.AddStrictEquals(2, "", fake, 1, "", fake);
            queryGraph.AddStrictEquals(1, "", fake, 0, "", fake);

            ISet <InterchangeablePair <int, int> > innerJoins = new HashSet <InterchangeablePair <int, int> >();
            var innerJoinGraph = new InnerJoinGraph(6, innerJoins);
            var streamStack    = new Stack <int>();

            NStreamOuterQueryPlanBuilder.RecursiveBuild(
                streamNum,
                streamStack,
                queryGraph,
                outerInnerGraph,
                innerJoinGraph,
                completedStreams,
                substreamsPerStream,
                requiredPerStream,
                new DependencyGraph(6, false));

            Assert.AreEqual(6, substreamsPerStream.Count);
            EPAssertionUtil.AssertEqualsExactOrder(substreamsPerStream.Get(2), new[] { 3, 1 });
            EPAssertionUtil.AssertEqualsExactOrder(substreamsPerStream.Get(3), new[] { 4, 5 });
            EPAssertionUtil.AssertEqualsExactOrder(substreamsPerStream.Get(1), new[] { 0 });
            EPAssertionUtil.AssertEqualsExactOrder(substreamsPerStream.Get(4), new int[] { });
            EPAssertionUtil.AssertEqualsExactOrder(substreamsPerStream.Get(5), new int[] { });
            EPAssertionUtil.AssertEqualsExactOrder(substreamsPerStream.Get(0), new int[] { });

            NStreamOuterQueryPlanBuilder.VerifyJoinedPerStream(2, substreamsPerStream);
            EPAssertionUtil.AssertEqualsExactOrder(
                requiredPerStream,
                new[] { false, false, false, true, true, false }
                );
        }
        public void SetUp()
        {
            types = new[] {
                supportEventTypeFactory.CreateMapType(CreateType("P00,P01")),
                supportEventTypeFactory.CreateMapType(CreateType("P10")),
                supportEventTypeFactory.CreateMapType(CreateType("P20,P21")),
                supportEventTypeFactory.CreateMapType(CreateType("P30,P31")),
                supportEventTypeFactory.CreateMapType(CreateType("P40,P41,P42"))
            };

            queryGraph = new QueryGraphForge(5, null, false);
            queryGraph.AddStrictEquals(0, "P00", Make(0, "P00"), 1, "P10", Make(1, "P10"));
            queryGraph.AddStrictEquals(0, "P01", Make(0, "P01"), 2, "P20", Make(2, "P20"));
            queryGraph.AddStrictEquals(4, "P40", Make(4, "P40"), 3, "P30", Make(3, "P30"));
            queryGraph.AddStrictEquals(4, "P41", Make(4, "P41"), 3, "P31", Make(3, "P31"));
            queryGraph.AddStrictEquals(4, "P42", Make(4, "P42"), 2, "P21", Make(2, "P21"));
        }
        public void SetUp()
        {
            typesPerStream = new EventType[] {
                supportEventTypeFactory.CreateBeanType(typeof(SupportBean_S0)),
                supportEventTypeFactory.CreateBeanType(typeof(SupportBean_S1)),
                supportEventTypeFactory.CreateBeanType(typeof(SupportBean_S2)),
                supportEventTypeFactory.CreateBeanType(typeof(SupportBean_S3)),
                supportEventTypeFactory.CreateBeanType(typeof(SupportBean_S4))
            };

            queryGraph = new QueryGraphForge(5, null, false);
            queryGraph.AddStrictEquals(0, "P00", Make(0, "P00"), 1, "P10", Make(1, "P10"));
            queryGraph.AddStrictEquals(0, "P01", Make(0, "P01"), 2, "P20", Make(2, "P20"));
            queryGraph.AddStrictEquals(4, "P40", Make(4, "P40"), 3, "P30", Make(3, "P30"));
            queryGraph.AddStrictEquals(4, "P41", Make(4, "P41"), 3, "P31", Make(3, "P31"));
            queryGraph.AddStrictEquals(4, "P42", Make(4, "P42"), 2, "P21", Make(2, "P21"));

            dependencyGraph = new DependencyGraph(5, false);
        }
        public void TestComputeNavigableDepth()
        {
            ExprIdentNode fake = supportExprNodeFactory.MakeIdentNode("TheString", "s0");

            queryGraph.AddStrictEquals(3, "P30", fake, 2, "P20", fake);
            queryGraph.AddStrictEquals(2, "P30", fake, 1, "P20", fake);

            int depth = NStreamQueryPlanBuilder.ComputeNavigableDepth(0, new int[] { 1, 2, 3, 4 }, queryGraph);

            Assert.AreEqual(4, depth);

            depth = NStreamQueryPlanBuilder.ComputeNavigableDepth(0, new int[] { 4, 2, 3, 1 }, queryGraph);
            Assert.AreEqual(0, depth);

            depth = NStreamQueryPlanBuilder.ComputeNavigableDepth(4, new int[] { 3, 2, 1, 0 }, queryGraph);
            Assert.AreEqual(4, depth);

            depth = NStreamQueryPlanBuilder.ComputeNavigableDepth(1, new int[] { 0, 3, 4, 2 }, queryGraph);
            Assert.AreEqual(1, depth);
        }
Example #7
0
 private static void Add(
     QueryGraphForge queryGraph,
     ExprIdentNode identNodeLeft,
     ExprIdentNode identNodeRight)
 {
     queryGraph.AddStrictEquals(
         identNodeLeft.StreamId,
         identNodeLeft.ResolvedPropertyName,
         identNodeLeft,
         identNodeRight.StreamId,
         identNodeRight.ResolvedPropertyName,
         identNodeRight);
 }
Example #8
0
        public void Apply(QueryGraphForge filterQueryGraph)
        {
            if (targetStreamNum == parameterStreamNum) {
                return;
            }

            var targetStartExpr = ExprNodeUtilityMake.MakeExprIdentNode(
                typesPerStream,
                targetStreamNum,
                targetStartProp);
            var targetEndExpr = ExprNodeUtilityMake.MakeExprIdentNode(typesPerStream, targetStreamNum, targetEndProp);
            var parameterStartExpr = ExprNodeUtilityMake.MakeExprIdentNode(
                typesPerStream,
                parameterStreamNum,
                parameterStartProp);
            var parameterEndExpr = ExprNodeUtilityMake.MakeExprIdentNode(
                typesPerStream,
                parameterStreamNum,
                parameterEndProp);

            if (targetStartExpr.Forge.EvaluationType != parameterStartExpr.Forge.EvaluationType) {
                return;
            }

            if (currentMethod == DateTimeMethodEnum.BEFORE) {
                // a.end < b.start
                filterQueryGraph.AddRelationalOpStrict(
                    targetStreamNum,
                    targetEndExpr,
                    parameterStreamNum,
                    parameterStartExpr,
                    RelationalOpEnum.LT);
            }
            else if (currentMethod == DateTimeMethodEnum.AFTER) {
                // a.start > b.end
                filterQueryGraph.AddRelationalOpStrict(
                    targetStreamNum,
                    targetStartExpr,
                    parameterStreamNum,
                    parameterEndExpr,
                    RelationalOpEnum.GT);
            }
            else if (currentMethod == DateTimeMethodEnum.COINCIDES) {
                // a.startTimestamp = b.startTimestamp and a.endTimestamp = b.endTimestamp
                filterQueryGraph.AddStrictEquals(
                    targetStreamNum,
                    targetStartProp,
                    targetStartExpr,
                    parameterStreamNum,
                    parameterStartProp,
                    parameterStartExpr);

                var noDuration = parameterEndProp.Equals(parameterStartProp) && targetEndProp.Equals(targetStartProp);
                if (!noDuration) {
                    var leftEndExpr = ExprNodeUtilityMake.MakeExprIdentNode(
                        typesPerStream,
                        targetStreamNum,
                        targetEndProp);
                    var rightEndExpr = ExprNodeUtilityMake.MakeExprIdentNode(
                        typesPerStream,
                        parameterStreamNum,
                        parameterEndProp);
                    filterQueryGraph.AddStrictEquals(
                        targetStreamNum,
                        targetEndProp,
                        leftEndExpr,
                        parameterStreamNum,
                        parameterEndProp,
                        rightEndExpr);
                }
            }
            else if (currentMethod == DateTimeMethodEnum.DURING || currentMethod == DateTimeMethodEnum.INCLUDES) {
                // DURING:   b.startTimestamp < a.startTimestamp <= a.endTimestamp < b.endTimestamp
                // INCLUDES: a.startTimestamp < b.startTimestamp <= b.endTimestamp < a.endTimestamp
                var relop = currentMethod == DateTimeMethodEnum.DURING ? RelationalOpEnum.LT : RelationalOpEnum.GT;
                filterQueryGraph.AddRelationalOpStrict(
                    parameterStreamNum,
                    parameterStartExpr,
                    targetStreamNum,
                    targetStartExpr,
                    relop);

                filterQueryGraph.AddRelationalOpStrict(
                    targetStreamNum,
                    targetEndExpr,
                    parameterStreamNum,
                    parameterEndExpr,
                    relop);
            }
            else if (currentMethod == DateTimeMethodEnum.FINISHES || currentMethod == DateTimeMethodEnum.FINISHEDBY) {
                // FINISHES:   b.startTimestamp < a.startTimestamp and a.endTimestamp = b.endTimestamp
                // FINISHEDBY: a.startTimestamp < b.startTimestamp and a.endTimestamp = b.endTimestamp
                var relop = currentMethod == DateTimeMethodEnum.FINISHES ? RelationalOpEnum.LT : RelationalOpEnum.GT;
                filterQueryGraph.AddRelationalOpStrict(
                    parameterStreamNum,
                    parameterStartExpr,
                    targetStreamNum,
                    targetStartExpr,
                    relop);

                filterQueryGraph.AddStrictEquals(
                    targetStreamNum,
                    targetEndProp,
                    targetEndExpr,
                    parameterStreamNum,
                    parameterEndProp,
                    parameterEndExpr);
            }
            else if (currentMethod == DateTimeMethodEnum.MEETS) {
                // a.endTimestamp = b.startTimestamp
                filterQueryGraph.AddStrictEquals(
                    targetStreamNum,
                    targetEndProp,
                    targetEndExpr,
                    parameterStreamNum,
                    parameterStartProp,
                    parameterStartExpr);
            }
            else if (currentMethod == DateTimeMethodEnum.METBY) {
                // a.startTimestamp = b.endTimestamp
                filterQueryGraph.AddStrictEquals(
                    targetStreamNum,
                    targetStartProp,
                    targetStartExpr,
                    parameterStreamNum,
                    parameterEndProp,
                    parameterEndExpr);
            }
            else if (currentMethod == DateTimeMethodEnum.OVERLAPS || currentMethod == DateTimeMethodEnum.OVERLAPPEDBY) {
                // OVERLAPS:     a.startTimestamp < b.startTimestamp < a.endTimestamp < b.endTimestamp
                // OVERLAPPEDBY: b.startTimestamp < a.startTimestamp < b.endTimestamp < a.endTimestamp
                var relop = currentMethod == DateTimeMethodEnum.OVERLAPS ? RelationalOpEnum.LT : RelationalOpEnum.GT;
                filterQueryGraph.AddRelationalOpStrict(
                    targetStreamNum,
                    targetStartExpr,
                    parameterStreamNum,
                    parameterStartExpr,
                    relop);

                filterQueryGraph.AddRelationalOpStrict(
                    targetStreamNum,
                    targetEndExpr,
                    parameterStreamNum,
                    parameterEndExpr,
                    relop);

                if (currentMethod == DateTimeMethodEnum.OVERLAPS) {
                    filterQueryGraph.AddRelationalOpStrict(
                        parameterStreamNum,
                        parameterStartExpr,
                        targetStreamNum,
                        targetEndExpr,
                        RelationalOpEnum.LT);
                }
                else {
                    filterQueryGraph.AddRelationalOpStrict(
                        targetStreamNum,
                        targetStartExpr,
                        parameterStreamNum,
                        parameterEndExpr,
                        RelationalOpEnum.LT);
                }
            }
            else if (currentMethod == DateTimeMethodEnum.STARTS || currentMethod == DateTimeMethodEnum.STARTEDBY) {
                // STARTS:       a.startTimestamp = b.startTimestamp and a.endTimestamp < b.endTimestamp
                // STARTEDBY:    a.startTimestamp = b.startTimestamp and b.endTimestamp < a.endTimestamp
                filterQueryGraph.AddStrictEquals(
                    targetStreamNum,
                    targetStartProp,
                    targetStartExpr,
                    parameterStreamNum,
                    parameterStartProp,
                    parameterStartExpr);

                var relop = currentMethod == DateTimeMethodEnum.STARTS ? RelationalOpEnum.LT : RelationalOpEnum.GT;
                filterQueryGraph.AddRelationalOpStrict(
                    targetStreamNum,
                    targetEndExpr,
                    parameterStreamNum,
                    parameterEndExpr,
                    relop);
            }
        }
Example #9
0
        /// <summary>
        ///     Analye EQUALS (=) node.
        /// </summary>
        /// <param name="equalsNode">node to analyze</param>
        /// <param name="queryGraph">store relationships between stream properties</param>
        /// <param name="isOuterJoin">indicator for outer join</param>
        protected internal static void AnalyzeEqualsNode(
            ExprEqualsNode equalsNode,
            QueryGraphForge queryGraph,
            bool isOuterJoin)
        {
            if (equalsNode.ChildNodes[0] is ExprIdentNode &&
                equalsNode.ChildNodes[1] is ExprIdentNode) {
                var identNodeLeft = (ExprIdentNode) equalsNode.ChildNodes[0];
                var identNodeRight = (ExprIdentNode) equalsNode.ChildNodes[1];

                if (identNodeLeft.StreamId != identNodeRight.StreamId) {
                    queryGraph.AddStrictEquals(
                        identNodeLeft.StreamId,
                        identNodeLeft.ResolvedPropertyName,
                        identNodeLeft,
                        identNodeRight.StreamId,
                        identNodeRight.ResolvedPropertyName,
                        identNodeRight);
                }

                return;
            }

            if (isOuterJoin) {
                // outerjoins don't use constants or one-way expression-derived information to evaluate join
                return;
            }

            // handle constant-compare or transformation case
            var indexedStream = -1;
            ExprIdentNode indexedPropExpr = null;
            ExprNode exprNodeNoIdent = null;

            if (equalsNode.ChildNodes[0] is ExprIdentNode) {
                indexedPropExpr = (ExprIdentNode) equalsNode.ChildNodes[0];
                indexedStream = indexedPropExpr.StreamId;
                exprNodeNoIdent = equalsNode.ChildNodes[1];
            }
            else if (equalsNode.ChildNodes[1] is ExprIdentNode) {
                indexedPropExpr = (ExprIdentNode) equalsNode.ChildNodes[1];
                indexedStream = indexedPropExpr.StreamId;
                exprNodeNoIdent = equalsNode.ChildNodes[0];
            }

            if (indexedStream == -1) {
                return; // require property of right/left side of equals
            }

            var eligibility = EligibilityUtil.VerifyInputStream(exprNodeNoIdent, indexedStream);
            if (!eligibility.Eligibility.IsEligible()) {
                return;
            }

            if (eligibility.Eligibility == Eligibility.REQUIRE_NONE) {
                queryGraph.AddUnkeyedExpression(indexedStream, indexedPropExpr, exprNodeNoIdent);
            }
            else {
                queryGraph.AddKeyedExpression(
                    indexedStream,
                    indexedPropExpr,
                    eligibility.StreamNum.Value,
                    exprNodeNoIdent);
            }
        }