Beispiel #1
0
        public Respondent GetMinUser(Respondent r)
        {
            Respondent result = new Respondent(r, false);

            foreach (LinkedQuestion lq in Questions)
            {
                if (lq.GetQnumValue() <= StartQ)
                {
                    continue;
                }

                // skip ones that already have an answer
                if (result.Responses.Any(x => x.VarName.Equals(lq.VarName.RefVarName)))
                {
                    continue;
                }


                // skip ones that this user doesn't answer
                if (!UserGetsQuestion(result, lq))
                {
                    result.AddSkip(lq.VarName.RefVarName);
                    continue;
                }

                int directFilterCount;
                int indirectFilterCount;

                List <LinkedQuestion> directFilterList = GetDirectFilterVarList(lq);
                directFilterCount = directFilterList.Count();

                List <LinkedQuestion> indirectFilterList = new List <LinkedQuestion>();
                try
                {
                    if (lq.GetQnumValue() >= StartQ)
                    {
                        foreach (LinkedQuestion q in directFilterList)
                        {
                            indirectFilterList.AddRange(GetIndirectFilterVarList(q));
                        }
                    }
                }catch (Exception e)
                {
                }

                indirectFilterList  = indirectFilterList.Except(directFilterList).ToList();
                indirectFilterCount = indirectFilterList.Count();

                if (directFilterCount + indirectFilterCount == 0)
                {
                    continue;
                }

                List <FilterInstruction> responses = lq.GetFiltersByResponse();
                // get list of responses
                // for each response get direct count, get indirect count

                int    min     = 9999999;
                string minResp = "";
                foreach (FilterInstruction fi in responses)
                {
                    List <LinkedQuestion> directList = GetDirectFilterConditionList(fi);
                    int directCount = directList.Count();

                    List <LinkedQuestion> indirectList = new List <LinkedQuestion>();
                    foreach (LinkedQuestion q in indirectFilterList)
                    {
                        if (QuestionHasIndirectFilter(q, fi))
                        {
                            indirectList.Add(q);
                        }
                    }
                    int indirectCount = indirectList.Count();

                    // for all responses, get the lowest number of direct+indirect
                    // add that response to the respondent
                    if (directCount + indirectCount < min)
                    {
                        min     = directCount + indirectCount;
                        minResp = fi.ValuesStr[0];
                    }
                }

                // if minResp = blank then no answer is used as a filter elsewhere so we can answer with anything
                if (string.IsNullOrEmpty(minResp))
                {
                    minResp = "0";
                }

                result.AddResponse(lq.VarName.RefVarName, minResp);
            }

            return(result);
        }