Example #1
0
        private static void AnalyzeRelationalOpNode(
            ExprRelationalOpNode relNode,
            QueryGraphForge queryGraph)
        {
            if (relNode.ChildNodes[0] is ExprIdentNode &&
                relNode.ChildNodes[1] is ExprIdentNode) {
                var identNodeLeft = (ExprIdentNode) relNode.ChildNodes[0];
                var identNodeRight = (ExprIdentNode) relNode.ChildNodes[1];

                if (identNodeLeft.StreamId != identNodeRight.StreamId) {
                    queryGraph.AddRelationalOpStrict(
                        identNodeLeft.StreamId,
                        identNodeLeft,
                        identNodeRight.StreamId,
                        identNodeRight,
                        relNode.RelationalOpEnum);
                }

                return;
            }

            var indexedStream = -1;
            ExprIdentNode indexedPropExpr = null;
            ExprNode exprNodeNoIdent = null;
            var relop = relNode.RelationalOpEnum;

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

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

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

            queryGraph.AddRelationalOp(indexedStream, indexedPropExpr, eligibility.StreamNum, exprNodeNoIdent, relop);
        }