Exemplo n.º 1
0
        private static void AnalyzeInNodeSingleIndex(ExprInNode inNode, QueryGraph queryGraph)
        {
            if (!(inNode.ChildNodes[0] is ExprIdentNode))
            {
                return;
            }
            var testIdent      = (ExprIdentNode)inNode.ChildNodes[0];
            var testIdentClass = TypeHelper.GetBoxedType(testIdent.ExprEvaluator.ReturnType);
            int indexedStream  = testIdent.StreamId;

            ExprNode[] setExpressions = GetInNodeSetExpressions(inNode);
            if (setExpressions.Length == 0)
            {
                return;
            }

            var perStreamExprs = new LinkedHashMap <int?, IList <ExprNode> >();

            foreach (ExprNode exprNodeSet in setExpressions)
            {
                if (exprNodeSet.ExprEvaluator.ReturnType.GetBoxedType() != testIdentClass)
                {
                    continue;
                }
                if (exprNodeSet is ExprIdentNode)
                {
                    var setIdent = (ExprIdentNode)exprNodeSet;
                    AddToList(setIdent.StreamId, setIdent, perStreamExprs);
                }
                else
                {
                    EligibilityDesc eligibility = EligibilityUtil.VerifyInputStream(exprNodeSet, indexedStream);
                    if (!eligibility.Eligibility.IsEligible())
                    {
                        continue;
                    }
                    AddToList(eligibility.StreamNum, exprNodeSet, perStreamExprs);
                }
            }

            foreach (var entry in perStreamExprs)
            {
                ExprNode[] exprNodes = ExprNodeUtility.ToArray(entry.Value);
                if (entry.Key == null)
                {
                    queryGraph.AddInSetSingleIndexUnkeyed(testIdent.StreamId, testIdent, exprNodes);
                    continue;
                }
                if (entry.Key.Value != indexedStream)
                {
                    queryGraph.AddInSetSingleIndex(testIdent.StreamId, testIdent, entry.Key.Value, exprNodes);
                }
            }
        }