Example #1
0
        private static void AnalyzeInNodeSingleIndex(
            ExprInNode inNode,
            QueryGraphForge queryGraph)
        {
            if (!(inNode.ChildNodes[0] is ExprIdentNode)) {
                return;
            }

            var testIdent = (ExprIdentNode) inNode.ChildNodes[0];
            var testIdentClass = testIdent.Forge.EvaluationType.GetBoxedType();
            var indexedStream = testIdent.StreamId;

            var setExpressions = GetInNodeSetExpressions(inNode);
            if (setExpressions.Length == 0) {
                return;
            }

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

            foreach (var exprNodeSet in setExpressions) {
                if (exprNodeSet.Forge.EvaluationType.GetBoxedType() != testIdentClass) {
                    continue;
                }

                if (exprNodeSet is ExprIdentNode) {
                    var setIdent = (ExprIdentNode) exprNodeSet;
                    AddToList(setIdent.StreamId, setIdent, perStreamExprs);
                }
                else {
                    var eligibility = EligibilityUtil.VerifyInputStream(exprNodeSet, indexedStream);
                    if (!eligibility.Eligibility.IsEligible()) {
                        continue;
                    }

                    AddToList(eligibility.StreamNum, exprNodeSet, perStreamExprs);
                }
            }

            foreach (var entry in perStreamExprs) {
                var exprNodes = ExprNodeUtilityQuery.ToArray(entry.Value);
                if (entry.Key == null) {
                    queryGraph.AddInSetSingleIndexUnkeyed(testIdent.StreamId, testIdent, exprNodes);
                    continue;
                }

                if (entry.Key != indexedStream) {
                    queryGraph.AddInSetSingleIndex(testIdent.StreamId, testIdent, entry.Key.Value, exprNodes);
                }
            }
        }